@@ -351,5 +351,169 @@ macro_rules! uint_module {
351
351
assert_eq_const_safe!( <$T>:: midpoint( 6 , <$T>:: MAX ) , ( <$T>:: MAX - <$T>:: MIN ) / 2 + 3 ) ;
352
352
}
353
353
}
354
+
355
+ // test_unbounded_sh* constants
356
+ const SHIFT_AMOUNT_OVERFLOW : u32 = <$T>:: BITS ;
357
+ const SHIFT_AMOUNT_OVERFLOW2 : u32 = <$T>:: BITS + 3 ;
358
+ const SHIFT_AMOUNT_OVERFLOW3 : u32 = <$T>:: BITS << 2 ;
359
+
360
+ const SHIFT_AMOUNT_TEST_ONE : u32 = <$T>:: BITS >> 1 ;
361
+ const SHIFT_AMOUNT_TEST_TWO : u32 = <$T>:: BITS >> 3 ;
362
+ const SHIFT_AMOUNT_TEST_THREE : u32 = ( <$T>:: BITS >> 1 ) - 1 ;
363
+ const SHIFT_AMOUNT_TEST_FOUR : u32 = <$T>:: BITS - 1 ;
364
+
365
+ test_runtime_and_compiletime! {
366
+ fn test_unbounded_shl( ) {
367
+ // <$T>::MIN
368
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_TEST_ONE ) , ( <$T>:: MIN << SHIFT_AMOUNT_TEST_ONE ) ) ;
369
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_TEST_TWO ) , ( <$T>:: MIN << SHIFT_AMOUNT_TEST_TWO ) ) ;
370
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_TEST_THREE ) , ( <$T>:: MIN << SHIFT_AMOUNT_TEST_THREE ) ) ;
371
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_TEST_FOUR ) , ( <$T>:: MIN << SHIFT_AMOUNT_TEST_FOUR ) ) ;
372
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , 1 ) , ( <$T>:: MIN << 1 ) ) ;
373
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , 3 ) , ( <$T>:: MIN << 3 ) ) ;
374
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , 5 ) , ( <$T>:: MIN << 5 ) ) ;
375
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
376
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
377
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MIN , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
378
+
379
+ // <$T>::MAX
380
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_TEST_ONE ) , ( <$T>:: MAX << SHIFT_AMOUNT_TEST_ONE ) ) ;
381
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_TEST_TWO ) , ( <$T>:: MAX << SHIFT_AMOUNT_TEST_TWO ) ) ;
382
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_TEST_THREE ) , ( <$T>:: MAX << SHIFT_AMOUNT_TEST_THREE ) ) ;
383
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_TEST_FOUR ) , ( <$T>:: MAX << SHIFT_AMOUNT_TEST_FOUR ) ) ;
384
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , 1 ) , ( <$T>:: MAX << 1 ) ) ;
385
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , 3 ) , ( <$T>:: MAX << 3 ) ) ;
386
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , 5 ) , ( <$T>:: MAX << 5 ) ) ;
387
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
388
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
389
+ assert_eq_const_safe!( <$T>:: unbounded_shl( <$T>:: MAX , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
390
+
391
+ // 1
392
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_TEST_ONE ) , ( 1 << SHIFT_AMOUNT_TEST_ONE ) ) ;
393
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_TEST_TWO ) , ( 1 << SHIFT_AMOUNT_TEST_TWO ) ) ;
394
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_TEST_THREE ) , ( 1 << SHIFT_AMOUNT_TEST_THREE ) ) ;
395
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_TEST_FOUR ) , ( 1 << SHIFT_AMOUNT_TEST_FOUR ) ) ;
396
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , 1 ) , ( 1 << 1 ) ) ;
397
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , 3 ) , ( 1 << 3 ) ) ;
398
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , 5 ) , ( 1 << 5 ) ) ;
399
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
400
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
401
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
402
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 1 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
403
+
404
+ // !0
405
+ assert_eq_const_safe!( <$T>:: unbounded_shl( !0 , SHIFT_AMOUNT_TEST_ONE ) , ( !0 << SHIFT_AMOUNT_TEST_ONE ) ) ;
406
+ assert_eq_const_safe!( <$T>:: unbounded_shl( !0 , SHIFT_AMOUNT_TEST_TWO ) , ( !0 << SHIFT_AMOUNT_TEST_TWO ) ) ;
407
+ assert_eq_const_safe!( <$T>:: unbounded_shl( !0 , SHIFT_AMOUNT_TEST_THREE ) , ( !0 << SHIFT_AMOUNT_TEST_THREE ) ) ;
408
+ assert_eq_const_safe!( <$T>:: unbounded_shl( !0 , SHIFT_AMOUNT_TEST_FOUR ) , ( !0 << SHIFT_AMOUNT_TEST_FOUR ) ) ;
409
+ assert_eq_const_safe!( <$T>:: unbounded_shl( !0 , 1 ) , ( !0 << 1 ) ) ;
410
+ assert_eq_const_safe!( <$T>:: unbounded_shl( !0 , 3 ) , ( !0 << 3 ) ) ;
411
+ assert_eq_const_safe!( <$T>:: unbounded_shl( !0 , 5 ) , ( !0 << 5 ) ) ;
412
+ assert_eq_const_safe!( <$T>:: unbounded_shl( !0 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
413
+ assert_eq_const_safe!( <$T>:: unbounded_shl( !0 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
414
+ assert_eq_const_safe!( <$T>:: unbounded_shl( !0 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
415
+ assert_eq_const_safe!( <$T>:: unbounded_shl( !0 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
416
+
417
+ // 8
418
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_TEST_ONE ) , ( 8 << SHIFT_AMOUNT_TEST_ONE ) ) ;
419
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_TEST_TWO ) , ( 8 << SHIFT_AMOUNT_TEST_TWO ) ) ;
420
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_TEST_THREE ) , ( 8 << SHIFT_AMOUNT_TEST_THREE ) ) ;
421
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_TEST_FOUR ) , ( 8 << SHIFT_AMOUNT_TEST_FOUR ) ) ;
422
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , 1 ) , ( 8 << 1 ) ) ;
423
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , 3 ) , ( 8 << 3 ) ) ;
424
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , 5 ) , ( 8 << 5 ) ) ;
425
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
426
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
427
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 8 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
428
+
429
+ // 17
430
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_TEST_ONE ) , ( 17 << SHIFT_AMOUNT_TEST_ONE ) ) ;
431
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_TEST_TWO ) , ( 17 << SHIFT_AMOUNT_TEST_TWO ) ) ;
432
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_TEST_THREE ) , ( 17 << SHIFT_AMOUNT_TEST_THREE ) ) ;
433
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_TEST_FOUR ) , ( 17 << SHIFT_AMOUNT_TEST_FOUR ) ) ;
434
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , 1 ) , ( 17 << 1 ) ) ;
435
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , 3 ) , ( 17 << 3 ) ) ;
436
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , 5 ) , ( 17 << 5 ) ) ;
437
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
438
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
439
+ assert_eq_const_safe!( <$T>:: unbounded_shl( 17 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
440
+ }
441
+
442
+ fn test_unbounded_shr( ) {
443
+ // <$T>::MIN
444
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_TEST_ONE ) , ( <$T>:: MIN >> SHIFT_AMOUNT_TEST_ONE ) ) ;
445
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_TEST_TWO ) , ( <$T>:: MIN >> SHIFT_AMOUNT_TEST_TWO ) ) ;
446
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_TEST_THREE ) , ( <$T>:: MIN >> SHIFT_AMOUNT_TEST_THREE ) ) ;
447
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_TEST_FOUR ) , ( <$T>:: MIN >> SHIFT_AMOUNT_TEST_FOUR ) ) ;
448
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , 1 ) , ( <$T>:: MIN >> 1 ) ) ;
449
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , 3 ) , ( <$T>:: MIN >> 3 ) ) ;
450
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , 5 ) , ( <$T>:: MIN >> 5 ) ) ;
451
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
452
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
453
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MIN , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
454
+
455
+ // <$T>::MAX
456
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_TEST_ONE ) , ( <$T>:: MAX >> SHIFT_AMOUNT_TEST_ONE ) ) ;
457
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_TEST_TWO ) , ( <$T>:: MAX >> SHIFT_AMOUNT_TEST_TWO ) ) ;
458
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_TEST_THREE ) , ( <$T>:: MAX >> SHIFT_AMOUNT_TEST_THREE ) ) ;
459
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_TEST_FOUR ) , ( <$T>:: MAX >> SHIFT_AMOUNT_TEST_FOUR ) ) ;
460
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , 1 ) , ( <$T>:: MAX >> 1 ) ) ;
461
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , 3 ) , ( <$T>:: MAX >> 3 ) ) ;
462
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , 5 ) , ( <$T>:: MAX >> 5 ) ) ;
463
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
464
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
465
+ assert_eq_const_safe!( <$T>:: unbounded_shr( <$T>:: MAX , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
466
+
467
+ // 1
468
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_TEST_ONE ) , ( 1 >> SHIFT_AMOUNT_TEST_ONE ) ) ;
469
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_TEST_TWO ) , ( 1 >> SHIFT_AMOUNT_TEST_TWO ) ) ;
470
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_TEST_THREE ) , ( 1 >> SHIFT_AMOUNT_TEST_THREE ) ) ;
471
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_TEST_FOUR ) , ( 1 >> SHIFT_AMOUNT_TEST_FOUR ) ) ;
472
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , 1 ) , ( 1 >> 1 ) ) ;
473
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , 3 ) , ( 1 >> 3 ) ) ;
474
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , 5 ) , ( 1 >> 5 ) ) ;
475
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
476
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
477
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
478
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 1 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
479
+
480
+ // !0
481
+ assert_eq_const_safe!( <$T>:: unbounded_shr( !0 , SHIFT_AMOUNT_TEST_ONE ) , ( !0 >> SHIFT_AMOUNT_TEST_ONE ) ) ;
482
+ assert_eq_const_safe!( <$T>:: unbounded_shr( !0 , SHIFT_AMOUNT_TEST_TWO ) , ( !0 >> SHIFT_AMOUNT_TEST_TWO ) ) ;
483
+ assert_eq_const_safe!( <$T>:: unbounded_shr( !0 , SHIFT_AMOUNT_TEST_THREE ) , ( !0 >> SHIFT_AMOUNT_TEST_THREE ) ) ;
484
+ assert_eq_const_safe!( <$T>:: unbounded_shr( !0 , SHIFT_AMOUNT_TEST_FOUR ) , ( !0 >> SHIFT_AMOUNT_TEST_FOUR ) ) ;
485
+ assert_eq_const_safe!( <$T>:: unbounded_shr( !0 , 1 ) , ( !0 >> 1 ) ) ;
486
+ assert_eq_const_safe!( <$T>:: unbounded_shr( !0 , 3 ) , ( !0 >> 3 ) ) ;
487
+ assert_eq_const_safe!( <$T>:: unbounded_shr( !0 , 5 ) , ( !0 >> 5 ) ) ;
488
+ assert_eq_const_safe!( <$T>:: unbounded_shr( !0 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
489
+ assert_eq_const_safe!( <$T>:: unbounded_shr( !0 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
490
+ assert_eq_const_safe!( <$T>:: unbounded_shr( !0 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
491
+ assert_eq_const_safe!( <$T>:: unbounded_shr( !0 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
492
+
493
+ // 8
494
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_TEST_ONE ) , ( 8 >> SHIFT_AMOUNT_TEST_ONE ) ) ;
495
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_TEST_TWO ) , ( 8 >> SHIFT_AMOUNT_TEST_TWO ) ) ;
496
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_TEST_THREE ) , ( 8 >> SHIFT_AMOUNT_TEST_THREE ) ) ;
497
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_TEST_FOUR ) , ( 8 >> SHIFT_AMOUNT_TEST_FOUR ) ) ;
498
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , 1 ) , ( 8 >> 1 ) ) ;
499
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , 3 ) , ( 8 >> 3 ) ) ;
500
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , 5 ) , ( 8 >> 5 ) ) ;
501
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
502
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
503
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 8 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
504
+
505
+ // 17
506
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_TEST_ONE ) , ( 17 >> SHIFT_AMOUNT_TEST_ONE ) ) ;
507
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_TEST_TWO ) , ( 17 >> SHIFT_AMOUNT_TEST_TWO ) ) ;
508
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_TEST_THREE ) , ( 17 >> SHIFT_AMOUNT_TEST_THREE ) ) ;
509
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_TEST_FOUR ) , ( 17 >> SHIFT_AMOUNT_TEST_FOUR ) ) ;
510
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , 1 ) , ( 17 >> 1 ) ) ;
511
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , 3 ) , ( 17 >> 3 ) ) ;
512
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , 5 ) , ( 17 >> 5 ) ) ;
513
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_OVERFLOW ) , 0 ) ;
514
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_OVERFLOW2 ) , 0 ) ;
515
+ assert_eq_const_safe!( <$T>:: unbounded_shr( 17 , SHIFT_AMOUNT_OVERFLOW3 ) , 0 ) ;
516
+ }
517
+ }
354
518
} ;
355
519
}
0 commit comments