diff --git a/doc/DESIGN.md b/doc/DESIGN.md index 98a5e888..90514804 100644 --- a/doc/DESIGN.md +++ b/doc/DESIGN.md @@ -285,7 +285,7 @@ For example to create a prefixed unit the following may be used: ```cpp template - requires requires { U::symbol; } && std::same_as + requires requires { U::symbol; } struct prefixed_derived_unit : downcast_helper>> { diff --git a/src/include/units/unit.h b/src/include/units/unit.h index 729fafcd..d451961b 100644 --- a/src/include/units/unit.h +++ b/src/include/units/unit.h @@ -161,7 +161,7 @@ namespace units { }; template - requires requires { U::symbol; } && std::same_as + requires requires { U::symbol; } struct prefixed_derived_unit : downcast_helper>> { static constexpr auto symbol = P::symbol + U::symbol; using prefix_type = P::prefix_type; diff --git a/test/unit_test/runtime/digital_information_test.cpp b/test/unit_test/runtime/digital_information_test.cpp index 8a70d92d..0ffb12c5 100644 --- a/test/unit_test/runtime/digital_information_test.cpp +++ b/test/unit_test/runtime/digital_information_test.cpp @@ -39,14 +39,16 @@ namespace data { struct mebi : units::prefix, "Mi"> {}; struct bit : units::coherent_derived_unit {}; - struct kilobit : units::prefixed_derived_unit {}; + struct kilobit : units::prefixed_derived_unit {}; struct byte : units::derived_unit> {}; + struct kilobyte : units::prefixed_derived_unit {}; inline namespace literals { constexpr auto operator""_b(unsigned long long l) { return units::quantity(l); } constexpr auto operator""_Kib(unsigned long long l) { return units::quantity(l); } constexpr auto operator""_B(unsigned long long l) { return units::quantity(l); } + constexpr auto operator""_KiB(unsigned long long l) { return units::quantity(l); } } @@ -66,16 +68,22 @@ TEST_CASE("operator<< on a custom quantity", "[text][ostream]") REQUIRE(stream.str() == "64 B"); } - SECTION("prefixed unit") + SECTION("prefixed coherent unit") { stream << 256_Kib; - // REQUIRE(stream.str() == "256 Kib"); + REQUIRE(stream.str() == "256 Kib"); + } + + SECTION("prefixed non-coherent unit") + { + stream << 1024_KiB; + REQUIRE(stream.str() == "1024 KiB"); } SECTION("other unit matching prefix") { stream << 8_Kib * 8_Kib / 2_b; - // REQUIRE(stream.str() == "32 Mib"); + REQUIRE(stream.str() == "32 Mib"); } } } diff --git a/test/unit_test/static/custom_unit_test.cpp b/test/unit_test/static/custom_unit_test.cpp index f01f64ca..34138a8f 100644 --- a/test/unit_test/static/custom_unit_test.cpp +++ b/test/unit_test/static/custom_unit_test.cpp @@ -37,16 +37,20 @@ namespace { struct data_prefix {}; + struct kibi : units::prefix, "Ki"> {}; + struct bit : units::coherent_derived_unit {}; + struct kilobit : units::prefixed_derived_unit {}; + struct byte : units::derived_unit> {}; + struct kilobyte : units::prefixed_derived_unit {}; inline namespace literals { constexpr auto operator""_b(unsigned long long l) { return units::quantity(l); } - constexpr auto operator""_b(long double l) { return units::quantity(l); } - + constexpr auto operator""_Kib(unsigned long long l) { return units::quantity(l); } constexpr auto operator""_B(unsigned long long l) { return units::quantity(l); } - constexpr auto operator""_B(long double l) { return units::quantity(l); } + constexpr auto operator""_KiB(unsigned long long l) { return units::quantity(l); } } } @@ -54,6 +58,10 @@ namespace { namespace { static_assert(1_B == 8_b); + static_assert(1024_b == 1_Kib); + static_assert(1024_B == 1_KiB); + static_assert(8 * 1024_b == 1_KiB); + static_assert(8 * 1_Kib == 1_KiB); }