in r/src/materialize.c [249:310]
static int nanoarrow_materialize_list_of(struct RConverter* converter,
SEXP converter_xptr) {
SEXP converter_shelter = R_ExternalPtrProtected(converter_xptr);
SEXP child_converter_xptrs = VECTOR_ELT(converter_shelter, 3);
struct RConverter* child_converter = converter->children[0];
SEXP child_converter_xptr = VECTOR_ELT(child_converter_xptrs, 0);
struct ArrayViewSlice* src = &converter->src;
struct VectorSlice* dst = &converter->dst;
const int32_t* offsets = src->array_view->buffer_views[1].data.as_int32;
const int64_t* large_offsets = src->array_view->buffer_views[1].data.as_int64;
int64_t raw_src_offset = src->array_view->array->offset + src->offset;
int64_t offset;
int64_t length;
switch (src->array_view->storage_type) {
case NANOARROW_TYPE_NA:
return NANOARROW_OK;
case NANOARROW_TYPE_LIST:
for (int64_t i = 0; i < dst->length; i++) {
if (!ArrowArrayViewIsNull(src->array_view, src->offset + i)) {
offset = offsets[raw_src_offset + i];
length = offsets[raw_src_offset + i + 1] - offset;
NANOARROW_RETURN_NOT_OK(materialize_list_element(
child_converter, child_converter_xptr, offset, length));
SET_VECTOR_ELT(dst->vec_sexp, dst->offset + i,
nanoarrow_converter_release_result(child_converter_xptr));
}
}
break;
case NANOARROW_TYPE_LARGE_LIST:
for (int64_t i = 0; i < dst->length; i++) {
if (!ArrowArrayViewIsNull(src->array_view, src->offset + i)) {
offset = large_offsets[raw_src_offset + i];
length = large_offsets[raw_src_offset + i + 1] - offset;
NANOARROW_RETURN_NOT_OK(materialize_list_element(
child_converter, child_converter_xptr, offset, length));
SET_VECTOR_ELT(dst->vec_sexp, dst->offset + i,
nanoarrow_converter_release_result(child_converter_xptr));
}
}
break;
case NANOARROW_TYPE_FIXED_SIZE_LIST:
length = src->array_view->layout.child_size_elements;
for (int64_t i = 0; i < dst->length; i++) {
if (!ArrowArrayViewIsNull(src->array_view, src->offset + i)) {
offset = (raw_src_offset + i) * length;
NANOARROW_RETURN_NOT_OK(materialize_list_element(
child_converter, child_converter_xptr, offset, length));
SET_VECTOR_ELT(dst->vec_sexp, dst->offset + i,
nanoarrow_converter_release_result(child_converter_xptr));
}
}
break;
default:
return EINVAL;
}
return NANOARROW_OK;
}