@@ -7,8 +7,10 @@ use rayon::par_iter::ExactParallelIterator;
7
7
use rayon:: par_iter:: BoundedParallelIterator ;
8
8
use rayon:: par_iter:: internal:: { Consumer , UnindexedConsumer } ;
9
9
use rayon:: par_iter:: internal:: bridge;
10
+ use rayon:: par_iter:: internal:: bridge_unindexed;
10
11
use rayon:: par_iter:: internal:: ProducerCallback ;
11
12
use rayon:: par_iter:: internal:: Producer ;
13
+ use rayon:: par_iter:: internal:: UnindexedProducer ;
12
14
13
15
use super :: AxisIter ;
14
16
use super :: AxisIterMut ;
@@ -112,3 +114,55 @@ macro_rules! par_iter_wrapper {
112
114
113
115
par_iter_wrapper ! ( AxisIter , [ Sync ] ) ;
114
116
par_iter_wrapper ! ( AxisIterMut , [ Send + Sync ] ) ;
117
+
118
+ macro_rules! par_iter_view_wrapper {
119
+ // thread_bounds are either Sync or Send + Sync
120
+ ( $view_name: ident, [ $( $thread_bounds: tt) * ] ) => {
121
+ impl <' a, A , D > IntoParallelIterator for $view_name<' a, A , D >
122
+ where D : Dimension ,
123
+ A : $( $thread_bounds) * ,
124
+ {
125
+ type Item = <Self as IntoIterator >:: Item ;
126
+ type Iter = Parallel <Self >;
127
+ fn into_par_iter( self ) -> Self :: Iter {
128
+ Parallel {
129
+ iter: self ,
130
+ }
131
+ }
132
+ }
133
+
134
+
135
+ impl <' a, A , D > ParallelIterator for Parallel <$view_name<' a, A , D >>
136
+ where D : Dimension ,
137
+ A : $( $thread_bounds) * ,
138
+ {
139
+ type Item = <$view_name<' a, A , D > as IntoIterator >:: Item ;
140
+ fn drive_unindexed<C >( self , consumer: C ) -> C :: Result
141
+ where C : UnindexedConsumer <Self :: Item >
142
+ {
143
+ bridge_unindexed( self . iter, consumer)
144
+ }
145
+ }
146
+
147
+ impl <' a, A , D > UnindexedProducer for $view_name<' a, A , D >
148
+ where D : Dimension ,
149
+ A : $( $thread_bounds) * ,
150
+ {
151
+ fn can_split( & self ) -> bool {
152
+ self . len( ) > 1
153
+ }
154
+
155
+ fn split( self ) -> ( Self , Self ) {
156
+ let max_axis = self . max_stride_axis( ) ;
157
+ let mid = self . len_of( max_axis) ;
158
+ self . split_at( max_axis, mid)
159
+ }
160
+ }
161
+
162
+ }
163
+ }
164
+
165
+ use super :: Iter ;
166
+
167
+ par_iter_view_wrapper ! ( ArrayView , [ Sync ] ) ;
168
+ par_iter_view_wrapper ! ( ArrayViewMut , [ Sync + Send ] ) ;
0 commit comments