polars_core/chunked_array/builder/list/
boolean.rs

1use super::*;
2
3pub struct ListBooleanChunkedBuilder {
4    builder: LargeListBooleanBuilder,
5    field: Field,
6    fast_explode: bool,
7}
8
9impl ListBooleanChunkedBuilder {
10    pub fn new(name: PlSmallStr, capacity: usize, values_capacity: usize) -> Self {
11        let values = MutableBooleanArray::with_capacity(values_capacity);
12        let builder = LargeListBooleanBuilder::new_with_capacity(values, capacity);
13        let field = Field::new(name, DataType::List(Box::new(DataType::Boolean)));
14
15        Self {
16            builder,
17            field,
18            fast_explode: true,
19        }
20    }
21
22    #[inline]
23    pub fn append_iter<I: Iterator<Item = Option<bool>> + TrustedLen>(&mut self, iter: I) {
24        let values = self.builder.mut_values();
25
26        if iter.size_hint().0 == 0 {
27            self.fast_explode = false;
28        }
29        // SAFETY:
30        // trusted len, trust the type system
31        unsafe { values.extend_trusted_len_unchecked(iter) };
32        self.builder.try_push_valid().unwrap();
33    }
34
35    #[inline]
36    pub(crate) fn append(&mut self, ca: &BooleanChunked) {
37        if ca.is_empty() {
38            self.fast_explode = false;
39        }
40        let value_builder = self.builder.mut_values();
41        value_builder.extend(ca);
42        self.builder.try_push_valid().unwrap();
43    }
44}
45
46impl ListBuilderTrait for ListBooleanChunkedBuilder {
47    #[inline]
48    fn append_null(&mut self) {
49        self.fast_explode = false;
50        self.builder.push_null();
51    }
52
53    #[inline]
54    fn append_series(&mut self, s: &Series) -> PolarsResult<()> {
55        let ca = s.bool()?;
56        self.append(ca);
57        Ok(())
58    }
59
60    fn field(&self) -> &Field {
61        &self.field
62    }
63
64    fn inner_array(&mut self) -> ArrayRef {
65        self.builder.as_box()
66    }
67
68    fn fast_explode(&self) -> bool {
69        self.fast_explode
70    }
71}