@@ -148,6 +148,23 @@ impl<A> DoubleEndedIterator for Baseiter<A, Ix1> {
148
148
149
149
unsafe { Some ( self . ptr . offset ( offset) ) }
150
150
}
151
+
152
+ fn rfold < Acc , G > ( mut self , init : Acc , mut g : G ) -> Acc
153
+ where G : FnMut ( Acc , * mut A ) -> Acc ,
154
+ {
155
+ let mut accum = init;
156
+ if let Some ( index) = self . index {
157
+ let elem_index = index[ 0 ] ;
158
+ unsafe {
159
+ // self.dim[0] is the current length
160
+ while self . dim [ 0 ] > elem_index {
161
+ self . dim [ 0 ] -= 1 ;
162
+ accum = g ( accum, self . ptr . offset ( Ix1 :: stride_offset ( & self . dim , & self . strides ) ) ) ;
163
+ }
164
+ }
165
+ }
166
+ accum
167
+ }
151
168
}
152
169
153
170
clone_bounds ! (
@@ -206,6 +223,14 @@ impl<'a, A> DoubleEndedIterator for ElementsBase<'a, A, Ix1> {
206
223
fn next_back ( & mut self ) -> Option < & ' a A > {
207
224
self . inner . next_back ( ) . map ( |p| unsafe { & * p } )
208
225
}
226
+
227
+ fn rfold < Acc , G > ( self , init : Acc , mut g : G ) -> Acc
228
+ where G : FnMut ( Acc , Self :: Item ) -> Acc ,
229
+ {
230
+ unsafe {
231
+ self . inner . rfold ( init, move |acc, ptr| g ( acc, & * ptr) )
232
+ }
233
+ }
209
234
}
210
235
211
236
impl < ' a , A , D > ExactSizeIterator for ElementsBase < ' a , A , D >
@@ -370,6 +395,12 @@ impl<'a, A> DoubleEndedIterator for Iter<'a, A, Ix1> {
370
395
fn next_back ( & mut self ) -> Option < & ' a A > {
371
396
either_mut ! ( self . inner, iter => iter. next_back( ) )
372
397
}
398
+
399
+ fn rfold < Acc , G > ( self , init : Acc , g : G ) -> Acc
400
+ where G : FnMut ( Acc , Self :: Item ) -> Acc
401
+ {
402
+ either ! ( self . inner, iter => iter. rfold( init, g) )
403
+ }
373
404
}
374
405
375
406
impl < ' a , A , D > ExactSizeIterator for Iter < ' a , A , D >
@@ -431,6 +462,12 @@ impl<'a, A> DoubleEndedIterator for IterMut<'a, A, Ix1> {
431
462
fn next_back ( & mut self ) -> Option < & ' a mut A > {
432
463
either_mut ! ( self . inner, iter => iter. next_back( ) )
433
464
}
465
+
466
+ fn rfold < Acc , G > ( self , init : Acc , g : G ) -> Acc
467
+ where G : FnMut ( Acc , Self :: Item ) -> Acc
468
+ {
469
+ either ! ( self . inner, iter => iter. rfold( init, g) )
470
+ }
434
471
}
435
472
436
473
impl < ' a , A , D > ExactSizeIterator for IterMut < ' a , A , D >
@@ -466,6 +503,14 @@ impl<'a, A> DoubleEndedIterator for ElementsBaseMut<'a, A, Ix1> {
466
503
fn next_back ( & mut self ) -> Option < & ' a mut A > {
467
504
self . inner . next_back ( ) . map ( |p| unsafe { & mut * p } )
468
505
}
506
+
507
+ fn rfold < Acc , G > ( self , init : Acc , mut g : G ) -> Acc
508
+ where G : FnMut ( Acc , Self :: Item ) -> Acc
509
+ {
510
+ unsafe {
511
+ self . inner . rfold ( init, move |acc, ptr| g ( acc, & mut * ptr) )
512
+ }
513
+ }
469
514
}
470
515
471
516
impl < ' a , A , D > ExactSizeIterator for ElementsBaseMut < ' a , A , D >
0 commit comments