@@ -161,6 +161,28 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> {
161161 ( exact, Some ( exact) )
162162 }
163163
164+ #[ inline]
165+ fn advance_by ( & mut self , n : usize ) -> Result < ( ) , usize > {
166+ let step_size = self . len ( ) . min ( n) ;
167+ if mem:: size_of :: < T > ( ) == 0 {
168+ // SAFETY: due to unchecked casts of unsigned amounts to signed offsets the wraparound
169+ // effectively results in unsigned pointers representing positions 0..usize::MAX,
170+ // which is valid for ZSTs.
171+ self . ptr = unsafe { arith_offset ( self . ptr as * const i8 , step_size as isize ) as * mut T }
172+ } else {
173+ let to_drop = ptr:: slice_from_raw_parts_mut ( self . ptr as * mut T , step_size) ;
174+ // SAFETY: the min() above ensures that step_size is in bounds
175+ unsafe {
176+ self . ptr = self . ptr . add ( step_size) ;
177+ ptr:: drop_in_place ( to_drop) ;
178+ }
179+ }
180+ if step_size < n {
181+ return Err ( step_size) ;
182+ }
183+ Ok ( ( ) )
184+ }
185+
164186 #[ inline]
165187 fn count ( self ) -> usize {
166188 self . len ( )
@@ -203,6 +225,29 @@ impl<T, A: Allocator> DoubleEndedIterator for IntoIter<T, A> {
203225 Some ( unsafe { ptr:: read ( self . end ) } )
204226 }
205227 }
228+
229+ #[ inline]
230+ fn advance_back_by ( & mut self , n : usize ) -> Result < ( ) , usize > {
231+ let step_size = self . len ( ) . min ( n) ;
232+ if mem:: size_of :: < T > ( ) == 0 {
233+ // SAFETY: same as for advance_by()
234+ self . end = unsafe {
235+ arith_offset ( self . end as * const i8 , step_size. wrapping_neg ( ) as isize ) as * mut T
236+ }
237+ } else {
238+ // SAFETY: same as for advance_by()
239+ self . end = unsafe { self . end . offset ( step_size. wrapping_neg ( ) as isize ) } ;
240+ let to_drop = ptr:: slice_from_raw_parts_mut ( self . end as * mut T , step_size) ;
241+ // SAFETY: same as for advance_by()
242+ unsafe {
243+ ptr:: drop_in_place ( to_drop) ;
244+ }
245+ }
246+ if step_size < n {
247+ return Err ( step_size) ;
248+ }
249+ Ok ( ( ) )
250+ }
206251}
207252
208253#[ stable( feature = "rust1" , since = "1.0.0" ) ]
0 commit comments