@@ -478,5 +478,170 @@ macro_rules! int_module {
478478 assert_eq_const_safe!( <$T>:: midpoint( 6 , <$T>:: MAX ) , <$T>:: MAX / 2 + 3 ) ;
479479 }
480480 }
481+
482+ const SHIFT_AMOUNT_OVERFLOW : $T = <$T>:: BITS ;
483+ const SHIFT_AMOUNT_OVERFLOW2 : $T = <$T>:: BITS + 3 ;
484+ const SHIFT_AMOUNT_OVERFLOW3 : $T = <$T>:: BITS << 2 ;
485+
486+
487+ const SHIFT_AMOUNT_TEST_ONE : $T = <$T>:: BITS >> 1 ;
488+ const SHIFT_AMOUNT_TEST_TWO : $T = <$T>:: BITS >> 3 ;
489+ const SHIFT_AMOUNT_TEST_THREE : $T = ( <$T>:: BITS >> 1 ) - 1 ;
490+ const SHIFT_AMOUNT_TEST_FOUR : $T = <$T>:: BITS - 1 ;
491+
492+
493+ test_runtime_and_compiletime! {
494+ fn test_unbounded_shl( ) {
495+ // <$T>::MIN
496+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_TEST_ONE ) , ( <$T>:: MIN << SHIFT_AMOUNT_TEST_ONE ) ) ;
497+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_TEST_TWO ) , ( <$T>:: MIN << SHIFT_AMOUNT_TEST_TWO ) ) ;
498+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_TEST_THREE ) , ( <$T>:: MIN << SHIFT_AMOUNT_TEST_THREE ) ) ;
499+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUN_TEST_FOUR ) , ( <$T>:: MIN << SHIFT_AMOUN_TEST_FOUR ) ) ;
500+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , 1 ) , ( <$T>:: MIN << 1 ) ) ;
501+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , 3 ) , ( <$T>:: MIN << 3 ) ) ;
502+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , 5 ) , ( <$T>:: MIN << 5 ) ) ;
503+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
504+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
505+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
506+
507+ // <$T>::MAX
508+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_TEST_ONE ) , ( <$T>:: MAX << SHIFT_AMOUNT_TEST_ONE ) ) ;
509+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_TEST_TWO ) , ( <$T>:: MAX << SHIFT_AMOUNT_TEST_TWO ) ) ;
510+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_TEST_THREE ) , ( <$T>:: MAX << SHIFT_AMOUNT_TEST_THREE ) ) ;
511+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_TEST_FOUR ) , ( <$T>:: MAX << SHIFT_AMOUNT_TEST_FOUR ) ) ;
512+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , 1 ) , ( <$T>:: MAX << 1 ) ) ;
513+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , 3 ) , ( <$T>:: MAX << 3 ) ) ;
514+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , 5 ) , ( <$T>:: MAX << 5 ) ) ;
515+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
516+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
517+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
518+
519+ // 1
520+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_TEST_ONE ) , ( 1 << SHIFT_AMOUNT_TEST_ONE ) ) ;
521+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_TEST_TWO ) , ( 1 << SHIFT_AMOUNT_TEST_TWO ) ) ;
522+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_TEST_THREE ) , ( 1 << SHIFT_AMOUNT_TEST_THREE ) ) ;
523+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_TEST_FOUR ) , ( 1 << SHIFT_AMOUNT_TEST_FOUR ) ) ;
524+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , 1 ) , ( 1 << 1 ) ) ;
525+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , 3 ) , ( 1 << 3 ) ) ;
526+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , 5 ) , ( 1 << 5 ) ) ;
527+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
528+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
529+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
530+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
531+
532+ // -1
533+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , SHIFT_AMOUNT_TEST_ONE ) , ( -1 << SHIFT_AMOUNT_TEST_ONE ) ) ;
534+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , SHIFT_AMOUNT_TEST_TWO ) , ( -1 << SHIFT_AMOUNT_TEST_TWO ) ) ;
535+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , SHIFT_AMOUNT_TEST_THREE ) , ( -1 << SHIFT_AMOUNT_TEST_THREE ) ) ;
536+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , SHIFT_AMOUNT_TEST_FOUR ) , ( -1 << SHIFT_AMOUNT_TEST_FOUR ) ) ;
537+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , 1 ) , ( -1 << 1 ) ) ;
538+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , 3 ) , ( -1 << 3 ) ) ;
539+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , 5 ) , ( -1 << 5 ) ) ;
540+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
541+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
542+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
543+ assert_eq_const_safe!( <$T>:: unbounded_shl( -1 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
544+
545+ // 8
546+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_TEST_ONE ) , ( 8 << SHIFT_AMOUNT_TEST_ONE ) ) ;
547+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_TEST_TWO ) , ( 8 << SHIFT_AMOUNT_TEST_TWO ) ) ;
548+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_TEST_THREE ) , ( 8 << SHIFT_AMOUNT_TEST_THREE ) ) ;
549+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_TEST_FOUR ) , ( 8 << SHIFT_AMOUNT_TEST_FOUR ) ) ;
550+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , 1 ) , ( 8 << 1 ) ) ;
551+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , 3 ) , ( 8 << 3 ) ) ;
552+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , 5 ) , ( 8 << 5 ) ) ;
553+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
554+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
555+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
556+
557+ // 17
558+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_TEST_ONE ) , ( 17 << SHIFT_AMOUNT_TEST_ONE ) ) ;
559+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_TEST_TWO ) , ( 17 << SHIFT_AMOUNT_TEST_TWO ) ) ;
560+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_TEST_THREE ) , ( 17 << SHIFT_AMOUNT_TEST_THREE ) ) ;
561+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_TEST_FOUR ) , ( 17 << SHIFT_AMOUNT_TEST_FOUR ) ) ;
562+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , 1 ) , ( 17 << 1 ) ) ;
563+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , 3 ) , ( 17 << 3 ) ) ;
564+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , 5 ) , ( 17 << 5 ) ) ;
565+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
566+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
567+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
568+ }
569+
570+ fn test_unbounded_shr( ) {
571+ // <$T>::MIN
572+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_TEST_ONE ) , ( <$T>:: MIN >> SHIFT_AMOUNT_TEST_ONE ) ) ;
573+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_TEST_TWO ) , ( <$T>:: MIN >> SHIFT_AMOUNT_TEST_TWO ) ) ;
574+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_TEST_THREE ) , ( <$T>:: MIN >> SHIFT_AMOUNT_TEST_THREE ) ) ;
575+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUN_TEST_FOUR ) , ( <$T>:: MIN >> SHIFT_AMOUN_TEST_FOUR ) ) ;
576+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , 1 ) , ( <$T>:: MIN >> 1 ) ) ;
577+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , 3 ) , ( <$T>:: MIN >> 3 ) ) ;
578+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , 5 ) , ( <$T>:: MIN >> 5 ) ) ;
579+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_OVERFLOW ) , -1 ) ;
580+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_OVERFLOW2 ) , -1 ) ;
581+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_OVERFLOW3 ) , -1 ) ;
582+
583+ // <$T>::MAX
584+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_TEST_ONE ) , ( <$T>:: MAX >> SHIFT_AMOUNT_TEST_ONE ) ) ;
585+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_TEST_TWO ) , ( <$T>:: MAX >> SHIFT_AMOUNT_TEST_TWO ) ) ;
586+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_TEST_THREE ) , ( <$T>:: MAX >> SHIFT_AMOUNT_TEST_THREE ) ) ;
587+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_TEST_FOUR ) , ( <$T>:: MAX >> SHIFT_AMOUNT_TEST_FOUR ) ) ;
588+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , 1 ) , ( <$T>:: MAX >> 1 ) ) ;
589+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , 3 ) , ( <$T>:: MAX >> 3 ) ) ;
590+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , 5 ) , ( <$T>:: MAX >> 5 ) ) ;
591+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
592+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
593+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
594+
595+ // 1
596+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_TEST_ONE ) , ( 1 >> SHIFT_AMOUNT_TEST_ONE ) ) ;
597+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_TEST_TWO ) , ( 1 >> SHIFT_AMOUNT_TEST_TWO ) ) ;
598+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_TEST_THREE ) , ( 1 >> SHIFT_AMOUNT_TEST_THREE ) ) ;
599+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_TEST_FOUR ) , ( 1 >> SHIFT_AMOUNT_TEST_FOUR ) ) ;
600+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , 1 ) , ( 1 >> 1 ) ) ;
601+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , 3 ) , ( 1 >> 3 ) ) ;
602+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , 5 ) , ( 1 >> 5 ) ) ;
603+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
604+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
605+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
606+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
607+
608+ // -1
609+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , SHIFT_AMOUNT_TEST_ONE ) , ( -1 >> SHIFT_AMOUNT_TEST_ONE ) ) ;
610+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , SHIFT_AMOUNT_TEST_TWO ) , ( -1 >> SHIFT_AMOUNT_TEST_TWO ) ) ;
611+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , SHIFT_AMOUNT_TEST_THREE ) , ( -1 >> SHIFT_AMOUNT_TEST_THREE ) ) ;
612+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , SHIFT_AMOUNT_TEST_FOUR ) , ( -1 >> SHIFT_AMOUNT_TEST_FOUR ) ) ;
613+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , 1 ) , ( -1 >> 1 ) ) ;
614+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , 3 ) , ( -1 >> 3 ) ) ;
615+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , 5 ) , ( -1 >> 5 ) ) ;
616+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , SHIFT_AMOUNT_OVERFLOW ) , -1 ) ;
617+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , SHIFT_AMOUNT_OVERFLOW ) , -1 ) ;
618+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , SHIFT_AMOUNT_OVERFLOW2 ) , -1 ) ;
619+ assert_eq_const_safe!( <$T>:: unbounded_shr( -1 , SHIFT_AMOUNT_OVERFLOW3 ) , -1 ) ;
620+
621+ // 8
622+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_TEST_ONE ) , ( 8 >> SHIFT_AMOUNT_TEST_ONE ) ) ;
623+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_TEST_TWO ) , ( 8 >> SHIFT_AMOUNT_TEST_TWO ) ) ;
624+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_TEST_THREE ) , ( 8 >> SHIFT_AMOUNT_TEST_THREE ) ) ;
625+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_TEST_FOUR ) , ( 8 >> SHIFT_AMOUNT_TEST_FOUR ) ) ;
626+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , 1 ) , ( 8 >> 1 ) ) ;
627+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , 3 ) , ( 8 >> 3 ) ) ;
628+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , 5 ) , ( 8 >> 5 ) ) ;
629+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
630+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
631+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
632+
633+ // 17
634+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_TEST_ONE ) , ( 17 >> SHIFT_AMOUNT_TEST_ONE ) ) ;
635+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_TEST_TWO ) , ( 17 >> SHIFT_AMOUNT_TEST_TWO ) ) ;
636+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_TEST_THREE ) , ( 17 >> SHIFT_AMOUNT_TEST_THREE ) ) ;
637+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_TEST_FOUR ) , ( 17 >> SHIFT_AMOUNT_TEST_FOUR ) ) ;
638+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , 1 ) , ( 17 >> 1 ) ) ;
639+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , 3 ) , ( 17 >> 3 ) ) ;
640+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , 5 ) , ( 17 >> 5 ) ) ;
641+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
642+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
643+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
644+ }
645+ }
481646 } ;
482647}
0 commit comments