@@ -4,6 +4,7 @@ use crate::iter::adapters::zip::try_get_unchecked;
44use crate :: iter:: {
55 FusedIterator , TrustedFused , TrustedLen , TrustedRandomAccess , TrustedRandomAccessNoCoerce ,
66} ;
7+ use crate :: num:: NonZero ;
78use crate :: ops:: Try ;
89
910/// An iterator that yields `None` forever after the underlying iterator
5051 FuseImpl :: next ( self )
5152 }
5253
54+ fn advance_by ( & mut self , n : usize ) -> Result < ( ) , NonZero < usize > > {
55+ FuseImpl :: advance_by ( self , n)
56+ }
57+
5358 #[ inline]
5459 fn nth ( & mut self , n : usize ) -> Option < I :: Item > {
5560 FuseImpl :: nth ( self , n)
@@ -259,6 +264,7 @@ trait FuseImpl<I> {
259264
260265 // Functions specific to any normal Iterators
261266 fn next ( & mut self ) -> Option < Self :: Item > ;
267+ fn advance_by ( & mut self , n : usize ) -> Result < ( ) , NonZero < usize > > ;
262268 fn nth ( & mut self , n : usize ) -> Option < Self :: Item > ;
263269 fn try_fold < Acc , Fold , R > ( & mut self , acc : Acc , fold : Fold ) -> R
264270 where
@@ -301,6 +307,22 @@ where
301307 and_then_or_clear ( & mut self . iter , Iterator :: next)
302308 }
303309
310+ #[ inline]
311+ default fn advance_by ( & mut self , n : usize ) -> Result < ( ) , NonZero < usize > > {
312+ let Some ( iter) = & mut self . iter else {
313+ return match NonZero :: new ( n) {
314+ Some ( n) => Err ( n) ,
315+ None => Ok ( ( ) ) ,
316+ } ;
317+ } ;
318+
319+ let res = iter. advance_by ( n) ;
320+ if res. is_err ( ) {
321+ self . iter = None ;
322+ }
323+ res
324+ }
325+
304326 #[ inline]
305327 default fn nth ( & mut self , n : usize ) -> Option < I :: Item > {
306328 and_then_or_clear ( & mut self . iter , |iter| iter. nth ( n) )
@@ -381,6 +403,17 @@ where
381403 self . iter . as_mut ( ) ?. next ( )
382404 }
383405
406+ #[ inline]
407+ fn advance_by ( & mut self , n : usize ) -> Result < ( ) , NonZero < usize > > {
408+ match & mut self . iter {
409+ Some ( iter) => iter. advance_by ( n) ,
410+ None => match NonZero :: new ( n) {
411+ Some ( n) => Err ( n) ,
412+ None => Ok ( ( ) ) ,
413+ } ,
414+ }
415+ }
416+
384417 #[ inline]
385418 fn nth ( & mut self , n : usize ) -> Option < I :: Item > {
386419 self . iter . as_mut ( ) ?. nth ( n)
0 commit comments