Thanks to visit codestin.com
Credit goes to docs.rs

arrow2/array/boolean/
data.rs

1use crate::array::{Arrow2Arrow, BooleanArray};
2use crate::bitmap::Bitmap;
3use crate::datatypes::DataType;
4use arrow_buffer::{BooleanBuffer, NullBuffer};
5use arrow_data::{ArrayData, ArrayDataBuilder};
6
7impl Arrow2Arrow for BooleanArray {
8    fn to_data(&self) -> ArrayData {
9        let buffer = NullBuffer::from(self.values.clone());
10
11        let builder = ArrayDataBuilder::new(arrow_schema::DataType::Boolean)
12            .len(buffer.len())
13            .offset(buffer.offset())
14            .buffers(vec![buffer.into_inner().into_inner()])
15            .nulls(self.validity.as_ref().map(|b| b.clone().into()));
16
17        // Safety: Array is valid
18        unsafe { builder.build_unchecked() }
19    }
20
21    fn from_data(data: &ArrayData) -> Self {
22        assert_eq!(data.data_type(), &arrow_schema::DataType::Boolean);
23
24        let buffers = data.buffers();
25        let buffer = BooleanBuffer::new(buffers[0].clone(), data.offset(), data.len());
26        // Use NullBuffer to compute set count
27        let values = Bitmap::from_null_buffer(NullBuffer::new(buffer));
28
29        Self {
30            data_type: DataType::Boolean,
31            values,
32            validity: data.nulls().map(|n| Bitmap::from_null_buffer(n.clone())),
33        }
34    }
35}