in src/nanoarrow/array_inline.h [610:656]
static inline ArrowErrorCode ArrowArrayFinishElement(struct ArrowArray* array) {
struct ArrowArrayPrivateData* private_data =
(struct ArrowArrayPrivateData*)array->private_data;
int64_t child_length;
switch (private_data->storage_type) {
case NANOARROW_TYPE_LIST:
case NANOARROW_TYPE_MAP:
child_length = array->children[0]->length;
if (child_length > INT32_MAX) {
return EINVAL;
}
NANOARROW_RETURN_NOT_OK(
ArrowBufferAppendInt32(ArrowArrayBuffer(array, 1), (int32_t)child_length));
break;
case NANOARROW_TYPE_LARGE_LIST:
child_length = array->children[0]->length;
NANOARROW_RETURN_NOT_OK(
ArrowBufferAppendInt64(ArrowArrayBuffer(array, 1), child_length));
break;
case NANOARROW_TYPE_FIXED_SIZE_LIST:
child_length = array->children[0]->length;
if (child_length !=
((array->length + 1) * private_data->layout.child_size_elements)) {
return EINVAL;
}
break;
case NANOARROW_TYPE_STRUCT:
for (int64_t i = 0; i < array->n_children; i++) {
child_length = array->children[i]->length;
if (child_length != (array->length + 1)) {
return EINVAL;
}
}
break;
default:
return EINVAL;
}
if (private_data->bitmap.buffer.data != NULL) {
NANOARROW_RETURN_NOT_OK(ArrowBitmapAppend(ArrowArrayValidityBitmap(array), 1, 1));
}
array->length++;
return NANOARROW_OK;
}