Skip to main content

ndstruct/csl/
csl_rayon.rs

1use 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);