Path: blob/main/crates/polars-arrow/src/array/union/ffi.rs
6939 views
use polars_error::PolarsResult;12use super::super::Array;3use super::super::ffi::ToFfi;4use super::UnionArray;5use crate::array::FromFfi;6use crate::ffi;78unsafe impl ToFfi for UnionArray {9fn buffers(&self) -> Vec<Option<*const u8>> {10if let Some(offsets) = &self.offsets {11vec![12Some(self.types.storage_ptr().cast::<u8>()),13Some(offsets.storage_ptr().cast::<u8>()),14]15} else {16vec![Some(self.types.storage_ptr().cast::<u8>())]17}18}1920fn children(&self) -> Vec<Box<dyn Array>> {21self.fields.clone()22}2324fn offset(&self) -> Option<usize> {25Some(self.types.offset())26}2728fn to_ffi_aligned(&self) -> Self {29self.clone()30}31}3233impl<A: ffi::ArrowArrayRef> FromFfi<A> for UnionArray {34unsafe fn try_from_ffi(array: A) -> PolarsResult<Self> {35let dtype = array.dtype().clone();36let fields = Self::get_fields(&dtype);3738let mut types = unsafe { array.buffer::<i8>(0) }?;39let offsets = if Self::is_sparse(&dtype) {40None41} else {42Some(unsafe { array.buffer::<i32>(1) }?)43};4445let length = array.array().len();46let offset = array.array().offset();47let fields = (0..fields.len())48.map(|index| {49let child = array.child(index)?;50ffi::try_from(child)51})52.collect::<PolarsResult<Vec<Box<dyn Array>>>>()?;5354if offset > 0 {55types.slice(offset, length);56};5758Self::try_new(dtype, types, fields, offsets)59}60}616263