ndstruct/csl/
csl_rayon.rs1use crate::{
2 csl::{CslLineIterMut, CslLineIterRef, CslMut, CslRef},
3 ParallelIteratorWrapper, ParallelProducerWrapper,
4};
5use rayon::iter::{
6 plumbing::{bridge, Consumer, Producer, ProducerCallback, UnindexedConsumer},
7 IndexedParallelIterator, ParallelIterator,
8};
9
10macro_rules! create_rayon_iter {
11 ($csl_rayon_iter:ident, $ref:ident) => {
12 impl<'slices, T, const D: usize> ParallelIterator
13 for ParallelIteratorWrapper<$csl_rayon_iter<'slices, T, D>>
14 where
15 T: Send + Sync + 'slices,
16 {
17 type Item = $ref<'slices, T, D>;
18
19 #[inline]
20 fn drive_unindexed<C>(self, consumer: C) -> C::Result
21 where
22 C: UnindexedConsumer<Self::Item>,
23 {
24 bridge(self, consumer)
25 }
26
27 #[inline]
28 fn opt_len(&self) -> Option<usize> {
29 Some(self.0.len())
30 }
31 }
32
33 impl<'slices, T, const D: usize> IndexedParallelIterator
34 for ParallelIteratorWrapper<$csl_rayon_iter<'slices, T, D>>
35 where
36 T: Send + Sync + 'slices,
37 {
38 #[inline]
39 fn drive<C>(self, consumer: C) -> C::Result
40 where
41 C: Consumer<Self::Item>,
42 {
43 bridge(self, consumer)
44 }
45
46 #[inline]
47 fn len(&self) -> usize {
48 ExactSizeIterator::len(&self.0)
49 }
50
51 #[inline]
52 fn with_producer<Cb>(self, callback: Cb) -> Cb::Output
53 where
54 Cb: ProducerCallback<Self::Item>,
55 {
56 callback.callback(ParallelProducerWrapper(self.0))
57 }
58 }
59
60 impl<'slices, T, const D: usize> IntoIterator
61 for ParallelProducerWrapper<$csl_rayon_iter<'slices, T, D>>
62 where
63 T: 'slices,
64 {
65 type IntoIter = $csl_rayon_iter<'slices, T, D>;
66 type Item = <Self::IntoIter as Iterator>::Item;
67
68 #[inline]
69 fn into_iter(self) -> Self::IntoIter {
70 self.0
71 }
72 }
73
74 impl<'slices, T, const D: usize> Producer
75 for ParallelProducerWrapper<$csl_rayon_iter<'slices, T, D>>
76 where
77 T: Send + Sync + 'slices,
78 {
79 type IntoIter = $csl_rayon_iter<'slices, T, D>;
80 type Item = <Self::IntoIter as Iterator>::Item;
81
82 #[inline]
83 fn into_iter(self) -> Self::IntoIter {
84 self.0
85 }
86
87 #[inline]
88 fn split_at(self, i: usize) -> (Self, Self) {
89 let [a, b] = self.0.split_at(i).unwrap();
90 (ParallelProducerWrapper(a), ParallelProducerWrapper(b))
91 }
92 }
93 };
94}
95
96create_rayon_iter!(CslLineIterRef, CslRef);
97create_rayon_iter!(CslLineIterMut, CslMut);