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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
use crate::trusted_len::TrustedLen;
use crate::utils::FromTrustedLenIterator;
use arrow::array::{ArrayData, BooleanArray};
use arrow::buffer::MutableBuffer;
use arrow::datatypes::DataType;
use arrow::util::bit_util;
impl FromTrustedLenIterator<Option<bool>> for BooleanArray {
fn from_iter_trusted_length<I: IntoIterator<Item = Option<bool>>>(iter: I) -> Self
where
I::IntoIter: TrustedLen,
{
let iter = iter.into_iter();
let (_, data_len) = iter.size_hint();
let data_len = data_len.expect("Iterator must be sized");
let num_bytes = bit_util::ceil(data_len, 8);
let mut null_buf = MutableBuffer::from_len_zeroed(num_bytes);
let mut val_buf = MutableBuffer::from_len_zeroed(num_bytes);
let data = val_buf.as_slice_mut().as_mut_ptr();
let null_slice = null_buf.as_slice_mut().as_mut_ptr();
iter.enumerate().for_each(|(i, item)| {
if let Some(a) = item {
unsafe {
bit_util::set_bit_raw(null_slice, i);
if a {
bit_util::set_bit_raw(data, i);
}
}
}
});
let data = ArrayData::new(
DataType::Boolean,
data_len,
None,
Some(null_buf.into()),
0,
vec![val_buf.into()],
vec![],
);
BooleanArray::from(data)
}
}
impl FromTrustedLenIterator<bool> for BooleanArray {
fn from_iter_trusted_length<I: IntoIterator<Item = bool>>(iter: I) -> Self
where
I::IntoIter: TrustedLen,
{
let iter = iter.into_iter();
let (_, data_len) = iter.size_hint();
let data_len = data_len.expect("Iterator must be sized");
let num_bytes = bit_util::ceil(data_len, 8);
let mut val_buf = MutableBuffer::from_len_zeroed(num_bytes);
let data = val_buf.as_slice_mut().as_mut_ptr();
iter.enumerate().for_each(|(i, item)| {
unsafe {
if item {
bit_util::set_bit_raw(data, i);
}
}
});
let data = ArrayData::new(
DataType::Boolean,
data_len,
None,
None,
0,
vec![val_buf.into()],
vec![],
);
BooleanArray::from(data)
}
}