simdeez/base/
iters.rs

1use crate::SimdBaseIo;
2
3pub trait SimdIter: SimdBaseIo {
4    #[inline(always)]
5    fn iter(&self) -> SimdArrayIterator<'_, Self> {
6        SimdArrayIterator {
7            simd: self,
8            index: 0,
9        }
10    }
11
12    #[inline(always)]
13    fn iter_mut(&mut self) -> SimdArrayMutIterator<'_, Self> {
14        SimdArrayMutIterator {
15            simd: self,
16            index: 0,
17        }
18    }
19}
20
21impl<T: SimdBaseIo> SimdIter for T {}
22
23pub struct SimdArrayIterator<'a, S: SimdBaseIo> {
24    simd: &'a S,
25    index: usize,
26}
27
28impl<S: SimdBaseIo> Iterator for SimdArrayIterator<'_, S> {
29    type Item = S::Scalar;
30
31    #[inline(always)]
32    fn next(&mut self) -> Option<Self::Item> {
33        if self.index >= S::WIDTH {
34            return None;
35        }
36
37        unsafe {
38            let value = self.simd.get_unchecked(self.index);
39            self.index += 1;
40            Some(value)
41        }
42    }
43}
44
45pub struct SimdArrayMutIterator<'a, S: SimdBaseIo> {
46    simd: &'a mut S,
47    index: usize,
48}
49
50impl<'a, S: SimdBaseIo> Iterator for SimdArrayMutIterator<'a, S> {
51    type Item = &'a mut S::Scalar;
52
53    #[inline(always)]
54    fn next(&mut self) -> Option<Self::Item> {
55        if self.index >= S::WIDTH {
56            return None;
57        }
58
59        unsafe {
60            let value = self.simd.get_unchecked_mut(self.index);
61            self.index += 1;
62            Some(value)
63        }
64    }
65}