@@ -512,5 +512,169 @@ macro_rules! int_module {
512512 assert_eq_const_safe!( <$T>:: midpoint( 6 , <$T>:: MAX ) , <$T>:: MAX / 2 + 3 ) ;
513513 }
514514 }
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+ }
515679 } ;
516680}
0 commit comments