faca929 util: Return uint64_t from _MiB and _GiB operators:
If the test is only checking brace initialization/narrowing, maybe we can test brace-initializability™️ directly and avoid the assign_*_result_to_int scaffolding:
diff --git a/src/test/util_tests.cpp b/src/test/util_tests.cpp
--- a/src/test/util_tests.cpp (revision a7346d6065fb9c96330eef0bf9abb997d9245194)
+++ b/src/test/util_tests.cpp (revision d5b1b02d1ac72b1114698bf62859a89355dfe617)
@@ -36,6 +36,7 @@
#include <optional>
#include <string>
#include <thread>
+#include <type_traits>
#include <univalue.h>
#include <utility>
#include <vector>
@@ -1827,19 +1828,13 @@
TestSaturatingLeftShift<int64_t>();
}
-template <template <class, auto...> class Op, class Int, auto v>
-concept is_valid = requires { typename Op<Int, v>; };
-
-template <class Int, auto v, auto eval = Int{operator""_MiB(v)}>
-struct assign_MiB_result_to_int {
-};
-
-template <class Int, auto v, auto eval = Int{operator""_GiB(v)}>
-struct assign_GiB_result_to_int {
-};
+template <class Int, auto BYTES>
+concept BraceInitializesTo = requires { Int{BYTES}; };
BOOST_AUTO_TEST_CASE(mib_string_literal_test)
{
+ static_assert(std::is_same_v<decltype(1_MiB), uint64_t>);
+
// Basic equivalences and simple arithmetic operations
BOOST_CHECK_EQUAL(0_MiB, 0);
BOOST_CHECK_EQUAL(1_MiB, 1 << 20);
@@ -1861,24 +1856,12 @@
BOOST_CHECK_EQUAL(128_MiB, 0x8000000U);
BOOST_CHECK_EQUAL(550_MiB, 550ULL * 1024 * 1024);
- // Overflow handling and narrowing checks at compile time
- {
- using Int = uint32_t;
- constexpr auto max_mib{std::numeric_limits<Int>::max() >> 20};
- BOOST_CHECK_EQUAL(max_mib, 4095U);
- BOOST_CHECK_EQUAL(4095_MiB, Int{4095} << 20);
- static_assert(is_valid<assign_MiB_result_to_int, Int, max_mib>);
- static_assert(is_valid<assign_MiB_result_to_int, Int, 4095U>);
- static_assert(!is_valid<assign_MiB_result_to_int, Int, 4096U>);
- static_assert(!is_valid<assign_MiB_result_to_int, Int, max_mib + 1>);
- }
- {
- using Int = uint64_t;
- BOOST_CHECK_EQUAL(4096_MiB, Int{4096} << 20);
- constexpr auto max_mib{std::numeric_limits<Int>::max() >> 20};
- static_assert(is_valid<assign_MiB_result_to_int, Int, max_mib>);
- static_assert(!is_valid<assign_MiB_result_to_int, Int, max_mib + 1>);
- }
+ // 4095 MiB fits in uint32_t bytes. 4096 MiB requires the uint64_t return type.
+ static_assert( BraceInitializesTo<uint32_t, 4095_MiB>);
+ static_assert(!BraceInitializesTo<uint32_t, 4096_MiB>);
+ static_assert( BraceInitializesTo<uint64_t, 4096_MiB>);
+ BOOST_CHECK_EQUAL(4095_MiB, uint32_t{4095} << 20);
+ BOOST_CHECK_EQUAL(4096_MiB, uint64_t{4096} << 20);
}
BOOST_AUTO_TEST_CASE(ceil_div_test)
@@ -1920,6 +1903,8 @@
BOOST_AUTO_TEST_CASE(gib_string_literal_test)
{
+ static_assert(std::is_same_v<decltype(1_GiB), uint64_t>);
+
// Basic equivalences and simple arithmetic operations
BOOST_CHECK_EQUAL(0_GiB, 0);
BOOST_CHECK_EQUAL(1_GiB, 1 << 30);
@@ -1935,22 +1920,13 @@
BOOST_CHECK_EQUAL(3_GiB / 1_GiB, 3U);
BOOST_CHECK_EQUAL(3_GiB, 3U << 30);
- // Overflow handling and narrowing checks at compile time
- {
- using Int = uint32_t;
- constexpr auto max_gib{std::numeric_limits<Int>::max() >> 30};
- BOOST_CHECK_EQUAL(max_gib, 3U);
- BOOST_CHECK_EQUAL(3_GiB, Int{3} << 30);
- static_assert(is_valid<assign_GiB_result_to_int, Int, max_gib>);
- static_assert(!is_valid<assign_GiB_result_to_int, Int, max_gib + 1>);
- }
- {
- using Int = uint64_t;
- BOOST_CHECK_EQUAL(4_GiB, Int{4} << 30);
- constexpr auto max_gib{std::numeric_limits<Int>::max() >> 30};
- static_assert(is_valid<assign_GiB_result_to_int, Int, max_gib>);
- static_assert(!is_valid<assign_GiB_result_to_int, Int, max_gib + 1>);
- }
+ // 3 GiB fits in uint32_t bytes. 4 GiB requires the uint64_t return type.
+ static_assert( BraceInitializesTo<uint32_t, 3_GiB>);
+ static_assert(!BraceInitializesTo<uint32_t, 4_GiB>);
+ static_assert( BraceInitializesTo<uint64_t, 4_GiB>);
+ BOOST_CHECK_EQUAL(3_GiB, uint32_t{3} << 30);
+ BOOST_CHECK_EQUAL(4_GiB, uint64_t{4} << 30);
+
// Specific codebase values
BOOST_CHECK_EQUAL(4_GiB, 4096_MiB);
BOOST_CHECK_EQUAL(8_GiB, 8192_MiB);