@@ -512,5 +512,170 @@ macro_rules! int_module {
512
512
assert_eq_const_safe!( <$T>:: midpoint( 6 , <$T>:: MAX ) , <$T>:: MAX / 2 + 3 ) ;
513
513
}
514
514
}
515
+
516
+ const SHIFT_AMOUNT_OVERFLOW : $T = <$T>:: BITS ;
517
+ const SHIFT_AMOUNT_OVERFLOW2 : $T = <$T>:: BITS + 3 ;
518
+ const SHIFT_AMOUNT_OVERFLOW3 : $T = <$T>:: BITS << 2 ;
519
+
520
+
521
+ const SHIFT_AMOUNT_TEST_ONE : $T = <$T>:: BITS >> 1 ;
522
+ const SHIFT_AMOUNT_TEST_TWO : $T = <$T>:: BITS >> 3 ;
523
+ const SHIFT_AMOUNT_TEST_THREE : $T = ( <$T>:: BITS >> 1 ) - 1 ;
524
+ const SHIFT_AMOUNT_TEST_FOUR : $T = <$T>:: BITS - 1 ;
525
+
526
+
527
+ test_runtime_and_compiletime! {
528
+ fn test_unbounded_shl( ) {
529
+ // <$T>::MIN
530
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_TEST_ONE ) , ( <$T>:: MIN << SHIFT_AMOUNT_TEST_ONE ) ) ;
531
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_TEST_TWO ) , ( <$T>:: MIN << SHIFT_AMOUNT_TEST_TWO ) ) ;
532
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_TEST_THREE ) , ( <$T>:: MIN << SHIFT_AMOUNT_TEST_THREE ) ) ;
533
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUN_TEST_FOUR ) , ( <$T>:: MIN << SHIFT_AMOUN_TEST_FOUR ) ) ;
534
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , 1 ) , ( <$T>:: MIN << 1 ) ) ;
535
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , 3 ) , ( <$T>:: MIN << 3 ) ) ;
536
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , 5 ) , ( <$T>:: MIN << 5 ) ) ;
537
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
538
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
539
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
540
+
541
+ // <$T>::MAX
542
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_TEST_ONE ) , ( <$T>:: MAX << SHIFT_AMOUNT_TEST_ONE ) ) ;
543
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_TEST_TWO ) , ( <$T>:: MAX << SHIFT_AMOUNT_TEST_TWO ) ) ;
544
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_TEST_THREE ) , ( <$T>:: MAX << SHIFT_AMOUNT_TEST_THREE ) ) ;
545
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_TEST_FOUR ) , ( <$T>:: MAX << SHIFT_AMOUNT_TEST_FOUR ) ) ;
546
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , 1 ) , ( <$T>:: MAX << 1 ) ) ;
547
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , 3 ) , ( <$T>:: MAX << 3 ) ) ;
548
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , 5 ) , ( <$T>:: MAX << 5 ) ) ;
549
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
550
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
551
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
552
+
553
+ // 1
554
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_TEST_ONE ) , ( 1 << SHIFT_AMOUNT_TEST_ONE ) ) ;
555
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_TEST_TWO ) , ( 1 << SHIFT_AMOUNT_TEST_TWO ) ) ;
556
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_TEST_THREE ) , ( 1 << SHIFT_AMOUNT_TEST_THREE ) ) ;
557
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_TEST_FOUR ) , ( 1 << SHIFT_AMOUNT_TEST_FOUR ) ) ;
558
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , 1 ) , ( 1 << 1 ) ) ;
559
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , 3 ) , ( 1 << 3 ) ) ;
560
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , 5 ) , ( 1 << 5 ) ) ;
561
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
562
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
563
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
564
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
565
+
566
+ // -1
567
+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , SHIFT_AMOUNT_TEST_ONE ) , ( -1 << SHIFT_AMOUNT_TEST_ONE ) ) ;
568
+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , SHIFT_AMOUNT_TEST_TWO ) , ( -1 << SHIFT_AMOUNT_TEST_TWO ) ) ;
569
+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , SHIFT_AMOUNT_TEST_THREE ) , ( -1 << SHIFT_AMOUNT_TEST_THREE ) ) ;
570
+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , SHIFT_AMOUNT_TEST_FOUR ) , ( -1 << SHIFT_AMOUNT_TEST_FOUR ) ) ;
571
+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , 1 ) , ( -1 << 1 ) ) ;
572
+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , 3 ) , ( -1 << 3 ) ) ;
573
+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , 5 ) , ( -1 << 5 ) ) ;
574
+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
575
+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
576
+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
577
+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
578
+
579
+ // 8
580
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_TEST_ONE ) , ( 8 << SHIFT_AMOUNT_TEST_ONE ) ) ;
581
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_TEST_TWO ) , ( 8 << SHIFT_AMOUNT_TEST_TWO ) ) ;
582
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_TEST_THREE ) , ( 8 << SHIFT_AMOUNT_TEST_THREE ) ) ;
583
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_TEST_FOUR ) , ( 8 << SHIFT_AMOUNT_TEST_FOUR ) ) ;
584
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , 1 ) , ( 8 << 1 ) ) ;
585
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , 3 ) , ( 8 << 3 ) ) ;
586
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , 5 ) , ( 8 << 5 ) ) ;
587
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
588
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
589
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
590
+
591
+ // 17
592
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_TEST_ONE ) , ( 17 << SHIFT_AMOUNT_TEST_ONE ) ) ;
593
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_TEST_TWO ) , ( 17 << SHIFT_AMOUNT_TEST_TWO ) ) ;
594
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_TEST_THREE ) , ( 17 << SHIFT_AMOUNT_TEST_THREE ) ) ;
595
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_TEST_FOUR ) , ( 17 << SHIFT_AMOUNT_TEST_FOUR ) ) ;
596
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , 1 ) , ( 17 << 1 ) ) ;
597
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , 3 ) , ( 17 << 3 ) ) ;
598
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , 5 ) , ( 17 << 5 ) ) ;
599
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
600
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
601
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
602
+ }
603
+
604
+ fn test_unbounded_shr( ) {
605
+ // <$T>::MIN
606
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_TEST_ONE ) , ( <$T>:: MIN >> SHIFT_AMOUNT_TEST_ONE ) ) ;
607
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_TEST_TWO ) , ( <$T>:: MIN >> SHIFT_AMOUNT_TEST_TWO ) ) ;
608
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_TEST_THREE ) , ( <$T>:: MIN >> SHIFT_AMOUNT_TEST_THREE ) ) ;
609
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUN_TEST_FOUR ) , ( <$T>:: MIN >> SHIFT_AMOUN_TEST_FOUR ) ) ;
610
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , 1 ) , ( <$T>:: MIN >> 1 ) ) ;
611
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , 3 ) , ( <$T>:: MIN >> 3 ) ) ;
612
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , 5 ) , ( <$T>:: MIN >> 5 ) ) ;
613
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_OVERFLOW ) , -1 ) ;
614
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_OVERFLOW2 ) , -1 ) ;
615
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_OVERFLOW3 ) , -1 ) ;
616
+
617
+ // <$T>::MAX
618
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_TEST_ONE ) , ( <$T>:: MAX >> SHIFT_AMOUNT_TEST_ONE ) ) ;
619
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_TEST_TWO ) , ( <$T>:: MAX >> SHIFT_AMOUNT_TEST_TWO ) ) ;
620
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_TEST_THREE ) , ( <$T>:: MAX >> SHIFT_AMOUNT_TEST_THREE ) ) ;
621
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_TEST_FOUR ) , ( <$T>:: MAX >> SHIFT_AMOUNT_TEST_FOUR ) ) ;
622
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , 1 ) , ( <$T>:: MAX >> 1 ) ) ;
623
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , 3 ) , ( <$T>:: MAX >> 3 ) ) ;
624
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , 5 ) , ( <$T>:: MAX >> 5 ) ) ;
625
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
626
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
627
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
628
+
629
+ // 1
630
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_TEST_ONE ) , ( 1 >> SHIFT_AMOUNT_TEST_ONE ) ) ;
631
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_TEST_TWO ) , ( 1 >> SHIFT_AMOUNT_TEST_TWO ) ) ;
632
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_TEST_THREE ) , ( 1 >> SHIFT_AMOUNT_TEST_THREE ) ) ;
633
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_TEST_FOUR ) , ( 1 >> SHIFT_AMOUNT_TEST_FOUR ) ) ;
634
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , 1 ) , ( 1 >> 1 ) ) ;
635
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , 3 ) , ( 1 >> 3 ) ) ;
636
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , 5 ) , ( 1 >> 5 ) ) ;
637
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
638
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
639
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
640
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
641
+
642
+ // -1
643
+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , SHIFT_AMOUNT_TEST_ONE ) , ( -1 >> SHIFT_AMOUNT_TEST_ONE ) ) ;
644
+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , SHIFT_AMOUNT_TEST_TWO ) , ( -1 >> SHIFT_AMOUNT_TEST_TWO ) ) ;
645
+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , SHIFT_AMOUNT_TEST_THREE ) , ( -1 >> SHIFT_AMOUNT_TEST_THREE ) ) ;
646
+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , SHIFT_AMOUNT_TEST_FOUR ) , ( -1 >> SHIFT_AMOUNT_TEST_FOUR ) ) ;
647
+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , 1 ) , ( -1 >> 1 ) ) ;
648
+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , 3 ) , ( -1 >> 3 ) ) ;
649
+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , 5 ) , ( -1 >> 5 ) ) ;
650
+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , SHIFT_AMOUNT_OVERFLOW ) , -1 ) ;
651
+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , SHIFT_AMOUNT_OVERFLOW ) , -1 ) ;
652
+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , SHIFT_AMOUNT_OVERFLOW2 ) , -1 ) ;
653
+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , SHIFT_AMOUNT_OVERFLOW3 ) , -1 ) ;
654
+
655
+ // 8
656
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_TEST_ONE ) , ( 8 >> SHIFT_AMOUNT_TEST_ONE ) ) ;
657
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_TEST_TWO ) , ( 8 >> SHIFT_AMOUNT_TEST_TWO ) ) ;
658
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_TEST_THREE ) , ( 8 >> SHIFT_AMOUNT_TEST_THREE ) ) ;
659
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_TEST_FOUR ) , ( 8 >> SHIFT_AMOUNT_TEST_FOUR ) ) ;
660
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , 1 ) , ( 8 >> 1 ) ) ;
661
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , 3 ) , ( 8 >> 3 ) ) ;
662
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , 5 ) , ( 8 >> 5 ) ) ;
663
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
664
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
665
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
666
+
667
+ // 17
668
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_TEST_ONE ) , ( 17 >> SHIFT_AMOUNT_TEST_ONE ) ) ;
669
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_TEST_TWO ) , ( 17 >> SHIFT_AMOUNT_TEST_TWO ) ) ;
670
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_TEST_THREE ) , ( 17 >> SHIFT_AMOUNT_TEST_THREE ) ) ;
671
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_TEST_FOUR ) , ( 17 >> SHIFT_AMOUNT_TEST_FOUR ) ) ;
672
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , 1 ) , ( 17 >> 1 ) ) ;
673
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , 3 ) , ( 17 >> 3 ) ) ;
674
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , 5 ) , ( 17 >> 5 ) ) ;
675
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
676
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
677
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
678
+ }
679
+ }
515
680
} ;
516
681
}
0 commit comments