polars_arrow/array/growable/
boolean.rs1use std::sync::Arc;
2
3use super::Growable;
4use crate::array::growable::utils::{extend_validity, prepare_validity};
5use crate::array::{Array, BooleanArray};
6use crate::bitmap::BitmapBuilder;
7use crate::datatypes::ArrowDataType;
8
9pub struct GrowableBoolean<'a> {
11 arrays: Vec<&'a BooleanArray>,
12 dtype: ArrowDataType,
13 validity: Option<BitmapBuilder>,
14 values: BitmapBuilder,
15}
16
17impl<'a> GrowableBoolean<'a> {
18 pub fn new(arrays: Vec<&'a BooleanArray>, mut use_validity: bool, capacity: usize) -> Self {
22 let dtype = arrays[0].dtype().clone();
23
24 if !use_validity & arrays.iter().any(|array| array.null_count() > 0) {
27 use_validity = true;
28 };
29
30 Self {
31 arrays,
32 dtype,
33 values: BitmapBuilder::with_capacity(capacity),
34 validity: prepare_validity(use_validity, capacity),
35 }
36 }
37
38 fn to(&mut self) -> BooleanArray {
39 let validity = self.validity.take();
40 let values = std::mem::take(&mut self.values);
41
42 BooleanArray::new(
43 self.dtype.clone(),
44 values.freeze(),
45 validity.map(|v| v.freeze()),
46 )
47 }
48}
49
50impl<'a> Growable<'a> for GrowableBoolean<'a> {
51 unsafe fn extend(&mut self, index: usize, start: usize, len: usize) {
52 let array = *self.arrays.get_unchecked(index);
53 extend_validity(&mut self.validity, array, start, len);
54
55 let values = array.values();
56
57 let (slice, offset, _) = values.as_slice();
58 self.values.extend_from_slice(slice, start + offset, len);
59 }
60
61 fn extend_validity(&mut self, additional: usize) {
62 self.values.extend_constant(additional, false);
63 if let Some(validity) = &mut self.validity {
64 validity.extend_constant(additional, false);
65 }
66 }
67
68 #[inline]
69 fn len(&self) -> usize {
70 self.values.len()
71 }
72
73 fn as_arc(&mut self) -> Arc<dyn Array> {
74 Arc::new(self.to())
75 }
76
77 fn as_box(&mut self) -> Box<dyn Array> {
78 Box::new(self.to())
79 }
80}
81
82impl<'a> From<GrowableBoolean<'a>> for BooleanArray {
83 fn from(val: GrowableBoolean<'a>) -> Self {
84 BooleanArray::new(
85 val.dtype,
86 val.values.freeze(),
87 val.validity.map(|v| v.freeze()),
88 )
89 }
90}