@@ -64,6 +64,14 @@ pub trait SliceIter<'slice, T>: ExactSizeIterator + AsRef<[T]> + Sealed {
6464 /// Iterator must contain at least `count` more items.
6565 unsafe fn advance_unchecked ( & mut self , count : usize ) ;
6666
67+ /// Advance iterator to end.
68+ #[ inline( always) ]
69+ fn advance_to_end ( & mut self ) {
70+ // This function boils down to just setting the current pointer to the end - 2 instructions.
71+ // https://godbolt.org/z/EceneefEe
72+ self . advance ( self . len ( ) ) ;
73+ }
74+
6775 /// Get pointer to next item in the iterator.
6876 ///
6977 /// Pointer is only valid to read an item from if iterator is not empty.
@@ -355,6 +363,39 @@ mod test_iter {
355363 }
356364 }
357365
366+ #[ test]
367+ fn advance_to_end ( ) {
368+ let arr = [ 11 , 22 , 33 ] ;
369+
370+ let mut iter = arr. iter ( ) ;
371+ iter. advance_to_end ( ) ;
372+ assert_eq ! ( iter. next( ) , None ) ;
373+
374+ let mut iter = arr. iter ( ) ;
375+ assert_eq ! ( iter. next( ) , Some ( & 11 ) ) ;
376+ iter. advance_to_end ( ) ;
377+ assert_eq ! ( iter. next( ) , None ) ;
378+
379+ let mut iter = arr. iter ( ) ;
380+ assert_eq ! ( iter. next( ) , Some ( & 11 ) ) ;
381+ assert_eq ! ( iter. next( ) , Some ( & 22 ) ) ;
382+ iter. advance_to_end ( ) ;
383+ assert_eq ! ( iter. next( ) , None ) ;
384+
385+ let mut iter = arr. iter ( ) ;
386+ assert_eq ! ( iter. next( ) , Some ( & 11 ) ) ;
387+ assert_eq ! ( iter. next( ) , Some ( & 22 ) ) ;
388+ assert_eq ! ( iter. next( ) , Some ( & 33 ) ) ;
389+ assert_eq ! ( iter. next( ) , None ) ;
390+ iter. advance_to_end ( ) ;
391+ assert_eq ! ( iter. next( ) , None ) ;
392+
393+ let empty_arr: [ u32 ; 0 ] = [ ] ;
394+ let mut iter = empty_arr. iter ( ) ;
395+ iter. advance_to_end ( ) ;
396+ assert_eq ! ( iter. next( ) , None ) ;
397+ }
398+
358399 #[ test]
359400 fn ptr ( ) {
360401 let slice = [ 11u32 , 22 , 33 ] ;
@@ -513,6 +554,39 @@ mod test_iter_mut {
513554 }
514555 }
515556
557+ #[ test]
558+ fn advance_to_end ( ) {
559+ let mut arr = [ 11 , 22 , 33 ] ;
560+
561+ let mut iter = arr. iter_mut ( ) ;
562+ iter. advance_to_end ( ) ;
563+ assert_eq ! ( iter. next( ) , None ) ;
564+
565+ let mut iter = arr. iter_mut ( ) ;
566+ assert_eq ! ( iter. next( ) , Some ( & mut 11 ) ) ;
567+ iter. advance_to_end ( ) ;
568+ assert_eq ! ( iter. next( ) , None ) ;
569+
570+ let mut iter = arr. iter_mut ( ) ;
571+ assert_eq ! ( iter. next( ) , Some ( & mut 11 ) ) ;
572+ assert_eq ! ( iter. next( ) , Some ( & mut 22 ) ) ;
573+ iter. advance_to_end ( ) ;
574+ assert_eq ! ( iter. next( ) , None ) ;
575+
576+ let mut iter = arr. iter_mut ( ) ;
577+ assert_eq ! ( iter. next( ) , Some ( & mut 11 ) ) ;
578+ assert_eq ! ( iter. next( ) , Some ( & mut 22 ) ) ;
579+ assert_eq ! ( iter. next( ) , Some ( & mut 33 ) ) ;
580+ assert_eq ! ( iter. next( ) , None ) ;
581+ iter. advance_to_end ( ) ;
582+ assert_eq ! ( iter. next( ) , None ) ;
583+
584+ let mut empty_arr: [ u32 ; 0 ] = [ ] ;
585+ let mut iter = empty_arr. iter_mut ( ) ;
586+ iter. advance_to_end ( ) ;
587+ assert_eq ! ( iter. next( ) , None ) ;
588+ }
589+
516590 #[ test]
517591 fn ptr ( ) {
518592 let mut slice = [ 11u32 , 22 , 33 ] ;
0 commit comments