Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-arrow/src/array/boolean/ffi.rs
6939 views
1
use polars_error::PolarsResult;
2
3
use super::BooleanArray;
4
use crate::array::{FromFfi, ToFfi};
5
use crate::bitmap::align;
6
use crate::ffi;
7
8
unsafe impl ToFfi for BooleanArray {
9
fn buffers(&self) -> Vec<Option<*const u8>> {
10
vec![
11
self.validity.as_ref().map(|x| x.as_ptr()),
12
Some(self.values.as_ptr()),
13
]
14
}
15
16
fn offset(&self) -> Option<usize> {
17
let offset = self.values.offset();
18
if let Some(bitmap) = self.validity.as_ref() {
19
if bitmap.offset() == offset {
20
Some(offset)
21
} else {
22
None
23
}
24
} else {
25
Some(offset)
26
}
27
}
28
29
fn to_ffi_aligned(&self) -> Self {
30
let offset = self.values.offset();
31
32
let validity = self.validity.as_ref().map(|bitmap| {
33
if bitmap.offset() == offset {
34
bitmap.clone()
35
} else {
36
align(bitmap, offset)
37
}
38
});
39
40
Self {
41
dtype: self.dtype.clone(),
42
validity,
43
values: self.values.clone(),
44
}
45
}
46
}
47
48
impl<A: ffi::ArrowArrayRef> FromFfi<A> for BooleanArray {
49
unsafe fn try_from_ffi(array: A) -> PolarsResult<Self> {
50
let dtype = array.dtype().clone();
51
let validity = unsafe { array.validity() }?;
52
let values = unsafe { array.bitmap(1) }?;
53
Self::try_new(dtype, values, validity)
54
}
55
}
56
57