1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
use crate::{ array::{FromFfi, Offset, ToFfi}, datatypes::DataType, ffi, }; use crate::error::Result; use super::BinaryArray; unsafe impl<O: Offset> ToFfi for BinaryArray<O> { fn buffers(&self) -> Vec<Option<std::ptr::NonNull<u8>>> { unsafe { vec![ self.validity.as_ref().map(|x| x.as_ptr()), Some(std::ptr::NonNull::new_unchecked( self.offsets.as_ptr() as *mut u8 )), Some(std::ptr::NonNull::new_unchecked( self.values.as_ptr() as *mut u8 )), ] } } #[inline] fn offset(&self) -> usize { self.offset } } unsafe impl<O: Offset, A: ffi::ArrowArrayRef> FromFfi<A> for BinaryArray<O> { fn try_from_ffi(array: A) -> Result<Self> { let data_type = array.data_type()?; let expected = if O::is_large() { DataType::LargeBinary } else { DataType::Binary }; assert_eq!(data_type, expected); let length = array.array().len(); let offset = array.array().offset(); let mut validity = unsafe { array.validity() }?; let mut offsets = unsafe { array.buffer::<O>(0) }?; let values = unsafe { array.buffer::<u8>(1) }?; if offset > 0 { offsets = offsets.slice(offset, length); validity = validity.map(|x| x.slice(offset, length)) } Ok(Self::from_data(offsets, values, validity)) } }