Path: blob/main/crates/polars-arrow/src/array/binview/ffi.rs
8412 views
use polars_buffer::Buffer;1use polars_error::PolarsResult;23use super::BinaryViewArrayGeneric;4use crate::array::binview::{View, ViewType};5use crate::array::{FromFfi, ToFfi};6use crate::bitmap::align;7use crate::ffi;89unsafe impl<T: ViewType + ?Sized> ToFfi for BinaryViewArrayGeneric<T> {10fn buffers(&self) -> Vec<Option<*const u8>> {11let mut buffers = Vec::with_capacity(self.buffers.len() + 2);12buffers.push(self.validity.as_ref().map(|x| x.as_ptr()));13buffers.push(Some(self.views.storage_ptr().cast::<u8>()));14buffers.extend(self.buffers.iter().map(|b| Some(b.storage_ptr())));15buffers16}1718fn offset(&self) -> Option<usize> {19let offset = self.views.offset();20if let Some(bitmap) = self.validity.as_ref() {21if bitmap.offset() == offset {22Some(offset)23} else {24None25}26} else {27Some(offset)28}29}3031fn to_ffi_aligned(&self) -> Self {32let offset = self.views.offset();3334let validity = self.validity.as_ref().map(|bitmap| {35if bitmap.offset() == offset {36bitmap.clone()37} else {38align(bitmap, offset)39}40});4142Self {43dtype: self.dtype.clone(),44validity,45views: self.views.clone(),46buffers: self.buffers.clone(),47phantom: Default::default(),48total_bytes_len: self.total_bytes_len.clone(),49total_buffer_len: self.total_buffer_len,50}51}52}5354impl<T: ViewType + ?Sized, A: ffi::ArrowArrayRef> FromFfi<A> for BinaryViewArrayGeneric<T> {55unsafe fn try_from_ffi(array: A) -> PolarsResult<Self> {56let dtype = array.dtype().clone();5758let validity = unsafe { array.validity() }?;59let views = unsafe { array.buffer::<View>(1) }?;6061// 2 - validity + views62let n_buffers = array.n_buffers();63let mut remaining_buffers = n_buffers - 2;64if remaining_buffers <= 1 {65return Ok(Self::new_unchecked_unknown_md(66dtype,67views,68Buffer::new(),69validity,70None,71));72}7374let n_variadic_buffers = remaining_buffers - 1;75let variadic_buffer_offset = n_buffers - 1;7677let variadic_buffer_sizes =78array.buffer_known_len::<i64>(variadic_buffer_offset, n_variadic_buffers)?;79remaining_buffers -= 1;8081let mut variadic_buffers = Vec::with_capacity(remaining_buffers);8283let offset = 2;84for (i, &size) in (offset..remaining_buffers + offset).zip(variadic_buffer_sizes.iter()) {85let values = unsafe { array.buffer_known_len::<u8>(i, size as usize) }?;86variadic_buffers.push(values);87}8889Ok(Self::new_unchecked_unknown_md(90dtype,91views,92Buffer::from(variadic_buffers),93validity,94None,95))96}97}9899100