rstsr_core/feature_rayon/
par_iter.rs1use crate::prelude_dev::*;
4use rayon::prelude::*;
5
6#[duplicate_item(IterTensor; [IterVecView]; [IterVecMut]; [IndexedIterVecView]; [IndexedIterVecMut])]
9impl<'a, T, D> IntoParallelIterator for IterTensor<'a, T, D>
10where
11 D: DimDevAPI,
12 T: Send + Sync,
13{
14 type Item = <IterTensor<'a, T, D> as Iterator>::Item;
15 type Iter = ParIterRSTSR<Self>;
16
17 fn into_par_iter(self) -> Self::Iter {
18 Self::Iter { iter: self }
19 }
20}
21
22#[duplicate_item(IterTensor; [IterAxesView]; [IterAxesMut]; [IndexedIterAxesView]; [IndexedIterAxesMut])]
23impl<'a, T, B> IntoParallelIterator for IterTensor<'a, T, B>
24where
25 T: Send + Sync,
26 B::Raw: Send,
27 B: DeviceAPI<T> + Send,
28{
29 type Item = <IterTensor<'a, T, B> as Iterator>::Item;
30 type Iter = ParIterRSTSR<Self>;
31
32 fn into_par_iter(self) -> Self::Iter {
33 Self::Iter { iter: self }
34 }
35}
36
37#[cfg(test)]
40mod test {
41 use super::*;
42
43 #[test]
44 fn test_col_major() {
45 let layout = [10, 10, 10].c();
46 let iter_ser = IterLayoutColMajor::new(&layout).unwrap();
47 let iter_par = IterLayoutColMajor::new(&layout).unwrap().into_par_iter();
48 let vec_ser: Vec<usize> = iter_ser.collect();
49 let mut vec_par = vec![];
50 iter_par.collect_into_vec(&mut vec_par);
51 assert_eq!(vec_ser, vec_par);
52 }
53
54 #[test]
55 fn test_row_major() {
56 let layout = [10, 10, 10].c();
57 let iter_ser = IterLayoutRowMajor::new(&layout).unwrap();
58 let iter_par = IterLayoutRowMajor::new(&layout).unwrap().into_par_iter();
59 let vec_ser: Vec<usize> = iter_ser.collect();
60 let mut vec_par = vec![];
61 iter_par.collect_into_vec(&mut vec_par);
62 assert_eq!(vec_ser, vec_par);
63 }
64}