@@ -474,3 +474,109 @@ fn array_split_array_mut_out_of_bounds() {
474
474
475
475
v. split_array_mut :: < 7 > ( ) ;
476
476
}
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