vortex_array/arrays/primitive/array/
accessor.rs1use std::iter;
5
6use crate::ToCanonical;
7use crate::accessor::ArrayAccessor;
8use crate::arrays::primitive::PrimitiveArray;
9use crate::dtype::NativePType;
10use crate::validity::Validity;
11use crate::vtable::ValidityHelper;
12
13impl<T: NativePType> ArrayAccessor<T> for PrimitiveArray {
14 fn with_iterator<F, R>(&self, f: F) -> R
15 where
16 F: for<'a> FnOnce(&mut dyn Iterator<Item = Option<&'a T>>) -> R,
17 {
18 match self.validity() {
19 Validity::NonNullable | Validity::AllValid => {
20 let mut iter = self.as_slice::<T>().iter().map(Some);
21 f(&mut iter)
22 }
23 Validity::AllInvalid => f(&mut iter::repeat_n(None, self.len())),
24 Validity::Array(v) => {
25 let validity = v.to_bool().into_bit_buffer();
26 let mut iter = self
27 .as_slice::<T>()
28 .iter()
29 .zip(validity.iter())
30 .map(|(value, valid)| valid.then_some(value));
31 f(&mut iter)
32 }
33 }
34 }
35}