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 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}