Path: blob/main/crates/polars-arrow/src/array/map/ffi.rs
6939 views
use polars_error::PolarsResult;12use super::super::Array;3use super::super::ffi::ToFfi;4use super::MapArray;5use crate::array::FromFfi;6use crate::bitmap::align;7use crate::ffi;8use crate::offset::OffsetsBuffer;910unsafe impl ToFfi for MapArray {11fn buffers(&self) -> Vec<Option<*const u8>> {12vec![13self.validity.as_ref().map(|x| x.as_ptr()),14Some(self.offsets.buffer().storage_ptr().cast::<u8>()),15]16}1718fn children(&self) -> Vec<Box<dyn Array>> {19vec![self.field.clone()]20}2122fn offset(&self) -> Option<usize> {23let offset = self.offsets.buffer().offset();24if let Some(bitmap) = self.validity.as_ref() {25if bitmap.offset() == offset {26Some(offset)27} else {28None29}30} else {31Some(offset)32}33}3435fn to_ffi_aligned(&self) -> Self {36let offset = self.offsets.buffer().offset();3738let validity = self.validity.as_ref().map(|bitmap| {39if bitmap.offset() == offset {40bitmap.clone()41} else {42align(bitmap, offset)43}44});4546Self {47dtype: self.dtype.clone(),48validity,49offsets: self.offsets.clone(),50field: self.field.clone(),51}52}53}5455impl<A: ffi::ArrowArrayRef> FromFfi<A> for MapArray {56unsafe fn try_from_ffi(array: A) -> PolarsResult<Self> {57let dtype = array.dtype().clone();58let validity = unsafe { array.validity() }?;59let offsets = unsafe { array.buffer::<i32>(1) }?;60let child = array.child(0)?;61let values = ffi::try_from(child)?;6263// assumption that data from FFI is well constructed64let offsets = unsafe { OffsetsBuffer::new_unchecked(offsets) };6566Self::try_new(dtype, offsets, values, validity)67}68}697071