@@ -163,26 +163,11 @@ macro_rules! iterator {
163
163
}
164
164
165
165
#[ inline]
166
- fn nth( & mut self , n: usize ) -> Option <$elem> {
167
- if n >= len!( self ) {
168
- // This iterator is now empty.
169
- if mem:: size_of:: <T >( ) == 0 {
170
- // We have to do it this way as `ptr` may never be 0, but `end`
171
- // could be (due to wrapping).
172
- self . end = self . ptr. as_ptr( ) ;
173
- } else {
174
- // SAFETY: end can't be 0 if T isn't ZST because ptr isn't 0 and end >= ptr
175
- unsafe {
176
- self . ptr = NonNull :: new_unchecked( self . end as * mut T ) ;
177
- }
178
- }
179
- return None ;
180
- }
181
- // SAFETY: We are in bounds. `post_inc_start` does the right thing even for ZSTs.
182
- unsafe {
183
- self . post_inc_start( n as isize ) ;
184
- Some ( next_unchecked!( self ) )
185
- }
166
+ fn advance_by( & mut self , n: usize ) -> Result <( ) , usize >{
167
+ let advance = cmp:: min( n, len!( self ) ) ;
168
+ // SAFETY: `advance` does not exceed `self.len()` by construction
169
+ unsafe { self . post_inc_start( advance as isize ) } ;
170
+ if advance == n { Ok ( ( ) ) } else { Err ( advance) }
186
171
}
187
172
188
173
#[ inline]
@@ -359,17 +344,11 @@ macro_rules! iterator {
359
344
}
360
345
361
346
#[ inline]
362
- fn nth_back( & mut self , n: usize ) -> Option <$elem> {
363
- if n >= len!( self ) {
364
- // This iterator is now empty.
365
- self . end = self . ptr. as_ptr( ) ;
366
- return None ;
367
- }
368
- // SAFETY: We are in bounds. `pre_dec_end` does the right thing even for ZSTs.
369
- unsafe {
370
- self . pre_dec_end( n as isize ) ;
371
- Some ( next_back_unchecked!( self ) )
372
- }
347
+ fn advance_back_by( & mut self , n: usize ) -> Result <( ) , usize > {
348
+ let advance = cmp:: min( n, len!( self ) ) ;
349
+ // SAFETY: `advance` does not exceed `self.len()` by construction
350
+ unsafe { self . pre_dec_end( advance as isize ) } ;
351
+ if advance == n { Ok ( ( ) ) } else { Err ( advance) }
373
352
}
374
353
}
375
354
0 commit comments