cast_test.cpp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*
  2. * Copyright 2010-2025 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bx/blob/master/LICENSE
  4. */
  5. #include "test.h"
  6. #include <bx/bx.h>
  7. TEST_CASE("Bit cast", "[cast]")
  8. {
  9. STATIC_REQUIRE(0x4172f58bc0000000ull == bx::bitCast<uint64_t>(19880124.0) );
  10. STATIC_REQUIRE(0x3fe9000000000000ull == bx::bitCast<uint64_t>(0.781250) );
  11. STATIC_REQUIRE(19880124.0 == bx::bitCast<double>(0x4172f58bc0000000ull) );
  12. STATIC_REQUIRE(0.781250 == bx::bitCast<double>(0x3fe9000000000000ull) );
  13. }
  14. TEST_CASE("Narrow cast", "[cast]")
  15. {
  16. REQUIRE(127 == bx::narrowCast<int8_t>(int32_t(127) ) );
  17. REQUIRE_ASSERTS(bx::narrowCast<int8_t>(int32_t(128) ) );
  18. REQUIRE_ASSERTS(bx::narrowCast<int8_t>(uint32_t(128) ) );
  19. REQUIRE(128 == bx::narrowCast<uint8_t>(int32_t(128) ) );
  20. }
  21. template<typename Ty, typename FromT>
  22. inline constexpr bool saturateCastTest(Ty _expectedMin, Ty _expectedMax)
  23. {
  24. return true
  25. && _expectedMin == bx::saturateCast<Ty>(static_cast<FromT>(_expectedMin) )
  26. && _expectedMax == bx::saturateCast<Ty>(static_cast<FromT>(_expectedMax) )
  27. ;
  28. }
  29. TEST_CASE("Saturate cast", "[cast]")
  30. {
  31. STATIC_REQUIRE(-128 == bx::saturateCast<int8_t >( int32_t( -255) ) );
  32. STATIC_REQUIRE( 127 == bx::saturateCast<int8_t >( int32_t( 255) ) );
  33. STATIC_REQUIRE( 127 == bx::saturateCast<int8_t >( int32_t( 127) ) );
  34. STATIC_REQUIRE( 127 == bx::saturateCast<int8_t >( int32_t( 128) ) );
  35. STATIC_REQUIRE( 127 == bx::saturateCast<int8_t >(uint32_t( 128) ) );
  36. STATIC_REQUIRE(-128 == bx::saturateCast<int8_t >( float(-1389.9831f) ) );
  37. STATIC_REQUIRE( 127 == bx::saturateCast<int8_t >( float( 1389.9831f) ) );
  38. STATIC_REQUIRE( 0 == bx::saturateCast<uint8_t>( int32_t( -128) ) );
  39. STATIC_REQUIRE( 128 == bx::saturateCast<uint8_t>( int32_t( 128) ) );
  40. STATIC_REQUIRE( -13 == bx::saturateCast<int8_t >( float( -13.89f) ) );
  41. STATIC_REQUIRE( 13 == bx::saturateCast<int8_t >( float( 13.89f) ) );
  42. STATIC_REQUIRE( 0 == bx::saturateCast<uint8_t>( float( -13.89f) ) );
  43. STATIC_REQUIRE( 13 == bx::saturateCast<uint8_t>( float( 13.89f) ) );
  44. STATIC_REQUIRE(saturateCastTest<int8_t, int8_t>(-128, 127) );
  45. STATIC_REQUIRE(saturateCastTest<int8_t, uint8_t>( 0, 127) );
  46. STATIC_REQUIRE(saturateCastTest<int8_t, int16_t>(-128, 127) );
  47. STATIC_REQUIRE(saturateCastTest<int8_t, uint16_t>( 0, 127) );
  48. STATIC_REQUIRE(saturateCastTest<int8_t, int32_t>(-128, 127) );
  49. STATIC_REQUIRE(saturateCastTest<int8_t, uint32_t>( 0, 127) );
  50. STATIC_REQUIRE(saturateCastTest<int8_t, int64_t>(-128, 127) );
  51. STATIC_REQUIRE(saturateCastTest<int8_t, uint64_t>( 0, 127) );
  52. STATIC_REQUIRE(saturateCastTest<uint8_t, int8_t>( 0, 127) );
  53. STATIC_REQUIRE(saturateCastTest<uint8_t, uint8_t>( 0, 255) );
  54. STATIC_REQUIRE(saturateCastTest<uint8_t, int16_t>( 0, 255) );
  55. STATIC_REQUIRE(saturateCastTest<uint8_t, uint16_t>( 0, 255) );
  56. STATIC_REQUIRE(saturateCastTest<uint8_t, int32_t>( 0, 255) );
  57. STATIC_REQUIRE(saturateCastTest<uint8_t, uint32_t>( 0, 255) );
  58. STATIC_REQUIRE(saturateCastTest<uint8_t, int64_t>( 0, 255) );
  59. STATIC_REQUIRE(saturateCastTest<uint8_t, uint64_t>( 0, 255) );
  60. STATIC_REQUIRE(saturateCastTest<int16_t, int8_t>( -128, 127) );
  61. STATIC_REQUIRE(saturateCastTest<int16_t, uint8_t>( 0, 255) );
  62. STATIC_REQUIRE(saturateCastTest<int16_t, int16_t>( -32768, 32767) );
  63. STATIC_REQUIRE(saturateCastTest<int16_t, uint16_t>( 0, 32767) );
  64. STATIC_REQUIRE(saturateCastTest<int16_t, int32_t>( -32768, 32767) );
  65. STATIC_REQUIRE(saturateCastTest<int16_t, uint32_t>( 0, 32767) );
  66. STATIC_REQUIRE(saturateCastTest<int16_t, int64_t>( -32768, 32767) );
  67. STATIC_REQUIRE(saturateCastTest<int16_t, uint64_t>( 0, 32767) );
  68. STATIC_REQUIRE(saturateCastTest<uint16_t, int8_t>( 0, 127) );
  69. STATIC_REQUIRE(saturateCastTest<uint16_t, uint8_t>( 0, 255) );
  70. STATIC_REQUIRE(saturateCastTest<uint16_t, int16_t>( 0, 32767) );
  71. STATIC_REQUIRE(saturateCastTest<uint16_t, uint16_t>( 0, 65535) );
  72. STATIC_REQUIRE(saturateCastTest<uint16_t, int32_t>( 0, 65535) );
  73. STATIC_REQUIRE(saturateCastTest<uint16_t, uint32_t>( 0, 65535) );
  74. STATIC_REQUIRE(saturateCastTest<uint16_t, int64_t>( 0, 65535) );
  75. STATIC_REQUIRE(saturateCastTest<uint16_t, uint64_t>( 0, 65535) );
  76. STATIC_REQUIRE(saturateCastTest<int32_t, int8_t>( -128, 127) );
  77. STATIC_REQUIRE(saturateCastTest<int32_t, uint8_t>( 0, 255) );
  78. STATIC_REQUIRE(saturateCastTest<int32_t, int16_t>( -32768, 32767) );
  79. STATIC_REQUIRE(saturateCastTest<int32_t, uint16_t>( 0, 65535) );
  80. STATIC_REQUIRE(saturateCastTest<int32_t, int32_t>( -2147483648, 2147483647) );
  81. STATIC_REQUIRE(saturateCastTest<int32_t, uint32_t>( 0, 2147483647) );
  82. STATIC_REQUIRE(saturateCastTest<int32_t, int64_t>( -2147483648, 2147483647) );
  83. STATIC_REQUIRE(saturateCastTest<int32_t, uint64_t>( 0, 2147483647) );
  84. STATIC_REQUIRE(saturateCastTest<uint32_t, int8_t>( 0, 127) );
  85. STATIC_REQUIRE(saturateCastTest<uint32_t, uint8_t>( 0, 255) );
  86. STATIC_REQUIRE(saturateCastTest<uint32_t, int16_t>( 0, 32767) );
  87. STATIC_REQUIRE(saturateCastTest<uint32_t, uint16_t>( 0, 65535) );
  88. STATIC_REQUIRE(saturateCastTest<uint32_t, int32_t>( 0, 2147483647) );
  89. STATIC_REQUIRE(saturateCastTest<uint32_t, uint32_t>( 0, 4294967295) );
  90. STATIC_REQUIRE(saturateCastTest<uint32_t, int64_t>( 0, 4294967295) );
  91. STATIC_REQUIRE(saturateCastTest<uint32_t, uint64_t>( 0, 4294967295) );
  92. STATIC_REQUIRE(saturateCastTest<int64_t, int8_t>( -128, 127) );
  93. STATIC_REQUIRE(saturateCastTest<int64_t, uint8_t>( 0, 255) );
  94. STATIC_REQUIRE(saturateCastTest<int64_t, int16_t>( -32768, 32767) );
  95. STATIC_REQUIRE(saturateCastTest<int64_t, uint16_t>( 0, 65535) );
  96. STATIC_REQUIRE(saturateCastTest<int64_t, int32_t>( -2147483648, 2147483647) );
  97. STATIC_REQUIRE(saturateCastTest<int64_t, uint32_t>( 0, 4294967295) );
  98. STATIC_REQUIRE(saturateCastTest<int64_t, int64_t>( -9223372036854775808ll, 9223372036854775807ll) );
  99. STATIC_REQUIRE(saturateCastTest<int64_t, uint64_t>( 0, 9223372036854775807ll) );
  100. STATIC_REQUIRE(saturateCastTest<uint64_t, int8_t>( 0, 127) );
  101. STATIC_REQUIRE(saturateCastTest<uint64_t, uint8_t>( 0, 255) );
  102. STATIC_REQUIRE(saturateCastTest<uint64_t, int16_t>( 0, 32767) );
  103. STATIC_REQUIRE(saturateCastTest<uint64_t, uint16_t>( 0, 65535) );
  104. STATIC_REQUIRE(saturateCastTest<uint64_t, int32_t>( 0, 2147483647) );
  105. STATIC_REQUIRE(saturateCastTest<uint64_t, uint32_t>( 0, 4294967295) );
  106. STATIC_REQUIRE(saturateCastTest<uint64_t, int64_t>( 0, 9223372036854775807ull) );
  107. STATIC_REQUIRE(saturateCastTest<uint64_t, uint64_t>( 0, 18446744073709551615ull) );
  108. }