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