Path: blob/main/crates/polars-arrow/src/array/boolean/builder.rs
6939 views
use polars_utils::IdxSize;12use super::BooleanArray;3use crate::array::builder::{ShareStrategy, StaticArrayBuilder};4use crate::bitmap::{BitmapBuilder, OptBitmapBuilder};5use crate::datatypes::ArrowDataType;67pub struct BooleanArrayBuilder {8dtype: ArrowDataType,9values: BitmapBuilder,10validity: OptBitmapBuilder,11}1213impl BooleanArrayBuilder {14pub fn new(dtype: ArrowDataType) -> Self {15Self {16dtype,17values: BitmapBuilder::new(),18validity: OptBitmapBuilder::default(),19}20}21}2223impl StaticArrayBuilder for BooleanArrayBuilder {24type Array = BooleanArray;2526fn dtype(&self) -> &ArrowDataType {27&self.dtype28}2930fn reserve(&mut self, additional: usize) {31self.values.reserve(additional);32self.validity.reserve(additional);33}3435fn freeze(self) -> BooleanArray {36let values = self.values.freeze();37let validity = self.validity.into_opt_validity();38BooleanArray::try_new(self.dtype, values, validity).unwrap()39}4041fn freeze_reset(&mut self) -> Self::Array {42let values = core::mem::take(&mut self.values).freeze();43let validity = core::mem::take(&mut self.validity).into_opt_validity();44BooleanArray::try_new(self.dtype.clone(), values, validity).unwrap()45}4647fn len(&self) -> usize {48self.values.len()49}5051fn extend_nulls(&mut self, length: usize) {52self.values.extend_constant(length, false);53self.validity.extend_constant(length, false);54}5556fn subslice_extend(57&mut self,58other: &BooleanArray,59start: usize,60length: usize,61_share: ShareStrategy,62) {63self.values64.subslice_extend_from_bitmap(other.values(), start, length);65self.validity66.subslice_extend_from_opt_validity(other.validity(), start, length);67}6869fn subslice_extend_each_repeated(70&mut self,71other: &BooleanArray,72start: usize,73length: usize,74repeats: usize,75_share: ShareStrategy,76) {77self.values.subslice_extend_each_repeated_from_bitmap(78other.values(),79start,80length,81repeats,82);83self.validity84.subslice_extend_each_repeated_from_opt_validity(85other.validity(),86start,87length,88repeats,89);90}9192unsafe fn gather_extend(93&mut self,94other: &BooleanArray,95idxs: &[IdxSize],96_share: ShareStrategy,97) {98self.values.reserve(idxs.len());99for idx in idxs {100self.values101.push_unchecked(other.value_unchecked(*idx as usize));102}103self.validity104.gather_extend_from_opt_validity(other.validity(), idxs);105}106107fn opt_gather_extend(&mut self, other: &BooleanArray, idxs: &[IdxSize], _share: ShareStrategy) {108self.values.reserve(idxs.len());109unsafe {110for idx in idxs {111let val = if (*idx as usize) < other.len() {112// We don't use get here as that double-checks the validity113// which we don't care about here.114other.value_unchecked(*idx as usize)115} else {116false117};118self.values.push_unchecked(val);119}120}121self.validity122.opt_gather_extend_from_opt_validity(other.validity(), idxs, other.len());123}124}125126127