in r/src/buffer.c [131:188]
SEXP nanoarrow_c_buffer_info(SEXP buffer_xptr) {
struct ArrowBuffer* buffer = buffer_from_xptr(buffer_xptr);
SEXP buffer_types_sexp = R_ExternalPtrTag(buffer_xptr);
SEXP buffer_type_sexp;
SEXP buffer_data_type_sexp;
int32_t element_size_bits;
if (buffer_types_sexp == R_NilValue) {
buffer_type_sexp = PROTECT(Rf_mkString("unknown"));
buffer_data_type_sexp = PROTECT(Rf_mkString("unknown"));
element_size_bits = 0;
} else {
enum ArrowBufferType buffer_type = INTEGER(buffer_types_sexp)[0];
const char* buffer_type_string;
switch (buffer_type) {
case NANOARROW_BUFFER_TYPE_VALIDITY:
buffer_type_string = "validity";
break;
case NANOARROW_BUFFER_TYPE_DATA_OFFSET:
buffer_type_string = "data_offset";
break;
case NANOARROW_BUFFER_TYPE_DATA:
buffer_type_string = "data";
break;
case NANOARROW_BUFFER_TYPE_TYPE_ID:
buffer_type_string = "type_id";
break;
case NANOARROW_BUFFER_TYPE_UNION_OFFSET:
buffer_type_string = "union_offset";
break;
default:
buffer_type_string = "unknown";
break;
}
enum ArrowType buffer_data_type = INTEGER(buffer_types_sexp)[1];
const char* buffer_data_type_string = ArrowTypeString(buffer_data_type);
buffer_type_sexp = PROTECT(Rf_mkString(buffer_type_string));
buffer_data_type_sexp = PROTECT(Rf_mkString(buffer_data_type_string));
element_size_bits = INTEGER(buffer_types_sexp)[2];
}
const char* names[] = {"data", "size_bytes", "capacity_bytes",
"type", "data_type", "element_size_bits",
""};
SEXP info = PROTECT(Rf_mkNamed(VECSXP, names));
SET_VECTOR_ELT(info, 0, R_MakeExternalPtr(buffer->data, NULL, buffer_xptr));
SET_VECTOR_ELT(info, 1, Rf_ScalarReal(buffer->size_bytes));
SET_VECTOR_ELT(info, 2, Rf_ScalarReal(buffer->capacity_bytes));
SET_VECTOR_ELT(info, 3, buffer_type_sexp);
SET_VECTOR_ELT(info, 4, buffer_data_type_sexp);
SET_VECTOR_ELT(info, 5, Rf_ScalarInteger(element_size_bits));
UNPROTECT(3);
return info;
}