// Generated by using data-raw/codegen.R -> do not edit by hand
#include <cpp11.hpp>
#include <cpp11/declarations.hpp>

#include "./arrow_types.h"

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Array> Array__Slice1(const std::shared_ptr<arrow::Array>& array, R_xlen_t offset);
extern "C" SEXP _arrow_Array__Slice1(SEXP array_sexp, SEXP offset_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type array(array_sexp);
	arrow::r::Input<R_xlen_t>::type offset(offset_sexp);
	return cpp11::as_sexp(Array__Slice1(array, offset));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__Slice1(SEXP array_sexp, SEXP offset_sexp){
	Rf_error("Cannot call Array__Slice1(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Array> Array__Slice2(const std::shared_ptr<arrow::Array>& array, R_xlen_t offset, R_xlen_t length);
extern "C" SEXP _arrow_Array__Slice2(SEXP array_sexp, SEXP offset_sexp, SEXP length_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type array(array_sexp);
	arrow::r::Input<R_xlen_t>::type offset(offset_sexp);
	arrow::r::Input<R_xlen_t>::type length(length_sexp);
	return cpp11::as_sexp(Array__Slice2(array, offset, length));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__Slice2(SEXP array_sexp, SEXP offset_sexp, SEXP length_sexp){
	Rf_error("Cannot call Array__Slice2(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
bool Array__IsNull(const std::shared_ptr<arrow::Array>& x, R_xlen_t i);
extern "C" SEXP _arrow_Array__IsNull(SEXP x_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type x(x_sexp);
	arrow::r::Input<R_xlen_t>::type i(i_sexp);
	return cpp11::as_sexp(Array__IsNull(x, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__IsNull(SEXP x_sexp, SEXP i_sexp){
	Rf_error("Cannot call Array__IsNull(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
bool Array__IsValid(const std::shared_ptr<arrow::Array>& x, R_xlen_t i);
extern "C" SEXP _arrow_Array__IsValid(SEXP x_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type x(x_sexp);
	arrow::r::Input<R_xlen_t>::type i(i_sexp);
	return cpp11::as_sexp(Array__IsValid(x, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__IsValid(SEXP x_sexp, SEXP i_sexp){
	Rf_error("Cannot call Array__IsValid(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
int Array__length(const std::shared_ptr<arrow::Array>& x);
extern "C" SEXP _arrow_Array__length(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type x(x_sexp);
	return cpp11::as_sexp(Array__length(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__length(SEXP x_sexp){
	Rf_error("Cannot call Array__length(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
int Array__offset(const std::shared_ptr<arrow::Array>& x);
extern "C" SEXP _arrow_Array__offset(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type x(x_sexp);
	return cpp11::as_sexp(Array__offset(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__offset(SEXP x_sexp){
	Rf_error("Cannot call Array__offset(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
int Array__null_count(const std::shared_ptr<arrow::Array>& x);
extern "C" SEXP _arrow_Array__null_count(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type x(x_sexp);
	return cpp11::as_sexp(Array__null_count(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__null_count(SEXP x_sexp){
	Rf_error("Cannot call Array__null_count(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Array__type(const std::shared_ptr<arrow::Array>& x);
extern "C" SEXP _arrow_Array__type(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type x(x_sexp);
	return cpp11::as_sexp(Array__type(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__type(SEXP x_sexp){
	Rf_error("Cannot call Array__type(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string Array__ToString(const std::shared_ptr<arrow::Array>& x);
extern "C" SEXP _arrow_Array__ToString(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type x(x_sexp);
	return cpp11::as_sexp(Array__ToString(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__ToString(SEXP x_sexp){
	Rf_error("Cannot call Array__ToString(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
arrow::Type::type Array__type_id(const std::shared_ptr<arrow::Array>& x);
extern "C" SEXP _arrow_Array__type_id(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type x(x_sexp);
	return cpp11::as_sexp(Array__type_id(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__type_id(SEXP x_sexp){
	Rf_error("Cannot call Array__type_id(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
bool Array__Equals(const std::shared_ptr<arrow::Array>& lhs, const std::shared_ptr<arrow::Array>& rhs);
extern "C" SEXP _arrow_Array__Equals(SEXP lhs_sexp, SEXP rhs_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type lhs(lhs_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type rhs(rhs_sexp);
	return cpp11::as_sexp(Array__Equals(lhs, rhs));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__Equals(SEXP lhs_sexp, SEXP rhs_sexp){
	Rf_error("Cannot call Array__Equals(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
bool Array__ApproxEquals(const std::shared_ptr<arrow::Array>& lhs, const std::shared_ptr<arrow::Array>& rhs);
extern "C" SEXP _arrow_Array__ApproxEquals(SEXP lhs_sexp, SEXP rhs_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type lhs(lhs_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type rhs(rhs_sexp);
	return cpp11::as_sexp(Array__ApproxEquals(lhs, rhs));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__ApproxEquals(SEXP lhs_sexp, SEXP rhs_sexp){
	Rf_error("Cannot call Array__ApproxEquals(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string Array__Diff(const std::shared_ptr<arrow::Array>& lhs, const std::shared_ptr<arrow::Array>& rhs);
extern "C" SEXP _arrow_Array__Diff(SEXP lhs_sexp, SEXP rhs_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type lhs(lhs_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type rhs(rhs_sexp);
	return cpp11::as_sexp(Array__Diff(lhs, rhs));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__Diff(SEXP lhs_sexp, SEXP rhs_sexp){
	Rf_error("Cannot call Array__Diff(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::ArrayData> Array__data(const std::shared_ptr<arrow::Array>& array);
extern "C" SEXP _arrow_Array__data(SEXP array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type array(array_sexp);
	return cpp11::as_sexp(Array__data(array));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__data(SEXP array_sexp){
	Rf_error("Cannot call Array__data(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
bool Array__RangeEquals(const std::shared_ptr<arrow::Array>& self, const std::shared_ptr<arrow::Array>& other, R_xlen_t start_idx, R_xlen_t end_idx, R_xlen_t other_start_idx);
extern "C" SEXP _arrow_Array__RangeEquals(SEXP self_sexp, SEXP other_sexp, SEXP start_idx_sexp, SEXP end_idx_sexp, SEXP other_start_idx_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type self(self_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type other(other_sexp);
	arrow::r::Input<R_xlen_t>::type start_idx(start_idx_sexp);
	arrow::r::Input<R_xlen_t>::type end_idx(end_idx_sexp);
	arrow::r::Input<R_xlen_t>::type other_start_idx(other_start_idx_sexp);
	return cpp11::as_sexp(Array__RangeEquals(self, other, start_idx, end_idx, other_start_idx));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__RangeEquals(SEXP self_sexp, SEXP other_sexp, SEXP start_idx_sexp, SEXP end_idx_sexp, SEXP other_start_idx_sexp){
	Rf_error("Cannot call Array__RangeEquals(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Array> Array__View(const std::shared_ptr<arrow::Array>& array, const std::shared_ptr<arrow::DataType>& type);
extern "C" SEXP _arrow_Array__View(SEXP array_sexp, SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type array(array_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::DataType>&>::type type(type_sexp);
	return cpp11::as_sexp(Array__View(array, type));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__View(SEXP array_sexp, SEXP type_sexp){
	Rf_error("Cannot call Array__View(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
void Array__Validate(const std::shared_ptr<arrow::Array>& array);
extern "C" SEXP _arrow_Array__Validate(SEXP array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type array(array_sexp);
	Array__Validate(array);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__Validate(SEXP array_sexp){
	Rf_error("Cannot call Array__Validate(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Array> DictionaryArray__indices(const std::shared_ptr<arrow::DictionaryArray>& array);
extern "C" SEXP _arrow_DictionaryArray__indices(SEXP array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::DictionaryArray>&>::type array(array_sexp);
	return cpp11::as_sexp(DictionaryArray__indices(array));
END_CPP11
}
#else
extern "C" SEXP _arrow_DictionaryArray__indices(SEXP array_sexp){
	Rf_error("Cannot call DictionaryArray__indices(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Array> DictionaryArray__dictionary(const std::shared_ptr<arrow::DictionaryArray>& array);
extern "C" SEXP _arrow_DictionaryArray__dictionary(SEXP array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::DictionaryArray>&>::type array(array_sexp);
	return cpp11::as_sexp(DictionaryArray__dictionary(array));
END_CPP11
}
#else
extern "C" SEXP _arrow_DictionaryArray__dictionary(SEXP array_sexp){
	Rf_error("Cannot call DictionaryArray__dictionary(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Array> StructArray__field(const std::shared_ptr<arrow::StructArray>& array, int i);
extern "C" SEXP _arrow_StructArray__field(SEXP array_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::StructArray>&>::type array(array_sexp);
	arrow::r::Input<int>::type i(i_sexp);
	return cpp11::as_sexp(StructArray__field(array, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_StructArray__field(SEXP array_sexp, SEXP i_sexp){
	Rf_error("Cannot call StructArray__field(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Array> StructArray__GetFieldByName(const std::shared_ptr<arrow::StructArray>& array, const std::string& name);
extern "C" SEXP _arrow_StructArray__GetFieldByName(SEXP array_sexp, SEXP name_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::StructArray>&>::type array(array_sexp);
	arrow::r::Input<const std::string&>::type name(name_sexp);
	return cpp11::as_sexp(StructArray__GetFieldByName(array, name));
END_CPP11
}
#else
extern "C" SEXP _arrow_StructArray__GetFieldByName(SEXP array_sexp, SEXP name_sexp){
	Rf_error("Cannot call StructArray__GetFieldByName(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::list StructArray__Flatten(const std::shared_ptr<arrow::StructArray>& array);
extern "C" SEXP _arrow_StructArray__Flatten(SEXP array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::StructArray>&>::type array(array_sexp);
	return cpp11::as_sexp(StructArray__Flatten(array));
END_CPP11
}
#else
extern "C" SEXP _arrow_StructArray__Flatten(SEXP array_sexp){
	Rf_error("Cannot call StructArray__Flatten(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> ListArray__value_type(const std::shared_ptr<arrow::ListArray>& array);
extern "C" SEXP _arrow_ListArray__value_type(SEXP array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ListArray>&>::type array(array_sexp);
	return cpp11::as_sexp(ListArray__value_type(array));
END_CPP11
}
#else
extern "C" SEXP _arrow_ListArray__value_type(SEXP array_sexp){
	Rf_error("Cannot call ListArray__value_type(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> LargeListArray__value_type(const std::shared_ptr<arrow::LargeListArray>& array);
extern "C" SEXP _arrow_LargeListArray__value_type(SEXP array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::LargeListArray>&>::type array(array_sexp);
	return cpp11::as_sexp(LargeListArray__value_type(array));
END_CPP11
}
#else
extern "C" SEXP _arrow_LargeListArray__value_type(SEXP array_sexp){
	Rf_error("Cannot call LargeListArray__value_type(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Array> ListArray__values(const std::shared_ptr<arrow::ListArray>& array);
extern "C" SEXP _arrow_ListArray__values(SEXP array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ListArray>&>::type array(array_sexp);
	return cpp11::as_sexp(ListArray__values(array));
END_CPP11
}
#else
extern "C" SEXP _arrow_ListArray__values(SEXP array_sexp){
	Rf_error("Cannot call ListArray__values(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Array> LargeListArray__values(const std::shared_ptr<arrow::LargeListArray>& array);
extern "C" SEXP _arrow_LargeListArray__values(SEXP array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::LargeListArray>&>::type array(array_sexp);
	return cpp11::as_sexp(LargeListArray__values(array));
END_CPP11
}
#else
extern "C" SEXP _arrow_LargeListArray__values(SEXP array_sexp){
	Rf_error("Cannot call LargeListArray__values(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
int32_t ListArray__value_length(const std::shared_ptr<arrow::ListArray>& array, int64_t i);
extern "C" SEXP _arrow_ListArray__value_length(SEXP array_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ListArray>&>::type array(array_sexp);
	arrow::r::Input<int64_t>::type i(i_sexp);
	return cpp11::as_sexp(ListArray__value_length(array, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_ListArray__value_length(SEXP array_sexp, SEXP i_sexp){
	Rf_error("Cannot call ListArray__value_length(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
int64_t LargeListArray__value_length(const std::shared_ptr<arrow::LargeListArray>& array, int64_t i);
extern "C" SEXP _arrow_LargeListArray__value_length(SEXP array_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::LargeListArray>&>::type array(array_sexp);
	arrow::r::Input<int64_t>::type i(i_sexp);
	return cpp11::as_sexp(LargeListArray__value_length(array, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_LargeListArray__value_length(SEXP array_sexp, SEXP i_sexp){
	Rf_error("Cannot call LargeListArray__value_length(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
int64_t FixedSizeListArray__value_length(const std::shared_ptr<arrow::FixedSizeListArray>& array, int64_t i);
extern "C" SEXP _arrow_FixedSizeListArray__value_length(SEXP array_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::FixedSizeListArray>&>::type array(array_sexp);
	arrow::r::Input<int64_t>::type i(i_sexp);
	return cpp11::as_sexp(FixedSizeListArray__value_length(array, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_FixedSizeListArray__value_length(SEXP array_sexp, SEXP i_sexp){
	Rf_error("Cannot call FixedSizeListArray__value_length(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
int32_t ListArray__value_offset(const std::shared_ptr<arrow::ListArray>& array, int64_t i);
extern "C" SEXP _arrow_ListArray__value_offset(SEXP array_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ListArray>&>::type array(array_sexp);
	arrow::r::Input<int64_t>::type i(i_sexp);
	return cpp11::as_sexp(ListArray__value_offset(array, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_ListArray__value_offset(SEXP array_sexp, SEXP i_sexp){
	Rf_error("Cannot call ListArray__value_offset(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
int64_t LargeListArray__value_offset(const std::shared_ptr<arrow::LargeListArray>& array, int64_t i);
extern "C" SEXP _arrow_LargeListArray__value_offset(SEXP array_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::LargeListArray>&>::type array(array_sexp);
	arrow::r::Input<int64_t>::type i(i_sexp);
	return cpp11::as_sexp(LargeListArray__value_offset(array, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_LargeListArray__value_offset(SEXP array_sexp, SEXP i_sexp){
	Rf_error("Cannot call LargeListArray__value_offset(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
int64_t FixedSizeListArray__value_offset(const std::shared_ptr<arrow::FixedSizeListArray>& array, int64_t i);
extern "C" SEXP _arrow_FixedSizeListArray__value_offset(SEXP array_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::FixedSizeListArray>&>::type array(array_sexp);
	arrow::r::Input<int64_t>::type i(i_sexp);
	return cpp11::as_sexp(FixedSizeListArray__value_offset(array, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_FixedSizeListArray__value_offset(SEXP array_sexp, SEXP i_sexp){
	Rf_error("Cannot call FixedSizeListArray__value_offset(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::writable::integers ListArray__raw_value_offsets(const std::shared_ptr<arrow::ListArray>& array);
extern "C" SEXP _arrow_ListArray__raw_value_offsets(SEXP array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ListArray>&>::type array(array_sexp);
	return cpp11::as_sexp(ListArray__raw_value_offsets(array));
END_CPP11
}
#else
extern "C" SEXP _arrow_ListArray__raw_value_offsets(SEXP array_sexp){
	Rf_error("Cannot call ListArray__raw_value_offsets(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::writable::integers LargeListArray__raw_value_offsets(const std::shared_ptr<arrow::LargeListArray>& array);
extern "C" SEXP _arrow_LargeListArray__raw_value_offsets(SEXP array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::LargeListArray>&>::type array(array_sexp);
	return cpp11::as_sexp(LargeListArray__raw_value_offsets(array));
END_CPP11
}
#else
extern "C" SEXP _arrow_LargeListArray__raw_value_offsets(SEXP array_sexp){
	Rf_error("Cannot call LargeListArray__raw_value_offsets(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array_to_vector.cpp
#if defined(ARROW_R_WITH_ARROW)
SEXP Array__as_vector(const std::shared_ptr<arrow::Array>& array);
extern "C" SEXP _arrow_Array__as_vector(SEXP array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type array(array_sexp);
	return cpp11::as_sexp(Array__as_vector(array));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__as_vector(SEXP array_sexp){
	Rf_error("Cannot call Array__as_vector(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array_to_vector.cpp
#if defined(ARROW_R_WITH_ARROW)
SEXP ChunkedArray__as_vector(const std::shared_ptr<arrow::ChunkedArray>& chunked_array);
extern "C" SEXP _arrow_ChunkedArray__as_vector(SEXP chunked_array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ChunkedArray>&>::type chunked_array(chunked_array_sexp);
	return cpp11::as_sexp(ChunkedArray__as_vector(chunked_array));
END_CPP11
}
#else
extern "C" SEXP _arrow_ChunkedArray__as_vector(SEXP chunked_array_sexp){
	Rf_error("Cannot call ChunkedArray__as_vector(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array_to_vector.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::writable::list RecordBatch__to_dataframe(const std::shared_ptr<arrow::RecordBatch>& batch, bool use_threads);
extern "C" SEXP _arrow_RecordBatch__to_dataframe(SEXP batch_sexp, SEXP use_threads_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type batch(batch_sexp);
	arrow::r::Input<bool>::type use_threads(use_threads_sexp);
	return cpp11::as_sexp(RecordBatch__to_dataframe(batch, use_threads));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__to_dataframe(SEXP batch_sexp, SEXP use_threads_sexp){
	Rf_error("Cannot call RecordBatch__to_dataframe(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// array_to_vector.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::writable::list Table__to_dataframe(const std::shared_ptr<arrow::Table>& table, bool use_threads);
extern "C" SEXP _arrow_Table__to_dataframe(SEXP table_sexp, SEXP use_threads_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	arrow::r::Input<bool>::type use_threads(use_threads_sexp);
	return cpp11::as_sexp(Table__to_dataframe(table, use_threads));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__to_dataframe(SEXP table_sexp, SEXP use_threads_sexp){
	Rf_error("Cannot call Table__to_dataframe(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// arraydata.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> ArrayData__get_type(const std::shared_ptr<arrow::ArrayData>& x);
extern "C" SEXP _arrow_ArrayData__get_type(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ArrayData>&>::type x(x_sexp);
	return cpp11::as_sexp(ArrayData__get_type(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_ArrayData__get_type(SEXP x_sexp){
	Rf_error("Cannot call ArrayData__get_type(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// arraydata.cpp
#if defined(ARROW_R_WITH_ARROW)
int ArrayData__get_length(const std::shared_ptr<arrow::ArrayData>& x);
extern "C" SEXP _arrow_ArrayData__get_length(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ArrayData>&>::type x(x_sexp);
	return cpp11::as_sexp(ArrayData__get_length(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_ArrayData__get_length(SEXP x_sexp){
	Rf_error("Cannot call ArrayData__get_length(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// arraydata.cpp
#if defined(ARROW_R_WITH_ARROW)
int ArrayData__get_null_count(const std::shared_ptr<arrow::ArrayData>& x);
extern "C" SEXP _arrow_ArrayData__get_null_count(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ArrayData>&>::type x(x_sexp);
	return cpp11::as_sexp(ArrayData__get_null_count(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_ArrayData__get_null_count(SEXP x_sexp){
	Rf_error("Cannot call ArrayData__get_null_count(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// arraydata.cpp
#if defined(ARROW_R_WITH_ARROW)
int ArrayData__get_offset(const std::shared_ptr<arrow::ArrayData>& x);
extern "C" SEXP _arrow_ArrayData__get_offset(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ArrayData>&>::type x(x_sexp);
	return cpp11::as_sexp(ArrayData__get_offset(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_ArrayData__get_offset(SEXP x_sexp){
	Rf_error("Cannot call ArrayData__get_offset(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// arraydata.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::list ArrayData__buffers(const std::shared_ptr<arrow::ArrayData>& x);
extern "C" SEXP _arrow_ArrayData__buffers(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ArrayData>&>::type x(x_sexp);
	return cpp11::as_sexp(ArrayData__buffers(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_ArrayData__buffers(SEXP x_sexp){
	Rf_error("Cannot call ArrayData__buffers(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// buffer.cpp
#if defined(ARROW_R_WITH_ARROW)
bool Buffer__is_mutable(const std::shared_ptr<arrow::Buffer>& buffer);
extern "C" SEXP _arrow_Buffer__is_mutable(SEXP buffer_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Buffer>&>::type buffer(buffer_sexp);
	return cpp11::as_sexp(Buffer__is_mutable(buffer));
END_CPP11
}
#else
extern "C" SEXP _arrow_Buffer__is_mutable(SEXP buffer_sexp){
	Rf_error("Cannot call Buffer__is_mutable(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// buffer.cpp
#if defined(ARROW_R_WITH_ARROW)
void Buffer__ZeroPadding(const std::shared_ptr<arrow::Buffer>& buffer);
extern "C" SEXP _arrow_Buffer__ZeroPadding(SEXP buffer_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Buffer>&>::type buffer(buffer_sexp);
	Buffer__ZeroPadding(buffer);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_Buffer__ZeroPadding(SEXP buffer_sexp){
	Rf_error("Cannot call Buffer__ZeroPadding(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// buffer.cpp
#if defined(ARROW_R_WITH_ARROW)
int64_t Buffer__capacity(const std::shared_ptr<arrow::Buffer>& buffer);
extern "C" SEXP _arrow_Buffer__capacity(SEXP buffer_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Buffer>&>::type buffer(buffer_sexp);
	return cpp11::as_sexp(Buffer__capacity(buffer));
END_CPP11
}
#else
extern "C" SEXP _arrow_Buffer__capacity(SEXP buffer_sexp){
	Rf_error("Cannot call Buffer__capacity(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// buffer.cpp
#if defined(ARROW_R_WITH_ARROW)
int64_t Buffer__size(const std::shared_ptr<arrow::Buffer>& buffer);
extern "C" SEXP _arrow_Buffer__size(SEXP buffer_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Buffer>&>::type buffer(buffer_sexp);
	return cpp11::as_sexp(Buffer__size(buffer));
END_CPP11
}
#else
extern "C" SEXP _arrow_Buffer__size(SEXP buffer_sexp){
	Rf_error("Cannot call Buffer__size(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// buffer.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Buffer> r___RBuffer__initialize(SEXP x);
extern "C" SEXP _arrow_r___RBuffer__initialize(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<SEXP>::type x(x_sexp);
	return cpp11::as_sexp(r___RBuffer__initialize(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_r___RBuffer__initialize(SEXP x_sexp){
	Rf_error("Cannot call r___RBuffer__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// buffer.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::writable::raws Buffer__data(const std::shared_ptr<arrow::Buffer>& buffer);
extern "C" SEXP _arrow_Buffer__data(SEXP buffer_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Buffer>&>::type buffer(buffer_sexp);
	return cpp11::as_sexp(Buffer__data(buffer));
END_CPP11
}
#else
extern "C" SEXP _arrow_Buffer__data(SEXP buffer_sexp){
	Rf_error("Cannot call Buffer__data(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// buffer.cpp
#if defined(ARROW_R_WITH_ARROW)
bool Buffer__Equals(const std::shared_ptr<arrow::Buffer>& x, const std::shared_ptr<arrow::Buffer>& y);
extern "C" SEXP _arrow_Buffer__Equals(SEXP x_sexp, SEXP y_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Buffer>&>::type x(x_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Buffer>&>::type y(y_sexp);
	return cpp11::as_sexp(Buffer__Equals(x, y));
END_CPP11
}
#else
extern "C" SEXP _arrow_Buffer__Equals(SEXP x_sexp, SEXP y_sexp){
	Rf_error("Cannot call Buffer__Equals(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// chunkedarray.cpp
#if defined(ARROW_R_WITH_ARROW)
int ChunkedArray__length(const std::shared_ptr<arrow::ChunkedArray>& chunked_array);
extern "C" SEXP _arrow_ChunkedArray__length(SEXP chunked_array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ChunkedArray>&>::type chunked_array(chunked_array_sexp);
	return cpp11::as_sexp(ChunkedArray__length(chunked_array));
END_CPP11
}
#else
extern "C" SEXP _arrow_ChunkedArray__length(SEXP chunked_array_sexp){
	Rf_error("Cannot call ChunkedArray__length(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// chunkedarray.cpp
#if defined(ARROW_R_WITH_ARROW)
int ChunkedArray__null_count(const std::shared_ptr<arrow::ChunkedArray>& chunked_array);
extern "C" SEXP _arrow_ChunkedArray__null_count(SEXP chunked_array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ChunkedArray>&>::type chunked_array(chunked_array_sexp);
	return cpp11::as_sexp(ChunkedArray__null_count(chunked_array));
END_CPP11
}
#else
extern "C" SEXP _arrow_ChunkedArray__null_count(SEXP chunked_array_sexp){
	Rf_error("Cannot call ChunkedArray__null_count(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// chunkedarray.cpp
#if defined(ARROW_R_WITH_ARROW)
int ChunkedArray__num_chunks(const std::shared_ptr<arrow::ChunkedArray>& chunked_array);
extern "C" SEXP _arrow_ChunkedArray__num_chunks(SEXP chunked_array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ChunkedArray>&>::type chunked_array(chunked_array_sexp);
	return cpp11::as_sexp(ChunkedArray__num_chunks(chunked_array));
END_CPP11
}
#else
extern "C" SEXP _arrow_ChunkedArray__num_chunks(SEXP chunked_array_sexp){
	Rf_error("Cannot call ChunkedArray__num_chunks(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// chunkedarray.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Array> ChunkedArray__chunk(const std::shared_ptr<arrow::ChunkedArray>& chunked_array, int i);
extern "C" SEXP _arrow_ChunkedArray__chunk(SEXP chunked_array_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ChunkedArray>&>::type chunked_array(chunked_array_sexp);
	arrow::r::Input<int>::type i(i_sexp);
	return cpp11::as_sexp(ChunkedArray__chunk(chunked_array, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_ChunkedArray__chunk(SEXP chunked_array_sexp, SEXP i_sexp){
	Rf_error("Cannot call ChunkedArray__chunk(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// chunkedarray.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::list ChunkedArray__chunks(const std::shared_ptr<arrow::ChunkedArray>& chunked_array);
extern "C" SEXP _arrow_ChunkedArray__chunks(SEXP chunked_array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ChunkedArray>&>::type chunked_array(chunked_array_sexp);
	return cpp11::as_sexp(ChunkedArray__chunks(chunked_array));
END_CPP11
}
#else
extern "C" SEXP _arrow_ChunkedArray__chunks(SEXP chunked_array_sexp){
	Rf_error("Cannot call ChunkedArray__chunks(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// chunkedarray.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> ChunkedArray__type(const std::shared_ptr<arrow::ChunkedArray>& chunked_array);
extern "C" SEXP _arrow_ChunkedArray__type(SEXP chunked_array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ChunkedArray>&>::type chunked_array(chunked_array_sexp);
	return cpp11::as_sexp(ChunkedArray__type(chunked_array));
END_CPP11
}
#else
extern "C" SEXP _arrow_ChunkedArray__type(SEXP chunked_array_sexp){
	Rf_error("Cannot call ChunkedArray__type(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// chunkedarray.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::ChunkedArray> ChunkedArray__Slice1(const std::shared_ptr<arrow::ChunkedArray>& chunked_array, R_xlen_t offset);
extern "C" SEXP _arrow_ChunkedArray__Slice1(SEXP chunked_array_sexp, SEXP offset_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ChunkedArray>&>::type chunked_array(chunked_array_sexp);
	arrow::r::Input<R_xlen_t>::type offset(offset_sexp);
	return cpp11::as_sexp(ChunkedArray__Slice1(chunked_array, offset));
END_CPP11
}
#else
extern "C" SEXP _arrow_ChunkedArray__Slice1(SEXP chunked_array_sexp, SEXP offset_sexp){
	Rf_error("Cannot call ChunkedArray__Slice1(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// chunkedarray.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::ChunkedArray> ChunkedArray__Slice2(const std::shared_ptr<arrow::ChunkedArray>& chunked_array, R_xlen_t offset, R_xlen_t length);
extern "C" SEXP _arrow_ChunkedArray__Slice2(SEXP chunked_array_sexp, SEXP offset_sexp, SEXP length_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ChunkedArray>&>::type chunked_array(chunked_array_sexp);
	arrow::r::Input<R_xlen_t>::type offset(offset_sexp);
	arrow::r::Input<R_xlen_t>::type length(length_sexp);
	return cpp11::as_sexp(ChunkedArray__Slice2(chunked_array, offset, length));
END_CPP11
}
#else
extern "C" SEXP _arrow_ChunkedArray__Slice2(SEXP chunked_array_sexp, SEXP offset_sexp, SEXP length_sexp){
	Rf_error("Cannot call ChunkedArray__Slice2(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// chunkedarray.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::ChunkedArray> ChunkedArray__View(const std::shared_ptr<arrow::ChunkedArray>& array, const std::shared_ptr<arrow::DataType>& type);
extern "C" SEXP _arrow_ChunkedArray__View(SEXP array_sexp, SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ChunkedArray>&>::type array(array_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::DataType>&>::type type(type_sexp);
	return cpp11::as_sexp(ChunkedArray__View(array, type));
END_CPP11
}
#else
extern "C" SEXP _arrow_ChunkedArray__View(SEXP array_sexp, SEXP type_sexp){
	Rf_error("Cannot call ChunkedArray__View(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// chunkedarray.cpp
#if defined(ARROW_R_WITH_ARROW)
void ChunkedArray__Validate(const std::shared_ptr<arrow::ChunkedArray>& chunked_array);
extern "C" SEXP _arrow_ChunkedArray__Validate(SEXP chunked_array_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ChunkedArray>&>::type chunked_array(chunked_array_sexp);
	ChunkedArray__Validate(chunked_array);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_ChunkedArray__Validate(SEXP chunked_array_sexp){
	Rf_error("Cannot call ChunkedArray__Validate(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// chunkedarray.cpp
#if defined(ARROW_R_WITH_ARROW)
bool ChunkedArray__Equals(const std::shared_ptr<arrow::ChunkedArray>& x, const std::shared_ptr<arrow::ChunkedArray>& y);
extern "C" SEXP _arrow_ChunkedArray__Equals(SEXP x_sexp, SEXP y_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ChunkedArray>&>::type x(x_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::ChunkedArray>&>::type y(y_sexp);
	return cpp11::as_sexp(ChunkedArray__Equals(x, y));
END_CPP11
}
#else
extern "C" SEXP _arrow_ChunkedArray__Equals(SEXP x_sexp, SEXP y_sexp){
	Rf_error("Cannot call ChunkedArray__Equals(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// chunkedarray.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string ChunkedArray__ToString(const std::shared_ptr<arrow::ChunkedArray>& x);
extern "C" SEXP _arrow_ChunkedArray__ToString(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ChunkedArray>&>::type x(x_sexp);
	return cpp11::as_sexp(ChunkedArray__ToString(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_ChunkedArray__ToString(SEXP x_sexp){
	Rf_error("Cannot call ChunkedArray__ToString(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// chunkedarray.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::ChunkedArray> ChunkedArray__from_list(cpp11::list chunks, SEXP s_type);
extern "C" SEXP _arrow_ChunkedArray__from_list(SEXP chunks_sexp, SEXP s_type_sexp){
BEGIN_CPP11
	arrow::r::Input<cpp11::list>::type chunks(chunks_sexp);
	arrow::r::Input<SEXP>::type s_type(s_type_sexp);
	return cpp11::as_sexp(ChunkedArray__from_list(chunks, s_type));
END_CPP11
}
#else
extern "C" SEXP _arrow_ChunkedArray__from_list(SEXP chunks_sexp, SEXP s_type_sexp){
	Rf_error("Cannot call ChunkedArray__from_list(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// compression.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::util::Codec> util___Codec__Create(arrow::Compression::type codec, R_xlen_t compression_level);
extern "C" SEXP _arrow_util___Codec__Create(SEXP codec_sexp, SEXP compression_level_sexp){
BEGIN_CPP11
	arrow::r::Input<arrow::Compression::type>::type codec(codec_sexp);
	arrow::r::Input<R_xlen_t>::type compression_level(compression_level_sexp);
	return cpp11::as_sexp(util___Codec__Create(codec, compression_level));
END_CPP11
}
#else
extern "C" SEXP _arrow_util___Codec__Create(SEXP codec_sexp, SEXP compression_level_sexp){
	Rf_error("Cannot call util___Codec__Create(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// compression.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string util___Codec__name(const std::shared_ptr<arrow::util::Codec>& codec);
extern "C" SEXP _arrow_util___Codec__name(SEXP codec_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::util::Codec>&>::type codec(codec_sexp);
	return cpp11::as_sexp(util___Codec__name(codec));
END_CPP11
}
#else
extern "C" SEXP _arrow_util___Codec__name(SEXP codec_sexp){
	Rf_error("Cannot call util___Codec__name(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// compression.cpp
#if defined(ARROW_R_WITH_ARROW)
bool util___Codec__IsAvailable(arrow::Compression::type codec);
extern "C" SEXP _arrow_util___Codec__IsAvailable(SEXP codec_sexp){
BEGIN_CPP11
	arrow::r::Input<arrow::Compression::type>::type codec(codec_sexp);
	return cpp11::as_sexp(util___Codec__IsAvailable(codec));
END_CPP11
}
#else
extern "C" SEXP _arrow_util___Codec__IsAvailable(SEXP codec_sexp){
	Rf_error("Cannot call util___Codec__IsAvailable(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// compression.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::io::CompressedOutputStream> io___CompressedOutputStream__Make(const std::shared_ptr<arrow::util::Codec>& codec, const std::shared_ptr<arrow::io::OutputStream>& raw);
extern "C" SEXP _arrow_io___CompressedOutputStream__Make(SEXP codec_sexp, SEXP raw_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::util::Codec>&>::type codec(codec_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::io::OutputStream>&>::type raw(raw_sexp);
	return cpp11::as_sexp(io___CompressedOutputStream__Make(codec, raw));
END_CPP11
}
#else
extern "C" SEXP _arrow_io___CompressedOutputStream__Make(SEXP codec_sexp, SEXP raw_sexp){
	Rf_error("Cannot call io___CompressedOutputStream__Make(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// compression.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::io::CompressedInputStream> io___CompressedInputStream__Make(const std::shared_ptr<arrow::util::Codec>& codec, const std::shared_ptr<arrow::io::InputStream>& raw);
extern "C" SEXP _arrow_io___CompressedInputStream__Make(SEXP codec_sexp, SEXP raw_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::util::Codec>&>::type codec(codec_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::io::InputStream>&>::type raw(raw_sexp);
	return cpp11::as_sexp(io___CompressedInputStream__Make(codec, raw));
END_CPP11
}
#else
extern "C" SEXP _arrow_io___CompressedInputStream__Make(SEXP codec_sexp, SEXP raw_sexp){
	Rf_error("Cannot call io___CompressedInputStream__Make(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// compute.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::RecordBatch> RecordBatch__cast(const std::shared_ptr<arrow::RecordBatch>& batch, const std::shared_ptr<arrow::Schema>& schema, cpp11::list options);
extern "C" SEXP _arrow_RecordBatch__cast(SEXP batch_sexp, SEXP schema_sexp, SEXP options_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type batch(batch_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schema(schema_sexp);
	arrow::r::Input<cpp11::list>::type options(options_sexp);
	return cpp11::as_sexp(RecordBatch__cast(batch, schema, options));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__cast(SEXP batch_sexp, SEXP schema_sexp, SEXP options_sexp){
	Rf_error("Cannot call RecordBatch__cast(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// compute.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Table> Table__cast(const std::shared_ptr<arrow::Table>& table, const std::shared_ptr<arrow::Schema>& schema, cpp11::list options);
extern "C" SEXP _arrow_Table__cast(SEXP table_sexp, SEXP schema_sexp, SEXP options_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schema(schema_sexp);
	arrow::r::Input<cpp11::list>::type options(options_sexp);
	return cpp11::as_sexp(Table__cast(table, schema, options));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__cast(SEXP table_sexp, SEXP schema_sexp, SEXP options_sexp){
	Rf_error("Cannot call Table__cast(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// compute.cpp
#if defined(ARROW_R_WITH_ARROW)
SEXP compute__CallFunction(std::string func_name, cpp11::list args, cpp11::list options);
extern "C" SEXP _arrow_compute__CallFunction(SEXP func_name_sexp, SEXP args_sexp, SEXP options_sexp){
BEGIN_CPP11
	arrow::r::Input<std::string>::type func_name(func_name_sexp);
	arrow::r::Input<cpp11::list>::type args(args_sexp);
	arrow::r::Input<cpp11::list>::type options(options_sexp);
	return cpp11::as_sexp(compute__CallFunction(func_name, args, options));
END_CPP11
}
#else
extern "C" SEXP _arrow_compute__CallFunction(SEXP func_name_sexp, SEXP args_sexp, SEXP options_sexp){
	Rf_error("Cannot call compute__CallFunction(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// compute.cpp
#if defined(ARROW_R_WITH_ARROW)
SEXP compute__GroupBy(cpp11::list arguments, cpp11::list keys, cpp11::list options);
extern "C" SEXP _arrow_compute__GroupBy(SEXP arguments_sexp, SEXP keys_sexp, SEXP options_sexp){
BEGIN_CPP11
	arrow::r::Input<cpp11::list>::type arguments(arguments_sexp);
	arrow::r::Input<cpp11::list>::type keys(keys_sexp);
	arrow::r::Input<cpp11::list>::type options(options_sexp);
	return cpp11::as_sexp(compute__GroupBy(arguments, keys, options));
END_CPP11
}
#else
extern "C" SEXP _arrow_compute__GroupBy(SEXP arguments_sexp, SEXP keys_sexp, SEXP options_sexp){
	Rf_error("Cannot call compute__GroupBy(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// compute.cpp
#if defined(ARROW_R_WITH_ARROW)
std::vector<std::string> compute__GetFunctionNames();
extern "C" SEXP _arrow_compute__GetFunctionNames(){
BEGIN_CPP11
	return cpp11::as_sexp(compute__GetFunctionNames());
END_CPP11
}
#else
extern "C" SEXP _arrow_compute__GetFunctionNames(){
	Rf_error("Cannot call compute__GetFunctionNames(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// csv.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::csv::ReadOptions> csv___ReadOptions__initialize(cpp11::list options);
extern "C" SEXP _arrow_csv___ReadOptions__initialize(SEXP options_sexp){
BEGIN_CPP11
	arrow::r::Input<cpp11::list>::type options(options_sexp);
	return cpp11::as_sexp(csv___ReadOptions__initialize(options));
END_CPP11
}
#else
extern "C" SEXP _arrow_csv___ReadOptions__initialize(SEXP options_sexp){
	Rf_error("Cannot call csv___ReadOptions__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// csv.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::csv::ParseOptions> csv___ParseOptions__initialize(cpp11::list options);
extern "C" SEXP _arrow_csv___ParseOptions__initialize(SEXP options_sexp){
BEGIN_CPP11
	arrow::r::Input<cpp11::list>::type options(options_sexp);
	return cpp11::as_sexp(csv___ParseOptions__initialize(options));
END_CPP11
}
#else
extern "C" SEXP _arrow_csv___ParseOptions__initialize(SEXP options_sexp){
	Rf_error("Cannot call csv___ParseOptions__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// csv.cpp
#if defined(ARROW_R_WITH_ARROW)
SEXP csv___ReadOptions__column_names(const std::shared_ptr<arrow::csv::ReadOptions>& options);
extern "C" SEXP _arrow_csv___ReadOptions__column_names(SEXP options_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::csv::ReadOptions>&>::type options(options_sexp);
	return cpp11::as_sexp(csv___ReadOptions__column_names(options));
END_CPP11
}
#else
extern "C" SEXP _arrow_csv___ReadOptions__column_names(SEXP options_sexp){
	Rf_error("Cannot call csv___ReadOptions__column_names(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// csv.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::csv::ConvertOptions> csv___ConvertOptions__initialize(cpp11::list options);
extern "C" SEXP _arrow_csv___ConvertOptions__initialize(SEXP options_sexp){
BEGIN_CPP11
	arrow::r::Input<cpp11::list>::type options(options_sexp);
	return cpp11::as_sexp(csv___ConvertOptions__initialize(options));
END_CPP11
}
#else
extern "C" SEXP _arrow_csv___ConvertOptions__initialize(SEXP options_sexp){
	Rf_error("Cannot call csv___ConvertOptions__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// csv.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::csv::TableReader> csv___TableReader__Make(const std::shared_ptr<arrow::io::InputStream>& input, const std::shared_ptr<arrow::csv::ReadOptions>& read_options, const std::shared_ptr<arrow::csv::ParseOptions>& parse_options, const std::shared_ptr<arrow::csv::ConvertOptions>& convert_options);
extern "C" SEXP _arrow_csv___TableReader__Make(SEXP input_sexp, SEXP read_options_sexp, SEXP parse_options_sexp, SEXP convert_options_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::InputStream>&>::type input(input_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::csv::ReadOptions>&>::type read_options(read_options_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::csv::ParseOptions>&>::type parse_options(parse_options_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::csv::ConvertOptions>&>::type convert_options(convert_options_sexp);
	return cpp11::as_sexp(csv___TableReader__Make(input, read_options, parse_options, convert_options));
END_CPP11
}
#else
extern "C" SEXP _arrow_csv___TableReader__Make(SEXP input_sexp, SEXP read_options_sexp, SEXP parse_options_sexp, SEXP convert_options_sexp){
	Rf_error("Cannot call csv___TableReader__Make(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// csv.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Table> csv___TableReader__Read(const std::shared_ptr<arrow::csv::TableReader>& table_reader);
extern "C" SEXP _arrow_csv___TableReader__Read(SEXP table_reader_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::csv::TableReader>&>::type table_reader(table_reader_sexp);
	return cpp11::as_sexp(csv___TableReader__Read(table_reader));
END_CPP11
}
#else
extern "C" SEXP _arrow_csv___TableReader__Read(SEXP table_reader_sexp){
	Rf_error("Cannot call csv___TableReader__Read(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// csv.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string TimestampParser__kind(const std::shared_ptr<arrow::TimestampParser>& parser);
extern "C" SEXP _arrow_TimestampParser__kind(SEXP parser_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::TimestampParser>&>::type parser(parser_sexp);
	return cpp11::as_sexp(TimestampParser__kind(parser));
END_CPP11
}
#else
extern "C" SEXP _arrow_TimestampParser__kind(SEXP parser_sexp){
	Rf_error("Cannot call TimestampParser__kind(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// csv.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string TimestampParser__format(const std::shared_ptr<arrow::TimestampParser>& parser);
extern "C" SEXP _arrow_TimestampParser__format(SEXP parser_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::TimestampParser>&>::type parser(parser_sexp);
	return cpp11::as_sexp(TimestampParser__format(parser));
END_CPP11
}
#else
extern "C" SEXP _arrow_TimestampParser__format(SEXP parser_sexp){
	Rf_error("Cannot call TimestampParser__format(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// csv.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::TimestampParser> TimestampParser__MakeStrptime(std::string format);
extern "C" SEXP _arrow_TimestampParser__MakeStrptime(SEXP format_sexp){
BEGIN_CPP11
	arrow::r::Input<std::string>::type format(format_sexp);
	return cpp11::as_sexp(TimestampParser__MakeStrptime(format));
END_CPP11
}
#else
extern "C" SEXP _arrow_TimestampParser__MakeStrptime(SEXP format_sexp){
	Rf_error("Cannot call TimestampParser__MakeStrptime(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// csv.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::TimestampParser> TimestampParser__MakeISO8601();
extern "C" SEXP _arrow_TimestampParser__MakeISO8601(){
BEGIN_CPP11
	return cpp11::as_sexp(TimestampParser__MakeISO8601());
END_CPP11
}
#else
extern "C" SEXP _arrow_TimestampParser__MakeISO8601(){
	Rf_error("Cannot call TimestampParser__MakeISO8601(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::ScannerBuilder> dataset___Dataset__NewScan(const std::shared_ptr<ds::Dataset>& ds);
extern "C" SEXP _arrow_dataset___Dataset__NewScan(SEXP ds_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::Dataset>&>::type ds(ds_sexp);
	return cpp11::as_sexp(dataset___Dataset__NewScan(ds));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___Dataset__NewScan(SEXP ds_sexp){
	Rf_error("Cannot call dataset___Dataset__NewScan(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<arrow::Schema> dataset___Dataset__schema(const std::shared_ptr<ds::Dataset>& dataset);
extern "C" SEXP _arrow_dataset___Dataset__schema(SEXP dataset_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::Dataset>&>::type dataset(dataset_sexp);
	return cpp11::as_sexp(dataset___Dataset__schema(dataset));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___Dataset__schema(SEXP dataset_sexp){
	Rf_error("Cannot call dataset___Dataset__schema(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::string dataset___Dataset__type_name(const std::shared_ptr<ds::Dataset>& dataset);
extern "C" SEXP _arrow_dataset___Dataset__type_name(SEXP dataset_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::Dataset>&>::type dataset(dataset_sexp);
	return cpp11::as_sexp(dataset___Dataset__type_name(dataset));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___Dataset__type_name(SEXP dataset_sexp){
	Rf_error("Cannot call dataset___Dataset__type_name(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::Dataset> dataset___Dataset__ReplaceSchema(const std::shared_ptr<ds::Dataset>& dataset, const std::shared_ptr<arrow::Schema>& schm);
extern "C" SEXP _arrow_dataset___Dataset__ReplaceSchema(SEXP dataset_sexp, SEXP schm_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::Dataset>&>::type dataset(dataset_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schm(schm_sexp);
	return cpp11::as_sexp(dataset___Dataset__ReplaceSchema(dataset, schm));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___Dataset__ReplaceSchema(SEXP dataset_sexp, SEXP schm_sexp){
	Rf_error("Cannot call dataset___Dataset__ReplaceSchema(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::Dataset> dataset___UnionDataset__create(const ds::DatasetVector& datasets, const std::shared_ptr<arrow::Schema>& schm);
extern "C" SEXP _arrow_dataset___UnionDataset__create(SEXP datasets_sexp, SEXP schm_sexp){
BEGIN_CPP11
	arrow::r::Input<const ds::DatasetVector&>::type datasets(datasets_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schm(schm_sexp);
	return cpp11::as_sexp(dataset___UnionDataset__create(datasets, schm));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___UnionDataset__create(SEXP datasets_sexp, SEXP schm_sexp){
	Rf_error("Cannot call dataset___UnionDataset__create(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::Dataset> dataset___InMemoryDataset__create(const std::shared_ptr<arrow::Table>& table);
extern "C" SEXP _arrow_dataset___InMemoryDataset__create(SEXP table_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	return cpp11::as_sexp(dataset___InMemoryDataset__create(table));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___InMemoryDataset__create(SEXP table_sexp){
	Rf_error("Cannot call dataset___InMemoryDataset__create(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
cpp11::list dataset___UnionDataset__children(const std::shared_ptr<ds::UnionDataset>& ds);
extern "C" SEXP _arrow_dataset___UnionDataset__children(SEXP ds_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::UnionDataset>&>::type ds(ds_sexp);
	return cpp11::as_sexp(dataset___UnionDataset__children(ds));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___UnionDataset__children(SEXP ds_sexp){
	Rf_error("Cannot call dataset___UnionDataset__children(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::FileFormat> dataset___FileSystemDataset__format(const std::shared_ptr<ds::FileSystemDataset>& dataset);
extern "C" SEXP _arrow_dataset___FileSystemDataset__format(SEXP dataset_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::FileSystemDataset>&>::type dataset(dataset_sexp);
	return cpp11::as_sexp(dataset___FileSystemDataset__format(dataset));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___FileSystemDataset__format(SEXP dataset_sexp){
	Rf_error("Cannot call dataset___FileSystemDataset__format(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<fs::FileSystem> dataset___FileSystemDataset__filesystem(const std::shared_ptr<ds::FileSystemDataset>& dataset);
extern "C" SEXP _arrow_dataset___FileSystemDataset__filesystem(SEXP dataset_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::FileSystemDataset>&>::type dataset(dataset_sexp);
	return cpp11::as_sexp(dataset___FileSystemDataset__filesystem(dataset));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___FileSystemDataset__filesystem(SEXP dataset_sexp){
	Rf_error("Cannot call dataset___FileSystemDataset__filesystem(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::vector<std::string> dataset___FileSystemDataset__files(const std::shared_ptr<ds::FileSystemDataset>& dataset);
extern "C" SEXP _arrow_dataset___FileSystemDataset__files(SEXP dataset_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::FileSystemDataset>&>::type dataset(dataset_sexp);
	return cpp11::as_sexp(dataset___FileSystemDataset__files(dataset));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___FileSystemDataset__files(SEXP dataset_sexp){
	Rf_error("Cannot call dataset___FileSystemDataset__files(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::Dataset> dataset___DatasetFactory__Finish1(const std::shared_ptr<ds::DatasetFactory>& factory, bool unify_schemas);
extern "C" SEXP _arrow_dataset___DatasetFactory__Finish1(SEXP factory_sexp, SEXP unify_schemas_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::DatasetFactory>&>::type factory(factory_sexp);
	arrow::r::Input<bool>::type unify_schemas(unify_schemas_sexp);
	return cpp11::as_sexp(dataset___DatasetFactory__Finish1(factory, unify_schemas));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___DatasetFactory__Finish1(SEXP factory_sexp, SEXP unify_schemas_sexp){
	Rf_error("Cannot call dataset___DatasetFactory__Finish1(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::Dataset> dataset___DatasetFactory__Finish2(const std::shared_ptr<ds::DatasetFactory>& factory, const std::shared_ptr<arrow::Schema>& schema);
extern "C" SEXP _arrow_dataset___DatasetFactory__Finish2(SEXP factory_sexp, SEXP schema_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::DatasetFactory>&>::type factory(factory_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schema(schema_sexp);
	return cpp11::as_sexp(dataset___DatasetFactory__Finish2(factory, schema));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___DatasetFactory__Finish2(SEXP factory_sexp, SEXP schema_sexp){
	Rf_error("Cannot call dataset___DatasetFactory__Finish2(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<arrow::Schema> dataset___DatasetFactory__Inspect(const std::shared_ptr<ds::DatasetFactory>& factory, bool unify_schemas);
extern "C" SEXP _arrow_dataset___DatasetFactory__Inspect(SEXP factory_sexp, SEXP unify_schemas_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::DatasetFactory>&>::type factory(factory_sexp);
	arrow::r::Input<bool>::type unify_schemas(unify_schemas_sexp);
	return cpp11::as_sexp(dataset___DatasetFactory__Inspect(factory, unify_schemas));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___DatasetFactory__Inspect(SEXP factory_sexp, SEXP unify_schemas_sexp){
	Rf_error("Cannot call dataset___DatasetFactory__Inspect(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::DatasetFactory> dataset___UnionDatasetFactory__Make(const std::vector<std::shared_ptr<ds::DatasetFactory>>& children);
extern "C" SEXP _arrow_dataset___UnionDatasetFactory__Make(SEXP children_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::vector<std::shared_ptr<ds::DatasetFactory>>&>::type children(children_sexp);
	return cpp11::as_sexp(dataset___UnionDatasetFactory__Make(children));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___UnionDatasetFactory__Make(SEXP children_sexp){
	Rf_error("Cannot call dataset___UnionDatasetFactory__Make(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::FileSystemDatasetFactory> dataset___FileSystemDatasetFactory__Make0(const std::shared_ptr<fs::FileSystem>& fs, const std::vector<std::string>& paths, const std::shared_ptr<ds::FileFormat>& format);
extern "C" SEXP _arrow_dataset___FileSystemDatasetFactory__Make0(SEXP fs_sexp, SEXP paths_sexp, SEXP format_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type fs(fs_sexp);
	arrow::r::Input<const std::vector<std::string>&>::type paths(paths_sexp);
	arrow::r::Input<const std::shared_ptr<ds::FileFormat>&>::type format(format_sexp);
	return cpp11::as_sexp(dataset___FileSystemDatasetFactory__Make0(fs, paths, format));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___FileSystemDatasetFactory__Make0(SEXP fs_sexp, SEXP paths_sexp, SEXP format_sexp){
	Rf_error("Cannot call dataset___FileSystemDatasetFactory__Make0(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::FileSystemDatasetFactory> dataset___FileSystemDatasetFactory__Make2(const std::shared_ptr<fs::FileSystem>& fs, const std::shared_ptr<fs::FileSelector>& selector, const std::shared_ptr<ds::FileFormat>& format, const std::shared_ptr<ds::Partitioning>& partitioning);
extern "C" SEXP _arrow_dataset___FileSystemDatasetFactory__Make2(SEXP fs_sexp, SEXP selector_sexp, SEXP format_sexp, SEXP partitioning_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type fs(fs_sexp);
	arrow::r::Input<const std::shared_ptr<fs::FileSelector>&>::type selector(selector_sexp);
	arrow::r::Input<const std::shared_ptr<ds::FileFormat>&>::type format(format_sexp);
	arrow::r::Input<const std::shared_ptr<ds::Partitioning>&>::type partitioning(partitioning_sexp);
	return cpp11::as_sexp(dataset___FileSystemDatasetFactory__Make2(fs, selector, format, partitioning));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___FileSystemDatasetFactory__Make2(SEXP fs_sexp, SEXP selector_sexp, SEXP format_sexp, SEXP partitioning_sexp){
	Rf_error("Cannot call dataset___FileSystemDatasetFactory__Make2(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::FileSystemDatasetFactory> dataset___FileSystemDatasetFactory__Make1(const std::shared_ptr<fs::FileSystem>& fs, const std::shared_ptr<fs::FileSelector>& selector, const std::shared_ptr<ds::FileFormat>& format);
extern "C" SEXP _arrow_dataset___FileSystemDatasetFactory__Make1(SEXP fs_sexp, SEXP selector_sexp, SEXP format_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type fs(fs_sexp);
	arrow::r::Input<const std::shared_ptr<fs::FileSelector>&>::type selector(selector_sexp);
	arrow::r::Input<const std::shared_ptr<ds::FileFormat>&>::type format(format_sexp);
	return cpp11::as_sexp(dataset___FileSystemDatasetFactory__Make1(fs, selector, format));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___FileSystemDatasetFactory__Make1(SEXP fs_sexp, SEXP selector_sexp, SEXP format_sexp){
	Rf_error("Cannot call dataset___FileSystemDatasetFactory__Make1(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::FileSystemDatasetFactory> dataset___FileSystemDatasetFactory__Make3(const std::shared_ptr<fs::FileSystem>& fs, const std::shared_ptr<fs::FileSelector>& selector, const std::shared_ptr<ds::FileFormat>& format, const std::shared_ptr<ds::PartitioningFactory>& factory);
extern "C" SEXP _arrow_dataset___FileSystemDatasetFactory__Make3(SEXP fs_sexp, SEXP selector_sexp, SEXP format_sexp, SEXP factory_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type fs(fs_sexp);
	arrow::r::Input<const std::shared_ptr<fs::FileSelector>&>::type selector(selector_sexp);
	arrow::r::Input<const std::shared_ptr<ds::FileFormat>&>::type format(format_sexp);
	arrow::r::Input<const std::shared_ptr<ds::PartitioningFactory>&>::type factory(factory_sexp);
	return cpp11::as_sexp(dataset___FileSystemDatasetFactory__Make3(fs, selector, format, factory));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___FileSystemDatasetFactory__Make3(SEXP fs_sexp, SEXP selector_sexp, SEXP format_sexp, SEXP factory_sexp){
	Rf_error("Cannot call dataset___FileSystemDatasetFactory__Make3(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::string dataset___FileFormat__type_name(const std::shared_ptr<ds::FileFormat>& format);
extern "C" SEXP _arrow_dataset___FileFormat__type_name(SEXP format_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::FileFormat>&>::type format(format_sexp);
	return cpp11::as_sexp(dataset___FileFormat__type_name(format));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___FileFormat__type_name(SEXP format_sexp){
	Rf_error("Cannot call dataset___FileFormat__type_name(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::FileWriteOptions> dataset___FileFormat__DefaultWriteOptions(const std::shared_ptr<ds::FileFormat>& fmt);
extern "C" SEXP _arrow_dataset___FileFormat__DefaultWriteOptions(SEXP fmt_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::FileFormat>&>::type fmt(fmt_sexp);
	return cpp11::as_sexp(dataset___FileFormat__DefaultWriteOptions(fmt));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___FileFormat__DefaultWriteOptions(SEXP fmt_sexp){
	Rf_error("Cannot call dataset___FileFormat__DefaultWriteOptions(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::ParquetFileFormat> dataset___ParquetFileFormat__Make(const std::shared_ptr<ds::ParquetFragmentScanOptions>& options, cpp11::strings dict_columns);
extern "C" SEXP _arrow_dataset___ParquetFileFormat__Make(SEXP options_sexp, SEXP dict_columns_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::ParquetFragmentScanOptions>&>::type options(options_sexp);
	arrow::r::Input<cpp11::strings>::type dict_columns(dict_columns_sexp);
	return cpp11::as_sexp(dataset___ParquetFileFormat__Make(options, dict_columns));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___ParquetFileFormat__Make(SEXP options_sexp, SEXP dict_columns_sexp){
	Rf_error("Cannot call dataset___ParquetFileFormat__Make(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::string dataset___FileWriteOptions__type_name(const std::shared_ptr<ds::FileWriteOptions>& options);
extern "C" SEXP _arrow_dataset___FileWriteOptions__type_name(SEXP options_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::FileWriteOptions>&>::type options(options_sexp);
	return cpp11::as_sexp(dataset___FileWriteOptions__type_name(options));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___FileWriteOptions__type_name(SEXP options_sexp){
	Rf_error("Cannot call dataset___FileWriteOptions__type_name(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
void dataset___ParquetFileWriteOptions__update(const std::shared_ptr<ds::ParquetFileWriteOptions>& options, const std::shared_ptr<parquet::WriterProperties>& writer_props, const std::shared_ptr<parquet::ArrowWriterProperties>& arrow_writer_props);
extern "C" SEXP _arrow_dataset___ParquetFileWriteOptions__update(SEXP options_sexp, SEXP writer_props_sexp, SEXP arrow_writer_props_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::ParquetFileWriteOptions>&>::type options(options_sexp);
	arrow::r::Input<const std::shared_ptr<parquet::WriterProperties>&>::type writer_props(writer_props_sexp);
	arrow::r::Input<const std::shared_ptr<parquet::ArrowWriterProperties>&>::type arrow_writer_props(arrow_writer_props_sexp);
	dataset___ParquetFileWriteOptions__update(options, writer_props, arrow_writer_props);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___ParquetFileWriteOptions__update(SEXP options_sexp, SEXP writer_props_sexp, SEXP arrow_writer_props_sexp){
	Rf_error("Cannot call dataset___ParquetFileWriteOptions__update(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
void dataset___IpcFileWriteOptions__update2(const std::shared_ptr<ds::IpcFileWriteOptions>& ipc_options, bool use_legacy_format, const std::shared_ptr<arrow::util::Codec>& codec, arrow::ipc::MetadataVersion metadata_version);
extern "C" SEXP _arrow_dataset___IpcFileWriteOptions__update2(SEXP ipc_options_sexp, SEXP use_legacy_format_sexp, SEXP codec_sexp, SEXP metadata_version_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::IpcFileWriteOptions>&>::type ipc_options(ipc_options_sexp);
	arrow::r::Input<bool>::type use_legacy_format(use_legacy_format_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::util::Codec>&>::type codec(codec_sexp);
	arrow::r::Input<arrow::ipc::MetadataVersion>::type metadata_version(metadata_version_sexp);
	dataset___IpcFileWriteOptions__update2(ipc_options, use_legacy_format, codec, metadata_version);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___IpcFileWriteOptions__update2(SEXP ipc_options_sexp, SEXP use_legacy_format_sexp, SEXP codec_sexp, SEXP metadata_version_sexp){
	Rf_error("Cannot call dataset___IpcFileWriteOptions__update2(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
void dataset___IpcFileWriteOptions__update1(const std::shared_ptr<ds::IpcFileWriteOptions>& ipc_options, bool use_legacy_format, arrow::ipc::MetadataVersion metadata_version);
extern "C" SEXP _arrow_dataset___IpcFileWriteOptions__update1(SEXP ipc_options_sexp, SEXP use_legacy_format_sexp, SEXP metadata_version_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::IpcFileWriteOptions>&>::type ipc_options(ipc_options_sexp);
	arrow::r::Input<bool>::type use_legacy_format(use_legacy_format_sexp);
	arrow::r::Input<arrow::ipc::MetadataVersion>::type metadata_version(metadata_version_sexp);
	dataset___IpcFileWriteOptions__update1(ipc_options, use_legacy_format, metadata_version);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___IpcFileWriteOptions__update1(SEXP ipc_options_sexp, SEXP use_legacy_format_sexp, SEXP metadata_version_sexp){
	Rf_error("Cannot call dataset___IpcFileWriteOptions__update1(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::IpcFileFormat> dataset___IpcFileFormat__Make();
extern "C" SEXP _arrow_dataset___IpcFileFormat__Make(){
BEGIN_CPP11
	return cpp11::as_sexp(dataset___IpcFileFormat__Make());
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___IpcFileFormat__Make(){
	Rf_error("Cannot call dataset___IpcFileFormat__Make(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::CsvFileFormat> dataset___CsvFileFormat__Make(const std::shared_ptr<arrow::csv::ParseOptions>& parse_options, const std::shared_ptr<arrow::csv::ConvertOptions>& convert_options, const std::shared_ptr<arrow::csv::ReadOptions>& read_options);
extern "C" SEXP _arrow_dataset___CsvFileFormat__Make(SEXP parse_options_sexp, SEXP convert_options_sexp, SEXP read_options_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::csv::ParseOptions>&>::type parse_options(parse_options_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::csv::ConvertOptions>&>::type convert_options(convert_options_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::csv::ReadOptions>&>::type read_options(read_options_sexp);
	return cpp11::as_sexp(dataset___CsvFileFormat__Make(parse_options, convert_options, read_options));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___CsvFileFormat__Make(SEXP parse_options_sexp, SEXP convert_options_sexp, SEXP read_options_sexp){
	Rf_error("Cannot call dataset___CsvFileFormat__Make(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::string dataset___FragmentScanOptions__type_name(const std::shared_ptr<ds::FragmentScanOptions>& fragment_scan_options);
extern "C" SEXP _arrow_dataset___FragmentScanOptions__type_name(SEXP fragment_scan_options_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::FragmentScanOptions>&>::type fragment_scan_options(fragment_scan_options_sexp);
	return cpp11::as_sexp(dataset___FragmentScanOptions__type_name(fragment_scan_options));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___FragmentScanOptions__type_name(SEXP fragment_scan_options_sexp){
	Rf_error("Cannot call dataset___FragmentScanOptions__type_name(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::CsvFragmentScanOptions> dataset___CsvFragmentScanOptions__Make(const std::shared_ptr<arrow::csv::ConvertOptions>& convert_options, const std::shared_ptr<arrow::csv::ReadOptions>& read_options);
extern "C" SEXP _arrow_dataset___CsvFragmentScanOptions__Make(SEXP convert_options_sexp, SEXP read_options_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::csv::ConvertOptions>&>::type convert_options(convert_options_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::csv::ReadOptions>&>::type read_options(read_options_sexp);
	return cpp11::as_sexp(dataset___CsvFragmentScanOptions__Make(convert_options, read_options));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___CsvFragmentScanOptions__Make(SEXP convert_options_sexp, SEXP read_options_sexp){
	Rf_error("Cannot call dataset___CsvFragmentScanOptions__Make(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::ParquetFragmentScanOptions> dataset___ParquetFragmentScanOptions__Make(bool use_buffered_stream, int64_t buffer_size, bool pre_buffer);
extern "C" SEXP _arrow_dataset___ParquetFragmentScanOptions__Make(SEXP use_buffered_stream_sexp, SEXP buffer_size_sexp, SEXP pre_buffer_sexp){
BEGIN_CPP11
	arrow::r::Input<bool>::type use_buffered_stream(use_buffered_stream_sexp);
	arrow::r::Input<int64_t>::type buffer_size(buffer_size_sexp);
	arrow::r::Input<bool>::type pre_buffer(pre_buffer_sexp);
	return cpp11::as_sexp(dataset___ParquetFragmentScanOptions__Make(use_buffered_stream, buffer_size, pre_buffer));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___ParquetFragmentScanOptions__Make(SEXP use_buffered_stream_sexp, SEXP buffer_size_sexp, SEXP pre_buffer_sexp){
	Rf_error("Cannot call dataset___ParquetFragmentScanOptions__Make(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::DirectoryPartitioning> dataset___DirectoryPartitioning(const std::shared_ptr<arrow::Schema>& schm);
extern "C" SEXP _arrow_dataset___DirectoryPartitioning(SEXP schm_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schm(schm_sexp);
	return cpp11::as_sexp(dataset___DirectoryPartitioning(schm));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___DirectoryPartitioning(SEXP schm_sexp){
	Rf_error("Cannot call dataset___DirectoryPartitioning(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::PartitioningFactory> dataset___DirectoryPartitioning__MakeFactory(const std::vector<std::string>& field_names);
extern "C" SEXP _arrow_dataset___DirectoryPartitioning__MakeFactory(SEXP field_names_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::vector<std::string>&>::type field_names(field_names_sexp);
	return cpp11::as_sexp(dataset___DirectoryPartitioning__MakeFactory(field_names));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___DirectoryPartitioning__MakeFactory(SEXP field_names_sexp){
	Rf_error("Cannot call dataset___DirectoryPartitioning__MakeFactory(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::HivePartitioning> dataset___HivePartitioning(const std::shared_ptr<arrow::Schema>& schm, const std::string& null_fallback);
extern "C" SEXP _arrow_dataset___HivePartitioning(SEXP schm_sexp, SEXP null_fallback_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schm(schm_sexp);
	arrow::r::Input<const std::string&>::type null_fallback(null_fallback_sexp);
	return cpp11::as_sexp(dataset___HivePartitioning(schm, null_fallback));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___HivePartitioning(SEXP schm_sexp, SEXP null_fallback_sexp){
	Rf_error("Cannot call dataset___HivePartitioning(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::PartitioningFactory> dataset___HivePartitioning__MakeFactory(const std::string& null_fallback);
extern "C" SEXP _arrow_dataset___HivePartitioning__MakeFactory(SEXP null_fallback_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::string&>::type null_fallback(null_fallback_sexp);
	return cpp11::as_sexp(dataset___HivePartitioning__MakeFactory(null_fallback));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___HivePartitioning__MakeFactory(SEXP null_fallback_sexp){
	Rf_error("Cannot call dataset___HivePartitioning__MakeFactory(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
void dataset___ScannerBuilder__ProjectNames(const std::shared_ptr<ds::ScannerBuilder>& sb, const std::vector<std::string>& cols);
extern "C" SEXP _arrow_dataset___ScannerBuilder__ProjectNames(SEXP sb_sexp, SEXP cols_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::ScannerBuilder>&>::type sb(sb_sexp);
	arrow::r::Input<const std::vector<std::string>&>::type cols(cols_sexp);
	dataset___ScannerBuilder__ProjectNames(sb, cols);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___ScannerBuilder__ProjectNames(SEXP sb_sexp, SEXP cols_sexp){
	Rf_error("Cannot call dataset___ScannerBuilder__ProjectNames(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
void dataset___ScannerBuilder__ProjectExprs(const std::shared_ptr<ds::ScannerBuilder>& sb, const std::vector<std::shared_ptr<ds::Expression>>& exprs, const std::vector<std::string>& names);
extern "C" SEXP _arrow_dataset___ScannerBuilder__ProjectExprs(SEXP sb_sexp, SEXP exprs_sexp, SEXP names_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::ScannerBuilder>&>::type sb(sb_sexp);
	arrow::r::Input<const std::vector<std::shared_ptr<ds::Expression>>&>::type exprs(exprs_sexp);
	arrow::r::Input<const std::vector<std::string>&>::type names(names_sexp);
	dataset___ScannerBuilder__ProjectExprs(sb, exprs, names);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___ScannerBuilder__ProjectExprs(SEXP sb_sexp, SEXP exprs_sexp, SEXP names_sexp){
	Rf_error("Cannot call dataset___ScannerBuilder__ProjectExprs(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
void dataset___ScannerBuilder__Filter(const std::shared_ptr<ds::ScannerBuilder>& sb, const std::shared_ptr<ds::Expression>& expr);
extern "C" SEXP _arrow_dataset___ScannerBuilder__Filter(SEXP sb_sexp, SEXP expr_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::ScannerBuilder>&>::type sb(sb_sexp);
	arrow::r::Input<const std::shared_ptr<ds::Expression>&>::type expr(expr_sexp);
	dataset___ScannerBuilder__Filter(sb, expr);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___ScannerBuilder__Filter(SEXP sb_sexp, SEXP expr_sexp){
	Rf_error("Cannot call dataset___ScannerBuilder__Filter(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
void dataset___ScannerBuilder__UseThreads(const std::shared_ptr<ds::ScannerBuilder>& sb, bool threads);
extern "C" SEXP _arrow_dataset___ScannerBuilder__UseThreads(SEXP sb_sexp, SEXP threads_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::ScannerBuilder>&>::type sb(sb_sexp);
	arrow::r::Input<bool>::type threads(threads_sexp);
	dataset___ScannerBuilder__UseThreads(sb, threads);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___ScannerBuilder__UseThreads(SEXP sb_sexp, SEXP threads_sexp){
	Rf_error("Cannot call dataset___ScannerBuilder__UseThreads(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
void dataset___ScannerBuilder__BatchSize(const std::shared_ptr<ds::ScannerBuilder>& sb, int64_t batch_size);
extern "C" SEXP _arrow_dataset___ScannerBuilder__BatchSize(SEXP sb_sexp, SEXP batch_size_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::ScannerBuilder>&>::type sb(sb_sexp);
	arrow::r::Input<int64_t>::type batch_size(batch_size_sexp);
	dataset___ScannerBuilder__BatchSize(sb, batch_size);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___ScannerBuilder__BatchSize(SEXP sb_sexp, SEXP batch_size_sexp){
	Rf_error("Cannot call dataset___ScannerBuilder__BatchSize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
void dataset___ScannerBuilder__FragmentScanOptions(const std::shared_ptr<ds::ScannerBuilder>& sb, const std::shared_ptr<ds::FragmentScanOptions>& options);
extern "C" SEXP _arrow_dataset___ScannerBuilder__FragmentScanOptions(SEXP sb_sexp, SEXP options_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::ScannerBuilder>&>::type sb(sb_sexp);
	arrow::r::Input<const std::shared_ptr<ds::FragmentScanOptions>&>::type options(options_sexp);
	dataset___ScannerBuilder__FragmentScanOptions(sb, options);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___ScannerBuilder__FragmentScanOptions(SEXP sb_sexp, SEXP options_sexp){
	Rf_error("Cannot call dataset___ScannerBuilder__FragmentScanOptions(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<arrow::Schema> dataset___ScannerBuilder__schema(const std::shared_ptr<ds::ScannerBuilder>& sb);
extern "C" SEXP _arrow_dataset___ScannerBuilder__schema(SEXP sb_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::ScannerBuilder>&>::type sb(sb_sexp);
	return cpp11::as_sexp(dataset___ScannerBuilder__schema(sb));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___ScannerBuilder__schema(SEXP sb_sexp){
	Rf_error("Cannot call dataset___ScannerBuilder__schema(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::Scanner> dataset___ScannerBuilder__Finish(const std::shared_ptr<ds::ScannerBuilder>& sb);
extern "C" SEXP _arrow_dataset___ScannerBuilder__Finish(SEXP sb_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::ScannerBuilder>&>::type sb(sb_sexp);
	return cpp11::as_sexp(dataset___ScannerBuilder__Finish(sb));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___ScannerBuilder__Finish(SEXP sb_sexp){
	Rf_error("Cannot call dataset___ScannerBuilder__Finish(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<arrow::Table> dataset___Scanner__ToTable(const std::shared_ptr<ds::Scanner>& scanner);
extern "C" SEXP _arrow_dataset___Scanner__ToTable(SEXP scanner_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::Scanner>&>::type scanner(scanner_sexp);
	return cpp11::as_sexp(dataset___Scanner__ToTable(scanner));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___Scanner__ToTable(SEXP scanner_sexp){
	Rf_error("Cannot call dataset___Scanner__ToTable(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<arrow::Table> dataset___Scanner__head(const std::shared_ptr<ds::Scanner>& scanner, int n);
extern "C" SEXP _arrow_dataset___Scanner__head(SEXP scanner_sexp, SEXP n_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::Scanner>&>::type scanner(scanner_sexp);
	arrow::r::Input<int>::type n(n_sexp);
	return cpp11::as_sexp(dataset___Scanner__head(scanner, n));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___Scanner__head(SEXP scanner_sexp, SEXP n_sexp){
	Rf_error("Cannot call dataset___Scanner__head(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
cpp11::list dataset___Scanner__Scan(const std::shared_ptr<ds::Scanner>& scanner);
extern "C" SEXP _arrow_dataset___Scanner__Scan(SEXP scanner_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::Scanner>&>::type scanner(scanner_sexp);
	return cpp11::as_sexp(dataset___Scanner__Scan(scanner));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___Scanner__Scan(SEXP scanner_sexp){
	Rf_error("Cannot call dataset___Scanner__Scan(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<arrow::Schema> dataset___Scanner__schema(const std::shared_ptr<ds::Scanner>& sc);
extern "C" SEXP _arrow_dataset___Scanner__schema(SEXP sc_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::Scanner>&>::type sc(sc_sexp);
	return cpp11::as_sexp(dataset___Scanner__schema(sc));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___Scanner__schema(SEXP sc_sexp){
	Rf_error("Cannot call dataset___Scanner__schema(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
cpp11::list dataset___ScanTask__get_batches(const std::shared_ptr<ds::ScanTask>& scan_task);
extern "C" SEXP _arrow_dataset___ScanTask__get_batches(SEXP scan_task_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::ScanTask>&>::type scan_task(scan_task_sexp);
	return cpp11::as_sexp(dataset___ScanTask__get_batches(scan_task));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___ScanTask__get_batches(SEXP scan_task_sexp){
	Rf_error("Cannot call dataset___ScanTask__get_batches(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// dataset.cpp
#if defined(ARROW_R_WITH_DATASET)
void dataset___Dataset__Write(const std::shared_ptr<ds::FileWriteOptions>& file_write_options, const std::shared_ptr<fs::FileSystem>& filesystem, std::string base_dir, const std::shared_ptr<ds::Partitioning>& partitioning, std::string basename_template, const std::shared_ptr<ds::Scanner>& scanner);
extern "C" SEXP _arrow_dataset___Dataset__Write(SEXP file_write_options_sexp, SEXP filesystem_sexp, SEXP base_dir_sexp, SEXP partitioning_sexp, SEXP basename_template_sexp, SEXP scanner_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::FileWriteOptions>&>::type file_write_options(file_write_options_sexp);
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type filesystem(filesystem_sexp);
	arrow::r::Input<std::string>::type base_dir(base_dir_sexp);
	arrow::r::Input<const std::shared_ptr<ds::Partitioning>&>::type partitioning(partitioning_sexp);
	arrow::r::Input<std::string>::type basename_template(basename_template_sexp);
	arrow::r::Input<const std::shared_ptr<ds::Scanner>&>::type scanner(scanner_sexp);
	dataset___Dataset__Write(file_write_options, filesystem, base_dir, partitioning, basename_template, scanner);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___Dataset__Write(SEXP file_write_options_sexp, SEXP filesystem_sexp, SEXP base_dir_sexp, SEXP partitioning_sexp, SEXP basename_template_sexp, SEXP scanner_sexp){
	Rf_error("Cannot call dataset___Dataset__Write(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Int8__initialize();
extern "C" SEXP _arrow_Int8__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(Int8__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_Int8__initialize(){
	Rf_error("Cannot call Int8__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Int16__initialize();
extern "C" SEXP _arrow_Int16__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(Int16__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_Int16__initialize(){
	Rf_error("Cannot call Int16__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Int32__initialize();
extern "C" SEXP _arrow_Int32__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(Int32__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_Int32__initialize(){
	Rf_error("Cannot call Int32__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Int64__initialize();
extern "C" SEXP _arrow_Int64__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(Int64__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_Int64__initialize(){
	Rf_error("Cannot call Int64__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> UInt8__initialize();
extern "C" SEXP _arrow_UInt8__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(UInt8__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_UInt8__initialize(){
	Rf_error("Cannot call UInt8__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> UInt16__initialize();
extern "C" SEXP _arrow_UInt16__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(UInt16__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_UInt16__initialize(){
	Rf_error("Cannot call UInt16__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> UInt32__initialize();
extern "C" SEXP _arrow_UInt32__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(UInt32__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_UInt32__initialize(){
	Rf_error("Cannot call UInt32__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> UInt64__initialize();
extern "C" SEXP _arrow_UInt64__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(UInt64__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_UInt64__initialize(){
	Rf_error("Cannot call UInt64__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Float16__initialize();
extern "C" SEXP _arrow_Float16__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(Float16__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_Float16__initialize(){
	Rf_error("Cannot call Float16__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Float32__initialize();
extern "C" SEXP _arrow_Float32__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(Float32__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_Float32__initialize(){
	Rf_error("Cannot call Float32__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Float64__initialize();
extern "C" SEXP _arrow_Float64__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(Float64__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_Float64__initialize(){
	Rf_error("Cannot call Float64__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Boolean__initialize();
extern "C" SEXP _arrow_Boolean__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(Boolean__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_Boolean__initialize(){
	Rf_error("Cannot call Boolean__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Utf8__initialize();
extern "C" SEXP _arrow_Utf8__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(Utf8__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_Utf8__initialize(){
	Rf_error("Cannot call Utf8__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> LargeUtf8__initialize();
extern "C" SEXP _arrow_LargeUtf8__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(LargeUtf8__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_LargeUtf8__initialize(){
	Rf_error("Cannot call LargeUtf8__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Binary__initialize();
extern "C" SEXP _arrow_Binary__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(Binary__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_Binary__initialize(){
	Rf_error("Cannot call Binary__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> LargeBinary__initialize();
extern "C" SEXP _arrow_LargeBinary__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(LargeBinary__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_LargeBinary__initialize(){
	Rf_error("Cannot call LargeBinary__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Date32__initialize();
extern "C" SEXP _arrow_Date32__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(Date32__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_Date32__initialize(){
	Rf_error("Cannot call Date32__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Date64__initialize();
extern "C" SEXP _arrow_Date64__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(Date64__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_Date64__initialize(){
	Rf_error("Cannot call Date64__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Null__initialize();
extern "C" SEXP _arrow_Null__initialize(){
BEGIN_CPP11
	return cpp11::as_sexp(Null__initialize());
END_CPP11
}
#else
extern "C" SEXP _arrow_Null__initialize(){
	Rf_error("Cannot call Null__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Decimal128Type__initialize(int32_t precision, int32_t scale);
extern "C" SEXP _arrow_Decimal128Type__initialize(SEXP precision_sexp, SEXP scale_sexp){
BEGIN_CPP11
	arrow::r::Input<int32_t>::type precision(precision_sexp);
	arrow::r::Input<int32_t>::type scale(scale_sexp);
	return cpp11::as_sexp(Decimal128Type__initialize(precision, scale));
END_CPP11
}
#else
extern "C" SEXP _arrow_Decimal128Type__initialize(SEXP precision_sexp, SEXP scale_sexp){
	Rf_error("Cannot call Decimal128Type__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> FixedSizeBinary__initialize(R_xlen_t byte_width);
extern "C" SEXP _arrow_FixedSizeBinary__initialize(SEXP byte_width_sexp){
BEGIN_CPP11
	arrow::r::Input<R_xlen_t>::type byte_width(byte_width_sexp);
	return cpp11::as_sexp(FixedSizeBinary__initialize(byte_width));
END_CPP11
}
#else
extern "C" SEXP _arrow_FixedSizeBinary__initialize(SEXP byte_width_sexp){
	Rf_error("Cannot call FixedSizeBinary__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Timestamp__initialize(arrow::TimeUnit::type unit, const std::string& timezone);
extern "C" SEXP _arrow_Timestamp__initialize(SEXP unit_sexp, SEXP timezone_sexp){
BEGIN_CPP11
	arrow::r::Input<arrow::TimeUnit::type>::type unit(unit_sexp);
	arrow::r::Input<const std::string&>::type timezone(timezone_sexp);
	return cpp11::as_sexp(Timestamp__initialize(unit, timezone));
END_CPP11
}
#else
extern "C" SEXP _arrow_Timestamp__initialize(SEXP unit_sexp, SEXP timezone_sexp){
	Rf_error("Cannot call Timestamp__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Time32__initialize(arrow::TimeUnit::type unit);
extern "C" SEXP _arrow_Time32__initialize(SEXP unit_sexp){
BEGIN_CPP11
	arrow::r::Input<arrow::TimeUnit::type>::type unit(unit_sexp);
	return cpp11::as_sexp(Time32__initialize(unit));
END_CPP11
}
#else
extern "C" SEXP _arrow_Time32__initialize(SEXP unit_sexp){
	Rf_error("Cannot call Time32__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Time64__initialize(arrow::TimeUnit::type unit);
extern "C" SEXP _arrow_Time64__initialize(SEXP unit_sexp){
BEGIN_CPP11
	arrow::r::Input<arrow::TimeUnit::type>::type unit(unit_sexp);
	return cpp11::as_sexp(Time64__initialize(unit));
END_CPP11
}
#else
extern "C" SEXP _arrow_Time64__initialize(SEXP unit_sexp){
	Rf_error("Cannot call Time64__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> list__(SEXP x);
extern "C" SEXP _arrow_list__(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<SEXP>::type x(x_sexp);
	return cpp11::as_sexp(list__(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_list__(SEXP x_sexp){
	Rf_error("Cannot call list__(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> large_list__(SEXP x);
extern "C" SEXP _arrow_large_list__(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<SEXP>::type x(x_sexp);
	return cpp11::as_sexp(large_list__(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_large_list__(SEXP x_sexp){
	Rf_error("Cannot call large_list__(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> fixed_size_list__(SEXP x, int list_size);
extern "C" SEXP _arrow_fixed_size_list__(SEXP x_sexp, SEXP list_size_sexp){
BEGIN_CPP11
	arrow::r::Input<SEXP>::type x(x_sexp);
	arrow::r::Input<int>::type list_size(list_size_sexp);
	return cpp11::as_sexp(fixed_size_list__(x, list_size));
END_CPP11
}
#else
extern "C" SEXP _arrow_fixed_size_list__(SEXP x_sexp, SEXP list_size_sexp){
	Rf_error("Cannot call fixed_size_list__(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> struct__(const std::vector<std::shared_ptr<arrow::Field>>& fields);
extern "C" SEXP _arrow_struct__(SEXP fields_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::vector<std::shared_ptr<arrow::Field>>&>::type fields(fields_sexp);
	return cpp11::as_sexp(struct__(fields));
END_CPP11
}
#else
extern "C" SEXP _arrow_struct__(SEXP fields_sexp){
	Rf_error("Cannot call struct__(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string DataType__ToString(const std::shared_ptr<arrow::DataType>& type);
extern "C" SEXP _arrow_DataType__ToString(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::DataType>&>::type type(type_sexp);
	return cpp11::as_sexp(DataType__ToString(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_DataType__ToString(SEXP type_sexp){
	Rf_error("Cannot call DataType__ToString(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string DataType__name(const std::shared_ptr<arrow::DataType>& type);
extern "C" SEXP _arrow_DataType__name(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::DataType>&>::type type(type_sexp);
	return cpp11::as_sexp(DataType__name(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_DataType__name(SEXP type_sexp){
	Rf_error("Cannot call DataType__name(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
bool DataType__Equals(const std::shared_ptr<arrow::DataType>& lhs, const std::shared_ptr<arrow::DataType>& rhs);
extern "C" SEXP _arrow_DataType__Equals(SEXP lhs_sexp, SEXP rhs_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::DataType>&>::type lhs(lhs_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::DataType>&>::type rhs(rhs_sexp);
	return cpp11::as_sexp(DataType__Equals(lhs, rhs));
END_CPP11
}
#else
extern "C" SEXP _arrow_DataType__Equals(SEXP lhs_sexp, SEXP rhs_sexp){
	Rf_error("Cannot call DataType__Equals(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
int DataType__num_fields(const std::shared_ptr<arrow::DataType>& type);
extern "C" SEXP _arrow_DataType__num_fields(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::DataType>&>::type type(type_sexp);
	return cpp11::as_sexp(DataType__num_fields(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_DataType__num_fields(SEXP type_sexp){
	Rf_error("Cannot call DataType__num_fields(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::list DataType__fields(const std::shared_ptr<arrow::DataType>& type);
extern "C" SEXP _arrow_DataType__fields(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::DataType>&>::type type(type_sexp);
	return cpp11::as_sexp(DataType__fields(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_DataType__fields(SEXP type_sexp){
	Rf_error("Cannot call DataType__fields(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
arrow::Type::type DataType__id(const std::shared_ptr<arrow::DataType>& type);
extern "C" SEXP _arrow_DataType__id(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::DataType>&>::type type(type_sexp);
	return cpp11::as_sexp(DataType__id(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_DataType__id(SEXP type_sexp){
	Rf_error("Cannot call DataType__id(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string ListType__ToString(const std::shared_ptr<arrow::ListType>& type);
extern "C" SEXP _arrow_ListType__ToString(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ListType>&>::type type(type_sexp);
	return cpp11::as_sexp(ListType__ToString(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_ListType__ToString(SEXP type_sexp){
	Rf_error("Cannot call ListType__ToString(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
int FixedWidthType__bit_width(const std::shared_ptr<arrow::FixedWidthType>& type);
extern "C" SEXP _arrow_FixedWidthType__bit_width(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::FixedWidthType>&>::type type(type_sexp);
	return cpp11::as_sexp(FixedWidthType__bit_width(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_FixedWidthType__bit_width(SEXP type_sexp){
	Rf_error("Cannot call FixedWidthType__bit_width(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
arrow::DateUnit DateType__unit(const std::shared_ptr<arrow::DateType>& type);
extern "C" SEXP _arrow_DateType__unit(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::DateType>&>::type type(type_sexp);
	return cpp11::as_sexp(DateType__unit(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_DateType__unit(SEXP type_sexp){
	Rf_error("Cannot call DateType__unit(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
arrow::TimeUnit::type TimeType__unit(const std::shared_ptr<arrow::TimeType>& type);
extern "C" SEXP _arrow_TimeType__unit(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::TimeType>&>::type type(type_sexp);
	return cpp11::as_sexp(TimeType__unit(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_TimeType__unit(SEXP type_sexp){
	Rf_error("Cannot call TimeType__unit(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
int32_t DecimalType__precision(const std::shared_ptr<arrow::DecimalType>& type);
extern "C" SEXP _arrow_DecimalType__precision(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::DecimalType>&>::type type(type_sexp);
	return cpp11::as_sexp(DecimalType__precision(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_DecimalType__precision(SEXP type_sexp){
	Rf_error("Cannot call DecimalType__precision(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
int32_t DecimalType__scale(const std::shared_ptr<arrow::DecimalType>& type);
extern "C" SEXP _arrow_DecimalType__scale(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::DecimalType>&>::type type(type_sexp);
	return cpp11::as_sexp(DecimalType__scale(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_DecimalType__scale(SEXP type_sexp){
	Rf_error("Cannot call DecimalType__scale(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string TimestampType__timezone(const std::shared_ptr<arrow::TimestampType>& type);
extern "C" SEXP _arrow_TimestampType__timezone(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::TimestampType>&>::type type(type_sexp);
	return cpp11::as_sexp(TimestampType__timezone(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_TimestampType__timezone(SEXP type_sexp){
	Rf_error("Cannot call TimestampType__timezone(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
arrow::TimeUnit::type TimestampType__unit(const std::shared_ptr<arrow::TimestampType>& type);
extern "C" SEXP _arrow_TimestampType__unit(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::TimestampType>&>::type type(type_sexp);
	return cpp11::as_sexp(TimestampType__unit(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_TimestampType__unit(SEXP type_sexp){
	Rf_error("Cannot call TimestampType__unit(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> DictionaryType__initialize(const std::shared_ptr<arrow::DataType>& index_type, const std::shared_ptr<arrow::DataType>& value_type, bool ordered);
extern "C" SEXP _arrow_DictionaryType__initialize(SEXP index_type_sexp, SEXP value_type_sexp, SEXP ordered_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::DataType>&>::type index_type(index_type_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::DataType>&>::type value_type(value_type_sexp);
	arrow::r::Input<bool>::type ordered(ordered_sexp);
	return cpp11::as_sexp(DictionaryType__initialize(index_type, value_type, ordered));
END_CPP11
}
#else
extern "C" SEXP _arrow_DictionaryType__initialize(SEXP index_type_sexp, SEXP value_type_sexp, SEXP ordered_sexp){
	Rf_error("Cannot call DictionaryType__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> DictionaryType__index_type(const std::shared_ptr<arrow::DictionaryType>& type);
extern "C" SEXP _arrow_DictionaryType__index_type(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::DictionaryType>&>::type type(type_sexp);
	return cpp11::as_sexp(DictionaryType__index_type(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_DictionaryType__index_type(SEXP type_sexp){
	Rf_error("Cannot call DictionaryType__index_type(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> DictionaryType__value_type(const std::shared_ptr<arrow::DictionaryType>& type);
extern "C" SEXP _arrow_DictionaryType__value_type(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::DictionaryType>&>::type type(type_sexp);
	return cpp11::as_sexp(DictionaryType__value_type(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_DictionaryType__value_type(SEXP type_sexp){
	Rf_error("Cannot call DictionaryType__value_type(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string DictionaryType__name(const std::shared_ptr<arrow::DictionaryType>& type);
extern "C" SEXP _arrow_DictionaryType__name(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::DictionaryType>&>::type type(type_sexp);
	return cpp11::as_sexp(DictionaryType__name(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_DictionaryType__name(SEXP type_sexp){
	Rf_error("Cannot call DictionaryType__name(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
bool DictionaryType__ordered(const std::shared_ptr<arrow::DictionaryType>& type);
extern "C" SEXP _arrow_DictionaryType__ordered(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::DictionaryType>&>::type type(type_sexp);
	return cpp11::as_sexp(DictionaryType__ordered(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_DictionaryType__ordered(SEXP type_sexp){
	Rf_error("Cannot call DictionaryType__ordered(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Field> StructType__GetFieldByName(const std::shared_ptr<arrow::StructType>& type, const std::string& name);
extern "C" SEXP _arrow_StructType__GetFieldByName(SEXP type_sexp, SEXP name_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::StructType>&>::type type(type_sexp);
	arrow::r::Input<const std::string&>::type name(name_sexp);
	return cpp11::as_sexp(StructType__GetFieldByName(type, name));
END_CPP11
}
#else
extern "C" SEXP _arrow_StructType__GetFieldByName(SEXP type_sexp, SEXP name_sexp){
	Rf_error("Cannot call StructType__GetFieldByName(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
int StructType__GetFieldIndex(const std::shared_ptr<arrow::StructType>& type, const std::string& name);
extern "C" SEXP _arrow_StructType__GetFieldIndex(SEXP type_sexp, SEXP name_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::StructType>&>::type type(type_sexp);
	arrow::r::Input<const std::string&>::type name(name_sexp);
	return cpp11::as_sexp(StructType__GetFieldIndex(type, name));
END_CPP11
}
#else
extern "C" SEXP _arrow_StructType__GetFieldIndex(SEXP type_sexp, SEXP name_sexp){
	Rf_error("Cannot call StructType__GetFieldIndex(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::vector<std::string> StructType__field_names(const std::shared_ptr<arrow::StructType>& type);
extern "C" SEXP _arrow_StructType__field_names(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::StructType>&>::type type(type_sexp);
	return cpp11::as_sexp(StructType__field_names(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_StructType__field_names(SEXP type_sexp){
	Rf_error("Cannot call StructType__field_names(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Field> ListType__value_field(const std::shared_ptr<arrow::ListType>& type);
extern "C" SEXP _arrow_ListType__value_field(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ListType>&>::type type(type_sexp);
	return cpp11::as_sexp(ListType__value_field(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_ListType__value_field(SEXP type_sexp){
	Rf_error("Cannot call ListType__value_field(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> ListType__value_type(const std::shared_ptr<arrow::ListType>& type);
extern "C" SEXP _arrow_ListType__value_type(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ListType>&>::type type(type_sexp);
	return cpp11::as_sexp(ListType__value_type(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_ListType__value_type(SEXP type_sexp){
	Rf_error("Cannot call ListType__value_type(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Field> LargeListType__value_field(const std::shared_ptr<arrow::LargeListType>& type);
extern "C" SEXP _arrow_LargeListType__value_field(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::LargeListType>&>::type type(type_sexp);
	return cpp11::as_sexp(LargeListType__value_field(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_LargeListType__value_field(SEXP type_sexp){
	Rf_error("Cannot call LargeListType__value_field(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> LargeListType__value_type(const std::shared_ptr<arrow::LargeListType>& type);
extern "C" SEXP _arrow_LargeListType__value_type(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::LargeListType>&>::type type(type_sexp);
	return cpp11::as_sexp(LargeListType__value_type(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_LargeListType__value_type(SEXP type_sexp){
	Rf_error("Cannot call LargeListType__value_type(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Field> FixedSizeListType__value_field(const std::shared_ptr<arrow::FixedSizeListType>& type);
extern "C" SEXP _arrow_FixedSizeListType__value_field(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::FixedSizeListType>&>::type type(type_sexp);
	return cpp11::as_sexp(FixedSizeListType__value_field(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_FixedSizeListType__value_field(SEXP type_sexp){
	Rf_error("Cannot call FixedSizeListType__value_field(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> FixedSizeListType__value_type(const std::shared_ptr<arrow::FixedSizeListType>& type);
extern "C" SEXP _arrow_FixedSizeListType__value_type(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::FixedSizeListType>&>::type type(type_sexp);
	return cpp11::as_sexp(FixedSizeListType__value_type(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_FixedSizeListType__value_type(SEXP type_sexp){
	Rf_error("Cannot call FixedSizeListType__value_type(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// datatype.cpp
#if defined(ARROW_R_WITH_ARROW)
int FixedSizeListType__list_size(const std::shared_ptr<arrow::FixedSizeListType>& type);
extern "C" SEXP _arrow_FixedSizeListType__list_size(SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::FixedSizeListType>&>::type type(type_sexp);
	return cpp11::as_sexp(FixedSizeListType__list_size(type));
END_CPP11
}
#else
extern "C" SEXP _arrow_FixedSizeListType__list_size(SEXP type_sexp){
	Rf_error("Cannot call FixedSizeListType__list_size(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// expression.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::Expression> dataset___expr__call(std::string func_name, cpp11::list argument_list, cpp11::list options);
extern "C" SEXP _arrow_dataset___expr__call(SEXP func_name_sexp, SEXP argument_list_sexp, SEXP options_sexp){
BEGIN_CPP11
	arrow::r::Input<std::string>::type func_name(func_name_sexp);
	arrow::r::Input<cpp11::list>::type argument_list(argument_list_sexp);
	arrow::r::Input<cpp11::list>::type options(options_sexp);
	return cpp11::as_sexp(dataset___expr__call(func_name, argument_list, options));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___expr__call(SEXP func_name_sexp, SEXP argument_list_sexp, SEXP options_sexp){
	Rf_error("Cannot call dataset___expr__call(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// expression.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::Expression> dataset___expr__field_ref(std::string name);
extern "C" SEXP _arrow_dataset___expr__field_ref(SEXP name_sexp){
BEGIN_CPP11
	arrow::r::Input<std::string>::type name(name_sexp);
	return cpp11::as_sexp(dataset___expr__field_ref(name));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___expr__field_ref(SEXP name_sexp){
	Rf_error("Cannot call dataset___expr__field_ref(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// expression.cpp
#if defined(ARROW_R_WITH_DATASET)
std::string dataset___expr__get_field_ref_name(const std::shared_ptr<ds::Expression>& ref);
extern "C" SEXP _arrow_dataset___expr__get_field_ref_name(SEXP ref_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::Expression>&>::type ref(ref_sexp);
	return cpp11::as_sexp(dataset___expr__get_field_ref_name(ref));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___expr__get_field_ref_name(SEXP ref_sexp){
	Rf_error("Cannot call dataset___expr__get_field_ref_name(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// expression.cpp
#if defined(ARROW_R_WITH_DATASET)
std::shared_ptr<ds::Expression> dataset___expr__scalar(const std::shared_ptr<arrow::Scalar>& x);
extern "C" SEXP _arrow_dataset___expr__scalar(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Scalar>&>::type x(x_sexp);
	return cpp11::as_sexp(dataset___expr__scalar(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___expr__scalar(SEXP x_sexp){
	Rf_error("Cannot call dataset___expr__scalar(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// expression.cpp
#if defined(ARROW_R_WITH_DATASET)
std::string dataset___expr__ToString(const std::shared_ptr<ds::Expression>& x);
extern "C" SEXP _arrow_dataset___expr__ToString(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<ds::Expression>&>::type x(x_sexp);
	return cpp11::as_sexp(dataset___expr__ToString(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_dataset___expr__ToString(SEXP x_sexp){
	Rf_error("Cannot call dataset___expr__ToString(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// feather.cpp
#if defined(ARROW_R_WITH_ARROW)
void ipc___WriteFeather__Table(const std::shared_ptr<arrow::io::OutputStream>& stream, const std::shared_ptr<arrow::Table>& table, int version, int chunk_size, arrow::Compression::type compression, int compression_level);
extern "C" SEXP _arrow_ipc___WriteFeather__Table(SEXP stream_sexp, SEXP table_sexp, SEXP version_sexp, SEXP chunk_size_sexp, SEXP compression_sexp, SEXP compression_level_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::OutputStream>&>::type stream(stream_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	arrow::r::Input<int>::type version(version_sexp);
	arrow::r::Input<int>::type chunk_size(chunk_size_sexp);
	arrow::r::Input<arrow::Compression::type>::type compression(compression_sexp);
	arrow::r::Input<int>::type compression_level(compression_level_sexp);
	ipc___WriteFeather__Table(stream, table, version, chunk_size, compression, compression_level);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___WriteFeather__Table(SEXP stream_sexp, SEXP table_sexp, SEXP version_sexp, SEXP chunk_size_sexp, SEXP compression_sexp, SEXP compression_level_sexp){
	Rf_error("Cannot call ipc___WriteFeather__Table(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// feather.cpp
#if defined(ARROW_R_WITH_ARROW)
int ipc___feather___Reader__version(const std::shared_ptr<arrow::ipc::feather::Reader>& reader);
extern "C" SEXP _arrow_ipc___feather___Reader__version(SEXP reader_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ipc::feather::Reader>&>::type reader(reader_sexp);
	return cpp11::as_sexp(ipc___feather___Reader__version(reader));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___feather___Reader__version(SEXP reader_sexp){
	Rf_error("Cannot call ipc___feather___Reader__version(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// feather.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Table> ipc___feather___Reader__Read(const std::shared_ptr<arrow::ipc::feather::Reader>& reader, SEXP columns);
extern "C" SEXP _arrow_ipc___feather___Reader__Read(SEXP reader_sexp, SEXP columns_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ipc::feather::Reader>&>::type reader(reader_sexp);
	arrow::r::Input<SEXP>::type columns(columns_sexp);
	return cpp11::as_sexp(ipc___feather___Reader__Read(reader, columns));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___feather___Reader__Read(SEXP reader_sexp, SEXP columns_sexp){
	Rf_error("Cannot call ipc___feather___Reader__Read(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// feather.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::ipc::feather::Reader> ipc___feather___Reader__Open(const std::shared_ptr<arrow::io::RandomAccessFile>& stream);
extern "C" SEXP _arrow_ipc___feather___Reader__Open(SEXP stream_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::RandomAccessFile>&>::type stream(stream_sexp);
	return cpp11::as_sexp(ipc___feather___Reader__Open(stream));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___feather___Reader__Open(SEXP stream_sexp){
	Rf_error("Cannot call ipc___feather___Reader__Open(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// feather.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Schema> ipc___feather___Reader__schema(const std::shared_ptr<arrow::ipc::feather::Reader>& reader);
extern "C" SEXP _arrow_ipc___feather___Reader__schema(SEXP reader_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ipc::feather::Reader>&>::type reader(reader_sexp);
	return cpp11::as_sexp(ipc___feather___Reader__schema(reader));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___feather___Reader__schema(SEXP reader_sexp){
	Rf_error("Cannot call ipc___feather___Reader__schema(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// field.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Field> Field__initialize(const std::string& name, const std::shared_ptr<arrow::DataType>& field, bool nullable);
extern "C" SEXP _arrow_Field__initialize(SEXP name_sexp, SEXP field_sexp, SEXP nullable_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::string&>::type name(name_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::DataType>&>::type field(field_sexp);
	arrow::r::Input<bool>::type nullable(nullable_sexp);
	return cpp11::as_sexp(Field__initialize(name, field, nullable));
END_CPP11
}
#else
extern "C" SEXP _arrow_Field__initialize(SEXP name_sexp, SEXP field_sexp, SEXP nullable_sexp){
	Rf_error("Cannot call Field__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// field.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string Field__ToString(const std::shared_ptr<arrow::Field>& field);
extern "C" SEXP _arrow_Field__ToString(SEXP field_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Field>&>::type field(field_sexp);
	return cpp11::as_sexp(Field__ToString(field));
END_CPP11
}
#else
extern "C" SEXP _arrow_Field__ToString(SEXP field_sexp){
	Rf_error("Cannot call Field__ToString(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// field.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string Field__name(const std::shared_ptr<arrow::Field>& field);
extern "C" SEXP _arrow_Field__name(SEXP field_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Field>&>::type field(field_sexp);
	return cpp11::as_sexp(Field__name(field));
END_CPP11
}
#else
extern "C" SEXP _arrow_Field__name(SEXP field_sexp){
	Rf_error("Cannot call Field__name(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// field.cpp
#if defined(ARROW_R_WITH_ARROW)
bool Field__Equals(const std::shared_ptr<arrow::Field>& field, const std::shared_ptr<arrow::Field>& other);
extern "C" SEXP _arrow_Field__Equals(SEXP field_sexp, SEXP other_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Field>&>::type field(field_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Field>&>::type other(other_sexp);
	return cpp11::as_sexp(Field__Equals(field, other));
END_CPP11
}
#else
extern "C" SEXP _arrow_Field__Equals(SEXP field_sexp, SEXP other_sexp){
	Rf_error("Cannot call Field__Equals(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// field.cpp
#if defined(ARROW_R_WITH_ARROW)
bool Field__nullable(const std::shared_ptr<arrow::Field>& field);
extern "C" SEXP _arrow_Field__nullable(SEXP field_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Field>&>::type field(field_sexp);
	return cpp11::as_sexp(Field__nullable(field));
END_CPP11
}
#else
extern "C" SEXP _arrow_Field__nullable(SEXP field_sexp){
	Rf_error("Cannot call Field__nullable(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// field.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Field__type(const std::shared_ptr<arrow::Field>& field);
extern "C" SEXP _arrow_Field__type(SEXP field_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Field>&>::type field(field_sexp);
	return cpp11::as_sexp(Field__type(field));
END_CPP11
}
#else
extern "C" SEXP _arrow_Field__type(SEXP field_sexp){
	Rf_error("Cannot call Field__type(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
fs::FileType fs___FileInfo__type(const std::shared_ptr<fs::FileInfo>& x);
extern "C" SEXP _arrow_fs___FileInfo__type(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileInfo>&>::type x(x_sexp);
	return cpp11::as_sexp(fs___FileInfo__type(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileInfo__type(SEXP x_sexp){
	Rf_error("Cannot call fs___FileInfo__type(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
void fs___FileInfo__set_type(const std::shared_ptr<fs::FileInfo>& x, fs::FileType type);
extern "C" SEXP _arrow_fs___FileInfo__set_type(SEXP x_sexp, SEXP type_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileInfo>&>::type x(x_sexp);
	arrow::r::Input<fs::FileType>::type type(type_sexp);
	fs___FileInfo__set_type(x, type);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileInfo__set_type(SEXP x_sexp, SEXP type_sexp){
	Rf_error("Cannot call fs___FileInfo__set_type(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string fs___FileInfo__path(const std::shared_ptr<fs::FileInfo>& x);
extern "C" SEXP _arrow_fs___FileInfo__path(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileInfo>&>::type x(x_sexp);
	return cpp11::as_sexp(fs___FileInfo__path(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileInfo__path(SEXP x_sexp){
	Rf_error("Cannot call fs___FileInfo__path(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
void fs___FileInfo__set_path(const std::shared_ptr<fs::FileInfo>& x, const std::string& path);
extern "C" SEXP _arrow_fs___FileInfo__set_path(SEXP x_sexp, SEXP path_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileInfo>&>::type x(x_sexp);
	arrow::r::Input<const std::string&>::type path(path_sexp);
	fs___FileInfo__set_path(x, path);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileInfo__set_path(SEXP x_sexp, SEXP path_sexp){
	Rf_error("Cannot call fs___FileInfo__set_path(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
int64_t fs___FileInfo__size(const std::shared_ptr<fs::FileInfo>& x);
extern "C" SEXP _arrow_fs___FileInfo__size(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileInfo>&>::type x(x_sexp);
	return cpp11::as_sexp(fs___FileInfo__size(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileInfo__size(SEXP x_sexp){
	Rf_error("Cannot call fs___FileInfo__size(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
void fs___FileInfo__set_size(const std::shared_ptr<fs::FileInfo>& x, int64_t size);
extern "C" SEXP _arrow_fs___FileInfo__set_size(SEXP x_sexp, SEXP size_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileInfo>&>::type x(x_sexp);
	arrow::r::Input<int64_t>::type size(size_sexp);
	fs___FileInfo__set_size(x, size);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileInfo__set_size(SEXP x_sexp, SEXP size_sexp){
	Rf_error("Cannot call fs___FileInfo__set_size(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string fs___FileInfo__base_name(const std::shared_ptr<fs::FileInfo>& x);
extern "C" SEXP _arrow_fs___FileInfo__base_name(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileInfo>&>::type x(x_sexp);
	return cpp11::as_sexp(fs___FileInfo__base_name(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileInfo__base_name(SEXP x_sexp){
	Rf_error("Cannot call fs___FileInfo__base_name(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string fs___FileInfo__extension(const std::shared_ptr<fs::FileInfo>& x);
extern "C" SEXP _arrow_fs___FileInfo__extension(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileInfo>&>::type x(x_sexp);
	return cpp11::as_sexp(fs___FileInfo__extension(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileInfo__extension(SEXP x_sexp){
	Rf_error("Cannot call fs___FileInfo__extension(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
SEXP fs___FileInfo__mtime(const std::shared_ptr<fs::FileInfo>& x);
extern "C" SEXP _arrow_fs___FileInfo__mtime(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileInfo>&>::type x(x_sexp);
	return cpp11::as_sexp(fs___FileInfo__mtime(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileInfo__mtime(SEXP x_sexp){
	Rf_error("Cannot call fs___FileInfo__mtime(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
void fs___FileInfo__set_mtime(const std::shared_ptr<fs::FileInfo>& x, SEXP time);
extern "C" SEXP _arrow_fs___FileInfo__set_mtime(SEXP x_sexp, SEXP time_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileInfo>&>::type x(x_sexp);
	arrow::r::Input<SEXP>::type time(time_sexp);
	fs___FileInfo__set_mtime(x, time);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileInfo__set_mtime(SEXP x_sexp, SEXP time_sexp){
	Rf_error("Cannot call fs___FileInfo__set_mtime(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string fs___FileSelector__base_dir(const std::shared_ptr<fs::FileSelector>& selector);
extern "C" SEXP _arrow_fs___FileSelector__base_dir(SEXP selector_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSelector>&>::type selector(selector_sexp);
	return cpp11::as_sexp(fs___FileSelector__base_dir(selector));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSelector__base_dir(SEXP selector_sexp){
	Rf_error("Cannot call fs___FileSelector__base_dir(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
bool fs___FileSelector__allow_not_found(const std::shared_ptr<fs::FileSelector>& selector);
extern "C" SEXP _arrow_fs___FileSelector__allow_not_found(SEXP selector_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSelector>&>::type selector(selector_sexp);
	return cpp11::as_sexp(fs___FileSelector__allow_not_found(selector));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSelector__allow_not_found(SEXP selector_sexp){
	Rf_error("Cannot call fs___FileSelector__allow_not_found(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
bool fs___FileSelector__recursive(const std::shared_ptr<fs::FileSelector>& selector);
extern "C" SEXP _arrow_fs___FileSelector__recursive(SEXP selector_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSelector>&>::type selector(selector_sexp);
	return cpp11::as_sexp(fs___FileSelector__recursive(selector));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSelector__recursive(SEXP selector_sexp){
	Rf_error("Cannot call fs___FileSelector__recursive(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<fs::FileSelector> fs___FileSelector__create(const std::string& base_dir, bool allow_not_found, bool recursive);
extern "C" SEXP _arrow_fs___FileSelector__create(SEXP base_dir_sexp, SEXP allow_not_found_sexp, SEXP recursive_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::string&>::type base_dir(base_dir_sexp);
	arrow::r::Input<bool>::type allow_not_found(allow_not_found_sexp);
	arrow::r::Input<bool>::type recursive(recursive_sexp);
	return cpp11::as_sexp(fs___FileSelector__create(base_dir, allow_not_found, recursive));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSelector__create(SEXP base_dir_sexp, SEXP allow_not_found_sexp, SEXP recursive_sexp){
	Rf_error("Cannot call fs___FileSelector__create(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::list fs___FileSystem__GetTargetInfos_Paths(const std::shared_ptr<fs::FileSystem>& file_system, const std::vector<std::string>& paths);
extern "C" SEXP _arrow_fs___FileSystem__GetTargetInfos_Paths(SEXP file_system_sexp, SEXP paths_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type file_system(file_system_sexp);
	arrow::r::Input<const std::vector<std::string>&>::type paths(paths_sexp);
	return cpp11::as_sexp(fs___FileSystem__GetTargetInfos_Paths(file_system, paths));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSystem__GetTargetInfos_Paths(SEXP file_system_sexp, SEXP paths_sexp){
	Rf_error("Cannot call fs___FileSystem__GetTargetInfos_Paths(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::list fs___FileSystem__GetTargetInfos_FileSelector(const std::shared_ptr<fs::FileSystem>& file_system, const std::shared_ptr<fs::FileSelector>& selector);
extern "C" SEXP _arrow_fs___FileSystem__GetTargetInfos_FileSelector(SEXP file_system_sexp, SEXP selector_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type file_system(file_system_sexp);
	arrow::r::Input<const std::shared_ptr<fs::FileSelector>&>::type selector(selector_sexp);
	return cpp11::as_sexp(fs___FileSystem__GetTargetInfos_FileSelector(file_system, selector));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSystem__GetTargetInfos_FileSelector(SEXP file_system_sexp, SEXP selector_sexp){
	Rf_error("Cannot call fs___FileSystem__GetTargetInfos_FileSelector(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
void fs___FileSystem__CreateDir(const std::shared_ptr<fs::FileSystem>& file_system, const std::string& path, bool recursive);
extern "C" SEXP _arrow_fs___FileSystem__CreateDir(SEXP file_system_sexp, SEXP path_sexp, SEXP recursive_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type file_system(file_system_sexp);
	arrow::r::Input<const std::string&>::type path(path_sexp);
	arrow::r::Input<bool>::type recursive(recursive_sexp);
	fs___FileSystem__CreateDir(file_system, path, recursive);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSystem__CreateDir(SEXP file_system_sexp, SEXP path_sexp, SEXP recursive_sexp){
	Rf_error("Cannot call fs___FileSystem__CreateDir(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
void fs___FileSystem__DeleteDir(const std::shared_ptr<fs::FileSystem>& file_system, const std::string& path);
extern "C" SEXP _arrow_fs___FileSystem__DeleteDir(SEXP file_system_sexp, SEXP path_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type file_system(file_system_sexp);
	arrow::r::Input<const std::string&>::type path(path_sexp);
	fs___FileSystem__DeleteDir(file_system, path);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSystem__DeleteDir(SEXP file_system_sexp, SEXP path_sexp){
	Rf_error("Cannot call fs___FileSystem__DeleteDir(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
void fs___FileSystem__DeleteDirContents(const std::shared_ptr<fs::FileSystem>& file_system, const std::string& path);
extern "C" SEXP _arrow_fs___FileSystem__DeleteDirContents(SEXP file_system_sexp, SEXP path_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type file_system(file_system_sexp);
	arrow::r::Input<const std::string&>::type path(path_sexp);
	fs___FileSystem__DeleteDirContents(file_system, path);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSystem__DeleteDirContents(SEXP file_system_sexp, SEXP path_sexp){
	Rf_error("Cannot call fs___FileSystem__DeleteDirContents(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
void fs___FileSystem__DeleteFile(const std::shared_ptr<fs::FileSystem>& file_system, const std::string& path);
extern "C" SEXP _arrow_fs___FileSystem__DeleteFile(SEXP file_system_sexp, SEXP path_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type file_system(file_system_sexp);
	arrow::r::Input<const std::string&>::type path(path_sexp);
	fs___FileSystem__DeleteFile(file_system, path);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSystem__DeleteFile(SEXP file_system_sexp, SEXP path_sexp){
	Rf_error("Cannot call fs___FileSystem__DeleteFile(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
void fs___FileSystem__DeleteFiles(const std::shared_ptr<fs::FileSystem>& file_system, const std::vector<std::string>& paths);
extern "C" SEXP _arrow_fs___FileSystem__DeleteFiles(SEXP file_system_sexp, SEXP paths_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type file_system(file_system_sexp);
	arrow::r::Input<const std::vector<std::string>&>::type paths(paths_sexp);
	fs___FileSystem__DeleteFiles(file_system, paths);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSystem__DeleteFiles(SEXP file_system_sexp, SEXP paths_sexp){
	Rf_error("Cannot call fs___FileSystem__DeleteFiles(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
void fs___FileSystem__Move(const std::shared_ptr<fs::FileSystem>& file_system, const std::string& src, const std::string& dest);
extern "C" SEXP _arrow_fs___FileSystem__Move(SEXP file_system_sexp, SEXP src_sexp, SEXP dest_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type file_system(file_system_sexp);
	arrow::r::Input<const std::string&>::type src(src_sexp);
	arrow::r::Input<const std::string&>::type dest(dest_sexp);
	fs___FileSystem__Move(file_system, src, dest);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSystem__Move(SEXP file_system_sexp, SEXP src_sexp, SEXP dest_sexp){
	Rf_error("Cannot call fs___FileSystem__Move(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
void fs___FileSystem__CopyFile(const std::shared_ptr<fs::FileSystem>& file_system, const std::string& src, const std::string& dest);
extern "C" SEXP _arrow_fs___FileSystem__CopyFile(SEXP file_system_sexp, SEXP src_sexp, SEXP dest_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type file_system(file_system_sexp);
	arrow::r::Input<const std::string&>::type src(src_sexp);
	arrow::r::Input<const std::string&>::type dest(dest_sexp);
	fs___FileSystem__CopyFile(file_system, src, dest);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSystem__CopyFile(SEXP file_system_sexp, SEXP src_sexp, SEXP dest_sexp){
	Rf_error("Cannot call fs___FileSystem__CopyFile(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::io::InputStream> fs___FileSystem__OpenInputStream(const std::shared_ptr<fs::FileSystem>& file_system, const std::string& path);
extern "C" SEXP _arrow_fs___FileSystem__OpenInputStream(SEXP file_system_sexp, SEXP path_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type file_system(file_system_sexp);
	arrow::r::Input<const std::string&>::type path(path_sexp);
	return cpp11::as_sexp(fs___FileSystem__OpenInputStream(file_system, path));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSystem__OpenInputStream(SEXP file_system_sexp, SEXP path_sexp){
	Rf_error("Cannot call fs___FileSystem__OpenInputStream(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::io::RandomAccessFile> fs___FileSystem__OpenInputFile(const std::shared_ptr<fs::FileSystem>& file_system, const std::string& path);
extern "C" SEXP _arrow_fs___FileSystem__OpenInputFile(SEXP file_system_sexp, SEXP path_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type file_system(file_system_sexp);
	arrow::r::Input<const std::string&>::type path(path_sexp);
	return cpp11::as_sexp(fs___FileSystem__OpenInputFile(file_system, path));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSystem__OpenInputFile(SEXP file_system_sexp, SEXP path_sexp){
	Rf_error("Cannot call fs___FileSystem__OpenInputFile(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::io::OutputStream> fs___FileSystem__OpenOutputStream(const std::shared_ptr<fs::FileSystem>& file_system, const std::string& path);
extern "C" SEXP _arrow_fs___FileSystem__OpenOutputStream(SEXP file_system_sexp, SEXP path_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type file_system(file_system_sexp);
	arrow::r::Input<const std::string&>::type path(path_sexp);
	return cpp11::as_sexp(fs___FileSystem__OpenOutputStream(file_system, path));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSystem__OpenOutputStream(SEXP file_system_sexp, SEXP path_sexp){
	Rf_error("Cannot call fs___FileSystem__OpenOutputStream(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::io::OutputStream> fs___FileSystem__OpenAppendStream(const std::shared_ptr<fs::FileSystem>& file_system, const std::string& path);
extern "C" SEXP _arrow_fs___FileSystem__OpenAppendStream(SEXP file_system_sexp, SEXP path_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type file_system(file_system_sexp);
	arrow::r::Input<const std::string&>::type path(path_sexp);
	return cpp11::as_sexp(fs___FileSystem__OpenAppendStream(file_system, path));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSystem__OpenAppendStream(SEXP file_system_sexp, SEXP path_sexp){
	Rf_error("Cannot call fs___FileSystem__OpenAppendStream(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string fs___FileSystem__type_name(const std::shared_ptr<fs::FileSystem>& file_system);
extern "C" SEXP _arrow_fs___FileSystem__type_name(SEXP file_system_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type file_system(file_system_sexp);
	return cpp11::as_sexp(fs___FileSystem__type_name(file_system));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSystem__type_name(SEXP file_system_sexp){
	Rf_error("Cannot call fs___FileSystem__type_name(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<fs::LocalFileSystem> fs___LocalFileSystem__create();
extern "C" SEXP _arrow_fs___LocalFileSystem__create(){
BEGIN_CPP11
	return cpp11::as_sexp(fs___LocalFileSystem__create());
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___LocalFileSystem__create(){
	Rf_error("Cannot call fs___LocalFileSystem__create(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<fs::SubTreeFileSystem> fs___SubTreeFileSystem__create(const std::string& base_path, const std::shared_ptr<fs::FileSystem>& base_fs);
extern "C" SEXP _arrow_fs___SubTreeFileSystem__create(SEXP base_path_sexp, SEXP base_fs_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::string&>::type base_path(base_path_sexp);
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type base_fs(base_fs_sexp);
	return cpp11::as_sexp(fs___SubTreeFileSystem__create(base_path, base_fs));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___SubTreeFileSystem__create(SEXP base_path_sexp, SEXP base_fs_sexp){
	Rf_error("Cannot call fs___SubTreeFileSystem__create(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<fs::FileSystem> fs___SubTreeFileSystem__base_fs(const std::shared_ptr<fs::SubTreeFileSystem>& file_system);
extern "C" SEXP _arrow_fs___SubTreeFileSystem__base_fs(SEXP file_system_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::SubTreeFileSystem>&>::type file_system(file_system_sexp);
	return cpp11::as_sexp(fs___SubTreeFileSystem__base_fs(file_system));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___SubTreeFileSystem__base_fs(SEXP file_system_sexp){
	Rf_error("Cannot call fs___SubTreeFileSystem__base_fs(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string fs___SubTreeFileSystem__base_path(const std::shared_ptr<fs::SubTreeFileSystem>& file_system);
extern "C" SEXP _arrow_fs___SubTreeFileSystem__base_path(SEXP file_system_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::SubTreeFileSystem>&>::type file_system(file_system_sexp);
	return cpp11::as_sexp(fs___SubTreeFileSystem__base_path(file_system));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___SubTreeFileSystem__base_path(SEXP file_system_sexp){
	Rf_error("Cannot call fs___SubTreeFileSystem__base_path(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::writable::list fs___FileSystemFromUri(const std::string& path);
extern "C" SEXP _arrow_fs___FileSystemFromUri(SEXP path_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::string&>::type path(path_sexp);
	return cpp11::as_sexp(fs___FileSystemFromUri(path));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___FileSystemFromUri(SEXP path_sexp){
	Rf_error("Cannot call fs___FileSystemFromUri(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_ARROW)
void fs___CopyFiles(const std::shared_ptr<fs::FileSystem>& source_fs, const std::shared_ptr<fs::FileSelector>& source_sel, const std::shared_ptr<fs::FileSystem>& destination_fs, const std::string& destination_base_dir, int64_t chunk_size, bool use_threads);
extern "C" SEXP _arrow_fs___CopyFiles(SEXP source_fs_sexp, SEXP source_sel_sexp, SEXP destination_fs_sexp, SEXP destination_base_dir_sexp, SEXP chunk_size_sexp, SEXP use_threads_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type source_fs(source_fs_sexp);
	arrow::r::Input<const std::shared_ptr<fs::FileSelector>&>::type source_sel(source_sel_sexp);
	arrow::r::Input<const std::shared_ptr<fs::FileSystem>&>::type destination_fs(destination_fs_sexp);
	arrow::r::Input<const std::string&>::type destination_base_dir(destination_base_dir_sexp);
	arrow::r::Input<int64_t>::type chunk_size(chunk_size_sexp);
	arrow::r::Input<bool>::type use_threads(use_threads_sexp);
	fs___CopyFiles(source_fs, source_sel, destination_fs, destination_base_dir, chunk_size, use_threads);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___CopyFiles(SEXP source_fs_sexp, SEXP source_sel_sexp, SEXP destination_fs_sexp, SEXP destination_base_dir_sexp, SEXP chunk_size_sexp, SEXP use_threads_sexp){
	Rf_error("Cannot call fs___CopyFiles(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_S3)
std::shared_ptr<fs::S3FileSystem> fs___S3FileSystem__create(bool anonymous, std::string access_key, std::string secret_key, std::string session_token, std::string role_arn, std::string session_name, std::string external_id, int load_frequency, std::string region, std::string endpoint_override, std::string scheme, bool background_writes);
extern "C" SEXP _arrow_fs___S3FileSystem__create(SEXP anonymous_sexp, SEXP access_key_sexp, SEXP secret_key_sexp, SEXP session_token_sexp, SEXP role_arn_sexp, SEXP session_name_sexp, SEXP external_id_sexp, SEXP load_frequency_sexp, SEXP region_sexp, SEXP endpoint_override_sexp, SEXP scheme_sexp, SEXP background_writes_sexp){
BEGIN_CPP11
	arrow::r::Input<bool>::type anonymous(anonymous_sexp);
	arrow::r::Input<std::string>::type access_key(access_key_sexp);
	arrow::r::Input<std::string>::type secret_key(secret_key_sexp);
	arrow::r::Input<std::string>::type session_token(session_token_sexp);
	arrow::r::Input<std::string>::type role_arn(role_arn_sexp);
	arrow::r::Input<std::string>::type session_name(session_name_sexp);
	arrow::r::Input<std::string>::type external_id(external_id_sexp);
	arrow::r::Input<int>::type load_frequency(load_frequency_sexp);
	arrow::r::Input<std::string>::type region(region_sexp);
	arrow::r::Input<std::string>::type endpoint_override(endpoint_override_sexp);
	arrow::r::Input<std::string>::type scheme(scheme_sexp);
	arrow::r::Input<bool>::type background_writes(background_writes_sexp);
	return cpp11::as_sexp(fs___S3FileSystem__create(anonymous, access_key, secret_key, session_token, role_arn, session_name, external_id, load_frequency, region, endpoint_override, scheme, background_writes));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___S3FileSystem__create(SEXP anonymous_sexp, SEXP access_key_sexp, SEXP secret_key_sexp, SEXP session_token_sexp, SEXP role_arn_sexp, SEXP session_name_sexp, SEXP external_id_sexp, SEXP load_frequency_sexp, SEXP region_sexp, SEXP endpoint_override_sexp, SEXP scheme_sexp, SEXP background_writes_sexp){
	Rf_error("Cannot call fs___S3FileSystem__create(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// filesystem.cpp
#if defined(ARROW_R_WITH_S3)
std::string fs___S3FileSystem__region(const std::shared_ptr<fs::S3FileSystem>& fs);
extern "C" SEXP _arrow_fs___S3FileSystem__region(SEXP fs_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<fs::S3FileSystem>&>::type fs(fs_sexp);
	return cpp11::as_sexp(fs___S3FileSystem__region(fs));
END_CPP11
}
#else
extern "C" SEXP _arrow_fs___S3FileSystem__region(SEXP fs_sexp){
	Rf_error("Cannot call fs___S3FileSystem__region(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Buffer> io___Readable__Read(const std::shared_ptr<arrow::io::Readable>& x, int64_t nbytes);
extern "C" SEXP _arrow_io___Readable__Read(SEXP x_sexp, SEXP nbytes_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::Readable>&>::type x(x_sexp);
	arrow::r::Input<int64_t>::type nbytes(nbytes_sexp);
	return cpp11::as_sexp(io___Readable__Read(x, nbytes));
END_CPP11
}
#else
extern "C" SEXP _arrow_io___Readable__Read(SEXP x_sexp, SEXP nbytes_sexp){
	Rf_error("Cannot call io___Readable__Read(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
void io___InputStream__Close(const std::shared_ptr<arrow::io::InputStream>& x);
extern "C" SEXP _arrow_io___InputStream__Close(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::InputStream>&>::type x(x_sexp);
	io___InputStream__Close(x);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_io___InputStream__Close(SEXP x_sexp){
	Rf_error("Cannot call io___InputStream__Close(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
void io___OutputStream__Close(const std::shared_ptr<arrow::io::OutputStream>& x);
extern "C" SEXP _arrow_io___OutputStream__Close(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::OutputStream>&>::type x(x_sexp);
	io___OutputStream__Close(x);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_io___OutputStream__Close(SEXP x_sexp){
	Rf_error("Cannot call io___OutputStream__Close(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
int64_t io___RandomAccessFile__GetSize(const std::shared_ptr<arrow::io::RandomAccessFile>& x);
extern "C" SEXP _arrow_io___RandomAccessFile__GetSize(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::RandomAccessFile>&>::type x(x_sexp);
	return cpp11::as_sexp(io___RandomAccessFile__GetSize(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_io___RandomAccessFile__GetSize(SEXP x_sexp){
	Rf_error("Cannot call io___RandomAccessFile__GetSize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
bool io___RandomAccessFile__supports_zero_copy(const std::shared_ptr<arrow::io::RandomAccessFile>& x);
extern "C" SEXP _arrow_io___RandomAccessFile__supports_zero_copy(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::RandomAccessFile>&>::type x(x_sexp);
	return cpp11::as_sexp(io___RandomAccessFile__supports_zero_copy(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_io___RandomAccessFile__supports_zero_copy(SEXP x_sexp){
	Rf_error("Cannot call io___RandomAccessFile__supports_zero_copy(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
void io___RandomAccessFile__Seek(const std::shared_ptr<arrow::io::RandomAccessFile>& x, int64_t position);
extern "C" SEXP _arrow_io___RandomAccessFile__Seek(SEXP x_sexp, SEXP position_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::RandomAccessFile>&>::type x(x_sexp);
	arrow::r::Input<int64_t>::type position(position_sexp);
	io___RandomAccessFile__Seek(x, position);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_io___RandomAccessFile__Seek(SEXP x_sexp, SEXP position_sexp){
	Rf_error("Cannot call io___RandomAccessFile__Seek(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
int64_t io___RandomAccessFile__Tell(const std::shared_ptr<arrow::io::RandomAccessFile>& x);
extern "C" SEXP _arrow_io___RandomAccessFile__Tell(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::RandomAccessFile>&>::type x(x_sexp);
	return cpp11::as_sexp(io___RandomAccessFile__Tell(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_io___RandomAccessFile__Tell(SEXP x_sexp){
	Rf_error("Cannot call io___RandomAccessFile__Tell(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Buffer> io___RandomAccessFile__Read0(const std::shared_ptr<arrow::io::RandomAccessFile>& x);
extern "C" SEXP _arrow_io___RandomAccessFile__Read0(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::RandomAccessFile>&>::type x(x_sexp);
	return cpp11::as_sexp(io___RandomAccessFile__Read0(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_io___RandomAccessFile__Read0(SEXP x_sexp){
	Rf_error("Cannot call io___RandomAccessFile__Read0(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Buffer> io___RandomAccessFile__ReadAt(const std::shared_ptr<arrow::io::RandomAccessFile>& x, int64_t position, int64_t nbytes);
extern "C" SEXP _arrow_io___RandomAccessFile__ReadAt(SEXP x_sexp, SEXP position_sexp, SEXP nbytes_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::RandomAccessFile>&>::type x(x_sexp);
	arrow::r::Input<int64_t>::type position(position_sexp);
	arrow::r::Input<int64_t>::type nbytes(nbytes_sexp);
	return cpp11::as_sexp(io___RandomAccessFile__ReadAt(x, position, nbytes));
END_CPP11
}
#else
extern "C" SEXP _arrow_io___RandomAccessFile__ReadAt(SEXP x_sexp, SEXP position_sexp, SEXP nbytes_sexp){
	Rf_error("Cannot call io___RandomAccessFile__ReadAt(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::io::MemoryMappedFile> io___MemoryMappedFile__Create(const std::string& path, int64_t size);
extern "C" SEXP _arrow_io___MemoryMappedFile__Create(SEXP path_sexp, SEXP size_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::string&>::type path(path_sexp);
	arrow::r::Input<int64_t>::type size(size_sexp);
	return cpp11::as_sexp(io___MemoryMappedFile__Create(path, size));
END_CPP11
}
#else
extern "C" SEXP _arrow_io___MemoryMappedFile__Create(SEXP path_sexp, SEXP size_sexp){
	Rf_error("Cannot call io___MemoryMappedFile__Create(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::io::MemoryMappedFile> io___MemoryMappedFile__Open(const std::string& path, arrow::io::FileMode::type mode);
extern "C" SEXP _arrow_io___MemoryMappedFile__Open(SEXP path_sexp, SEXP mode_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::string&>::type path(path_sexp);
	arrow::r::Input<arrow::io::FileMode::type>::type mode(mode_sexp);
	return cpp11::as_sexp(io___MemoryMappedFile__Open(path, mode));
END_CPP11
}
#else
extern "C" SEXP _arrow_io___MemoryMappedFile__Open(SEXP path_sexp, SEXP mode_sexp){
	Rf_error("Cannot call io___MemoryMappedFile__Open(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
void io___MemoryMappedFile__Resize(const std::shared_ptr<arrow::io::MemoryMappedFile>& x, int64_t size);
extern "C" SEXP _arrow_io___MemoryMappedFile__Resize(SEXP x_sexp, SEXP size_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::MemoryMappedFile>&>::type x(x_sexp);
	arrow::r::Input<int64_t>::type size(size_sexp);
	io___MemoryMappedFile__Resize(x, size);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_io___MemoryMappedFile__Resize(SEXP x_sexp, SEXP size_sexp){
	Rf_error("Cannot call io___MemoryMappedFile__Resize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::io::ReadableFile> io___ReadableFile__Open(const std::string& path);
extern "C" SEXP _arrow_io___ReadableFile__Open(SEXP path_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::string&>::type path(path_sexp);
	return cpp11::as_sexp(io___ReadableFile__Open(path));
END_CPP11
}
#else
extern "C" SEXP _arrow_io___ReadableFile__Open(SEXP path_sexp){
	Rf_error("Cannot call io___ReadableFile__Open(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::io::BufferReader> io___BufferReader__initialize(const std::shared_ptr<arrow::Buffer>& buffer);
extern "C" SEXP _arrow_io___BufferReader__initialize(SEXP buffer_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Buffer>&>::type buffer(buffer_sexp);
	return cpp11::as_sexp(io___BufferReader__initialize(buffer));
END_CPP11
}
#else
extern "C" SEXP _arrow_io___BufferReader__initialize(SEXP buffer_sexp){
	Rf_error("Cannot call io___BufferReader__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
void io___Writable__write(const std::shared_ptr<arrow::io::Writable>& stream, const std::shared_ptr<arrow::Buffer>& buf);
extern "C" SEXP _arrow_io___Writable__write(SEXP stream_sexp, SEXP buf_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::Writable>&>::type stream(stream_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Buffer>&>::type buf(buf_sexp);
	io___Writable__write(stream, buf);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_io___Writable__write(SEXP stream_sexp, SEXP buf_sexp){
	Rf_error("Cannot call io___Writable__write(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
int64_t io___OutputStream__Tell(const std::shared_ptr<arrow::io::OutputStream>& stream);
extern "C" SEXP _arrow_io___OutputStream__Tell(SEXP stream_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::OutputStream>&>::type stream(stream_sexp);
	return cpp11::as_sexp(io___OutputStream__Tell(stream));
END_CPP11
}
#else
extern "C" SEXP _arrow_io___OutputStream__Tell(SEXP stream_sexp){
	Rf_error("Cannot call io___OutputStream__Tell(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::io::FileOutputStream> io___FileOutputStream__Open(const std::string& path);
extern "C" SEXP _arrow_io___FileOutputStream__Open(SEXP path_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::string&>::type path(path_sexp);
	return cpp11::as_sexp(io___FileOutputStream__Open(path));
END_CPP11
}
#else
extern "C" SEXP _arrow_io___FileOutputStream__Open(SEXP path_sexp){
	Rf_error("Cannot call io___FileOutputStream__Open(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::io::BufferOutputStream> io___BufferOutputStream__Create(int64_t initial_capacity);
extern "C" SEXP _arrow_io___BufferOutputStream__Create(SEXP initial_capacity_sexp){
BEGIN_CPP11
	arrow::r::Input<int64_t>::type initial_capacity(initial_capacity_sexp);
	return cpp11::as_sexp(io___BufferOutputStream__Create(initial_capacity));
END_CPP11
}
#else
extern "C" SEXP _arrow_io___BufferOutputStream__Create(SEXP initial_capacity_sexp){
	Rf_error("Cannot call io___BufferOutputStream__Create(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
int64_t io___BufferOutputStream__capacity(const std::shared_ptr<arrow::io::BufferOutputStream>& stream);
extern "C" SEXP _arrow_io___BufferOutputStream__capacity(SEXP stream_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::BufferOutputStream>&>::type stream(stream_sexp);
	return cpp11::as_sexp(io___BufferOutputStream__capacity(stream));
END_CPP11
}
#else
extern "C" SEXP _arrow_io___BufferOutputStream__capacity(SEXP stream_sexp){
	Rf_error("Cannot call io___BufferOutputStream__capacity(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Buffer> io___BufferOutputStream__Finish(const std::shared_ptr<arrow::io::BufferOutputStream>& stream);
extern "C" SEXP _arrow_io___BufferOutputStream__Finish(SEXP stream_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::BufferOutputStream>&>::type stream(stream_sexp);
	return cpp11::as_sexp(io___BufferOutputStream__Finish(stream));
END_CPP11
}
#else
extern "C" SEXP _arrow_io___BufferOutputStream__Finish(SEXP stream_sexp){
	Rf_error("Cannot call io___BufferOutputStream__Finish(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
int64_t io___BufferOutputStream__Tell(const std::shared_ptr<arrow::io::BufferOutputStream>& stream);
extern "C" SEXP _arrow_io___BufferOutputStream__Tell(SEXP stream_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::BufferOutputStream>&>::type stream(stream_sexp);
	return cpp11::as_sexp(io___BufferOutputStream__Tell(stream));
END_CPP11
}
#else
extern "C" SEXP _arrow_io___BufferOutputStream__Tell(SEXP stream_sexp){
	Rf_error("Cannot call io___BufferOutputStream__Tell(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// io.cpp
#if defined(ARROW_R_WITH_ARROW)
void io___BufferOutputStream__Write(const std::shared_ptr<arrow::io::BufferOutputStream>& stream, cpp11::raws bytes);
extern "C" SEXP _arrow_io___BufferOutputStream__Write(SEXP stream_sexp, SEXP bytes_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::BufferOutputStream>&>::type stream(stream_sexp);
	arrow::r::Input<cpp11::raws>::type bytes(bytes_sexp);
	io___BufferOutputStream__Write(stream, bytes);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_io___BufferOutputStream__Write(SEXP stream_sexp, SEXP bytes_sexp){
	Rf_error("Cannot call io___BufferOutputStream__Write(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// json.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::json::ReadOptions> json___ReadOptions__initialize(bool use_threads, int block_size);
extern "C" SEXP _arrow_json___ReadOptions__initialize(SEXP use_threads_sexp, SEXP block_size_sexp){
BEGIN_CPP11
	arrow::r::Input<bool>::type use_threads(use_threads_sexp);
	arrow::r::Input<int>::type block_size(block_size_sexp);
	return cpp11::as_sexp(json___ReadOptions__initialize(use_threads, block_size));
END_CPP11
}
#else
extern "C" SEXP _arrow_json___ReadOptions__initialize(SEXP use_threads_sexp, SEXP block_size_sexp){
	Rf_error("Cannot call json___ReadOptions__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// json.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::json::ParseOptions> json___ParseOptions__initialize(bool newlines_in_values);
extern "C" SEXP _arrow_json___ParseOptions__initialize(SEXP newlines_in_values_sexp){
BEGIN_CPP11
	arrow::r::Input<bool>::type newlines_in_values(newlines_in_values_sexp);
	return cpp11::as_sexp(json___ParseOptions__initialize(newlines_in_values));
END_CPP11
}
#else
extern "C" SEXP _arrow_json___ParseOptions__initialize(SEXP newlines_in_values_sexp){
	Rf_error("Cannot call json___ParseOptions__initialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// json.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::json::TableReader> json___TableReader__Make(const std::shared_ptr<arrow::io::InputStream>& input, const std::shared_ptr<arrow::json::ReadOptions>& read_options, const std::shared_ptr<arrow::json::ParseOptions>& parse_options);
extern "C" SEXP _arrow_json___TableReader__Make(SEXP input_sexp, SEXP read_options_sexp, SEXP parse_options_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::InputStream>&>::type input(input_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::json::ReadOptions>&>::type read_options(read_options_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::json::ParseOptions>&>::type parse_options(parse_options_sexp);
	return cpp11::as_sexp(json___TableReader__Make(input, read_options, parse_options));
END_CPP11
}
#else
extern "C" SEXP _arrow_json___TableReader__Make(SEXP input_sexp, SEXP read_options_sexp, SEXP parse_options_sexp){
	Rf_error("Cannot call json___TableReader__Make(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// json.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Table> json___TableReader__Read(const std::shared_ptr<arrow::json::TableReader>& table_reader);
extern "C" SEXP _arrow_json___TableReader__Read(SEXP table_reader_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::json::TableReader>&>::type table_reader(table_reader_sexp);
	return cpp11::as_sexp(json___TableReader__Read(table_reader));
END_CPP11
}
#else
extern "C" SEXP _arrow_json___TableReader__Read(SEXP table_reader_sexp){
	Rf_error("Cannot call json___TableReader__Read(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// memorypool.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::MemoryPool> MemoryPool__default();
extern "C" SEXP _arrow_MemoryPool__default(){
BEGIN_CPP11
	return cpp11::as_sexp(MemoryPool__default());
END_CPP11
}
#else
extern "C" SEXP _arrow_MemoryPool__default(){
	Rf_error("Cannot call MemoryPool__default(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// memorypool.cpp
#if defined(ARROW_R_WITH_ARROW)
double MemoryPool__bytes_allocated(const std::shared_ptr<arrow::MemoryPool>& pool);
extern "C" SEXP _arrow_MemoryPool__bytes_allocated(SEXP pool_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::MemoryPool>&>::type pool(pool_sexp);
	return cpp11::as_sexp(MemoryPool__bytes_allocated(pool));
END_CPP11
}
#else
extern "C" SEXP _arrow_MemoryPool__bytes_allocated(SEXP pool_sexp){
	Rf_error("Cannot call MemoryPool__bytes_allocated(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// memorypool.cpp
#if defined(ARROW_R_WITH_ARROW)
double MemoryPool__max_memory(const std::shared_ptr<arrow::MemoryPool>& pool);
extern "C" SEXP _arrow_MemoryPool__max_memory(SEXP pool_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::MemoryPool>&>::type pool(pool_sexp);
	return cpp11::as_sexp(MemoryPool__max_memory(pool));
END_CPP11
}
#else
extern "C" SEXP _arrow_MemoryPool__max_memory(SEXP pool_sexp){
	Rf_error("Cannot call MemoryPool__max_memory(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// memorypool.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string MemoryPool__backend_name(const std::shared_ptr<arrow::MemoryPool>& pool);
extern "C" SEXP _arrow_MemoryPool__backend_name(SEXP pool_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::MemoryPool>&>::type pool(pool_sexp);
	return cpp11::as_sexp(MemoryPool__backend_name(pool));
END_CPP11
}
#else
extern "C" SEXP _arrow_MemoryPool__backend_name(SEXP pool_sexp){
	Rf_error("Cannot call MemoryPool__backend_name(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// memorypool.cpp
#if defined(ARROW_R_WITH_ARROW)
std::vector<std::string> supported_memory_backends();
extern "C" SEXP _arrow_supported_memory_backends(){
BEGIN_CPP11
	return cpp11::as_sexp(supported_memory_backends());
END_CPP11
}
#else
extern "C" SEXP _arrow_supported_memory_backends(){
	Rf_error("Cannot call supported_memory_backends(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// message.cpp
#if defined(ARROW_R_WITH_ARROW)
int64_t ipc___Message__body_length(const std::unique_ptr<arrow::ipc::Message>& message);
extern "C" SEXP _arrow_ipc___Message__body_length(SEXP message_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::unique_ptr<arrow::ipc::Message>&>::type message(message_sexp);
	return cpp11::as_sexp(ipc___Message__body_length(message));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___Message__body_length(SEXP message_sexp){
	Rf_error("Cannot call ipc___Message__body_length(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// message.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Buffer> ipc___Message__metadata(const std::unique_ptr<arrow::ipc::Message>& message);
extern "C" SEXP _arrow_ipc___Message__metadata(SEXP message_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::unique_ptr<arrow::ipc::Message>&>::type message(message_sexp);
	return cpp11::as_sexp(ipc___Message__metadata(message));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___Message__metadata(SEXP message_sexp){
	Rf_error("Cannot call ipc___Message__metadata(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// message.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Buffer> ipc___Message__body(const std::unique_ptr<arrow::ipc::Message>& message);
extern "C" SEXP _arrow_ipc___Message__body(SEXP message_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::unique_ptr<arrow::ipc::Message>&>::type message(message_sexp);
	return cpp11::as_sexp(ipc___Message__body(message));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___Message__body(SEXP message_sexp){
	Rf_error("Cannot call ipc___Message__body(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// message.cpp
#if defined(ARROW_R_WITH_ARROW)
int64_t ipc___Message__Verify(const std::unique_ptr<arrow::ipc::Message>& message);
extern "C" SEXP _arrow_ipc___Message__Verify(SEXP message_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::unique_ptr<arrow::ipc::Message>&>::type message(message_sexp);
	return cpp11::as_sexp(ipc___Message__Verify(message));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___Message__Verify(SEXP message_sexp){
	Rf_error("Cannot call ipc___Message__Verify(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// message.cpp
#if defined(ARROW_R_WITH_ARROW)
arrow::ipc::MessageType ipc___Message__type(const std::unique_ptr<arrow::ipc::Message>& message);
extern "C" SEXP _arrow_ipc___Message__type(SEXP message_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::unique_ptr<arrow::ipc::Message>&>::type message(message_sexp);
	return cpp11::as_sexp(ipc___Message__type(message));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___Message__type(SEXP message_sexp){
	Rf_error("Cannot call ipc___Message__type(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// message.cpp
#if defined(ARROW_R_WITH_ARROW)
bool ipc___Message__Equals(const std::unique_ptr<arrow::ipc::Message>& x, const std::unique_ptr<arrow::ipc::Message>& y);
extern "C" SEXP _arrow_ipc___Message__Equals(SEXP x_sexp, SEXP y_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::unique_ptr<arrow::ipc::Message>&>::type x(x_sexp);
	arrow::r::Input<const std::unique_ptr<arrow::ipc::Message>&>::type y(y_sexp);
	return cpp11::as_sexp(ipc___Message__Equals(x, y));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___Message__Equals(SEXP x_sexp, SEXP y_sexp){
	Rf_error("Cannot call ipc___Message__Equals(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// message.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::RecordBatch> ipc___ReadRecordBatch__Message__Schema(const std::unique_ptr<arrow::ipc::Message>& message, const std::shared_ptr<arrow::Schema>& schema);
extern "C" SEXP _arrow_ipc___ReadRecordBatch__Message__Schema(SEXP message_sexp, SEXP schema_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::unique_ptr<arrow::ipc::Message>&>::type message(message_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schema(schema_sexp);
	return cpp11::as_sexp(ipc___ReadRecordBatch__Message__Schema(message, schema));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___ReadRecordBatch__Message__Schema(SEXP message_sexp, SEXP schema_sexp){
	Rf_error("Cannot call ipc___ReadRecordBatch__Message__Schema(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// message.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Schema> ipc___ReadSchema_InputStream(const std::shared_ptr<arrow::io::InputStream>& stream);
extern "C" SEXP _arrow_ipc___ReadSchema_InputStream(SEXP stream_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::InputStream>&>::type stream(stream_sexp);
	return cpp11::as_sexp(ipc___ReadSchema_InputStream(stream));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___ReadSchema_InputStream(SEXP stream_sexp){
	Rf_error("Cannot call ipc___ReadSchema_InputStream(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// message.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Schema> ipc___ReadSchema_Message(const std::unique_ptr<arrow::ipc::Message>& message);
extern "C" SEXP _arrow_ipc___ReadSchema_Message(SEXP message_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::unique_ptr<arrow::ipc::Message>&>::type message(message_sexp);
	return cpp11::as_sexp(ipc___ReadSchema_Message(message));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___ReadSchema_Message(SEXP message_sexp){
	Rf_error("Cannot call ipc___ReadSchema_Message(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// message.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::ipc::MessageReader> ipc___MessageReader__Open(const std::shared_ptr<arrow::io::InputStream>& stream);
extern "C" SEXP _arrow_ipc___MessageReader__Open(SEXP stream_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::InputStream>&>::type stream(stream_sexp);
	return cpp11::as_sexp(ipc___MessageReader__Open(stream));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___MessageReader__Open(SEXP stream_sexp){
	Rf_error("Cannot call ipc___MessageReader__Open(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// message.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::ipc::Message> ipc___MessageReader__ReadNextMessage(const std::unique_ptr<arrow::ipc::MessageReader>& reader);
extern "C" SEXP _arrow_ipc___MessageReader__ReadNextMessage(SEXP reader_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::unique_ptr<arrow::ipc::MessageReader>&>::type reader(reader_sexp);
	return cpp11::as_sexp(ipc___MessageReader__ReadNextMessage(reader));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___MessageReader__ReadNextMessage(SEXP reader_sexp){
	Rf_error("Cannot call ipc___MessageReader__ReadNextMessage(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// message.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::ipc::Message> ipc___ReadMessage(const std::shared_ptr<arrow::io::InputStream>& stream);
extern "C" SEXP _arrow_ipc___ReadMessage(SEXP stream_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::InputStream>&>::type stream(stream_sexp);
	return cpp11::as_sexp(ipc___ReadMessage(stream));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___ReadMessage(SEXP stream_sexp){
	Rf_error("Cannot call ipc___ReadMessage(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
std::shared_ptr<parquet::ArrowReaderProperties> parquet___arrow___ArrowReaderProperties__Make(bool use_threads);
extern "C" SEXP _arrow_parquet___arrow___ArrowReaderProperties__Make(SEXP use_threads_sexp){
BEGIN_CPP11
	arrow::r::Input<bool>::type use_threads(use_threads_sexp);
	return cpp11::as_sexp(parquet___arrow___ArrowReaderProperties__Make(use_threads));
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___ArrowReaderProperties__Make(SEXP use_threads_sexp){
	Rf_error("Cannot call parquet___arrow___ArrowReaderProperties__Make(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
void parquet___arrow___ArrowReaderProperties__set_use_threads(const std::shared_ptr<parquet::ArrowReaderProperties>& properties, bool use_threads);
extern "C" SEXP _arrow_parquet___arrow___ArrowReaderProperties__set_use_threads(SEXP properties_sexp, SEXP use_threads_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::ArrowReaderProperties>&>::type properties(properties_sexp);
	arrow::r::Input<bool>::type use_threads(use_threads_sexp);
	parquet___arrow___ArrowReaderProperties__set_use_threads(properties, use_threads);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___ArrowReaderProperties__set_use_threads(SEXP properties_sexp, SEXP use_threads_sexp){
	Rf_error("Cannot call parquet___arrow___ArrowReaderProperties__set_use_threads(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
bool parquet___arrow___ArrowReaderProperties__get_use_threads(const std::shared_ptr<parquet::ArrowReaderProperties>& properties, bool use_threads);
extern "C" SEXP _arrow_parquet___arrow___ArrowReaderProperties__get_use_threads(SEXP properties_sexp, SEXP use_threads_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::ArrowReaderProperties>&>::type properties(properties_sexp);
	arrow::r::Input<bool>::type use_threads(use_threads_sexp);
	return cpp11::as_sexp(parquet___arrow___ArrowReaderProperties__get_use_threads(properties, use_threads));
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___ArrowReaderProperties__get_use_threads(SEXP properties_sexp, SEXP use_threads_sexp){
	Rf_error("Cannot call parquet___arrow___ArrowReaderProperties__get_use_threads(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
bool parquet___arrow___ArrowReaderProperties__get_read_dictionary(const std::shared_ptr<parquet::ArrowReaderProperties>& properties, int column_index);
extern "C" SEXP _arrow_parquet___arrow___ArrowReaderProperties__get_read_dictionary(SEXP properties_sexp, SEXP column_index_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::ArrowReaderProperties>&>::type properties(properties_sexp);
	arrow::r::Input<int>::type column_index(column_index_sexp);
	return cpp11::as_sexp(parquet___arrow___ArrowReaderProperties__get_read_dictionary(properties, column_index));
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___ArrowReaderProperties__get_read_dictionary(SEXP properties_sexp, SEXP column_index_sexp){
	Rf_error("Cannot call parquet___arrow___ArrowReaderProperties__get_read_dictionary(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
void parquet___arrow___ArrowReaderProperties__set_read_dictionary(const std::shared_ptr<parquet::ArrowReaderProperties>& properties, int column_index, bool read_dict);
extern "C" SEXP _arrow_parquet___arrow___ArrowReaderProperties__set_read_dictionary(SEXP properties_sexp, SEXP column_index_sexp, SEXP read_dict_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::ArrowReaderProperties>&>::type properties(properties_sexp);
	arrow::r::Input<int>::type column_index(column_index_sexp);
	arrow::r::Input<bool>::type read_dict(read_dict_sexp);
	parquet___arrow___ArrowReaderProperties__set_read_dictionary(properties, column_index, read_dict);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___ArrowReaderProperties__set_read_dictionary(SEXP properties_sexp, SEXP column_index_sexp, SEXP read_dict_sexp){
	Rf_error("Cannot call parquet___arrow___ArrowReaderProperties__set_read_dictionary(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
std::shared_ptr<parquet::arrow::FileReader> parquet___arrow___FileReader__OpenFile(const std::shared_ptr<arrow::io::RandomAccessFile>& file, const std::shared_ptr<parquet::ArrowReaderProperties>& props);
extern "C" SEXP _arrow_parquet___arrow___FileReader__OpenFile(SEXP file_sexp, SEXP props_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::RandomAccessFile>&>::type file(file_sexp);
	arrow::r::Input<const std::shared_ptr<parquet::ArrowReaderProperties>&>::type props(props_sexp);
	return cpp11::as_sexp(parquet___arrow___FileReader__OpenFile(file, props));
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___FileReader__OpenFile(SEXP file_sexp, SEXP props_sexp){
	Rf_error("Cannot call parquet___arrow___FileReader__OpenFile(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
std::shared_ptr<arrow::Table> parquet___arrow___FileReader__ReadTable1(const std::shared_ptr<parquet::arrow::FileReader>& reader);
extern "C" SEXP _arrow_parquet___arrow___FileReader__ReadTable1(SEXP reader_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::arrow::FileReader>&>::type reader(reader_sexp);
	return cpp11::as_sexp(parquet___arrow___FileReader__ReadTable1(reader));
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___FileReader__ReadTable1(SEXP reader_sexp){
	Rf_error("Cannot call parquet___arrow___FileReader__ReadTable1(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
std::shared_ptr<arrow::Table> parquet___arrow___FileReader__ReadTable2(const std::shared_ptr<parquet::arrow::FileReader>& reader, const std::vector<int>& column_indices);
extern "C" SEXP _arrow_parquet___arrow___FileReader__ReadTable2(SEXP reader_sexp, SEXP column_indices_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::arrow::FileReader>&>::type reader(reader_sexp);
	arrow::r::Input<const std::vector<int>&>::type column_indices(column_indices_sexp);
	return cpp11::as_sexp(parquet___arrow___FileReader__ReadTable2(reader, column_indices));
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___FileReader__ReadTable2(SEXP reader_sexp, SEXP column_indices_sexp){
	Rf_error("Cannot call parquet___arrow___FileReader__ReadTable2(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
std::shared_ptr<arrow::Table> parquet___arrow___FileReader__ReadRowGroup1(const std::shared_ptr<parquet::arrow::FileReader>& reader, int i);
extern "C" SEXP _arrow_parquet___arrow___FileReader__ReadRowGroup1(SEXP reader_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::arrow::FileReader>&>::type reader(reader_sexp);
	arrow::r::Input<int>::type i(i_sexp);
	return cpp11::as_sexp(parquet___arrow___FileReader__ReadRowGroup1(reader, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___FileReader__ReadRowGroup1(SEXP reader_sexp, SEXP i_sexp){
	Rf_error("Cannot call parquet___arrow___FileReader__ReadRowGroup1(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
std::shared_ptr<arrow::Table> parquet___arrow___FileReader__ReadRowGroup2(const std::shared_ptr<parquet::arrow::FileReader>& reader, int i, const std::vector<int>& column_indices);
extern "C" SEXP _arrow_parquet___arrow___FileReader__ReadRowGroup2(SEXP reader_sexp, SEXP i_sexp, SEXP column_indices_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::arrow::FileReader>&>::type reader(reader_sexp);
	arrow::r::Input<int>::type i(i_sexp);
	arrow::r::Input<const std::vector<int>&>::type column_indices(column_indices_sexp);
	return cpp11::as_sexp(parquet___arrow___FileReader__ReadRowGroup2(reader, i, column_indices));
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___FileReader__ReadRowGroup2(SEXP reader_sexp, SEXP i_sexp, SEXP column_indices_sexp){
	Rf_error("Cannot call parquet___arrow___FileReader__ReadRowGroup2(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
std::shared_ptr<arrow::Table> parquet___arrow___FileReader__ReadRowGroups1(const std::shared_ptr<parquet::arrow::FileReader>& reader, const std::vector<int>& row_groups);
extern "C" SEXP _arrow_parquet___arrow___FileReader__ReadRowGroups1(SEXP reader_sexp, SEXP row_groups_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::arrow::FileReader>&>::type reader(reader_sexp);
	arrow::r::Input<const std::vector<int>&>::type row_groups(row_groups_sexp);
	return cpp11::as_sexp(parquet___arrow___FileReader__ReadRowGroups1(reader, row_groups));
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___FileReader__ReadRowGroups1(SEXP reader_sexp, SEXP row_groups_sexp){
	Rf_error("Cannot call parquet___arrow___FileReader__ReadRowGroups1(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
std::shared_ptr<arrow::Table> parquet___arrow___FileReader__ReadRowGroups2(const std::shared_ptr<parquet::arrow::FileReader>& reader, const std::vector<int>& row_groups, const std::vector<int>& column_indices);
extern "C" SEXP _arrow_parquet___arrow___FileReader__ReadRowGroups2(SEXP reader_sexp, SEXP row_groups_sexp, SEXP column_indices_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::arrow::FileReader>&>::type reader(reader_sexp);
	arrow::r::Input<const std::vector<int>&>::type row_groups(row_groups_sexp);
	arrow::r::Input<const std::vector<int>&>::type column_indices(column_indices_sexp);
	return cpp11::as_sexp(parquet___arrow___FileReader__ReadRowGroups2(reader, row_groups, column_indices));
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___FileReader__ReadRowGroups2(SEXP reader_sexp, SEXP row_groups_sexp, SEXP column_indices_sexp){
	Rf_error("Cannot call parquet___arrow___FileReader__ReadRowGroups2(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
int64_t parquet___arrow___FileReader__num_rows(const std::shared_ptr<parquet::arrow::FileReader>& reader);
extern "C" SEXP _arrow_parquet___arrow___FileReader__num_rows(SEXP reader_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::arrow::FileReader>&>::type reader(reader_sexp);
	return cpp11::as_sexp(parquet___arrow___FileReader__num_rows(reader));
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___FileReader__num_rows(SEXP reader_sexp){
	Rf_error("Cannot call parquet___arrow___FileReader__num_rows(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
int parquet___arrow___FileReader__num_columns(const std::shared_ptr<parquet::arrow::FileReader>& reader);
extern "C" SEXP _arrow_parquet___arrow___FileReader__num_columns(SEXP reader_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::arrow::FileReader>&>::type reader(reader_sexp);
	return cpp11::as_sexp(parquet___arrow___FileReader__num_columns(reader));
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___FileReader__num_columns(SEXP reader_sexp){
	Rf_error("Cannot call parquet___arrow___FileReader__num_columns(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
int parquet___arrow___FileReader__num_row_groups(const std::shared_ptr<parquet::arrow::FileReader>& reader);
extern "C" SEXP _arrow_parquet___arrow___FileReader__num_row_groups(SEXP reader_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::arrow::FileReader>&>::type reader(reader_sexp);
	return cpp11::as_sexp(parquet___arrow___FileReader__num_row_groups(reader));
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___FileReader__num_row_groups(SEXP reader_sexp){
	Rf_error("Cannot call parquet___arrow___FileReader__num_row_groups(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
std::shared_ptr<arrow::ChunkedArray> parquet___arrow___FileReader__ReadColumn(const std::shared_ptr<parquet::arrow::FileReader>& reader, int i);
extern "C" SEXP _arrow_parquet___arrow___FileReader__ReadColumn(SEXP reader_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::arrow::FileReader>&>::type reader(reader_sexp);
	arrow::r::Input<int>::type i(i_sexp);
	return cpp11::as_sexp(parquet___arrow___FileReader__ReadColumn(reader, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___FileReader__ReadColumn(SEXP reader_sexp, SEXP i_sexp){
	Rf_error("Cannot call parquet___arrow___FileReader__ReadColumn(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
std::shared_ptr<parquet::ArrowWriterProperties> parquet___ArrowWriterProperties___create(bool allow_truncated_timestamps, bool use_deprecated_int96_timestamps, int timestamp_unit);
extern "C" SEXP _arrow_parquet___ArrowWriterProperties___create(SEXP allow_truncated_timestamps_sexp, SEXP use_deprecated_int96_timestamps_sexp, SEXP timestamp_unit_sexp){
BEGIN_CPP11
	arrow::r::Input<bool>::type allow_truncated_timestamps(allow_truncated_timestamps_sexp);
	arrow::r::Input<bool>::type use_deprecated_int96_timestamps(use_deprecated_int96_timestamps_sexp);
	arrow::r::Input<int>::type timestamp_unit(timestamp_unit_sexp);
	return cpp11::as_sexp(parquet___ArrowWriterProperties___create(allow_truncated_timestamps, use_deprecated_int96_timestamps, timestamp_unit));
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___ArrowWriterProperties___create(SEXP allow_truncated_timestamps_sexp, SEXP use_deprecated_int96_timestamps_sexp, SEXP timestamp_unit_sexp){
	Rf_error("Cannot call parquet___ArrowWriterProperties___create(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
std::shared_ptr<parquet::WriterPropertiesBuilder> parquet___WriterProperties___Builder__create();
extern "C" SEXP _arrow_parquet___WriterProperties___Builder__create(){
BEGIN_CPP11
	return cpp11::as_sexp(parquet___WriterProperties___Builder__create());
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___WriterProperties___Builder__create(){
	Rf_error("Cannot call parquet___WriterProperties___Builder__create(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
void parquet___WriterProperties___Builder__version(const std::shared_ptr<parquet::WriterPropertiesBuilder>& builder, const parquet::ParquetVersion::type& version);
extern "C" SEXP _arrow_parquet___WriterProperties___Builder__version(SEXP builder_sexp, SEXP version_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::WriterPropertiesBuilder>&>::type builder(builder_sexp);
	arrow::r::Input<const parquet::ParquetVersion::type&>::type version(version_sexp);
	parquet___WriterProperties___Builder__version(builder, version);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___WriterProperties___Builder__version(SEXP builder_sexp, SEXP version_sexp){
	Rf_error("Cannot call parquet___WriterProperties___Builder__version(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
void parquet___ArrowWriterProperties___Builder__set_compressions(const std::shared_ptr<parquet::WriterPropertiesBuilder>& builder, const std::vector<std::string>& paths, cpp11::integers types);
extern "C" SEXP _arrow_parquet___ArrowWriterProperties___Builder__set_compressions(SEXP builder_sexp, SEXP paths_sexp, SEXP types_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::WriterPropertiesBuilder>&>::type builder(builder_sexp);
	arrow::r::Input<const std::vector<std::string>&>::type paths(paths_sexp);
	arrow::r::Input<cpp11::integers>::type types(types_sexp);
	parquet___ArrowWriterProperties___Builder__set_compressions(builder, paths, types);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___ArrowWriterProperties___Builder__set_compressions(SEXP builder_sexp, SEXP paths_sexp, SEXP types_sexp){
	Rf_error("Cannot call parquet___ArrowWriterProperties___Builder__set_compressions(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
void parquet___ArrowWriterProperties___Builder__set_compression_levels(const std::shared_ptr<parquet::WriterPropertiesBuilder>& builder, const std::vector<std::string>& paths, cpp11::integers levels);
extern "C" SEXP _arrow_parquet___ArrowWriterProperties___Builder__set_compression_levels(SEXP builder_sexp, SEXP paths_sexp, SEXP levels_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::WriterPropertiesBuilder>&>::type builder(builder_sexp);
	arrow::r::Input<const std::vector<std::string>&>::type paths(paths_sexp);
	arrow::r::Input<cpp11::integers>::type levels(levels_sexp);
	parquet___ArrowWriterProperties___Builder__set_compression_levels(builder, paths, levels);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___ArrowWriterProperties___Builder__set_compression_levels(SEXP builder_sexp, SEXP paths_sexp, SEXP levels_sexp){
	Rf_error("Cannot call parquet___ArrowWriterProperties___Builder__set_compression_levels(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
void parquet___ArrowWriterProperties___Builder__set_use_dictionary(const std::shared_ptr<parquet::WriterPropertiesBuilder>& builder, const std::vector<std::string>& paths, cpp11::logicals use_dictionary);
extern "C" SEXP _arrow_parquet___ArrowWriterProperties___Builder__set_use_dictionary(SEXP builder_sexp, SEXP paths_sexp, SEXP use_dictionary_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::WriterPropertiesBuilder>&>::type builder(builder_sexp);
	arrow::r::Input<const std::vector<std::string>&>::type paths(paths_sexp);
	arrow::r::Input<cpp11::logicals>::type use_dictionary(use_dictionary_sexp);
	parquet___ArrowWriterProperties___Builder__set_use_dictionary(builder, paths, use_dictionary);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___ArrowWriterProperties___Builder__set_use_dictionary(SEXP builder_sexp, SEXP paths_sexp, SEXP use_dictionary_sexp){
	Rf_error("Cannot call parquet___ArrowWriterProperties___Builder__set_use_dictionary(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
void parquet___ArrowWriterProperties___Builder__set_write_statistics(const std::shared_ptr<parquet::WriterPropertiesBuilder>& builder, const std::vector<std::string>& paths, cpp11::logicals write_statistics);
extern "C" SEXP _arrow_parquet___ArrowWriterProperties___Builder__set_write_statistics(SEXP builder_sexp, SEXP paths_sexp, SEXP write_statistics_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::WriterPropertiesBuilder>&>::type builder(builder_sexp);
	arrow::r::Input<const std::vector<std::string>&>::type paths(paths_sexp);
	arrow::r::Input<cpp11::logicals>::type write_statistics(write_statistics_sexp);
	parquet___ArrowWriterProperties___Builder__set_write_statistics(builder, paths, write_statistics);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___ArrowWriterProperties___Builder__set_write_statistics(SEXP builder_sexp, SEXP paths_sexp, SEXP write_statistics_sexp){
	Rf_error("Cannot call parquet___ArrowWriterProperties___Builder__set_write_statistics(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
void parquet___ArrowWriterProperties___Builder__data_page_size(const std::shared_ptr<parquet::WriterPropertiesBuilder>& builder, int64_t data_page_size);
extern "C" SEXP _arrow_parquet___ArrowWriterProperties___Builder__data_page_size(SEXP builder_sexp, SEXP data_page_size_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::WriterPropertiesBuilder>&>::type builder(builder_sexp);
	arrow::r::Input<int64_t>::type data_page_size(data_page_size_sexp);
	parquet___ArrowWriterProperties___Builder__data_page_size(builder, data_page_size);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___ArrowWriterProperties___Builder__data_page_size(SEXP builder_sexp, SEXP data_page_size_sexp){
	Rf_error("Cannot call parquet___ArrowWriterProperties___Builder__data_page_size(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
std::shared_ptr<parquet::WriterProperties> parquet___WriterProperties___Builder__build(const std::shared_ptr<parquet::WriterPropertiesBuilder>& builder);
extern "C" SEXP _arrow_parquet___WriterProperties___Builder__build(SEXP builder_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::WriterPropertiesBuilder>&>::type builder(builder_sexp);
	return cpp11::as_sexp(parquet___WriterProperties___Builder__build(builder));
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___WriterProperties___Builder__build(SEXP builder_sexp){
	Rf_error("Cannot call parquet___WriterProperties___Builder__build(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
std::shared_ptr<parquet::arrow::FileWriter> parquet___arrow___ParquetFileWriter__Open(const std::shared_ptr<arrow::Schema>& schema, const std::shared_ptr<arrow::io::OutputStream>& sink, const std::shared_ptr<parquet::WriterProperties>& properties, const std::shared_ptr<parquet::ArrowWriterProperties>& arrow_properties);
extern "C" SEXP _arrow_parquet___arrow___ParquetFileWriter__Open(SEXP schema_sexp, SEXP sink_sexp, SEXP properties_sexp, SEXP arrow_properties_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schema(schema_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::io::OutputStream>&>::type sink(sink_sexp);
	arrow::r::Input<const std::shared_ptr<parquet::WriterProperties>&>::type properties(properties_sexp);
	arrow::r::Input<const std::shared_ptr<parquet::ArrowWriterProperties>&>::type arrow_properties(arrow_properties_sexp);
	return cpp11::as_sexp(parquet___arrow___ParquetFileWriter__Open(schema, sink, properties, arrow_properties));
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___ParquetFileWriter__Open(SEXP schema_sexp, SEXP sink_sexp, SEXP properties_sexp, SEXP arrow_properties_sexp){
	Rf_error("Cannot call parquet___arrow___ParquetFileWriter__Open(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
void parquet___arrow___FileWriter__WriteTable(const std::shared_ptr<parquet::arrow::FileWriter>& writer, const std::shared_ptr<arrow::Table>& table, int64_t chunk_size);
extern "C" SEXP _arrow_parquet___arrow___FileWriter__WriteTable(SEXP writer_sexp, SEXP table_sexp, SEXP chunk_size_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::arrow::FileWriter>&>::type writer(writer_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	arrow::r::Input<int64_t>::type chunk_size(chunk_size_sexp);
	parquet___arrow___FileWriter__WriteTable(writer, table, chunk_size);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___FileWriter__WriteTable(SEXP writer_sexp, SEXP table_sexp, SEXP chunk_size_sexp){
	Rf_error("Cannot call parquet___arrow___FileWriter__WriteTable(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
void parquet___arrow___FileWriter__Close(const std::shared_ptr<parquet::arrow::FileWriter>& writer);
extern "C" SEXP _arrow_parquet___arrow___FileWriter__Close(SEXP writer_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::arrow::FileWriter>&>::type writer(writer_sexp);
	parquet___arrow___FileWriter__Close(writer);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___FileWriter__Close(SEXP writer_sexp){
	Rf_error("Cannot call parquet___arrow___FileWriter__Close(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
void parquet___arrow___WriteTable(const std::shared_ptr<arrow::Table>& table, const std::shared_ptr<arrow::io::OutputStream>& sink, const std::shared_ptr<parquet::WriterProperties>& properties, const std::shared_ptr<parquet::ArrowWriterProperties>& arrow_properties);
extern "C" SEXP _arrow_parquet___arrow___WriteTable(SEXP table_sexp, SEXP sink_sexp, SEXP properties_sexp, SEXP arrow_properties_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::io::OutputStream>&>::type sink(sink_sexp);
	arrow::r::Input<const std::shared_ptr<parquet::WriterProperties>&>::type properties(properties_sexp);
	arrow::r::Input<const std::shared_ptr<parquet::ArrowWriterProperties>&>::type arrow_properties(arrow_properties_sexp);
	parquet___arrow___WriteTable(table, sink, properties, arrow_properties);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___WriteTable(SEXP table_sexp, SEXP sink_sexp, SEXP properties_sexp, SEXP arrow_properties_sexp){
	Rf_error("Cannot call parquet___arrow___WriteTable(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// parquet.cpp
#if defined(ARROW_R_WITH_PARQUET)
std::shared_ptr<arrow::Schema> parquet___arrow___FileReader__GetSchema(const std::shared_ptr<parquet::arrow::FileReader>& reader);
extern "C" SEXP _arrow_parquet___arrow___FileReader__GetSchema(SEXP reader_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<parquet::arrow::FileReader>&>::type reader(reader_sexp);
	return cpp11::as_sexp(parquet___arrow___FileReader__GetSchema(reader));
END_CPP11
}
#else
extern "C" SEXP _arrow_parquet___arrow___FileReader__GetSchema(SEXP reader_sexp){
	Rf_error("Cannot call parquet___arrow___FileReader__GetSchema(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// py-to-r.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Array> ImportArray(arrow::r::Pointer<struct ArrowArray> array, arrow::r::Pointer<struct ArrowSchema> schema);
extern "C" SEXP _arrow_ImportArray(SEXP array_sexp, SEXP schema_sexp){
BEGIN_CPP11
	arrow::r::Input<arrow::r::Pointer<struct ArrowArray>>::type array(array_sexp);
	arrow::r::Input<arrow::r::Pointer<struct ArrowSchema>>::type schema(schema_sexp);
	return cpp11::as_sexp(ImportArray(array, schema));
END_CPP11
}
#else
extern "C" SEXP _arrow_ImportArray(SEXP array_sexp, SEXP schema_sexp){
	Rf_error("Cannot call ImportArray(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// py-to-r.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::RecordBatch> ImportRecordBatch(arrow::r::Pointer<struct ArrowArray> array, arrow::r::Pointer<struct ArrowSchema> schema);
extern "C" SEXP _arrow_ImportRecordBatch(SEXP array_sexp, SEXP schema_sexp){
BEGIN_CPP11
	arrow::r::Input<arrow::r::Pointer<struct ArrowArray>>::type array(array_sexp);
	arrow::r::Input<arrow::r::Pointer<struct ArrowSchema>>::type schema(schema_sexp);
	return cpp11::as_sexp(ImportRecordBatch(array, schema));
END_CPP11
}
#else
extern "C" SEXP _arrow_ImportRecordBatch(SEXP array_sexp, SEXP schema_sexp){
	Rf_error("Cannot call ImportRecordBatch(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// py-to-r.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Schema> ImportSchema(arrow::r::Pointer<struct ArrowSchema> schema);
extern "C" SEXP _arrow_ImportSchema(SEXP schema_sexp){
BEGIN_CPP11
	arrow::r::Input<arrow::r::Pointer<struct ArrowSchema>>::type schema(schema_sexp);
	return cpp11::as_sexp(ImportSchema(schema));
END_CPP11
}
#else
extern "C" SEXP _arrow_ImportSchema(SEXP schema_sexp){
	Rf_error("Cannot call ImportSchema(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// py-to-r.cpp
#if defined(ARROW_R_WITH_ARROW)
arrow::r::Pointer<struct ArrowSchema> allocate_arrow_schema();
extern "C" SEXP _arrow_allocate_arrow_schema(){
BEGIN_CPP11
	return cpp11::as_sexp(allocate_arrow_schema());
END_CPP11
}
#else
extern "C" SEXP _arrow_allocate_arrow_schema(){
	Rf_error("Cannot call allocate_arrow_schema(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// py-to-r.cpp
#if defined(ARROW_R_WITH_ARROW)
void delete_arrow_schema(arrow::r::Pointer<struct ArrowSchema> ptr);
extern "C" SEXP _arrow_delete_arrow_schema(SEXP ptr_sexp){
BEGIN_CPP11
	arrow::r::Input<arrow::r::Pointer<struct ArrowSchema>>::type ptr(ptr_sexp);
	delete_arrow_schema(ptr);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_delete_arrow_schema(SEXP ptr_sexp){
	Rf_error("Cannot call delete_arrow_schema(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// py-to-r.cpp
#if defined(ARROW_R_WITH_ARROW)
arrow::r::Pointer<struct ArrowArray> allocate_arrow_array();
extern "C" SEXP _arrow_allocate_arrow_array(){
BEGIN_CPP11
	return cpp11::as_sexp(allocate_arrow_array());
END_CPP11
}
#else
extern "C" SEXP _arrow_allocate_arrow_array(){
	Rf_error("Cannot call allocate_arrow_array(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// py-to-r.cpp
#if defined(ARROW_R_WITH_ARROW)
void delete_arrow_array(arrow::r::Pointer<struct ArrowArray> ptr);
extern "C" SEXP _arrow_delete_arrow_array(SEXP ptr_sexp){
BEGIN_CPP11
	arrow::r::Input<arrow::r::Pointer<struct ArrowArray>>::type ptr(ptr_sexp);
	delete_arrow_array(ptr);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_delete_arrow_array(SEXP ptr_sexp){
	Rf_error("Cannot call delete_arrow_array(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// py-to-r.cpp
#if defined(ARROW_R_WITH_ARROW)
void ExportType(const std::shared_ptr<arrow::DataType>& type, arrow::r::Pointer<struct ArrowSchema> ptr);
extern "C" SEXP _arrow_ExportType(SEXP type_sexp, SEXP ptr_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::DataType>&>::type type(type_sexp);
	arrow::r::Input<arrow::r::Pointer<struct ArrowSchema>>::type ptr(ptr_sexp);
	ExportType(type, ptr);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_ExportType(SEXP type_sexp, SEXP ptr_sexp){
	Rf_error("Cannot call ExportType(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// py-to-r.cpp
#if defined(ARROW_R_WITH_ARROW)
void ExportSchema(const std::shared_ptr<arrow::Schema>& schema, arrow::r::Pointer<struct ArrowSchema> ptr);
extern "C" SEXP _arrow_ExportSchema(SEXP schema_sexp, SEXP ptr_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schema(schema_sexp);
	arrow::r::Input<arrow::r::Pointer<struct ArrowSchema>>::type ptr(ptr_sexp);
	ExportSchema(schema, ptr);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_ExportSchema(SEXP schema_sexp, SEXP ptr_sexp){
	Rf_error("Cannot call ExportSchema(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// py-to-r.cpp
#if defined(ARROW_R_WITH_ARROW)
void ExportArray(const std::shared_ptr<arrow::Array>& array, arrow::r::Pointer<struct ArrowArray> array_ptr, arrow::r::Pointer<struct ArrowSchema> schema_ptr);
extern "C" SEXP _arrow_ExportArray(SEXP array_sexp, SEXP array_ptr_sexp, SEXP schema_ptr_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type array(array_sexp);
	arrow::r::Input<arrow::r::Pointer<struct ArrowArray>>::type array_ptr(array_ptr_sexp);
	arrow::r::Input<arrow::r::Pointer<struct ArrowSchema>>::type schema_ptr(schema_ptr_sexp);
	ExportArray(array, array_ptr, schema_ptr);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_ExportArray(SEXP array_sexp, SEXP array_ptr_sexp, SEXP schema_ptr_sexp){
	Rf_error("Cannot call ExportArray(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// py-to-r.cpp
#if defined(ARROW_R_WITH_ARROW)
void ExportRecordBatch(const std::shared_ptr<arrow::RecordBatch>& batch, arrow::r::Pointer<struct ArrowArray> array_ptr, arrow::r::Pointer<struct ArrowSchema> schema_ptr);
extern "C" SEXP _arrow_ExportRecordBatch(SEXP batch_sexp, SEXP array_ptr_sexp, SEXP schema_ptr_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type batch(batch_sexp);
	arrow::r::Input<arrow::r::Pointer<struct ArrowArray>>::type array_ptr(array_ptr_sexp);
	arrow::r::Input<arrow::r::Pointer<struct ArrowSchema>>::type schema_ptr(schema_ptr_sexp);
	ExportRecordBatch(batch, array_ptr, schema_ptr);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_ExportRecordBatch(SEXP batch_sexp, SEXP array_ptr_sexp, SEXP schema_ptr_sexp){
	Rf_error("Cannot call ExportRecordBatch(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// r_to_arrow.cpp
#if defined(ARROW_R_WITH_ARROW)
SEXP vec_to_arrow(SEXP x, SEXP s_type);
extern "C" SEXP _arrow_vec_to_arrow(SEXP x_sexp, SEXP s_type_sexp){
BEGIN_CPP11
	arrow::r::Input<SEXP>::type x(x_sexp);
	arrow::r::Input<SEXP>::type s_type(s_type_sexp);
	return cpp11::as_sexp(vec_to_arrow(x, s_type));
END_CPP11
}
#else
extern "C" SEXP _arrow_vec_to_arrow(SEXP x_sexp, SEXP s_type_sexp){
	Rf_error("Cannot call vec_to_arrow(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// r_to_arrow.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Array> DictionaryArray__FromArrays(const std::shared_ptr<arrow::DataType>& type, const std::shared_ptr<arrow::Array>& indices, const std::shared_ptr<arrow::Array>& dict);
extern "C" SEXP _arrow_DictionaryArray__FromArrays(SEXP type_sexp, SEXP indices_sexp, SEXP dict_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::DataType>&>::type type(type_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type indices(indices_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type dict(dict_sexp);
	return cpp11::as_sexp(DictionaryArray__FromArrays(type, indices, dict));
END_CPP11
}
#else
extern "C" SEXP _arrow_DictionaryArray__FromArrays(SEXP type_sexp, SEXP indices_sexp, SEXP dict_sexp){
	Rf_error("Cannot call DictionaryArray__FromArrays(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
int RecordBatch__num_columns(const std::shared_ptr<arrow::RecordBatch>& x);
extern "C" SEXP _arrow_RecordBatch__num_columns(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type x(x_sexp);
	return cpp11::as_sexp(RecordBatch__num_columns(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__num_columns(SEXP x_sexp){
	Rf_error("Cannot call RecordBatch__num_columns(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
int RecordBatch__num_rows(const std::shared_ptr<arrow::RecordBatch>& x);
extern "C" SEXP _arrow_RecordBatch__num_rows(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type x(x_sexp);
	return cpp11::as_sexp(RecordBatch__num_rows(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__num_rows(SEXP x_sexp){
	Rf_error("Cannot call RecordBatch__num_rows(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Schema> RecordBatch__schema(const std::shared_ptr<arrow::RecordBatch>& x);
extern "C" SEXP _arrow_RecordBatch__schema(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type x(x_sexp);
	return cpp11::as_sexp(RecordBatch__schema(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__schema(SEXP x_sexp){
	Rf_error("Cannot call RecordBatch__schema(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::RecordBatch> RecordBatch__RenameColumns(const std::shared_ptr<arrow::RecordBatch>& batch, const std::vector<std::string>& names);
extern "C" SEXP _arrow_RecordBatch__RenameColumns(SEXP batch_sexp, SEXP names_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type batch(batch_sexp);
	arrow::r::Input<const std::vector<std::string>&>::type names(names_sexp);
	return cpp11::as_sexp(RecordBatch__RenameColumns(batch, names));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__RenameColumns(SEXP batch_sexp, SEXP names_sexp){
	Rf_error("Cannot call RecordBatch__RenameColumns(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::RecordBatch> RecordBatch__ReplaceSchemaMetadata(const std::shared_ptr<arrow::RecordBatch>& x, cpp11::strings metadata);
extern "C" SEXP _arrow_RecordBatch__ReplaceSchemaMetadata(SEXP x_sexp, SEXP metadata_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type x(x_sexp);
	arrow::r::Input<cpp11::strings>::type metadata(metadata_sexp);
	return cpp11::as_sexp(RecordBatch__ReplaceSchemaMetadata(x, metadata));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__ReplaceSchemaMetadata(SEXP x_sexp, SEXP metadata_sexp){
	Rf_error("Cannot call RecordBatch__ReplaceSchemaMetadata(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::list RecordBatch__columns(const std::shared_ptr<arrow::RecordBatch>& batch);
extern "C" SEXP _arrow_RecordBatch__columns(SEXP batch_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type batch(batch_sexp);
	return cpp11::as_sexp(RecordBatch__columns(batch));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__columns(SEXP batch_sexp){
	Rf_error("Cannot call RecordBatch__columns(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Array> RecordBatch__column(const std::shared_ptr<arrow::RecordBatch>& batch, R_xlen_t i);
extern "C" SEXP _arrow_RecordBatch__column(SEXP batch_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type batch(batch_sexp);
	arrow::r::Input<R_xlen_t>::type i(i_sexp);
	return cpp11::as_sexp(RecordBatch__column(batch, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__column(SEXP batch_sexp, SEXP i_sexp){
	Rf_error("Cannot call RecordBatch__column(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Array> RecordBatch__GetColumnByName(const std::shared_ptr<arrow::RecordBatch>& batch, const std::string& name);
extern "C" SEXP _arrow_RecordBatch__GetColumnByName(SEXP batch_sexp, SEXP name_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type batch(batch_sexp);
	arrow::r::Input<const std::string&>::type name(name_sexp);
	return cpp11::as_sexp(RecordBatch__GetColumnByName(batch, name));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__GetColumnByName(SEXP batch_sexp, SEXP name_sexp){
	Rf_error("Cannot call RecordBatch__GetColumnByName(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::RecordBatch> RecordBatch__SelectColumns(const std::shared_ptr<arrow::RecordBatch>& batch, cpp11::integers indices);
extern "C" SEXP _arrow_RecordBatch__SelectColumns(SEXP batch_sexp, SEXP indices_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type batch(batch_sexp);
	arrow::r::Input<cpp11::integers>::type indices(indices_sexp);
	return cpp11::as_sexp(RecordBatch__SelectColumns(batch, indices));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__SelectColumns(SEXP batch_sexp, SEXP indices_sexp){
	Rf_error("Cannot call RecordBatch__SelectColumns(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
bool RecordBatch__Equals(const std::shared_ptr<arrow::RecordBatch>& self, const std::shared_ptr<arrow::RecordBatch>& other, bool check_metadata);
extern "C" SEXP _arrow_RecordBatch__Equals(SEXP self_sexp, SEXP other_sexp, SEXP check_metadata_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type self(self_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type other(other_sexp);
	arrow::r::Input<bool>::type check_metadata(check_metadata_sexp);
	return cpp11::as_sexp(RecordBatch__Equals(self, other, check_metadata));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__Equals(SEXP self_sexp, SEXP other_sexp, SEXP check_metadata_sexp){
	Rf_error("Cannot call RecordBatch__Equals(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::RecordBatch> RecordBatch__AddColumn(const std::shared_ptr<arrow::RecordBatch>& batch, R_xlen_t i, const std::shared_ptr<arrow::Field>& field, const std::shared_ptr<arrow::Array>& column);
extern "C" SEXP _arrow_RecordBatch__AddColumn(SEXP batch_sexp, SEXP i_sexp, SEXP field_sexp, SEXP column_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type batch(batch_sexp);
	arrow::r::Input<R_xlen_t>::type i(i_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Field>&>::type field(field_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type column(column_sexp);
	return cpp11::as_sexp(RecordBatch__AddColumn(batch, i, field, column));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__AddColumn(SEXP batch_sexp, SEXP i_sexp, SEXP field_sexp, SEXP column_sexp){
	Rf_error("Cannot call RecordBatch__AddColumn(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::RecordBatch> RecordBatch__SetColumn(const std::shared_ptr<arrow::RecordBatch>& batch, R_xlen_t i, const std::shared_ptr<arrow::Field>& field, const std::shared_ptr<arrow::Array>& column);
extern "C" SEXP _arrow_RecordBatch__SetColumn(SEXP batch_sexp, SEXP i_sexp, SEXP field_sexp, SEXP column_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type batch(batch_sexp);
	arrow::r::Input<R_xlen_t>::type i(i_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Field>&>::type field(field_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type column(column_sexp);
	return cpp11::as_sexp(RecordBatch__SetColumn(batch, i, field, column));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__SetColumn(SEXP batch_sexp, SEXP i_sexp, SEXP field_sexp, SEXP column_sexp){
	Rf_error("Cannot call RecordBatch__SetColumn(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::RecordBatch> RecordBatch__RemoveColumn(const std::shared_ptr<arrow::RecordBatch>& batch, R_xlen_t i);
extern "C" SEXP _arrow_RecordBatch__RemoveColumn(SEXP batch_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type batch(batch_sexp);
	arrow::r::Input<R_xlen_t>::type i(i_sexp);
	return cpp11::as_sexp(RecordBatch__RemoveColumn(batch, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__RemoveColumn(SEXP batch_sexp, SEXP i_sexp){
	Rf_error("Cannot call RecordBatch__RemoveColumn(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string RecordBatch__column_name(const std::shared_ptr<arrow::RecordBatch>& batch, R_xlen_t i);
extern "C" SEXP _arrow_RecordBatch__column_name(SEXP batch_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type batch(batch_sexp);
	arrow::r::Input<R_xlen_t>::type i(i_sexp);
	return cpp11::as_sexp(RecordBatch__column_name(batch, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__column_name(SEXP batch_sexp, SEXP i_sexp){
	Rf_error("Cannot call RecordBatch__column_name(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::writable::strings RecordBatch__names(const std::shared_ptr<arrow::RecordBatch>& batch);
extern "C" SEXP _arrow_RecordBatch__names(SEXP batch_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type batch(batch_sexp);
	return cpp11::as_sexp(RecordBatch__names(batch));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__names(SEXP batch_sexp){
	Rf_error("Cannot call RecordBatch__names(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::RecordBatch> RecordBatch__Slice1(const std::shared_ptr<arrow::RecordBatch>& self, R_xlen_t offset);
extern "C" SEXP _arrow_RecordBatch__Slice1(SEXP self_sexp, SEXP offset_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type self(self_sexp);
	arrow::r::Input<R_xlen_t>::type offset(offset_sexp);
	return cpp11::as_sexp(RecordBatch__Slice1(self, offset));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__Slice1(SEXP self_sexp, SEXP offset_sexp){
	Rf_error("Cannot call RecordBatch__Slice1(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::RecordBatch> RecordBatch__Slice2(const std::shared_ptr<arrow::RecordBatch>& self, R_xlen_t offset, R_xlen_t length);
extern "C" SEXP _arrow_RecordBatch__Slice2(SEXP self_sexp, SEXP offset_sexp, SEXP length_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type self(self_sexp);
	arrow::r::Input<R_xlen_t>::type offset(offset_sexp);
	arrow::r::Input<R_xlen_t>::type length(length_sexp);
	return cpp11::as_sexp(RecordBatch__Slice2(self, offset, length));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__Slice2(SEXP self_sexp, SEXP offset_sexp, SEXP length_sexp){
	Rf_error("Cannot call RecordBatch__Slice2(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::raws ipc___SerializeRecordBatch__Raw(const std::shared_ptr<arrow::RecordBatch>& batch);
extern "C" SEXP _arrow_ipc___SerializeRecordBatch__Raw(SEXP batch_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type batch(batch_sexp);
	return cpp11::as_sexp(ipc___SerializeRecordBatch__Raw(batch));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___SerializeRecordBatch__Raw(SEXP batch_sexp){
	Rf_error("Cannot call ipc___SerializeRecordBatch__Raw(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::RecordBatch> ipc___ReadRecordBatch__InputStream__Schema(const std::shared_ptr<arrow::io::InputStream>& stream, const std::shared_ptr<arrow::Schema>& schema);
extern "C" SEXP _arrow_ipc___ReadRecordBatch__InputStream__Schema(SEXP stream_sexp, SEXP schema_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::InputStream>&>::type stream(stream_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schema(schema_sexp);
	return cpp11::as_sexp(ipc___ReadRecordBatch__InputStream__Schema(stream, schema));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___ReadRecordBatch__InputStream__Schema(SEXP stream_sexp, SEXP schema_sexp){
	Rf_error("Cannot call ipc___ReadRecordBatch__InputStream__Schema(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatch.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::RecordBatch> RecordBatch__from_arrays(SEXP schema_sxp, SEXP lst);
extern "C" SEXP _arrow_RecordBatch__from_arrays(SEXP schema_sxp_sexp, SEXP lst_sexp){
BEGIN_CPP11
	arrow::r::Input<SEXP>::type schema_sxp(schema_sxp_sexp);
	arrow::r::Input<SEXP>::type lst(lst_sexp);
	return cpp11::as_sexp(RecordBatch__from_arrays(schema_sxp, lst));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatch__from_arrays(SEXP schema_sxp_sexp, SEXP lst_sexp){
	Rf_error("Cannot call RecordBatch__from_arrays(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatchreader.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Schema> RecordBatchReader__schema(const std::shared_ptr<arrow::RecordBatchReader>& reader);
extern "C" SEXP _arrow_RecordBatchReader__schema(SEXP reader_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatchReader>&>::type reader(reader_sexp);
	return cpp11::as_sexp(RecordBatchReader__schema(reader));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatchReader__schema(SEXP reader_sexp){
	Rf_error("Cannot call RecordBatchReader__schema(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatchreader.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::RecordBatch> RecordBatchReader__ReadNext(const std::shared_ptr<arrow::RecordBatchReader>& reader);
extern "C" SEXP _arrow_RecordBatchReader__ReadNext(SEXP reader_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatchReader>&>::type reader(reader_sexp);
	return cpp11::as_sexp(RecordBatchReader__ReadNext(reader));
END_CPP11
}
#else
extern "C" SEXP _arrow_RecordBatchReader__ReadNext(SEXP reader_sexp){
	Rf_error("Cannot call RecordBatchReader__ReadNext(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatchreader.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::ipc::RecordBatchStreamReader> ipc___RecordBatchStreamReader__Open(const std::shared_ptr<arrow::io::InputStream>& stream);
extern "C" SEXP _arrow_ipc___RecordBatchStreamReader__Open(SEXP stream_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::InputStream>&>::type stream(stream_sexp);
	return cpp11::as_sexp(ipc___RecordBatchStreamReader__Open(stream));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___RecordBatchStreamReader__Open(SEXP stream_sexp){
	Rf_error("Cannot call ipc___RecordBatchStreamReader__Open(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatchreader.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::list ipc___RecordBatchStreamReader__batches(const std::shared_ptr<arrow::ipc::RecordBatchStreamReader>& reader);
extern "C" SEXP _arrow_ipc___RecordBatchStreamReader__batches(SEXP reader_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ipc::RecordBatchStreamReader>&>::type reader(reader_sexp);
	return cpp11::as_sexp(ipc___RecordBatchStreamReader__batches(reader));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___RecordBatchStreamReader__batches(SEXP reader_sexp){
	Rf_error("Cannot call ipc___RecordBatchStreamReader__batches(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatchreader.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Schema> ipc___RecordBatchFileReader__schema(const std::shared_ptr<arrow::ipc::RecordBatchFileReader>& reader);
extern "C" SEXP _arrow_ipc___RecordBatchFileReader__schema(SEXP reader_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ipc::RecordBatchFileReader>&>::type reader(reader_sexp);
	return cpp11::as_sexp(ipc___RecordBatchFileReader__schema(reader));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___RecordBatchFileReader__schema(SEXP reader_sexp){
	Rf_error("Cannot call ipc___RecordBatchFileReader__schema(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatchreader.cpp
#if defined(ARROW_R_WITH_ARROW)
int ipc___RecordBatchFileReader__num_record_batches(const std::shared_ptr<arrow::ipc::RecordBatchFileReader>& reader);
extern "C" SEXP _arrow_ipc___RecordBatchFileReader__num_record_batches(SEXP reader_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ipc::RecordBatchFileReader>&>::type reader(reader_sexp);
	return cpp11::as_sexp(ipc___RecordBatchFileReader__num_record_batches(reader));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___RecordBatchFileReader__num_record_batches(SEXP reader_sexp){
	Rf_error("Cannot call ipc___RecordBatchFileReader__num_record_batches(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatchreader.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::RecordBatch> ipc___RecordBatchFileReader__ReadRecordBatch(const std::shared_ptr<arrow::ipc::RecordBatchFileReader>& reader, int i);
extern "C" SEXP _arrow_ipc___RecordBatchFileReader__ReadRecordBatch(SEXP reader_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ipc::RecordBatchFileReader>&>::type reader(reader_sexp);
	arrow::r::Input<int>::type i(i_sexp);
	return cpp11::as_sexp(ipc___RecordBatchFileReader__ReadRecordBatch(reader, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___RecordBatchFileReader__ReadRecordBatch(SEXP reader_sexp, SEXP i_sexp){
	Rf_error("Cannot call ipc___RecordBatchFileReader__ReadRecordBatch(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatchreader.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::ipc::RecordBatchFileReader> ipc___RecordBatchFileReader__Open(const std::shared_ptr<arrow::io::RandomAccessFile>& file);
extern "C" SEXP _arrow_ipc___RecordBatchFileReader__Open(SEXP file_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::RandomAccessFile>&>::type file(file_sexp);
	return cpp11::as_sexp(ipc___RecordBatchFileReader__Open(file));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___RecordBatchFileReader__Open(SEXP file_sexp){
	Rf_error("Cannot call ipc___RecordBatchFileReader__Open(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatchreader.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Table> Table__from_RecordBatchReader(const std::shared_ptr<arrow::RecordBatchReader>& reader);
extern "C" SEXP _arrow_Table__from_RecordBatchReader(SEXP reader_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatchReader>&>::type reader(reader_sexp);
	return cpp11::as_sexp(Table__from_RecordBatchReader(reader));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__from_RecordBatchReader(SEXP reader_sexp){
	Rf_error("Cannot call Table__from_RecordBatchReader(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatchreader.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Table> Table__from_RecordBatchFileReader(const std::shared_ptr<arrow::ipc::RecordBatchFileReader>& reader);
extern "C" SEXP _arrow_Table__from_RecordBatchFileReader(SEXP reader_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ipc::RecordBatchFileReader>&>::type reader(reader_sexp);
	return cpp11::as_sexp(Table__from_RecordBatchFileReader(reader));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__from_RecordBatchFileReader(SEXP reader_sexp){
	Rf_error("Cannot call Table__from_RecordBatchFileReader(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatchreader.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::list ipc___RecordBatchFileReader__batches(const std::shared_ptr<arrow::ipc::RecordBatchFileReader>& reader);
extern "C" SEXP _arrow_ipc___RecordBatchFileReader__batches(SEXP reader_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ipc::RecordBatchFileReader>&>::type reader(reader_sexp);
	return cpp11::as_sexp(ipc___RecordBatchFileReader__batches(reader));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___RecordBatchFileReader__batches(SEXP reader_sexp){
	Rf_error("Cannot call ipc___RecordBatchFileReader__batches(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatchwriter.cpp
#if defined(ARROW_R_WITH_ARROW)
void ipc___RecordBatchWriter__WriteRecordBatch(const std::shared_ptr<arrow::ipc::RecordBatchWriter>& batch_writer, const std::shared_ptr<arrow::RecordBatch>& batch);
extern "C" SEXP _arrow_ipc___RecordBatchWriter__WriteRecordBatch(SEXP batch_writer_sexp, SEXP batch_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ipc::RecordBatchWriter>&>::type batch_writer(batch_writer_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::RecordBatch>&>::type batch(batch_sexp);
	ipc___RecordBatchWriter__WriteRecordBatch(batch_writer, batch);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___RecordBatchWriter__WriteRecordBatch(SEXP batch_writer_sexp, SEXP batch_sexp){
	Rf_error("Cannot call ipc___RecordBatchWriter__WriteRecordBatch(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatchwriter.cpp
#if defined(ARROW_R_WITH_ARROW)
void ipc___RecordBatchWriter__WriteTable(const std::shared_ptr<arrow::ipc::RecordBatchWriter>& batch_writer, const std::shared_ptr<arrow::Table>& table);
extern "C" SEXP _arrow_ipc___RecordBatchWriter__WriteTable(SEXP batch_writer_sexp, SEXP table_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ipc::RecordBatchWriter>&>::type batch_writer(batch_writer_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	ipc___RecordBatchWriter__WriteTable(batch_writer, table);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___RecordBatchWriter__WriteTable(SEXP batch_writer_sexp, SEXP table_sexp){
	Rf_error("Cannot call ipc___RecordBatchWriter__WriteTable(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatchwriter.cpp
#if defined(ARROW_R_WITH_ARROW)
void ipc___RecordBatchWriter__Close(const std::shared_ptr<arrow::ipc::RecordBatchWriter>& batch_writer);
extern "C" SEXP _arrow_ipc___RecordBatchWriter__Close(SEXP batch_writer_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::ipc::RecordBatchWriter>&>::type batch_writer(batch_writer_sexp);
	ipc___RecordBatchWriter__Close(batch_writer);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___RecordBatchWriter__Close(SEXP batch_writer_sexp){
	Rf_error("Cannot call ipc___RecordBatchWriter__Close(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatchwriter.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::ipc::RecordBatchWriter> ipc___RecordBatchFileWriter__Open(const std::shared_ptr<arrow::io::OutputStream>& stream, const std::shared_ptr<arrow::Schema>& schema, bool use_legacy_format, arrow::ipc::MetadataVersion metadata_version);
extern "C" SEXP _arrow_ipc___RecordBatchFileWriter__Open(SEXP stream_sexp, SEXP schema_sexp, SEXP use_legacy_format_sexp, SEXP metadata_version_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::OutputStream>&>::type stream(stream_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schema(schema_sexp);
	arrow::r::Input<bool>::type use_legacy_format(use_legacy_format_sexp);
	arrow::r::Input<arrow::ipc::MetadataVersion>::type metadata_version(metadata_version_sexp);
	return cpp11::as_sexp(ipc___RecordBatchFileWriter__Open(stream, schema, use_legacy_format, metadata_version));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___RecordBatchFileWriter__Open(SEXP stream_sexp, SEXP schema_sexp, SEXP use_legacy_format_sexp, SEXP metadata_version_sexp){
	Rf_error("Cannot call ipc___RecordBatchFileWriter__Open(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// recordbatchwriter.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::ipc::RecordBatchWriter> ipc___RecordBatchStreamWriter__Open(const std::shared_ptr<arrow::io::OutputStream>& stream, const std::shared_ptr<arrow::Schema>& schema, bool use_legacy_format, arrow::ipc::MetadataVersion metadata_version);
extern "C" SEXP _arrow_ipc___RecordBatchStreamWriter__Open(SEXP stream_sexp, SEXP schema_sexp, SEXP use_legacy_format_sexp, SEXP metadata_version_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::io::OutputStream>&>::type stream(stream_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schema(schema_sexp);
	arrow::r::Input<bool>::type use_legacy_format(use_legacy_format_sexp);
	arrow::r::Input<arrow::ipc::MetadataVersion>::type metadata_version(metadata_version_sexp);
	return cpp11::as_sexp(ipc___RecordBatchStreamWriter__Open(stream, schema, use_legacy_format, metadata_version));
END_CPP11
}
#else
extern "C" SEXP _arrow_ipc___RecordBatchStreamWriter__Open(SEXP stream_sexp, SEXP schema_sexp, SEXP use_legacy_format_sexp, SEXP metadata_version_sexp){
	Rf_error("Cannot call ipc___RecordBatchStreamWriter__Open(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// runtimeinfo.cpp
#if defined(ARROW_R_WITH_ARROW)
std::vector<std::string> runtime_info();
extern "C" SEXP _arrow_runtime_info(){
BEGIN_CPP11
	return cpp11::as_sexp(runtime_info());
END_CPP11
}
#else
extern "C" SEXP _arrow_runtime_info(){
	Rf_error("Cannot call runtime_info(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// scalar.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Scalar> Array__GetScalar(const std::shared_ptr<arrow::Array>& x, int64_t i);
extern "C" SEXP _arrow_Array__GetScalar(SEXP x_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Array>&>::type x(x_sexp);
	arrow::r::Input<int64_t>::type i(i_sexp);
	return cpp11::as_sexp(Array__GetScalar(x, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__GetScalar(SEXP x_sexp, SEXP i_sexp){
	Rf_error("Cannot call Array__GetScalar(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// scalar.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string Scalar__ToString(const std::shared_ptr<arrow::Scalar>& s);
extern "C" SEXP _arrow_Scalar__ToString(SEXP s_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Scalar>&>::type s(s_sexp);
	return cpp11::as_sexp(Scalar__ToString(s));
END_CPP11
}
#else
extern "C" SEXP _arrow_Scalar__ToString(SEXP s_sexp){
	Rf_error("Cannot call Scalar__ToString(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// scalar.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Scalar> StructScalar__field(const std::shared_ptr<arrow::StructScalar>& s, int i);
extern "C" SEXP _arrow_StructScalar__field(SEXP s_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::StructScalar>&>::type s(s_sexp);
	arrow::r::Input<int>::type i(i_sexp);
	return cpp11::as_sexp(StructScalar__field(s, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_StructScalar__field(SEXP s_sexp, SEXP i_sexp){
	Rf_error("Cannot call StructScalar__field(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// scalar.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Scalar> StructScalar__GetFieldByName(const std::shared_ptr<arrow::StructScalar>& s, const std::string& name);
extern "C" SEXP _arrow_StructScalar__GetFieldByName(SEXP s_sexp, SEXP name_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::StructScalar>&>::type s(s_sexp);
	arrow::r::Input<const std::string&>::type name(name_sexp);
	return cpp11::as_sexp(StructScalar__GetFieldByName(s, name));
END_CPP11
}
#else
extern "C" SEXP _arrow_StructScalar__GetFieldByName(SEXP s_sexp, SEXP name_sexp){
	Rf_error("Cannot call StructScalar__GetFieldByName(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// scalar.cpp
#if defined(ARROW_R_WITH_ARROW)
SEXP Scalar__as_vector(const std::shared_ptr<arrow::Scalar>& scalar);
extern "C" SEXP _arrow_Scalar__as_vector(SEXP scalar_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Scalar>&>::type scalar(scalar_sexp);
	return cpp11::as_sexp(Scalar__as_vector(scalar));
END_CPP11
}
#else
extern "C" SEXP _arrow_Scalar__as_vector(SEXP scalar_sexp){
	Rf_error("Cannot call Scalar__as_vector(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// scalar.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Array> MakeArrayFromScalar(const std::shared_ptr<arrow::Scalar>& scalar);
extern "C" SEXP _arrow_MakeArrayFromScalar(SEXP scalar_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Scalar>&>::type scalar(scalar_sexp);
	return cpp11::as_sexp(MakeArrayFromScalar(scalar));
END_CPP11
}
#else
extern "C" SEXP _arrow_MakeArrayFromScalar(SEXP scalar_sexp){
	Rf_error("Cannot call MakeArrayFromScalar(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// scalar.cpp
#if defined(ARROW_R_WITH_ARROW)
bool Scalar__is_valid(const std::shared_ptr<arrow::Scalar>& s);
extern "C" SEXP _arrow_Scalar__is_valid(SEXP s_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Scalar>&>::type s(s_sexp);
	return cpp11::as_sexp(Scalar__is_valid(s));
END_CPP11
}
#else
extern "C" SEXP _arrow_Scalar__is_valid(SEXP s_sexp){
	Rf_error("Cannot call Scalar__is_valid(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// scalar.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Scalar__type(const std::shared_ptr<arrow::Scalar>& s);
extern "C" SEXP _arrow_Scalar__type(SEXP s_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Scalar>&>::type s(s_sexp);
	return cpp11::as_sexp(Scalar__type(s));
END_CPP11
}
#else
extern "C" SEXP _arrow_Scalar__type(SEXP s_sexp){
	Rf_error("Cannot call Scalar__type(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// scalar.cpp
#if defined(ARROW_R_WITH_ARROW)
bool Scalar__Equals(const std::shared_ptr<arrow::Scalar>& lhs, const std::shared_ptr<arrow::Scalar>& rhs);
extern "C" SEXP _arrow_Scalar__Equals(SEXP lhs_sexp, SEXP rhs_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Scalar>&>::type lhs(lhs_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Scalar>&>::type rhs(rhs_sexp);
	return cpp11::as_sexp(Scalar__Equals(lhs, rhs));
END_CPP11
}
#else
extern "C" SEXP _arrow_Scalar__Equals(SEXP lhs_sexp, SEXP rhs_sexp){
	Rf_error("Cannot call Scalar__Equals(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// scalar.cpp
#if defined(ARROW_R_WITH_ARROW)
bool Scalar__ApproxEquals(const std::shared_ptr<arrow::Scalar>& lhs, const std::shared_ptr<arrow::Scalar>& rhs);
extern "C" SEXP _arrow_Scalar__ApproxEquals(SEXP lhs_sexp, SEXP rhs_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Scalar>&>::type lhs(lhs_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Scalar>&>::type rhs(rhs_sexp);
	return cpp11::as_sexp(Scalar__ApproxEquals(lhs, rhs));
END_CPP11
}
#else
extern "C" SEXP _arrow_Scalar__ApproxEquals(SEXP lhs_sexp, SEXP rhs_sexp){
	Rf_error("Cannot call Scalar__ApproxEquals(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// schema.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Schema> schema_(const std::vector<std::shared_ptr<arrow::Field>>& fields);
extern "C" SEXP _arrow_schema_(SEXP fields_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::vector<std::shared_ptr<arrow::Field>>&>::type fields(fields_sexp);
	return cpp11::as_sexp(schema_(fields));
END_CPP11
}
#else
extern "C" SEXP _arrow_schema_(SEXP fields_sexp){
	Rf_error("Cannot call schema_(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// schema.cpp
#if defined(ARROW_R_WITH_ARROW)
std::string Schema__ToString(const std::shared_ptr<arrow::Schema>& s);
extern "C" SEXP _arrow_Schema__ToString(SEXP s_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type s(s_sexp);
	return cpp11::as_sexp(Schema__ToString(s));
END_CPP11
}
#else
extern "C" SEXP _arrow_Schema__ToString(SEXP s_sexp){
	Rf_error("Cannot call Schema__ToString(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// schema.cpp
#if defined(ARROW_R_WITH_ARROW)
int Schema__num_fields(const std::shared_ptr<arrow::Schema>& s);
extern "C" SEXP _arrow_Schema__num_fields(SEXP s_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type s(s_sexp);
	return cpp11::as_sexp(Schema__num_fields(s));
END_CPP11
}
#else
extern "C" SEXP _arrow_Schema__num_fields(SEXP s_sexp){
	Rf_error("Cannot call Schema__num_fields(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// schema.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Field> Schema__field(const std::shared_ptr<arrow::Schema>& s, int i);
extern "C" SEXP _arrow_Schema__field(SEXP s_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type s(s_sexp);
	arrow::r::Input<int>::type i(i_sexp);
	return cpp11::as_sexp(Schema__field(s, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_Schema__field(SEXP s_sexp, SEXP i_sexp){
	Rf_error("Cannot call Schema__field(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// schema.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Schema> Schema__AddField(const std::shared_ptr<arrow::Schema>& s, int i, const std::shared_ptr<arrow::Field>& field);
extern "C" SEXP _arrow_Schema__AddField(SEXP s_sexp, SEXP i_sexp, SEXP field_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type s(s_sexp);
	arrow::r::Input<int>::type i(i_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Field>&>::type field(field_sexp);
	return cpp11::as_sexp(Schema__AddField(s, i, field));
END_CPP11
}
#else
extern "C" SEXP _arrow_Schema__AddField(SEXP s_sexp, SEXP i_sexp, SEXP field_sexp){
	Rf_error("Cannot call Schema__AddField(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// schema.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Schema> Schema__SetField(const std::shared_ptr<arrow::Schema>& s, int i, const std::shared_ptr<arrow::Field>& field);
extern "C" SEXP _arrow_Schema__SetField(SEXP s_sexp, SEXP i_sexp, SEXP field_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type s(s_sexp);
	arrow::r::Input<int>::type i(i_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Field>&>::type field(field_sexp);
	return cpp11::as_sexp(Schema__SetField(s, i, field));
END_CPP11
}
#else
extern "C" SEXP _arrow_Schema__SetField(SEXP s_sexp, SEXP i_sexp, SEXP field_sexp){
	Rf_error("Cannot call Schema__SetField(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// schema.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Schema> Schema__RemoveField(const std::shared_ptr<arrow::Schema>& s, int i);
extern "C" SEXP _arrow_Schema__RemoveField(SEXP s_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type s(s_sexp);
	arrow::r::Input<int>::type i(i_sexp);
	return cpp11::as_sexp(Schema__RemoveField(s, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_Schema__RemoveField(SEXP s_sexp, SEXP i_sexp){
	Rf_error("Cannot call Schema__RemoveField(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// schema.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Field> Schema__GetFieldByName(const std::shared_ptr<arrow::Schema>& s, std::string x);
extern "C" SEXP _arrow_Schema__GetFieldByName(SEXP s_sexp, SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type s(s_sexp);
	arrow::r::Input<std::string>::type x(x_sexp);
	return cpp11::as_sexp(Schema__GetFieldByName(s, x));
END_CPP11
}
#else
extern "C" SEXP _arrow_Schema__GetFieldByName(SEXP s_sexp, SEXP x_sexp){
	Rf_error("Cannot call Schema__GetFieldByName(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// schema.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::list Schema__fields(const std::shared_ptr<arrow::Schema>& schema);
extern "C" SEXP _arrow_Schema__fields(SEXP schema_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schema(schema_sexp);
	return cpp11::as_sexp(Schema__fields(schema));
END_CPP11
}
#else
extern "C" SEXP _arrow_Schema__fields(SEXP schema_sexp){
	Rf_error("Cannot call Schema__fields(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// schema.cpp
#if defined(ARROW_R_WITH_ARROW)
std::vector<std::string> Schema__field_names(const std::shared_ptr<arrow::Schema>& schema);
extern "C" SEXP _arrow_Schema__field_names(SEXP schema_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schema(schema_sexp);
	return cpp11::as_sexp(Schema__field_names(schema));
END_CPP11
}
#else
extern "C" SEXP _arrow_Schema__field_names(SEXP schema_sexp){
	Rf_error("Cannot call Schema__field_names(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// schema.cpp
#if defined(ARROW_R_WITH_ARROW)
bool Schema__HasMetadata(const std::shared_ptr<arrow::Schema>& schema);
extern "C" SEXP _arrow_Schema__HasMetadata(SEXP schema_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schema(schema_sexp);
	return cpp11::as_sexp(Schema__HasMetadata(schema));
END_CPP11
}
#else
extern "C" SEXP _arrow_Schema__HasMetadata(SEXP schema_sexp){
	Rf_error("Cannot call Schema__HasMetadata(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// schema.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::writable::list Schema__metadata(const std::shared_ptr<arrow::Schema>& schema);
extern "C" SEXP _arrow_Schema__metadata(SEXP schema_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schema(schema_sexp);
	return cpp11::as_sexp(Schema__metadata(schema));
END_CPP11
}
#else
extern "C" SEXP _arrow_Schema__metadata(SEXP schema_sexp){
	Rf_error("Cannot call Schema__metadata(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// schema.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Schema> Schema__WithMetadata(const std::shared_ptr<arrow::Schema>& schema, cpp11::strings metadata);
extern "C" SEXP _arrow_Schema__WithMetadata(SEXP schema_sexp, SEXP metadata_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schema(schema_sexp);
	arrow::r::Input<cpp11::strings>::type metadata(metadata_sexp);
	return cpp11::as_sexp(Schema__WithMetadata(schema, metadata));
END_CPP11
}
#else
extern "C" SEXP _arrow_Schema__WithMetadata(SEXP schema_sexp, SEXP metadata_sexp){
	Rf_error("Cannot call Schema__WithMetadata(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// schema.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::writable::raws Schema__serialize(const std::shared_ptr<arrow::Schema>& schema);
extern "C" SEXP _arrow_Schema__serialize(SEXP schema_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schema(schema_sexp);
	return cpp11::as_sexp(Schema__serialize(schema));
END_CPP11
}
#else
extern "C" SEXP _arrow_Schema__serialize(SEXP schema_sexp){
	Rf_error("Cannot call Schema__serialize(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// schema.cpp
#if defined(ARROW_R_WITH_ARROW)
bool Schema__Equals(const std::shared_ptr<arrow::Schema>& schema, const std::shared_ptr<arrow::Schema>& other, bool check_metadata);
extern "C" SEXP _arrow_Schema__Equals(SEXP schema_sexp, SEXP other_sexp, SEXP check_metadata_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type schema(schema_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Schema>&>::type other(other_sexp);
	arrow::r::Input<bool>::type check_metadata(check_metadata_sexp);
	return cpp11::as_sexp(Schema__Equals(schema, other, check_metadata));
END_CPP11
}
#else
extern "C" SEXP _arrow_Schema__Equals(SEXP schema_sexp, SEXP other_sexp, SEXP check_metadata_sexp){
	Rf_error("Cannot call Schema__Equals(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// schema.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Schema> arrow__UnifySchemas(const std::vector<std::shared_ptr<arrow::Schema>>& schemas);
extern "C" SEXP _arrow_arrow__UnifySchemas(SEXP schemas_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::vector<std::shared_ptr<arrow::Schema>>&>::type schemas(schemas_sexp);
	return cpp11::as_sexp(arrow__UnifySchemas(schemas));
END_CPP11
}
#else
extern "C" SEXP _arrow_arrow__UnifySchemas(SEXP schemas_sexp){
	Rf_error("Cannot call arrow__UnifySchemas(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
int Table__num_columns(const std::shared_ptr<arrow::Table>& x);
extern "C" SEXP _arrow_Table__num_columns(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type x(x_sexp);
	return cpp11::as_sexp(Table__num_columns(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__num_columns(SEXP x_sexp){
	Rf_error("Cannot call Table__num_columns(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
int Table__num_rows(const std::shared_ptr<arrow::Table>& x);
extern "C" SEXP _arrow_Table__num_rows(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type x(x_sexp);
	return cpp11::as_sexp(Table__num_rows(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__num_rows(SEXP x_sexp){
	Rf_error("Cannot call Table__num_rows(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Schema> Table__schema(const std::shared_ptr<arrow::Table>& x);
extern "C" SEXP _arrow_Table__schema(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type x(x_sexp);
	return cpp11::as_sexp(Table__schema(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__schema(SEXP x_sexp){
	Rf_error("Cannot call Table__schema(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Table> Table__ReplaceSchemaMetadata(const std::shared_ptr<arrow::Table>& x, cpp11::strings metadata);
extern "C" SEXP _arrow_Table__ReplaceSchemaMetadata(SEXP x_sexp, SEXP metadata_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type x(x_sexp);
	arrow::r::Input<cpp11::strings>::type metadata(metadata_sexp);
	return cpp11::as_sexp(Table__ReplaceSchemaMetadata(x, metadata));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__ReplaceSchemaMetadata(SEXP x_sexp, SEXP metadata_sexp){
	Rf_error("Cannot call Table__ReplaceSchemaMetadata(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::ChunkedArray> Table__column(const std::shared_ptr<arrow::Table>& table, R_xlen_t i);
extern "C" SEXP _arrow_Table__column(SEXP table_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	arrow::r::Input<R_xlen_t>::type i(i_sexp);
	return cpp11::as_sexp(Table__column(table, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__column(SEXP table_sexp, SEXP i_sexp){
	Rf_error("Cannot call Table__column(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Field> Table__field(const std::shared_ptr<arrow::Table>& table, R_xlen_t i);
extern "C" SEXP _arrow_Table__field(SEXP table_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	arrow::r::Input<R_xlen_t>::type i(i_sexp);
	return cpp11::as_sexp(Table__field(table, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__field(SEXP table_sexp, SEXP i_sexp){
	Rf_error("Cannot call Table__field(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
cpp11::list Table__columns(const std::shared_ptr<arrow::Table>& table);
extern "C" SEXP _arrow_Table__columns(SEXP table_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	return cpp11::as_sexp(Table__columns(table));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__columns(SEXP table_sexp){
	Rf_error("Cannot call Table__columns(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
std::vector<std::string> Table__ColumnNames(const std::shared_ptr<arrow::Table>& table);
extern "C" SEXP _arrow_Table__ColumnNames(SEXP table_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	return cpp11::as_sexp(Table__ColumnNames(table));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__ColumnNames(SEXP table_sexp){
	Rf_error("Cannot call Table__ColumnNames(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Table> Table__RenameColumns(const std::shared_ptr<arrow::Table>& table, const std::vector<std::string>& names);
extern "C" SEXP _arrow_Table__RenameColumns(SEXP table_sexp, SEXP names_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	arrow::r::Input<const std::vector<std::string>&>::type names(names_sexp);
	return cpp11::as_sexp(Table__RenameColumns(table, names));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__RenameColumns(SEXP table_sexp, SEXP names_sexp){
	Rf_error("Cannot call Table__RenameColumns(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Table> Table__Slice1(const std::shared_ptr<arrow::Table>& table, R_xlen_t offset);
extern "C" SEXP _arrow_Table__Slice1(SEXP table_sexp, SEXP offset_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	arrow::r::Input<R_xlen_t>::type offset(offset_sexp);
	return cpp11::as_sexp(Table__Slice1(table, offset));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__Slice1(SEXP table_sexp, SEXP offset_sexp){
	Rf_error("Cannot call Table__Slice1(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Table> Table__Slice2(const std::shared_ptr<arrow::Table>& table, R_xlen_t offset, R_xlen_t length);
extern "C" SEXP _arrow_Table__Slice2(SEXP table_sexp, SEXP offset_sexp, SEXP length_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	arrow::r::Input<R_xlen_t>::type offset(offset_sexp);
	arrow::r::Input<R_xlen_t>::type length(length_sexp);
	return cpp11::as_sexp(Table__Slice2(table, offset, length));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__Slice2(SEXP table_sexp, SEXP offset_sexp, SEXP length_sexp){
	Rf_error("Cannot call Table__Slice2(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
bool Table__Equals(const std::shared_ptr<arrow::Table>& lhs, const std::shared_ptr<arrow::Table>& rhs, bool check_metadata);
extern "C" SEXP _arrow_Table__Equals(SEXP lhs_sexp, SEXP rhs_sexp, SEXP check_metadata_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type lhs(lhs_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type rhs(rhs_sexp);
	arrow::r::Input<bool>::type check_metadata(check_metadata_sexp);
	return cpp11::as_sexp(Table__Equals(lhs, rhs, check_metadata));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__Equals(SEXP lhs_sexp, SEXP rhs_sexp, SEXP check_metadata_sexp){
	Rf_error("Cannot call Table__Equals(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
bool Table__Validate(const std::shared_ptr<arrow::Table>& table);
extern "C" SEXP _arrow_Table__Validate(SEXP table_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	return cpp11::as_sexp(Table__Validate(table));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__Validate(SEXP table_sexp){
	Rf_error("Cannot call Table__Validate(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
bool Table__ValidateFull(const std::shared_ptr<arrow::Table>& table);
extern "C" SEXP _arrow_Table__ValidateFull(SEXP table_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	return cpp11::as_sexp(Table__ValidateFull(table));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__ValidateFull(SEXP table_sexp){
	Rf_error("Cannot call Table__ValidateFull(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::ChunkedArray> Table__GetColumnByName(const std::shared_ptr<arrow::Table>& table, const std::string& name);
extern "C" SEXP _arrow_Table__GetColumnByName(SEXP table_sexp, SEXP name_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	arrow::r::Input<const std::string&>::type name(name_sexp);
	return cpp11::as_sexp(Table__GetColumnByName(table, name));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__GetColumnByName(SEXP table_sexp, SEXP name_sexp){
	Rf_error("Cannot call Table__GetColumnByName(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Table> Table__RemoveColumn(const std::shared_ptr<arrow::Table>& table, R_xlen_t i);
extern "C" SEXP _arrow_Table__RemoveColumn(SEXP table_sexp, SEXP i_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	arrow::r::Input<R_xlen_t>::type i(i_sexp);
	return cpp11::as_sexp(Table__RemoveColumn(table, i));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__RemoveColumn(SEXP table_sexp, SEXP i_sexp){
	Rf_error("Cannot call Table__RemoveColumn(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Table> Table__AddColumn(const std::shared_ptr<arrow::Table>& table, R_xlen_t i, const std::shared_ptr<arrow::Field>& field, const std::shared_ptr<arrow::ChunkedArray>& column);
extern "C" SEXP _arrow_Table__AddColumn(SEXP table_sexp, SEXP i_sexp, SEXP field_sexp, SEXP column_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	arrow::r::Input<R_xlen_t>::type i(i_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Field>&>::type field(field_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::ChunkedArray>&>::type column(column_sexp);
	return cpp11::as_sexp(Table__AddColumn(table, i, field, column));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__AddColumn(SEXP table_sexp, SEXP i_sexp, SEXP field_sexp, SEXP column_sexp){
	Rf_error("Cannot call Table__AddColumn(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Table> Table__SetColumn(const std::shared_ptr<arrow::Table>& table, R_xlen_t i, const std::shared_ptr<arrow::Field>& field, const std::shared_ptr<arrow::ChunkedArray>& column);
extern "C" SEXP _arrow_Table__SetColumn(SEXP table_sexp, SEXP i_sexp, SEXP field_sexp, SEXP column_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	arrow::r::Input<R_xlen_t>::type i(i_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::Field>&>::type field(field_sexp);
	arrow::r::Input<const std::shared_ptr<arrow::ChunkedArray>&>::type column(column_sexp);
	return cpp11::as_sexp(Table__SetColumn(table, i, field, column));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__SetColumn(SEXP table_sexp, SEXP i_sexp, SEXP field_sexp, SEXP column_sexp){
	Rf_error("Cannot call Table__SetColumn(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Table> Table__SelectColumns(const std::shared_ptr<arrow::Table>& table, const std::vector<int>& indices);
extern "C" SEXP _arrow_Table__SelectColumns(SEXP table_sexp, SEXP indices_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::shared_ptr<arrow::Table>&>::type table(table_sexp);
	arrow::r::Input<const std::vector<int>&>::type indices(indices_sexp);
	return cpp11::as_sexp(Table__SelectColumns(table, indices));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__SelectColumns(SEXP table_sexp, SEXP indices_sexp){
	Rf_error("Cannot call Table__SelectColumns(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
bool all_record_batches(SEXP lst);
extern "C" SEXP _arrow_all_record_batches(SEXP lst_sexp){
BEGIN_CPP11
	arrow::r::Input<SEXP>::type lst(lst_sexp);
	return cpp11::as_sexp(all_record_batches(lst));
END_CPP11
}
#else
extern "C" SEXP _arrow_all_record_batches(SEXP lst_sexp){
	Rf_error("Cannot call all_record_batches(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Table> Table__from_record_batches(const std::vector<std::shared_ptr<arrow::RecordBatch>>& batches, SEXP schema_sxp);
extern "C" SEXP _arrow_Table__from_record_batches(SEXP batches_sexp, SEXP schema_sxp_sexp){
BEGIN_CPP11
	arrow::r::Input<const std::vector<std::shared_ptr<arrow::RecordBatch>>&>::type batches(batches_sexp);
	arrow::r::Input<SEXP>::type schema_sxp(schema_sxp_sexp);
	return cpp11::as_sexp(Table__from_record_batches(batches, schema_sxp));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__from_record_batches(SEXP batches_sexp, SEXP schema_sxp_sexp){
	Rf_error("Cannot call Table__from_record_batches(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// table.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::Table> Table__from_dots(SEXP lst, SEXP schema_sxp);
extern "C" SEXP _arrow_Table__from_dots(SEXP lst_sexp, SEXP schema_sxp_sexp){
BEGIN_CPP11
	arrow::r::Input<SEXP>::type lst(lst_sexp);
	arrow::r::Input<SEXP>::type schema_sxp(schema_sxp_sexp);
	return cpp11::as_sexp(Table__from_dots(lst, schema_sxp));
END_CPP11
}
#else
extern "C" SEXP _arrow_Table__from_dots(SEXP lst_sexp, SEXP schema_sxp_sexp){
	Rf_error("Cannot call Table__from_dots(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// threadpool.cpp
#if defined(ARROW_R_WITH_ARROW)
int GetCpuThreadPoolCapacity();
extern "C" SEXP _arrow_GetCpuThreadPoolCapacity(){
BEGIN_CPP11
	return cpp11::as_sexp(GetCpuThreadPoolCapacity());
END_CPP11
}
#else
extern "C" SEXP _arrow_GetCpuThreadPoolCapacity(){
	Rf_error("Cannot call GetCpuThreadPoolCapacity(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// threadpool.cpp
#if defined(ARROW_R_WITH_ARROW)
void SetCpuThreadPoolCapacity(int threads);
extern "C" SEXP _arrow_SetCpuThreadPoolCapacity(SEXP threads_sexp){
BEGIN_CPP11
	arrow::r::Input<int>::type threads(threads_sexp);
	SetCpuThreadPoolCapacity(threads);
	return R_NilValue;
END_CPP11
}
#else
extern "C" SEXP _arrow_SetCpuThreadPoolCapacity(SEXP threads_sexp){
	Rf_error("Cannot call SetCpuThreadPoolCapacity(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

// type_infer.cpp
#if defined(ARROW_R_WITH_ARROW)
std::shared_ptr<arrow::DataType> Array__infer_type(SEXP x);
extern "C" SEXP _arrow_Array__infer_type(SEXP x_sexp){
BEGIN_CPP11
	arrow::r::Input<SEXP>::type x(x_sexp);
	return cpp11::as_sexp(Array__infer_type(x));
END_CPP11
}
#else
extern "C" SEXP _arrow_Array__infer_type(SEXP x_sexp){
	Rf_error("Cannot call Array__infer_type(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

#if defined(ARROW_R_WITH_ARROW)
extern "C" SEXP _arrow_Table__Reset(SEXP r6) {
BEGIN_CPP11
arrow::r::r6_reset_pointer<arrow::Table>(r6);
END_CPP11
return R_NilValue;
}
#else
extern "C" SEXP _arrow_Table__Reset(SEXP r6){
	Rf_error("Cannot call Table(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

#if defined(ARROW_R_WITH_ARROW)
extern "C" SEXP _arrow_RecordBatch__Reset(SEXP r6) {
BEGIN_CPP11
arrow::r::r6_reset_pointer<arrow::RecordBatch>(r6);
END_CPP11
return R_NilValue;
}
#else
extern "C" SEXP _arrow_RecordBatch__Reset(SEXP r6){
	Rf_error("Cannot call RecordBatch(). See https://arrow.apache.org/docs/r/articles/install.html for help installing Arrow C++ libraries. ");
}
#endif

extern "C" SEXP _arrow_available() {
return Rf_ScalarLogical(
#if defined(ARROW_R_WITH_ARROW)
  TRUE
#else
  FALSE
#endif
);
}
extern "C" SEXP _dataset_available() {
return Rf_ScalarLogical(
#if defined(ARROW_R_WITH_DATASET)
  TRUE
#else
  FALSE
#endif
);
}
extern "C" SEXP _parquet_available() {
return Rf_ScalarLogical(
#if defined(ARROW_R_WITH_PARQUET)
  TRUE
#else
  FALSE
#endif
);
}
extern "C" SEXP _s3_available() {
return Rf_ScalarLogical(
#if defined(ARROW_R_WITH_S3)
  TRUE
#else
  FALSE
#endif
);
}
static const R_CallMethodDef CallEntries[] = {
		{ "_arrow_available", (DL_FUNC)& _arrow_available, 0 },
		{ "_dataset_available", (DL_FUNC)& _dataset_available, 0 },
		{ "_parquet_available", (DL_FUNC)& _parquet_available, 0 },
		{ "_s3_available", (DL_FUNC)& _s3_available, 0 },
		{ "_arrow_Array__Slice1", (DL_FUNC) &_arrow_Array__Slice1, 2}, 
		{ "_arrow_Array__Slice2", (DL_FUNC) &_arrow_Array__Slice2, 3}, 
		{ "_arrow_Array__IsNull", (DL_FUNC) &_arrow_Array__IsNull, 2}, 
		{ "_arrow_Array__IsValid", (DL_FUNC) &_arrow_Array__IsValid, 2}, 
		{ "_arrow_Array__length", (DL_FUNC) &_arrow_Array__length, 1}, 
		{ "_arrow_Array__offset", (DL_FUNC) &_arrow_Array__offset, 1}, 
		{ "_arrow_Array__null_count", (DL_FUNC) &_arrow_Array__null_count, 1}, 
		{ "_arrow_Array__type", (DL_FUNC) &_arrow_Array__type, 1}, 
		{ "_arrow_Array__ToString", (DL_FUNC) &_arrow_Array__ToString, 1}, 
		{ "_arrow_Array__type_id", (DL_FUNC) &_arrow_Array__type_id, 1}, 
		{ "_arrow_Array__Equals", (DL_FUNC) &_arrow_Array__Equals, 2}, 
		{ "_arrow_Array__ApproxEquals", (DL_FUNC) &_arrow_Array__ApproxEquals, 2}, 
		{ "_arrow_Array__Diff", (DL_FUNC) &_arrow_Array__Diff, 2}, 
		{ "_arrow_Array__data", (DL_FUNC) &_arrow_Array__data, 1}, 
		{ "_arrow_Array__RangeEquals", (DL_FUNC) &_arrow_Array__RangeEquals, 5}, 
		{ "_arrow_Array__View", (DL_FUNC) &_arrow_Array__View, 2}, 
		{ "_arrow_Array__Validate", (DL_FUNC) &_arrow_Array__Validate, 1}, 
		{ "_arrow_DictionaryArray__indices", (DL_FUNC) &_arrow_DictionaryArray__indices, 1}, 
		{ "_arrow_DictionaryArray__dictionary", (DL_FUNC) &_arrow_DictionaryArray__dictionary, 1}, 
		{ "_arrow_StructArray__field", (DL_FUNC) &_arrow_StructArray__field, 2}, 
		{ "_arrow_StructArray__GetFieldByName", (DL_FUNC) &_arrow_StructArray__GetFieldByName, 2}, 
		{ "_arrow_StructArray__Flatten", (DL_FUNC) &_arrow_StructArray__Flatten, 1}, 
		{ "_arrow_ListArray__value_type", (DL_FUNC) &_arrow_ListArray__value_type, 1}, 
		{ "_arrow_LargeListArray__value_type", (DL_FUNC) &_arrow_LargeListArray__value_type, 1}, 
		{ "_arrow_ListArray__values", (DL_FUNC) &_arrow_ListArray__values, 1}, 
		{ "_arrow_LargeListArray__values", (DL_FUNC) &_arrow_LargeListArray__values, 1}, 
		{ "_arrow_ListArray__value_length", (DL_FUNC) &_arrow_ListArray__value_length, 2}, 
		{ "_arrow_LargeListArray__value_length", (DL_FUNC) &_arrow_LargeListArray__value_length, 2}, 
		{ "_arrow_FixedSizeListArray__value_length", (DL_FUNC) &_arrow_FixedSizeListArray__value_length, 2}, 
		{ "_arrow_ListArray__value_offset", (DL_FUNC) &_arrow_ListArray__value_offset, 2}, 
		{ "_arrow_LargeListArray__value_offset", (DL_FUNC) &_arrow_LargeListArray__value_offset, 2}, 
		{ "_arrow_FixedSizeListArray__value_offset", (DL_FUNC) &_arrow_FixedSizeListArray__value_offset, 2}, 
		{ "_arrow_ListArray__raw_value_offsets", (DL_FUNC) &_arrow_ListArray__raw_value_offsets, 1}, 
		{ "_arrow_LargeListArray__raw_value_offsets", (DL_FUNC) &_arrow_LargeListArray__raw_value_offsets, 1}, 
		{ "_arrow_Array__as_vector", (DL_FUNC) &_arrow_Array__as_vector, 1}, 
		{ "_arrow_ChunkedArray__as_vector", (DL_FUNC) &_arrow_ChunkedArray__as_vector, 1}, 
		{ "_arrow_RecordBatch__to_dataframe", (DL_FUNC) &_arrow_RecordBatch__to_dataframe, 2}, 
		{ "_arrow_Table__to_dataframe", (DL_FUNC) &_arrow_Table__to_dataframe, 2}, 
		{ "_arrow_ArrayData__get_type", (DL_FUNC) &_arrow_ArrayData__get_type, 1}, 
		{ "_arrow_ArrayData__get_length", (DL_FUNC) &_arrow_ArrayData__get_length, 1}, 
		{ "_arrow_ArrayData__get_null_count", (DL_FUNC) &_arrow_ArrayData__get_null_count, 1}, 
		{ "_arrow_ArrayData__get_offset", (DL_FUNC) &_arrow_ArrayData__get_offset, 1}, 
		{ "_arrow_ArrayData__buffers", (DL_FUNC) &_arrow_ArrayData__buffers, 1}, 
		{ "_arrow_Buffer__is_mutable", (DL_FUNC) &_arrow_Buffer__is_mutable, 1}, 
		{ "_arrow_Buffer__ZeroPadding", (DL_FUNC) &_arrow_Buffer__ZeroPadding, 1}, 
		{ "_arrow_Buffer__capacity", (DL_FUNC) &_arrow_Buffer__capacity, 1}, 
		{ "_arrow_Buffer__size", (DL_FUNC) &_arrow_Buffer__size, 1}, 
		{ "_arrow_r___RBuffer__initialize", (DL_FUNC) &_arrow_r___RBuffer__initialize, 1}, 
		{ "_arrow_Buffer__data", (DL_FUNC) &_arrow_Buffer__data, 1}, 
		{ "_arrow_Buffer__Equals", (DL_FUNC) &_arrow_Buffer__Equals, 2}, 
		{ "_arrow_ChunkedArray__length", (DL_FUNC) &_arrow_ChunkedArray__length, 1}, 
		{ "_arrow_ChunkedArray__null_count", (DL_FUNC) &_arrow_ChunkedArray__null_count, 1}, 
		{ "_arrow_ChunkedArray__num_chunks", (DL_FUNC) &_arrow_ChunkedArray__num_chunks, 1}, 
		{ "_arrow_ChunkedArray__chunk", (DL_FUNC) &_arrow_ChunkedArray__chunk, 2}, 
		{ "_arrow_ChunkedArray__chunks", (DL_FUNC) &_arrow_ChunkedArray__chunks, 1}, 
		{ "_arrow_ChunkedArray__type", (DL_FUNC) &_arrow_ChunkedArray__type, 1}, 
		{ "_arrow_ChunkedArray__Slice1", (DL_FUNC) &_arrow_ChunkedArray__Slice1, 2}, 
		{ "_arrow_ChunkedArray__Slice2", (DL_FUNC) &_arrow_ChunkedArray__Slice2, 3}, 
		{ "_arrow_ChunkedArray__View", (DL_FUNC) &_arrow_ChunkedArray__View, 2}, 
		{ "_arrow_ChunkedArray__Validate", (DL_FUNC) &_arrow_ChunkedArray__Validate, 1}, 
		{ "_arrow_ChunkedArray__Equals", (DL_FUNC) &_arrow_ChunkedArray__Equals, 2}, 
		{ "_arrow_ChunkedArray__ToString", (DL_FUNC) &_arrow_ChunkedArray__ToString, 1}, 
		{ "_arrow_ChunkedArray__from_list", (DL_FUNC) &_arrow_ChunkedArray__from_list, 2}, 
		{ "_arrow_util___Codec__Create", (DL_FUNC) &_arrow_util___Codec__Create, 2}, 
		{ "_arrow_util___Codec__name", (DL_FUNC) &_arrow_util___Codec__name, 1}, 
		{ "_arrow_util___Codec__IsAvailable", (DL_FUNC) &_arrow_util___Codec__IsAvailable, 1}, 
		{ "_arrow_io___CompressedOutputStream__Make", (DL_FUNC) &_arrow_io___CompressedOutputStream__Make, 2}, 
		{ "_arrow_io___CompressedInputStream__Make", (DL_FUNC) &_arrow_io___CompressedInputStream__Make, 2}, 
		{ "_arrow_RecordBatch__cast", (DL_FUNC) &_arrow_RecordBatch__cast, 3}, 
		{ "_arrow_Table__cast", (DL_FUNC) &_arrow_Table__cast, 3}, 
		{ "_arrow_compute__CallFunction", (DL_FUNC) &_arrow_compute__CallFunction, 3}, 
		{ "_arrow_compute__GroupBy", (DL_FUNC) &_arrow_compute__GroupBy, 3}, 
		{ "_arrow_compute__GetFunctionNames", (DL_FUNC) &_arrow_compute__GetFunctionNames, 0}, 
		{ "_arrow_csv___ReadOptions__initialize", (DL_FUNC) &_arrow_csv___ReadOptions__initialize, 1}, 
		{ "_arrow_csv___ParseOptions__initialize", (DL_FUNC) &_arrow_csv___ParseOptions__initialize, 1}, 
		{ "_arrow_csv___ReadOptions__column_names", (DL_FUNC) &_arrow_csv___ReadOptions__column_names, 1}, 
		{ "_arrow_csv___ConvertOptions__initialize", (DL_FUNC) &_arrow_csv___ConvertOptions__initialize, 1}, 
		{ "_arrow_csv___TableReader__Make", (DL_FUNC) &_arrow_csv___TableReader__Make, 4}, 
		{ "_arrow_csv___TableReader__Read", (DL_FUNC) &_arrow_csv___TableReader__Read, 1}, 
		{ "_arrow_TimestampParser__kind", (DL_FUNC) &_arrow_TimestampParser__kind, 1}, 
		{ "_arrow_TimestampParser__format", (DL_FUNC) &_arrow_TimestampParser__format, 1}, 
		{ "_arrow_TimestampParser__MakeStrptime", (DL_FUNC) &_arrow_TimestampParser__MakeStrptime, 1}, 
		{ "_arrow_TimestampParser__MakeISO8601", (DL_FUNC) &_arrow_TimestampParser__MakeISO8601, 0}, 
		{ "_arrow_dataset___Dataset__NewScan", (DL_FUNC) &_arrow_dataset___Dataset__NewScan, 1}, 
		{ "_arrow_dataset___Dataset__schema", (DL_FUNC) &_arrow_dataset___Dataset__schema, 1}, 
		{ "_arrow_dataset___Dataset__type_name", (DL_FUNC) &_arrow_dataset___Dataset__type_name, 1}, 
		{ "_arrow_dataset___Dataset__ReplaceSchema", (DL_FUNC) &_arrow_dataset___Dataset__ReplaceSchema, 2}, 
		{ "_arrow_dataset___UnionDataset__create", (DL_FUNC) &_arrow_dataset___UnionDataset__create, 2}, 
		{ "_arrow_dataset___InMemoryDataset__create", (DL_FUNC) &_arrow_dataset___InMemoryDataset__create, 1}, 
		{ "_arrow_dataset___UnionDataset__children", (DL_FUNC) &_arrow_dataset___UnionDataset__children, 1}, 
		{ "_arrow_dataset___FileSystemDataset__format", (DL_FUNC) &_arrow_dataset___FileSystemDataset__format, 1}, 
		{ "_arrow_dataset___FileSystemDataset__filesystem", (DL_FUNC) &_arrow_dataset___FileSystemDataset__filesystem, 1}, 
		{ "_arrow_dataset___FileSystemDataset__files", (DL_FUNC) &_arrow_dataset___FileSystemDataset__files, 1}, 
		{ "_arrow_dataset___DatasetFactory__Finish1", (DL_FUNC) &_arrow_dataset___DatasetFactory__Finish1, 2}, 
		{ "_arrow_dataset___DatasetFactory__Finish2", (DL_FUNC) &_arrow_dataset___DatasetFactory__Finish2, 2}, 
		{ "_arrow_dataset___DatasetFactory__Inspect", (DL_FUNC) &_arrow_dataset___DatasetFactory__Inspect, 2}, 
		{ "_arrow_dataset___UnionDatasetFactory__Make", (DL_FUNC) &_arrow_dataset___UnionDatasetFactory__Make, 1}, 
		{ "_arrow_dataset___FileSystemDatasetFactory__Make0", (DL_FUNC) &_arrow_dataset___FileSystemDatasetFactory__Make0, 3}, 
		{ "_arrow_dataset___FileSystemDatasetFactory__Make2", (DL_FUNC) &_arrow_dataset___FileSystemDatasetFactory__Make2, 4}, 
		{ "_arrow_dataset___FileSystemDatasetFactory__Make1", (DL_FUNC) &_arrow_dataset___FileSystemDatasetFactory__Make1, 3}, 
		{ "_arrow_dataset___FileSystemDatasetFactory__Make3", (DL_FUNC) &_arrow_dataset___FileSystemDatasetFactory__Make3, 4}, 
		{ "_arrow_dataset___FileFormat__type_name", (DL_FUNC) &_arrow_dataset___FileFormat__type_name, 1}, 
		{ "_arrow_dataset___FileFormat__DefaultWriteOptions", (DL_FUNC) &_arrow_dataset___FileFormat__DefaultWriteOptions, 1}, 
		{ "_arrow_dataset___ParquetFileFormat__Make", (DL_FUNC) &_arrow_dataset___ParquetFileFormat__Make, 2}, 
		{ "_arrow_dataset___FileWriteOptions__type_name", (DL_FUNC) &_arrow_dataset___FileWriteOptions__type_name, 1}, 
		{ "_arrow_dataset___ParquetFileWriteOptions__update", (DL_FUNC) &_arrow_dataset___ParquetFileWriteOptions__update, 3}, 
		{ "_arrow_dataset___IpcFileWriteOptions__update2", (DL_FUNC) &_arrow_dataset___IpcFileWriteOptions__update2, 4}, 
		{ "_arrow_dataset___IpcFileWriteOptions__update1", (DL_FUNC) &_arrow_dataset___IpcFileWriteOptions__update1, 3}, 
		{ "_arrow_dataset___IpcFileFormat__Make", (DL_FUNC) &_arrow_dataset___IpcFileFormat__Make, 0}, 
		{ "_arrow_dataset___CsvFileFormat__Make", (DL_FUNC) &_arrow_dataset___CsvFileFormat__Make, 3}, 
		{ "_arrow_dataset___FragmentScanOptions__type_name", (DL_FUNC) &_arrow_dataset___FragmentScanOptions__type_name, 1}, 
		{ "_arrow_dataset___CsvFragmentScanOptions__Make", (DL_FUNC) &_arrow_dataset___CsvFragmentScanOptions__Make, 2}, 
		{ "_arrow_dataset___ParquetFragmentScanOptions__Make", (DL_FUNC) &_arrow_dataset___ParquetFragmentScanOptions__Make, 3}, 
		{ "_arrow_dataset___DirectoryPartitioning", (DL_FUNC) &_arrow_dataset___DirectoryPartitioning, 1}, 
		{ "_arrow_dataset___DirectoryPartitioning__MakeFactory", (DL_FUNC) &_arrow_dataset___DirectoryPartitioning__MakeFactory, 1}, 
		{ "_arrow_dataset___HivePartitioning", (DL_FUNC) &_arrow_dataset___HivePartitioning, 2}, 
		{ "_arrow_dataset___HivePartitioning__MakeFactory", (DL_FUNC) &_arrow_dataset___HivePartitioning__MakeFactory, 1}, 
		{ "_arrow_dataset___ScannerBuilder__ProjectNames", (DL_FUNC) &_arrow_dataset___ScannerBuilder__ProjectNames, 2}, 
		{ "_arrow_dataset___ScannerBuilder__ProjectExprs", (DL_FUNC) &_arrow_dataset___ScannerBuilder__ProjectExprs, 3}, 
		{ "_arrow_dataset___ScannerBuilder__Filter", (DL_FUNC) &_arrow_dataset___ScannerBuilder__Filter, 2}, 
		{ "_arrow_dataset___ScannerBuilder__UseThreads", (DL_FUNC) &_arrow_dataset___ScannerBuilder__UseThreads, 2}, 
		{ "_arrow_dataset___ScannerBuilder__BatchSize", (DL_FUNC) &_arrow_dataset___ScannerBuilder__BatchSize, 2}, 
		{ "_arrow_dataset___ScannerBuilder__FragmentScanOptions", (DL_FUNC) &_arrow_dataset___ScannerBuilder__FragmentScanOptions, 2}, 
		{ "_arrow_dataset___ScannerBuilder__schema", (DL_FUNC) &_arrow_dataset___ScannerBuilder__schema, 1}, 
		{ "_arrow_dataset___ScannerBuilder__Finish", (DL_FUNC) &_arrow_dataset___ScannerBuilder__Finish, 1}, 
		{ "_arrow_dataset___Scanner__ToTable", (DL_FUNC) &_arrow_dataset___Scanner__ToTable, 1}, 
		{ "_arrow_dataset___Scanner__head", (DL_FUNC) &_arrow_dataset___Scanner__head, 2}, 
		{ "_arrow_dataset___Scanner__Scan", (DL_FUNC) &_arrow_dataset___Scanner__Scan, 1}, 
		{ "_arrow_dataset___Scanner__schema", (DL_FUNC) &_arrow_dataset___Scanner__schema, 1}, 
		{ "_arrow_dataset___ScanTask__get_batches", (DL_FUNC) &_arrow_dataset___ScanTask__get_batches, 1}, 
		{ "_arrow_dataset___Dataset__Write", (DL_FUNC) &_arrow_dataset___Dataset__Write, 6}, 
		{ "_arrow_Int8__initialize", (DL_FUNC) &_arrow_Int8__initialize, 0}, 
		{ "_arrow_Int16__initialize", (DL_FUNC) &_arrow_Int16__initialize, 0}, 
		{ "_arrow_Int32__initialize", (DL_FUNC) &_arrow_Int32__initialize, 0}, 
		{ "_arrow_Int64__initialize", (DL_FUNC) &_arrow_Int64__initialize, 0}, 
		{ "_arrow_UInt8__initialize", (DL_FUNC) &_arrow_UInt8__initialize, 0}, 
		{ "_arrow_UInt16__initialize", (DL_FUNC) &_arrow_UInt16__initialize, 0}, 
		{ "_arrow_UInt32__initialize", (DL_FUNC) &_arrow_UInt32__initialize, 0}, 
		{ "_arrow_UInt64__initialize", (DL_FUNC) &_arrow_UInt64__initialize, 0}, 
		{ "_arrow_Float16__initialize", (DL_FUNC) &_arrow_Float16__initialize, 0}, 
		{ "_arrow_Float32__initialize", (DL_FUNC) &_arrow_Float32__initialize, 0}, 
		{ "_arrow_Float64__initialize", (DL_FUNC) &_arrow_Float64__initialize, 0}, 
		{ "_arrow_Boolean__initialize", (DL_FUNC) &_arrow_Boolean__initialize, 0}, 
		{ "_arrow_Utf8__initialize", (DL_FUNC) &_arrow_Utf8__initialize, 0}, 
		{ "_arrow_LargeUtf8__initialize", (DL_FUNC) &_arrow_LargeUtf8__initialize, 0}, 
		{ "_arrow_Binary__initialize", (DL_FUNC) &_arrow_Binary__initialize, 0}, 
		{ "_arrow_LargeBinary__initialize", (DL_FUNC) &_arrow_LargeBinary__initialize, 0}, 
		{ "_arrow_Date32__initialize", (DL_FUNC) &_arrow_Date32__initialize, 0}, 
		{ "_arrow_Date64__initialize", (DL_FUNC) &_arrow_Date64__initialize, 0}, 
		{ "_arrow_Null__initialize", (DL_FUNC) &_arrow_Null__initialize, 0}, 
		{ "_arrow_Decimal128Type__initialize", (DL_FUNC) &_arrow_Decimal128Type__initialize, 2}, 
		{ "_arrow_FixedSizeBinary__initialize", (DL_FUNC) &_arrow_FixedSizeBinary__initialize, 1}, 
		{ "_arrow_Timestamp__initialize", (DL_FUNC) &_arrow_Timestamp__initialize, 2}, 
		{ "_arrow_Time32__initialize", (DL_FUNC) &_arrow_Time32__initialize, 1}, 
		{ "_arrow_Time64__initialize", (DL_FUNC) &_arrow_Time64__initialize, 1}, 
		{ "_arrow_list__", (DL_FUNC) &_arrow_list__, 1}, 
		{ "_arrow_large_list__", (DL_FUNC) &_arrow_large_list__, 1}, 
		{ "_arrow_fixed_size_list__", (DL_FUNC) &_arrow_fixed_size_list__, 2}, 
		{ "_arrow_struct__", (DL_FUNC) &_arrow_struct__, 1}, 
		{ "_arrow_DataType__ToString", (DL_FUNC) &_arrow_DataType__ToString, 1}, 
		{ "_arrow_DataType__name", (DL_FUNC) &_arrow_DataType__name, 1}, 
		{ "_arrow_DataType__Equals", (DL_FUNC) &_arrow_DataType__Equals, 2}, 
		{ "_arrow_DataType__num_fields", (DL_FUNC) &_arrow_DataType__num_fields, 1}, 
		{ "_arrow_DataType__fields", (DL_FUNC) &_arrow_DataType__fields, 1}, 
		{ "_arrow_DataType__id", (DL_FUNC) &_arrow_DataType__id, 1}, 
		{ "_arrow_ListType__ToString", (DL_FUNC) &_arrow_ListType__ToString, 1}, 
		{ "_arrow_FixedWidthType__bit_width", (DL_FUNC) &_arrow_FixedWidthType__bit_width, 1}, 
		{ "_arrow_DateType__unit", (DL_FUNC) &_arrow_DateType__unit, 1}, 
		{ "_arrow_TimeType__unit", (DL_FUNC) &_arrow_TimeType__unit, 1}, 
		{ "_arrow_DecimalType__precision", (DL_FUNC) &_arrow_DecimalType__precision, 1}, 
		{ "_arrow_DecimalType__scale", (DL_FUNC) &_arrow_DecimalType__scale, 1}, 
		{ "_arrow_TimestampType__timezone", (DL_FUNC) &_arrow_TimestampType__timezone, 1}, 
		{ "_arrow_TimestampType__unit", (DL_FUNC) &_arrow_TimestampType__unit, 1}, 
		{ "_arrow_DictionaryType__initialize", (DL_FUNC) &_arrow_DictionaryType__initialize, 3}, 
		{ "_arrow_DictionaryType__index_type", (DL_FUNC) &_arrow_DictionaryType__index_type, 1}, 
		{ "_arrow_DictionaryType__value_type", (DL_FUNC) &_arrow_DictionaryType__value_type, 1}, 
		{ "_arrow_DictionaryType__name", (DL_FUNC) &_arrow_DictionaryType__name, 1}, 
		{ "_arrow_DictionaryType__ordered", (DL_FUNC) &_arrow_DictionaryType__ordered, 1}, 
		{ "_arrow_StructType__GetFieldByName", (DL_FUNC) &_arrow_StructType__GetFieldByName, 2}, 
		{ "_arrow_StructType__GetFieldIndex", (DL_FUNC) &_arrow_StructType__GetFieldIndex, 2}, 
		{ "_arrow_StructType__field_names", (DL_FUNC) &_arrow_StructType__field_names, 1}, 
		{ "_arrow_ListType__value_field", (DL_FUNC) &_arrow_ListType__value_field, 1}, 
		{ "_arrow_ListType__value_type", (DL_FUNC) &_arrow_ListType__value_type, 1}, 
		{ "_arrow_LargeListType__value_field", (DL_FUNC) &_arrow_LargeListType__value_field, 1}, 
		{ "_arrow_LargeListType__value_type", (DL_FUNC) &_arrow_LargeListType__value_type, 1}, 
		{ "_arrow_FixedSizeListType__value_field", (DL_FUNC) &_arrow_FixedSizeListType__value_field, 1}, 
		{ "_arrow_FixedSizeListType__value_type", (DL_FUNC) &_arrow_FixedSizeListType__value_type, 1}, 
		{ "_arrow_FixedSizeListType__list_size", (DL_FUNC) &_arrow_FixedSizeListType__list_size, 1}, 
		{ "_arrow_dataset___expr__call", (DL_FUNC) &_arrow_dataset___expr__call, 3}, 
		{ "_arrow_dataset___expr__field_ref", (DL_FUNC) &_arrow_dataset___expr__field_ref, 1}, 
		{ "_arrow_dataset___expr__get_field_ref_name", (DL_FUNC) &_arrow_dataset___expr__get_field_ref_name, 1}, 
		{ "_arrow_dataset___expr__scalar", (DL_FUNC) &_arrow_dataset___expr__scalar, 1}, 
		{ "_arrow_dataset___expr__ToString", (DL_FUNC) &_arrow_dataset___expr__ToString, 1}, 
		{ "_arrow_ipc___WriteFeather__Table", (DL_FUNC) &_arrow_ipc___WriteFeather__Table, 6}, 
		{ "_arrow_ipc___feather___Reader__version", (DL_FUNC) &_arrow_ipc___feather___Reader__version, 1}, 
		{ "_arrow_ipc___feather___Reader__Read", (DL_FUNC) &_arrow_ipc___feather___Reader__Read, 2}, 
		{ "_arrow_ipc___feather___Reader__Open", (DL_FUNC) &_arrow_ipc___feather___Reader__Open, 1}, 
		{ "_arrow_ipc___feather___Reader__schema", (DL_FUNC) &_arrow_ipc___feather___Reader__schema, 1}, 
		{ "_arrow_Field__initialize", (DL_FUNC) &_arrow_Field__initialize, 3}, 
		{ "_arrow_Field__ToString", (DL_FUNC) &_arrow_Field__ToString, 1}, 
		{ "_arrow_Field__name", (DL_FUNC) &_arrow_Field__name, 1}, 
		{ "_arrow_Field__Equals", (DL_FUNC) &_arrow_Field__Equals, 2}, 
		{ "_arrow_Field__nullable", (DL_FUNC) &_arrow_Field__nullable, 1}, 
		{ "_arrow_Field__type", (DL_FUNC) &_arrow_Field__type, 1}, 
		{ "_arrow_fs___FileInfo__type", (DL_FUNC) &_arrow_fs___FileInfo__type, 1}, 
		{ "_arrow_fs___FileInfo__set_type", (DL_FUNC) &_arrow_fs___FileInfo__set_type, 2}, 
		{ "_arrow_fs___FileInfo__path", (DL_FUNC) &_arrow_fs___FileInfo__path, 1}, 
		{ "_arrow_fs___FileInfo__set_path", (DL_FUNC) &_arrow_fs___FileInfo__set_path, 2}, 
		{ "_arrow_fs___FileInfo__size", (DL_FUNC) &_arrow_fs___FileInfo__size, 1}, 
		{ "_arrow_fs___FileInfo__set_size", (DL_FUNC) &_arrow_fs___FileInfo__set_size, 2}, 
		{ "_arrow_fs___FileInfo__base_name", (DL_FUNC) &_arrow_fs___FileInfo__base_name, 1}, 
		{ "_arrow_fs___FileInfo__extension", (DL_FUNC) &_arrow_fs___FileInfo__extension, 1}, 
		{ "_arrow_fs___FileInfo__mtime", (DL_FUNC) &_arrow_fs___FileInfo__mtime, 1}, 
		{ "_arrow_fs___FileInfo__set_mtime", (DL_FUNC) &_arrow_fs___FileInfo__set_mtime, 2}, 
		{ "_arrow_fs___FileSelector__base_dir", (DL_FUNC) &_arrow_fs___FileSelector__base_dir, 1}, 
		{ "_arrow_fs___FileSelector__allow_not_found", (DL_FUNC) &_arrow_fs___FileSelector__allow_not_found, 1}, 
		{ "_arrow_fs___FileSelector__recursive", (DL_FUNC) &_arrow_fs___FileSelector__recursive, 1}, 
		{ "_arrow_fs___FileSelector__create", (DL_FUNC) &_arrow_fs___FileSelector__create, 3}, 
		{ "_arrow_fs___FileSystem__GetTargetInfos_Paths", (DL_FUNC) &_arrow_fs___FileSystem__GetTargetInfos_Paths, 2}, 
		{ "_arrow_fs___FileSystem__GetTargetInfos_FileSelector", (DL_FUNC) &_arrow_fs___FileSystem__GetTargetInfos_FileSelector, 2}, 
		{ "_arrow_fs___FileSystem__CreateDir", (DL_FUNC) &_arrow_fs___FileSystem__CreateDir, 3}, 
		{ "_arrow_fs___FileSystem__DeleteDir", (DL_FUNC) &_arrow_fs___FileSystem__DeleteDir, 2}, 
		{ "_arrow_fs___FileSystem__DeleteDirContents", (DL_FUNC) &_arrow_fs___FileSystem__DeleteDirContents, 2}, 
		{ "_arrow_fs___FileSystem__DeleteFile", (DL_FUNC) &_arrow_fs___FileSystem__DeleteFile, 2}, 
		{ "_arrow_fs___FileSystem__DeleteFiles", (DL_FUNC) &_arrow_fs___FileSystem__DeleteFiles, 2}, 
		{ "_arrow_fs___FileSystem__Move", (DL_FUNC) &_arrow_fs___FileSystem__Move, 3}, 
		{ "_arrow_fs___FileSystem__CopyFile", (DL_FUNC) &_arrow_fs___FileSystem__CopyFile, 3}, 
		{ "_arrow_fs___FileSystem__OpenInputStream", (DL_FUNC) &_arrow_fs___FileSystem__OpenInputStream, 2}, 
		{ "_arrow_fs___FileSystem__OpenInputFile", (DL_FUNC) &_arrow_fs___FileSystem__OpenInputFile, 2}, 
		{ "_arrow_fs___FileSystem__OpenOutputStream", (DL_FUNC) &_arrow_fs___FileSystem__OpenOutputStream, 2}, 
		{ "_arrow_fs___FileSystem__OpenAppendStream", (DL_FUNC) &_arrow_fs___FileSystem__OpenAppendStream, 2}, 
		{ "_arrow_fs___FileSystem__type_name", (DL_FUNC) &_arrow_fs___FileSystem__type_name, 1}, 
		{ "_arrow_fs___LocalFileSystem__create", (DL_FUNC) &_arrow_fs___LocalFileSystem__create, 0}, 
		{ "_arrow_fs___SubTreeFileSystem__create", (DL_FUNC) &_arrow_fs___SubTreeFileSystem__create, 2}, 
		{ "_arrow_fs___SubTreeFileSystem__base_fs", (DL_FUNC) &_arrow_fs___SubTreeFileSystem__base_fs, 1}, 
		{ "_arrow_fs___SubTreeFileSystem__base_path", (DL_FUNC) &_arrow_fs___SubTreeFileSystem__base_path, 1}, 
		{ "_arrow_fs___FileSystemFromUri", (DL_FUNC) &_arrow_fs___FileSystemFromUri, 1}, 
		{ "_arrow_fs___CopyFiles", (DL_FUNC) &_arrow_fs___CopyFiles, 6}, 
		{ "_arrow_fs___S3FileSystem__create", (DL_FUNC) &_arrow_fs___S3FileSystem__create, 12}, 
		{ "_arrow_fs___S3FileSystem__region", (DL_FUNC) &_arrow_fs___S3FileSystem__region, 1}, 
		{ "_arrow_io___Readable__Read", (DL_FUNC) &_arrow_io___Readable__Read, 2}, 
		{ "_arrow_io___InputStream__Close", (DL_FUNC) &_arrow_io___InputStream__Close, 1}, 
		{ "_arrow_io___OutputStream__Close", (DL_FUNC) &_arrow_io___OutputStream__Close, 1}, 
		{ "_arrow_io___RandomAccessFile__GetSize", (DL_FUNC) &_arrow_io___RandomAccessFile__GetSize, 1}, 
		{ "_arrow_io___RandomAccessFile__supports_zero_copy", (DL_FUNC) &_arrow_io___RandomAccessFile__supports_zero_copy, 1}, 
		{ "_arrow_io___RandomAccessFile__Seek", (DL_FUNC) &_arrow_io___RandomAccessFile__Seek, 2}, 
		{ "_arrow_io___RandomAccessFile__Tell", (DL_FUNC) &_arrow_io___RandomAccessFile__Tell, 1}, 
		{ "_arrow_io___RandomAccessFile__Read0", (DL_FUNC) &_arrow_io___RandomAccessFile__Read0, 1}, 
		{ "_arrow_io___RandomAccessFile__ReadAt", (DL_FUNC) &_arrow_io___RandomAccessFile__ReadAt, 3}, 
		{ "_arrow_io___MemoryMappedFile__Create", (DL_FUNC) &_arrow_io___MemoryMappedFile__Create, 2}, 
		{ "_arrow_io___MemoryMappedFile__Open", (DL_FUNC) &_arrow_io___MemoryMappedFile__Open, 2}, 
		{ "_arrow_io___MemoryMappedFile__Resize", (DL_FUNC) &_arrow_io___MemoryMappedFile__Resize, 2}, 
		{ "_arrow_io___ReadableFile__Open", (DL_FUNC) &_arrow_io___ReadableFile__Open, 1}, 
		{ "_arrow_io___BufferReader__initialize", (DL_FUNC) &_arrow_io___BufferReader__initialize, 1}, 
		{ "_arrow_io___Writable__write", (DL_FUNC) &_arrow_io___Writable__write, 2}, 
		{ "_arrow_io___OutputStream__Tell", (DL_FUNC) &_arrow_io___OutputStream__Tell, 1}, 
		{ "_arrow_io___FileOutputStream__Open", (DL_FUNC) &_arrow_io___FileOutputStream__Open, 1}, 
		{ "_arrow_io___BufferOutputStream__Create", (DL_FUNC) &_arrow_io___BufferOutputStream__Create, 1}, 
		{ "_arrow_io___BufferOutputStream__capacity", (DL_FUNC) &_arrow_io___BufferOutputStream__capacity, 1}, 
		{ "_arrow_io___BufferOutputStream__Finish", (DL_FUNC) &_arrow_io___BufferOutputStream__Finish, 1}, 
		{ "_arrow_io___BufferOutputStream__Tell", (DL_FUNC) &_arrow_io___BufferOutputStream__Tell, 1}, 
		{ "_arrow_io___BufferOutputStream__Write", (DL_FUNC) &_arrow_io___BufferOutputStream__Write, 2}, 
		{ "_arrow_json___ReadOptions__initialize", (DL_FUNC) &_arrow_json___ReadOptions__initialize, 2}, 
		{ "_arrow_json___ParseOptions__initialize", (DL_FUNC) &_arrow_json___ParseOptions__initialize, 1}, 
		{ "_arrow_json___TableReader__Make", (DL_FUNC) &_arrow_json___TableReader__Make, 3}, 
		{ "_arrow_json___TableReader__Read", (DL_FUNC) &_arrow_json___TableReader__Read, 1}, 
		{ "_arrow_MemoryPool__default", (DL_FUNC) &_arrow_MemoryPool__default, 0}, 
		{ "_arrow_MemoryPool__bytes_allocated", (DL_FUNC) &_arrow_MemoryPool__bytes_allocated, 1}, 
		{ "_arrow_MemoryPool__max_memory", (DL_FUNC) &_arrow_MemoryPool__max_memory, 1}, 
		{ "_arrow_MemoryPool__backend_name", (DL_FUNC) &_arrow_MemoryPool__backend_name, 1}, 
		{ "_arrow_supported_memory_backends", (DL_FUNC) &_arrow_supported_memory_backends, 0}, 
		{ "_arrow_ipc___Message__body_length", (DL_FUNC) &_arrow_ipc___Message__body_length, 1}, 
		{ "_arrow_ipc___Message__metadata", (DL_FUNC) &_arrow_ipc___Message__metadata, 1}, 
		{ "_arrow_ipc___Message__body", (DL_FUNC) &_arrow_ipc___Message__body, 1}, 
		{ "_arrow_ipc___Message__Verify", (DL_FUNC) &_arrow_ipc___Message__Verify, 1}, 
		{ "_arrow_ipc___Message__type", (DL_FUNC) &_arrow_ipc___Message__type, 1}, 
		{ "_arrow_ipc___Message__Equals", (DL_FUNC) &_arrow_ipc___Message__Equals, 2}, 
		{ "_arrow_ipc___ReadRecordBatch__Message__Schema", (DL_FUNC) &_arrow_ipc___ReadRecordBatch__Message__Schema, 2}, 
		{ "_arrow_ipc___ReadSchema_InputStream", (DL_FUNC) &_arrow_ipc___ReadSchema_InputStream, 1}, 
		{ "_arrow_ipc___ReadSchema_Message", (DL_FUNC) &_arrow_ipc___ReadSchema_Message, 1}, 
		{ "_arrow_ipc___MessageReader__Open", (DL_FUNC) &_arrow_ipc___MessageReader__Open, 1}, 
		{ "_arrow_ipc___MessageReader__ReadNextMessage", (DL_FUNC) &_arrow_ipc___MessageReader__ReadNextMessage, 1}, 
		{ "_arrow_ipc___ReadMessage", (DL_FUNC) &_arrow_ipc___ReadMessage, 1}, 
		{ "_arrow_parquet___arrow___ArrowReaderProperties__Make", (DL_FUNC) &_arrow_parquet___arrow___ArrowReaderProperties__Make, 1}, 
		{ "_arrow_parquet___arrow___ArrowReaderProperties__set_use_threads", (DL_FUNC) &_arrow_parquet___arrow___ArrowReaderProperties__set_use_threads, 2}, 
		{ "_arrow_parquet___arrow___ArrowReaderProperties__get_use_threads", (DL_FUNC) &_arrow_parquet___arrow___ArrowReaderProperties__get_use_threads, 2}, 
		{ "_arrow_parquet___arrow___ArrowReaderProperties__get_read_dictionary", (DL_FUNC) &_arrow_parquet___arrow___ArrowReaderProperties__get_read_dictionary, 2}, 
		{ "_arrow_parquet___arrow___ArrowReaderProperties__set_read_dictionary", (DL_FUNC) &_arrow_parquet___arrow___ArrowReaderProperties__set_read_dictionary, 3}, 
		{ "_arrow_parquet___arrow___FileReader__OpenFile", (DL_FUNC) &_arrow_parquet___arrow___FileReader__OpenFile, 2}, 
		{ "_arrow_parquet___arrow___FileReader__ReadTable1", (DL_FUNC) &_arrow_parquet___arrow___FileReader__ReadTable1, 1}, 
		{ "_arrow_parquet___arrow___FileReader__ReadTable2", (DL_FUNC) &_arrow_parquet___arrow___FileReader__ReadTable2, 2}, 
		{ "_arrow_parquet___arrow___FileReader__ReadRowGroup1", (DL_FUNC) &_arrow_parquet___arrow___FileReader__ReadRowGroup1, 2}, 
		{ "_arrow_parquet___arrow___FileReader__ReadRowGroup2", (DL_FUNC) &_arrow_parquet___arrow___FileReader__ReadRowGroup2, 3}, 
		{ "_arrow_parquet___arrow___FileReader__ReadRowGroups1", (DL_FUNC) &_arrow_parquet___arrow___FileReader__ReadRowGroups1, 2}, 
		{ "_arrow_parquet___arrow___FileReader__ReadRowGroups2", (DL_FUNC) &_arrow_parquet___arrow___FileReader__ReadRowGroups2, 3}, 
		{ "_arrow_parquet___arrow___FileReader__num_rows", (DL_FUNC) &_arrow_parquet___arrow___FileReader__num_rows, 1}, 
		{ "_arrow_parquet___arrow___FileReader__num_columns", (DL_FUNC) &_arrow_parquet___arrow___FileReader__num_columns, 1}, 
		{ "_arrow_parquet___arrow___FileReader__num_row_groups", (DL_FUNC) &_arrow_parquet___arrow___FileReader__num_row_groups, 1}, 
		{ "_arrow_parquet___arrow___FileReader__ReadColumn", (DL_FUNC) &_arrow_parquet___arrow___FileReader__ReadColumn, 2}, 
		{ "_arrow_parquet___ArrowWriterProperties___create", (DL_FUNC) &_arrow_parquet___ArrowWriterProperties___create, 3}, 
		{ "_arrow_parquet___WriterProperties___Builder__create", (DL_FUNC) &_arrow_parquet___WriterProperties___Builder__create, 0}, 
		{ "_arrow_parquet___WriterProperties___Builder__version", (DL_FUNC) &_arrow_parquet___WriterProperties___Builder__version, 2}, 
		{ "_arrow_parquet___ArrowWriterProperties___Builder__set_compressions", (DL_FUNC) &_arrow_parquet___ArrowWriterProperties___Builder__set_compressions, 3}, 
		{ "_arrow_parquet___ArrowWriterProperties___Builder__set_compression_levels", (DL_FUNC) &_arrow_parquet___ArrowWriterProperties___Builder__set_compression_levels, 3}, 
		{ "_arrow_parquet___ArrowWriterProperties___Builder__set_use_dictionary", (DL_FUNC) &_arrow_parquet___ArrowWriterProperties___Builder__set_use_dictionary, 3}, 
		{ "_arrow_parquet___ArrowWriterProperties___Builder__set_write_statistics", (DL_FUNC) &_arrow_parquet___ArrowWriterProperties___Builder__set_write_statistics, 3}, 
		{ "_arrow_parquet___ArrowWriterProperties___Builder__data_page_size", (DL_FUNC) &_arrow_parquet___ArrowWriterProperties___Builder__data_page_size, 2}, 
		{ "_arrow_parquet___WriterProperties___Builder__build", (DL_FUNC) &_arrow_parquet___WriterProperties___Builder__build, 1}, 
		{ "_arrow_parquet___arrow___ParquetFileWriter__Open", (DL_FUNC) &_arrow_parquet___arrow___ParquetFileWriter__Open, 4}, 
		{ "_arrow_parquet___arrow___FileWriter__WriteTable", (DL_FUNC) &_arrow_parquet___arrow___FileWriter__WriteTable, 3}, 
		{ "_arrow_parquet___arrow___FileWriter__Close", (DL_FUNC) &_arrow_parquet___arrow___FileWriter__Close, 1}, 
		{ "_arrow_parquet___arrow___WriteTable", (DL_FUNC) &_arrow_parquet___arrow___WriteTable, 4}, 
		{ "_arrow_parquet___arrow___FileReader__GetSchema", (DL_FUNC) &_arrow_parquet___arrow___FileReader__GetSchema, 1}, 
		{ "_arrow_ImportArray", (DL_FUNC) &_arrow_ImportArray, 2}, 
		{ "_arrow_ImportRecordBatch", (DL_FUNC) &_arrow_ImportRecordBatch, 2}, 
		{ "_arrow_ImportSchema", (DL_FUNC) &_arrow_ImportSchema, 1}, 
		{ "_arrow_allocate_arrow_schema", (DL_FUNC) &_arrow_allocate_arrow_schema, 0}, 
		{ "_arrow_delete_arrow_schema", (DL_FUNC) &_arrow_delete_arrow_schema, 1}, 
		{ "_arrow_allocate_arrow_array", (DL_FUNC) &_arrow_allocate_arrow_array, 0}, 
		{ "_arrow_delete_arrow_array", (DL_FUNC) &_arrow_delete_arrow_array, 1}, 
		{ "_arrow_ExportType", (DL_FUNC) &_arrow_ExportType, 2}, 
		{ "_arrow_ExportSchema", (DL_FUNC) &_arrow_ExportSchema, 2}, 
		{ "_arrow_ExportArray", (DL_FUNC) &_arrow_ExportArray, 3}, 
		{ "_arrow_ExportRecordBatch", (DL_FUNC) &_arrow_ExportRecordBatch, 3}, 
		{ "_arrow_vec_to_arrow", (DL_FUNC) &_arrow_vec_to_arrow, 2}, 
		{ "_arrow_DictionaryArray__FromArrays", (DL_FUNC) &_arrow_DictionaryArray__FromArrays, 3}, 
		{ "_arrow_RecordBatch__num_columns", (DL_FUNC) &_arrow_RecordBatch__num_columns, 1}, 
		{ "_arrow_RecordBatch__num_rows", (DL_FUNC) &_arrow_RecordBatch__num_rows, 1}, 
		{ "_arrow_RecordBatch__schema", (DL_FUNC) &_arrow_RecordBatch__schema, 1}, 
		{ "_arrow_RecordBatch__RenameColumns", (DL_FUNC) &_arrow_RecordBatch__RenameColumns, 2}, 
		{ "_arrow_RecordBatch__ReplaceSchemaMetadata", (DL_FUNC) &_arrow_RecordBatch__ReplaceSchemaMetadata, 2}, 
		{ "_arrow_RecordBatch__columns", (DL_FUNC) &_arrow_RecordBatch__columns, 1}, 
		{ "_arrow_RecordBatch__column", (DL_FUNC) &_arrow_RecordBatch__column, 2}, 
		{ "_arrow_RecordBatch__GetColumnByName", (DL_FUNC) &_arrow_RecordBatch__GetColumnByName, 2}, 
		{ "_arrow_RecordBatch__SelectColumns", (DL_FUNC) &_arrow_RecordBatch__SelectColumns, 2}, 
		{ "_arrow_RecordBatch__Equals", (DL_FUNC) &_arrow_RecordBatch__Equals, 3}, 
		{ "_arrow_RecordBatch__AddColumn", (DL_FUNC) &_arrow_RecordBatch__AddColumn, 4}, 
		{ "_arrow_RecordBatch__SetColumn", (DL_FUNC) &_arrow_RecordBatch__SetColumn, 4}, 
		{ "_arrow_RecordBatch__RemoveColumn", (DL_FUNC) &_arrow_RecordBatch__RemoveColumn, 2}, 
		{ "_arrow_RecordBatch__column_name", (DL_FUNC) &_arrow_RecordBatch__column_name, 2}, 
		{ "_arrow_RecordBatch__names", (DL_FUNC) &_arrow_RecordBatch__names, 1}, 
		{ "_arrow_RecordBatch__Slice1", (DL_FUNC) &_arrow_RecordBatch__Slice1, 2}, 
		{ "_arrow_RecordBatch__Slice2", (DL_FUNC) &_arrow_RecordBatch__Slice2, 3}, 
		{ "_arrow_ipc___SerializeRecordBatch__Raw", (DL_FUNC) &_arrow_ipc___SerializeRecordBatch__Raw, 1}, 
		{ "_arrow_ipc___ReadRecordBatch__InputStream__Schema", (DL_FUNC) &_arrow_ipc___ReadRecordBatch__InputStream__Schema, 2}, 
		{ "_arrow_RecordBatch__from_arrays", (DL_FUNC) &_arrow_RecordBatch__from_arrays, 2}, 
		{ "_arrow_RecordBatchReader__schema", (DL_FUNC) &_arrow_RecordBatchReader__schema, 1}, 
		{ "_arrow_RecordBatchReader__ReadNext", (DL_FUNC) &_arrow_RecordBatchReader__ReadNext, 1}, 
		{ "_arrow_ipc___RecordBatchStreamReader__Open", (DL_FUNC) &_arrow_ipc___RecordBatchStreamReader__Open, 1}, 
		{ "_arrow_ipc___RecordBatchStreamReader__batches", (DL_FUNC) &_arrow_ipc___RecordBatchStreamReader__batches, 1}, 
		{ "_arrow_ipc___RecordBatchFileReader__schema", (DL_FUNC) &_arrow_ipc___RecordBatchFileReader__schema, 1}, 
		{ "_arrow_ipc___RecordBatchFileReader__num_record_batches", (DL_FUNC) &_arrow_ipc___RecordBatchFileReader__num_record_batches, 1}, 
		{ "_arrow_ipc___RecordBatchFileReader__ReadRecordBatch", (DL_FUNC) &_arrow_ipc___RecordBatchFileReader__ReadRecordBatch, 2}, 
		{ "_arrow_ipc___RecordBatchFileReader__Open", (DL_FUNC) &_arrow_ipc___RecordBatchFileReader__Open, 1}, 
		{ "_arrow_Table__from_RecordBatchReader", (DL_FUNC) &_arrow_Table__from_RecordBatchReader, 1}, 
		{ "_arrow_Table__from_RecordBatchFileReader", (DL_FUNC) &_arrow_Table__from_RecordBatchFileReader, 1}, 
		{ "_arrow_ipc___RecordBatchFileReader__batches", (DL_FUNC) &_arrow_ipc___RecordBatchFileReader__batches, 1}, 
		{ "_arrow_ipc___RecordBatchWriter__WriteRecordBatch", (DL_FUNC) &_arrow_ipc___RecordBatchWriter__WriteRecordBatch, 2}, 
		{ "_arrow_ipc___RecordBatchWriter__WriteTable", (DL_FUNC) &_arrow_ipc___RecordBatchWriter__WriteTable, 2}, 
		{ "_arrow_ipc___RecordBatchWriter__Close", (DL_FUNC) &_arrow_ipc___RecordBatchWriter__Close, 1}, 
		{ "_arrow_ipc___RecordBatchFileWriter__Open", (DL_FUNC) &_arrow_ipc___RecordBatchFileWriter__Open, 4}, 
		{ "_arrow_ipc___RecordBatchStreamWriter__Open", (DL_FUNC) &_arrow_ipc___RecordBatchStreamWriter__Open, 4}, 
		{ "_arrow_runtime_info", (DL_FUNC) &_arrow_runtime_info, 0}, 
		{ "_arrow_Array__GetScalar", (DL_FUNC) &_arrow_Array__GetScalar, 2}, 
		{ "_arrow_Scalar__ToString", (DL_FUNC) &_arrow_Scalar__ToString, 1}, 
		{ "_arrow_StructScalar__field", (DL_FUNC) &_arrow_StructScalar__field, 2}, 
		{ "_arrow_StructScalar__GetFieldByName", (DL_FUNC) &_arrow_StructScalar__GetFieldByName, 2}, 
		{ "_arrow_Scalar__as_vector", (DL_FUNC) &_arrow_Scalar__as_vector, 1}, 
		{ "_arrow_MakeArrayFromScalar", (DL_FUNC) &_arrow_MakeArrayFromScalar, 1}, 
		{ "_arrow_Scalar__is_valid", (DL_FUNC) &_arrow_Scalar__is_valid, 1}, 
		{ "_arrow_Scalar__type", (DL_FUNC) &_arrow_Scalar__type, 1}, 
		{ "_arrow_Scalar__Equals", (DL_FUNC) &_arrow_Scalar__Equals, 2}, 
		{ "_arrow_Scalar__ApproxEquals", (DL_FUNC) &_arrow_Scalar__ApproxEquals, 2}, 
		{ "_arrow_schema_", (DL_FUNC) &_arrow_schema_, 1}, 
		{ "_arrow_Schema__ToString", (DL_FUNC) &_arrow_Schema__ToString, 1}, 
		{ "_arrow_Schema__num_fields", (DL_FUNC) &_arrow_Schema__num_fields, 1}, 
		{ "_arrow_Schema__field", (DL_FUNC) &_arrow_Schema__field, 2}, 
		{ "_arrow_Schema__AddField", (DL_FUNC) &_arrow_Schema__AddField, 3}, 
		{ "_arrow_Schema__SetField", (DL_FUNC) &_arrow_Schema__SetField, 3}, 
		{ "_arrow_Schema__RemoveField", (DL_FUNC) &_arrow_Schema__RemoveField, 2}, 
		{ "_arrow_Schema__GetFieldByName", (DL_FUNC) &_arrow_Schema__GetFieldByName, 2}, 
		{ "_arrow_Schema__fields", (DL_FUNC) &_arrow_Schema__fields, 1}, 
		{ "_arrow_Schema__field_names", (DL_FUNC) &_arrow_Schema__field_names, 1}, 
		{ "_arrow_Schema__HasMetadata", (DL_FUNC) &_arrow_Schema__HasMetadata, 1}, 
		{ "_arrow_Schema__metadata", (DL_FUNC) &_arrow_Schema__metadata, 1}, 
		{ "_arrow_Schema__WithMetadata", (DL_FUNC) &_arrow_Schema__WithMetadata, 2}, 
		{ "_arrow_Schema__serialize", (DL_FUNC) &_arrow_Schema__serialize, 1}, 
		{ "_arrow_Schema__Equals", (DL_FUNC) &_arrow_Schema__Equals, 3}, 
		{ "_arrow_arrow__UnifySchemas", (DL_FUNC) &_arrow_arrow__UnifySchemas, 1}, 
		{ "_arrow_Table__num_columns", (DL_FUNC) &_arrow_Table__num_columns, 1}, 
		{ "_arrow_Table__num_rows", (DL_FUNC) &_arrow_Table__num_rows, 1}, 
		{ "_arrow_Table__schema", (DL_FUNC) &_arrow_Table__schema, 1}, 
		{ "_arrow_Table__ReplaceSchemaMetadata", (DL_FUNC) &_arrow_Table__ReplaceSchemaMetadata, 2}, 
		{ "_arrow_Table__column", (DL_FUNC) &_arrow_Table__column, 2}, 
		{ "_arrow_Table__field", (DL_FUNC) &_arrow_Table__field, 2}, 
		{ "_arrow_Table__columns", (DL_FUNC) &_arrow_Table__columns, 1}, 
		{ "_arrow_Table__ColumnNames", (DL_FUNC) &_arrow_Table__ColumnNames, 1}, 
		{ "_arrow_Table__RenameColumns", (DL_FUNC) &_arrow_Table__RenameColumns, 2}, 
		{ "_arrow_Table__Slice1", (DL_FUNC) &_arrow_Table__Slice1, 2}, 
		{ "_arrow_Table__Slice2", (DL_FUNC) &_arrow_Table__Slice2, 3}, 
		{ "_arrow_Table__Equals", (DL_FUNC) &_arrow_Table__Equals, 3}, 
		{ "_arrow_Table__Validate", (DL_FUNC) &_arrow_Table__Validate, 1}, 
		{ "_arrow_Table__ValidateFull", (DL_FUNC) &_arrow_Table__ValidateFull, 1}, 
		{ "_arrow_Table__GetColumnByName", (DL_FUNC) &_arrow_Table__GetColumnByName, 2}, 
		{ "_arrow_Table__RemoveColumn", (DL_FUNC) &_arrow_Table__RemoveColumn, 2}, 
		{ "_arrow_Table__AddColumn", (DL_FUNC) &_arrow_Table__AddColumn, 4}, 
		{ "_arrow_Table__SetColumn", (DL_FUNC) &_arrow_Table__SetColumn, 4}, 
		{ "_arrow_Table__SelectColumns", (DL_FUNC) &_arrow_Table__SelectColumns, 2}, 
		{ "_arrow_all_record_batches", (DL_FUNC) &_arrow_all_record_batches, 1}, 
		{ "_arrow_Table__from_record_batches", (DL_FUNC) &_arrow_Table__from_record_batches, 2}, 
		{ "_arrow_Table__from_dots", (DL_FUNC) &_arrow_Table__from_dots, 2}, 
		{ "_arrow_GetCpuThreadPoolCapacity", (DL_FUNC) &_arrow_GetCpuThreadPoolCapacity, 0}, 
		{ "_arrow_SetCpuThreadPoolCapacity", (DL_FUNC) &_arrow_SetCpuThreadPoolCapacity, 1}, 
		{ "_arrow_Array__infer_type", (DL_FUNC) &_arrow_Array__infer_type, 1}, 
		{ "_arrow_Table__Reset", (DL_FUNC) &_arrow_Table__Reset, 1}, 
		{ "_arrow_RecordBatch__Reset", (DL_FUNC) &_arrow_RecordBatch__Reset, 1}, 
		{NULL, NULL, 0}
};
extern "C" void R_init_arrow(DllInfo* dll){
  R_registerRoutines(dll, NULL, CallEntries, NULL, NULL);
  R_useDynamicSymbols(dll, FALSE);
}


