Path: blob/main/crates/polars-arrow/src/array/binview/ffi.rs
6939 views
use std::sync::Arc;12use polars_error::PolarsResult;34use super::BinaryViewArrayGeneric;5use crate::array::binview::{View, ViewType};6use crate::array::{FromFfi, ToFfi};7use crate::bitmap::align;8use crate::ffi;910unsafe impl<T: ViewType + ?Sized> ToFfi for BinaryViewArrayGeneric<T> {11fn buffers(&self) -> Vec<Option<*const u8>> {12let mut buffers = Vec::with_capacity(self.buffers.len() + 2);13buffers.push(self.validity.as_ref().map(|x| x.as_ptr()));14buffers.push(Some(self.views.storage_ptr().cast::<u8>()));15buffers.extend(self.buffers.iter().map(|b| Some(b.storage_ptr())));16buffers17}1819fn offset(&self) -> Option<usize> {20let offset = self.views.offset();21if let Some(bitmap) = self.validity.as_ref() {22if bitmap.offset() == offset {23Some(offset)24} else {25None26}27} else {28Some(offset)29}30}3132fn to_ffi_aligned(&self) -> Self {33let offset = self.views.offset();3435let validity = self.validity.as_ref().map(|bitmap| {36if bitmap.offset() == offset {37bitmap.clone()38} else {39align(bitmap, offset)40}41});4243Self {44dtype: self.dtype.clone(),45validity,46views: self.views.clone(),47buffers: self.buffers.clone(),48phantom: Default::default(),49total_bytes_len: self.total_bytes_len.clone(),50total_buffer_len: self.total_buffer_len,51}52}53}5455impl<T: ViewType + ?Sized, A: ffi::ArrowArrayRef> FromFfi<A> for BinaryViewArrayGeneric<T> {56unsafe fn try_from_ffi(array: A) -> PolarsResult<Self> {57let dtype = array.dtype().clone();5859let validity = unsafe { array.validity() }?;60let views = unsafe { array.buffer::<View>(1) }?;6162// 2 - validity + views63let n_buffers = array.n_buffers();64let mut remaining_buffers = n_buffers - 2;65if remaining_buffers <= 1 {66return Ok(Self::new_unchecked_unknown_md(67dtype,68views,69Arc::from([]),70validity,71None,72));73}7475let n_variadic_buffers = remaining_buffers - 1;76let variadic_buffer_offset = n_buffers - 1;7778let variadic_buffer_sizes =79array.buffer_known_len::<i64>(variadic_buffer_offset, n_variadic_buffers)?;80remaining_buffers -= 1;8182let mut variadic_buffers = Vec::with_capacity(remaining_buffers);8384let offset = 2;85for (i, &size) in (offset..remaining_buffers + offset).zip(variadic_buffer_sizes.iter()) {86let values = unsafe { array.buffer_known_len::<u8>(i, size as usize) }?;87variadic_buffers.push(values);88}8990Ok(Self::new_unchecked_unknown_md(91dtype,92views,93Arc::from(variadic_buffers),94validity,95None,96))97}98}99100101