simd_kernels/traits/
dense_iter.rs1use minarrow::{Bitmask, Vec64};
2
3struct 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#[inline(always)]
52pub fn collect_valid<T: Copy>(d: &[T], m: Option<&Bitmask>) -> Vec64<T> {
53 DenseIter::new(d, m).collect()
54}