simd_kernels/traits/
dense_iter.rs

1use minarrow::{Bitmask, Vec64};
2
3/// Iterator over non-null values in a slice, using an optional Bitmask.
4struct DenseIter<'a, T> {
5    slice: &'a [T],
6    idx: usize,
7    mask: Option<&'a Bitmask>,
8    len: usize,
9}
10impl<'a, T: Copy> DenseIter<'a, T> {
11    #[inline(always)]
12    fn new(slice: &'a [T], mask: Option<&'a Bitmask>) -> Self {
13        let len = slice.len();
14        Self {
15            slice,
16            idx: 0,
17            mask,
18            len,
19        }
20    }
21}
22impl<'a, T: Copy> Iterator for DenseIter<'a, T> {
23    type Item = T;
24    #[inline(always)]
25    fn next(&mut self) -> Option<Self::Item> {
26        match self.mask {
27            None => {
28                if self.idx >= self.len {
29                    None
30                } else {
31                    let v = self.slice[self.idx];
32                    self.idx += 1;
33                    Some(v)
34                }
35            }
36            Some(m) => {
37                while self.idx < self.len {
38                    let i = self.idx;
39                    self.idx += 1;
40                    if unsafe { m.get_unchecked(i) } {
41                        return Some(self.slice[i]);
42                    }
43                }
44                None
45            }
46        }
47    }
48}
49
50/// Collects valid (non-null) values from a slice into a Vec64.
51#[inline(always)]
52pub fn collect_valid<T: Copy>(d: &[T], m: Option<&Bitmask>) -> Vec64<T> {
53    DenseIter::new(d, m).collect()
54}