vortex_array/arrays/primitive/
accessor.rs

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