@@ -161,6 +161,28 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> {
161
161
( exact, Some ( exact) )
162
162
}
163
163
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
+
164
186
#[ inline]
165
187
fn count ( self ) -> usize {
166
188
self . len ( )
@@ -203,6 +225,29 @@ impl<T, A: Allocator> DoubleEndedIterator for IntoIter<T, A> {
203
225
Some ( unsafe { ptr:: read ( self . end ) } )
204
226
}
205
227
}
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
+ }
206
251
}
207
252
208
253
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
0 commit comments