Path: blob/main/crates/polars-arrow/src/legacy/trusted_len/boolean.rs
6939 views
use crate::array::BooleanArray;1use crate::bitmap::utils::set_bit_unchecked;2use crate::bitmap::{BitmapBuilder, MutableBitmap};3use crate::datatypes::ArrowDataType;4use crate::legacy::array::default_arrays::FromData;5use crate::legacy::trusted_len::FromIteratorReversed;6use crate::legacy::utils::FromTrustedLenIterator;7use crate::trusted_len::TrustedLen;89impl FromTrustedLenIterator<Option<bool>> for BooleanArray {10fn from_iter_trusted_length<I: IntoIterator<Item = Option<bool>>>(iter: I) -> Self11where12I::IntoIter: TrustedLen,13{14// Soundness15// Trait system bounded to TrustedLen16unsafe { BooleanArray::from_trusted_len_iter_unchecked(iter.into_iter()) }17}18}19impl FromTrustedLenIterator<bool> for BooleanArray {20fn from_iter_trusted_length<I: IntoIterator<Item = bool>>(iter: I) -> Self21where22I::IntoIter: TrustedLen,23{24// Soundness25// Trait system bounded to TrustedLen26unsafe {27BooleanArray::from_data_default(28BitmapBuilder::from_trusted_len_iter(iter.into_iter()).freeze(),29None,30)31}32}33}3435impl FromIteratorReversed<bool> for BooleanArray {36fn from_trusted_len_iter_rev<I: TrustedLen<Item = bool>>(iter: I) -> Self {37let size = iter.size_hint().1.unwrap();3839let mut vals = MutableBitmap::from_len_zeroed(size);40let vals_slice = vals.as_mut_slice();41unsafe {42let mut offset = size;43iter.for_each(|item| {44offset -= 1;45if item {46set_bit_unchecked(vals_slice, offset, true);47}48});49}50BooleanArray::new(ArrowDataType::Boolean, vals.into(), None)51}52}5354impl FromIteratorReversed<Option<bool>> for BooleanArray {55fn from_trusted_len_iter_rev<I: TrustedLen<Item = Option<bool>>>(iter: I) -> Self {56let size = iter.size_hint().1.unwrap();5758let mut vals = MutableBitmap::from_len_zeroed(size);59let mut validity = MutableBitmap::with_capacity(size);60validity.extend_constant(size, true);61let validity_slice = validity.as_mut_slice();62let vals_slice = vals.as_mut_slice();63unsafe {64let mut offset = size;6566iter.for_each(|opt_item| {67offset -= 1;68match opt_item {69Some(item) => {70if item {71// Set value (validity bit is already true).72set_bit_unchecked(vals_slice, offset, true);73}74},75None => {76// Unset validity bit.77set_bit_unchecked(validity_slice, offset, false)78},79}80});81}82BooleanArray::new(ArrowDataType::Boolean, vals.into(), Some(validity.into()))83}84}858687