@@ -474,3 +474,109 @@ fn array_split_array_mut_out_of_bounds() {
474474
475475 v. split_array_mut :: < 7 > ( ) ;
476476}
477+
478+ #[ test]
479+ fn array_intoiter_advance_by ( ) {
480+ use std:: cell:: Cell ;
481+ struct DropCounter < ' a > ( usize , & ' a Cell < usize > ) ;
482+ impl Drop for DropCounter < ' _ > {
483+ fn drop ( & mut self ) {
484+ let x = self . 1 . get ( ) ;
485+ self . 1 . set ( x + 1 ) ;
486+ }
487+ }
488+
489+ let counter = Cell :: new ( 0 ) ;
490+ let a: [ _ ; 100 ] = std:: array:: from_fn ( |i| DropCounter ( i, & counter) ) ;
491+ let mut it = IntoIterator :: into_iter ( a) ;
492+
493+ let r = it. advance_by ( 1 ) ;
494+ assert_eq ! ( r, Ok ( ( ) ) ) ;
495+ assert_eq ! ( it. len( ) , 99 ) ;
496+ assert_eq ! ( counter. get( ) , 1 ) ;
497+
498+ let r = it. advance_by ( 0 ) ;
499+ assert_eq ! ( r, Ok ( ( ) ) ) ;
500+ assert_eq ! ( it. len( ) , 99 ) ;
501+ assert_eq ! ( counter. get( ) , 1 ) ;
502+
503+ let r = it. advance_by ( 11 ) ;
504+ assert_eq ! ( r, Ok ( ( ) ) ) ;
505+ assert_eq ! ( it. len( ) , 88 ) ;
506+ assert_eq ! ( counter. get( ) , 12 ) ;
507+
508+ let x = it. next ( ) ;
509+ assert_eq ! ( x. as_ref( ) . map( |x| x. 0 ) , Some ( 12 ) ) ;
510+ assert_eq ! ( it. len( ) , 87 ) ;
511+ assert_eq ! ( counter. get( ) , 12 ) ;
512+ drop ( x) ;
513+ assert_eq ! ( counter. get( ) , 13 ) ;
514+
515+ let r = it. advance_by ( 123456 ) ;
516+ assert_eq ! ( r, Err ( 87 ) ) ;
517+ assert_eq ! ( it. len( ) , 0 ) ;
518+ assert_eq ! ( counter. get( ) , 100 ) ;
519+
520+ let r = it. advance_by ( 0 ) ;
521+ assert_eq ! ( r, Ok ( ( ) ) ) ;
522+ assert_eq ! ( it. len( ) , 0 ) ;
523+ assert_eq ! ( counter. get( ) , 100 ) ;
524+
525+ let r = it. advance_by ( 10 ) ;
526+ assert_eq ! ( r, Err ( 0 ) ) ;
527+ assert_eq ! ( it. len( ) , 0 ) ;
528+ assert_eq ! ( counter. get( ) , 100 ) ;
529+ }
530+
531+ #[ test]
532+ fn array_intoiter_advance_back_by ( ) {
533+ use std:: cell:: Cell ;
534+ struct DropCounter < ' a > ( usize , & ' a Cell < usize > ) ;
535+ impl Drop for DropCounter < ' _ > {
536+ fn drop ( & mut self ) {
537+ let x = self . 1 . get ( ) ;
538+ self . 1 . set ( x + 1 ) ;
539+ }
540+ }
541+
542+ let counter = Cell :: new ( 0 ) ;
543+ let a: [ _ ; 100 ] = std:: array:: from_fn ( |i| DropCounter ( i, & counter) ) ;
544+ let mut it = IntoIterator :: into_iter ( a) ;
545+
546+ let r = it. advance_back_by ( 1 ) ;
547+ assert_eq ! ( r, Ok ( ( ) ) ) ;
548+ assert_eq ! ( it. len( ) , 99 ) ;
549+ assert_eq ! ( counter. get( ) , 1 ) ;
550+
551+ let r = it. advance_back_by ( 0 ) ;
552+ assert_eq ! ( r, Ok ( ( ) ) ) ;
553+ assert_eq ! ( it. len( ) , 99 ) ;
554+ assert_eq ! ( counter. get( ) , 1 ) ;
555+
556+ let r = it. advance_back_by ( 11 ) ;
557+ assert_eq ! ( r, Ok ( ( ) ) ) ;
558+ assert_eq ! ( it. len( ) , 88 ) ;
559+ assert_eq ! ( counter. get( ) , 12 ) ;
560+
561+ let x = it. next_back ( ) ;
562+ assert_eq ! ( x. as_ref( ) . map( |x| x. 0 ) , Some ( 87 ) ) ;
563+ assert_eq ! ( it. len( ) , 87 ) ;
564+ assert_eq ! ( counter. get( ) , 12 ) ;
565+ drop ( x) ;
566+ assert_eq ! ( counter. get( ) , 13 ) ;
567+
568+ let r = it. advance_back_by ( 123456 ) ;
569+ assert_eq ! ( r, Err ( 87 ) ) ;
570+ assert_eq ! ( it. len( ) , 0 ) ;
571+ assert_eq ! ( counter. get( ) , 100 ) ;
572+
573+ let r = it. advance_back_by ( 0 ) ;
574+ assert_eq ! ( r, Ok ( ( ) ) ) ;
575+ assert_eq ! ( it. len( ) , 0 ) ;
576+ assert_eq ! ( counter. get( ) , 100 ) ;
577+
578+ let r = it. advance_back_by ( 10 ) ;
579+ assert_eq ! ( r, Err ( 0 ) ) ;
580+ assert_eq ! ( it. len( ) , 0 ) ;
581+ assert_eq ! ( counter. get( ) , 100 ) ;
582+ }
0 commit comments