vortex_array/arrays/primitive/
accessor.rs

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