in r/src/convert.c [50:101]
SEXP nanoarrow_converter_from_type(enum VectorType vector_type) {
struct RConverter* converter =
(struct RConverter*)ArrowMalloc(sizeof(struct RConverter));
if (converter == NULL) {
Rf_error("Failed to allocate RConverter");
}
// 0: ptype, 1: schema_xptr, 2: array_xptr, 3: children, 4: result
SEXP converter_shelter = PROTECT(Rf_allocVector(VECSXP, 5));
SEXP converter_xptr =
PROTECT(R_MakeExternalPtr(converter, R_NilValue, converter_shelter));
R_RegisterCFinalizer(converter_xptr, &finalize_converter);
ArrowArrayViewInitFromType(&converter->array_view, NANOARROW_TYPE_UNINITIALIZED);
converter->schema_view.type = NANOARROW_TYPE_UNINITIALIZED;
converter->schema_view.storage_type = NANOARROW_TYPE_UNINITIALIZED;
converter->src.array_view = &converter->array_view;
converter->dst.vec_sexp = R_NilValue;
converter->options = NULL;
converter->error.message[0] = '\0';
converter->size = 0;
converter->capacity = 0;
converter->n_children = 0;
converter->children = NULL;
converter->ptype_view.vector_type = vector_type;
converter->ptype_view.ptype = R_NilValue;
switch (vector_type) {
case VECTOR_TYPE_NULL:
converter->ptype_view.sexp_type = NILSXP;
break;
case VECTOR_TYPE_LGL:
converter->ptype_view.sexp_type = LGLSXP;
break;
case VECTOR_TYPE_INT:
converter->ptype_view.sexp_type = INTSXP;
break;
case VECTOR_TYPE_DBL:
converter->ptype_view.sexp_type = REALSXP;
break;
case VECTOR_TYPE_CHR:
converter->ptype_view.sexp_type = STRSXP;
break;
default:
UNPROTECT(2);
return R_NilValue;
}
UNPROTECT(2);
return converter_xptr;
}