in r/src/convert.c [228:282]
SEXP nanoarrow_converter_from_ptype(SEXP ptype) {
SEXP converter_xptr = PROTECT(nanoarrow_converter_from_type(VECTOR_TYPE_NULL));
SEXP converter_shelter = R_ExternalPtrProtected(converter_xptr);
struct RConverter* converter = (struct RConverter*)R_ExternalPtrAddr(converter_xptr);
if (Rf_isObject(ptype)) {
if (nanoarrow_ptype_is_data_frame(ptype)) {
converter->ptype_view.vector_type = VECTOR_TYPE_DATA_FRAME;
set_converter_data_frame(converter_xptr, converter, ptype);
} else if (Rf_inherits(ptype, "blob")) {
converter->ptype_view.vector_type = VECTOR_TYPE_BLOB;
} else if (Rf_inherits(ptype, "vctrs_list_of")) {
converter->ptype_view.vector_type = VECTOR_TYPE_LIST_OF;
set_converter_list_of(converter_xptr, converter, ptype);
} else if (Rf_inherits(ptype, "vctrs_unspecified")) {
converter->ptype_view.vector_type = VECTOR_TYPE_UNSPECIFIED;
} else if (Rf_inherits(ptype, "Date")) {
converter->ptype_view.vector_type = VECTOR_TYPE_DATE;
converter->ptype_view.r_time_units = R_TIME_UNIT_DAYS;
} else if (Rf_inherits(ptype, "POSIXct")) {
converter->ptype_view.vector_type = VECTOR_TYPE_POSIXCT;
converter->ptype_view.r_time_units = R_TIME_UNIT_SECONDS;
} else if (Rf_inherits(ptype, "difftime")) {
converter->ptype_view.vector_type = VECTOR_TYPE_DIFFTIME;
converter->ptype_view.r_time_units = time_units_from_difftime(ptype);
} else {
converter->ptype_view.vector_type = VECTOR_TYPE_OTHER;
}
} else {
switch (TYPEOF(ptype)) {
case LGLSXP:
converter->ptype_view.vector_type = VECTOR_TYPE_LGL;
break;
case INTSXP:
converter->ptype_view.vector_type = VECTOR_TYPE_INT;
break;
case REALSXP:
converter->ptype_view.vector_type = VECTOR_TYPE_DBL;
break;
case STRSXP:
converter->ptype_view.vector_type = VECTOR_TYPE_CHR;
break;
default:
converter->ptype_view.vector_type = VECTOR_TYPE_OTHER;
break;
}
}
converter->ptype_view.ptype = ptype;
converter->ptype_view.sexp_type = TYPEOF(ptype);
SET_VECTOR_ELT(converter_shelter, 0, ptype);
UNPROTECT(1);
return converter_xptr;
}