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}