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