@@ -289,6 +289,35 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> {
289289 } ;
290290 }
291291
292+ fn try_fold < B , F , R > ( & mut self , init : B , mut f : F ) -> R
293+ where
294+ Self : Sized ,
295+ F : FnMut ( B , Self :: Item ) -> R ,
296+ R : core:: ops:: Try < Output = B > ,
297+ {
298+ let mut accum = init;
299+ if T :: IS_ZST {
300+ while self . ptr . as_ptr ( ) != self . end . cast_mut ( ) {
301+ // SAFETY: we just checked that `self.ptr` is in bounds.
302+ let tmp = unsafe { self . ptr . read ( ) } ;
303+ // See `next` for why we subtract from `end` here.
304+ self . end = self . end . wrapping_byte_sub ( 1 ) ;
305+ accum = f ( accum, tmp) ?;
306+ }
307+ } else {
308+ // SAFETY: `self.end` can only be null if `T` is a ZST.
309+ while self . ptr != non_null ! ( self . end, T ) {
310+ // SAFETY: we just checked that `self.ptr` is in bounds.
311+ let tmp = unsafe { self . ptr . read ( ) } ;
312+ // SAFETY: the maximum this can be is `self.end`.
313+ // Increment `self.ptr` first to avoid double dropping in the event of a panic.
314+ self . ptr = unsafe { self . ptr . add ( 1 ) } ;
315+ accum = f ( accum, tmp) ?;
316+ }
317+ }
318+ R :: from_output ( accum)
319+ }
320+
292321 unsafe fn __iterator_get_unchecked ( & mut self , i : usize ) -> Self :: Item
293322 where
294323 Self : TrustedRandomAccessNoCoerce ,
0 commit comments