@@ -422,25 +422,50 @@ void test()
422
422
VERIFY_IS_FALSE (someInvalid == 1 );
423
423
VERIFY_IS_FALSE (1 == someInvalid);
424
424
425
- /* Check that construction of CheckedInt from an integer value of a mismatched type is checked */
425
+ // Check simple casting between different signedness and sizes.
426
+ {
427
+ CheckedInt<uint8_t > foo = CheckedInt<uint16_t >(2 ).toChecked <uint8_t >();
428
+ VERIFY_IS_VALID (foo);
429
+ VERIFY (foo == 2 );
430
+ }
431
+ {
432
+ CheckedInt<uint8_t > foo = CheckedInt<uint16_t >(255 ).toChecked <uint8_t >();
433
+ VERIFY_IS_VALID (foo);
434
+ VERIFY (foo == 255 );
435
+ }
436
+ {
437
+ CheckedInt<uint8_t > foo = CheckedInt<uint16_t >(256 ).toChecked <uint8_t >();
438
+ VERIFY_IS_INVALID (foo);
439
+ }
440
+ {
441
+ CheckedInt<uint8_t > foo = CheckedInt<int8_t >(-2 ).toChecked <uint8_t >();
442
+ VERIFY_IS_INVALID (foo);
443
+ }
426
444
427
- #define VERIFY_CONSTRUCTION_FROM_INTEGER_TYPE (U ) \
445
+ // Check that construction of CheckedInt from an integer value of a mismatched type is checked
446
+ // Also check casting between all types.
447
+
448
+ #define VERIFY_CONSTRUCTION_FROM_INTEGER_TYPE2 (U,V,PostVExpr ) \
428
449
{ \
429
450
bool isUSigned = detail::IsSigned<U>::value; \
430
- VERIFY_IS_VALID (CheckedInt<T>(U ( 0 ) )); \
431
- VERIFY_IS_VALID (CheckedInt<T>(U ( 1 ) )); \
432
- VERIFY_IS_VALID (CheckedInt<T>(U (100 ))); \
451
+ VERIFY_IS_VALID (CheckedInt<T>(V ( 0 )PostVExpr )); \
452
+ VERIFY_IS_VALID (CheckedInt<T>(V ( 1 )PostVExpr )); \
453
+ VERIFY_IS_VALID (CheckedInt<T>(V (100 )PostVExpr )); \
433
454
if (isUSigned) \
434
- VERIFY_IS_VALID_IF (CheckedInt<T>(U (-1 )), isTSigned); \
455
+ VERIFY_IS_VALID_IF (CheckedInt<T>(V (-1 )PostVExpr ), isTSigned); \
435
456
if (sizeof (U) > sizeof (T)) \
436
- VERIFY_IS_INVALID (CheckedInt<T>(U (detail::MaxValue<T>::value) + one.value ())); \
457
+ VERIFY_IS_INVALID (CheckedInt<T>(V (detail::MaxValue<T>::value)PostVExpr + one.value ())); \
437
458
VERIFY_IS_VALID_IF (CheckedInt<T>(detail::MaxValue<U>::value), \
438
459
(sizeof (T) > sizeof (U) || ((sizeof (T) == sizeof (U)) && (isUSigned || !isTSigned)))); \
439
460
VERIFY_IS_VALID_IF (CheckedInt<T>(detail::MinValue<U>::value), \
440
- isUSigned == false ? 1 : \
441
- bool (isTSigned) == false ? 0 : \
442
- sizeof (T) >= sizeof (U)); \
461
+ isUSigned == false ? 1 \
462
+ : bool (isTSigned) == false ? 0 \
463
+ : sizeof (T) >= sizeof (U)); \
443
464
}
465
+ #define VERIFY_CONSTRUCTION_FROM_INTEGER_TYPE (U ) \
466
+ VERIFY_CONSTRUCTION_FROM_INTEGER_TYPE2 (U,U,+0 ) \
467
+ VERIFY_CONSTRUCTION_FROM_INTEGER_TYPE2 (U,CheckedInt<U>,.toChecked <T>())
468
+
444
469
VERIFY_CONSTRUCTION_FROM_INTEGER_TYPE (int8_t )
445
470
VERIFY_CONSTRUCTION_FROM_INTEGER_TYPE (uint8_t )
446
471
VERIFY_CONSTRUCTION_FROM_INTEGER_TYPE (int16_t )
0 commit comments