Skip to main content

vortex_array/arrays/primitive/array/
accessor.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use 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}