Path: blob/main/crates/polars-arrow/src/array/primitive/builder.rs
6939 views
use polars_utils::IdxSize;1use polars_utils::vec::PushUnchecked;23use super::PrimitiveArray;4use crate::array::builder::{ShareStrategy, StaticArrayBuilder};5use crate::bitmap::OptBitmapBuilder;6use crate::buffer::Buffer;7use crate::datatypes::ArrowDataType;8use crate::types::NativeType;910pub struct PrimitiveArrayBuilder<T> {11dtype: ArrowDataType,12values: Vec<T>,13validity: OptBitmapBuilder,14}1516impl<T: NativeType> PrimitiveArrayBuilder<T> {17pub fn new(dtype: ArrowDataType) -> Self {18Self {19dtype,20values: Vec::new(),21validity: OptBitmapBuilder::default(),22}23}24}2526impl<T: NativeType> StaticArrayBuilder for PrimitiveArrayBuilder<T> {27type Array = PrimitiveArray<T>;2829fn dtype(&self) -> &ArrowDataType {30&self.dtype31}3233fn reserve(&mut self, additional: usize) {34self.values.reserve(additional);35self.validity.reserve(additional);36}3738fn freeze(self) -> PrimitiveArray<T> {39let values = Buffer::from(self.values);40let validity = self.validity.into_opt_validity();41PrimitiveArray::new(self.dtype, values, validity)42}4344fn freeze_reset(&mut self) -> Self::Array {45let values = Buffer::from(core::mem::take(&mut self.values));46let validity = core::mem::take(&mut self.validity).into_opt_validity();47PrimitiveArray::new(self.dtype.clone(), values, validity)48}4950fn len(&self) -> usize {51self.values.len()52}5354fn extend_nulls(&mut self, length: usize) {55self.values.resize(self.values.len() + length, T::zeroed());56self.validity.extend_constant(length, false);57}5859fn subslice_extend(60&mut self,61other: &PrimitiveArray<T>,62start: usize,63length: usize,64_share: ShareStrategy,65) {66self.values67.extend_from_slice(&other.values()[start..start + length]);68self.validity69.subslice_extend_from_opt_validity(other.validity(), start, length);70}7172fn subslice_extend_each_repeated(73&mut self,74other: &PrimitiveArray<T>,75start: usize,76length: usize,77repeats: usize,78_share: ShareStrategy,79) {80self.values.reserve(length * repeats);8182for value in other.values()[start..start + length].iter() {83unsafe {84for _ in 0..repeats {85self.values.push_unchecked(*value);86}87}88}8990self.validity91.subslice_extend_each_repeated_from_opt_validity(92other.validity(),93start,94length,95repeats,96);97}9899unsafe fn gather_extend(100&mut self,101other: &PrimitiveArray<T>,102idxs: &[IdxSize],103_share: ShareStrategy,104) {105// TODO: SIMD gather kernels?106let other_values_slice = other.values().as_slice();107self.values.extend(108idxs.iter()109.map(|idx| *other_values_slice.get_unchecked(*idx as usize)),110);111self.validity112.gather_extend_from_opt_validity(other.validity(), idxs);113}114115fn opt_gather_extend(116&mut self,117other: &PrimitiveArray<T>,118idxs: &[IdxSize],119_share: ShareStrategy,120) {121self.values.reserve(idxs.len());122unsafe {123for idx in idxs {124let val = if (*idx as usize) < other.len() {125other.value_unchecked(*idx as usize)126} else {127T::zeroed()128};129self.values.push_unchecked(val);130}131}132self.validity133.opt_gather_extend_from_opt_validity(other.validity(), idxs, other.len());134}135}136137138