From 8a124ffbf0592542ff255e8873d9dc562b0d4644 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Mon, 12 Jun 2023 12:12:38 +0300 Subject: [PATCH] test: `custom_rep_test_min_impl` updated for V2 --- test/unit_test/static/CMakeLists.txt | 1 + .../static/custom_rep_test_min_impl.cpp | 397 +++++++----------- 2 files changed, 162 insertions(+), 236 deletions(-) diff --git a/test/unit_test/static/CMakeLists.txt b/test/unit_test/static/CMakeLists.txt index f5135edb..4af05b6a 100644 --- a/test/unit_test/static/CMakeLists.txt +++ b/test/unit_test/static/CMakeLists.txt @@ -35,6 +35,7 @@ add_library( chrono_test.cpp concepts_test.cpp # custom_rep_test_min_expl.cpp + custom_rep_test_min_impl.cpp dimension_test.cpp fixed_string_test.cpp fractional_exponent_quantity.cpp diff --git a/test/unit_test/static/custom_rep_test_min_impl.cpp b/test/unit_test/static/custom_rep_test_min_impl.cpp index 62b1ceb2..70166e60 100644 --- a/test/unit_test/static/custom_rep_test_min_impl.cpp +++ b/test/unit_test/static/custom_rep_test_min_impl.cpp @@ -20,8 +20,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -#include -#include +#include #include namespace { @@ -40,305 +39,231 @@ public: using value_type = T; min_impl() = default; - constexpr min_impl(T v) noexcept : value_(v) {} + constexpr explicit(false) min_impl(T v) noexcept : value_(v) {} template - constexpr min_impl(min_impl i) noexcept : value_(static_cast(i.value_)) + constexpr explicit(false) min_impl(min_impl i) noexcept : value_(static_cast(static_cast(i))) { } - constexpr operator T() const noexcept { return value_; } + constexpr explicit(false) operator T() const noexcept { return value_; } }; } // namespace +template +inline constexpr bool mp_units::is_scalar> = true; + template -struct std::common_type, min_impl> : std::common_type {}; +struct std::common_type, min_impl> : std::type_identity>> {}; template -struct std::common_type, U> : std::common_type {}; +struct std::common_type, U> : std::type_identity>> {}; template -struct std::common_type> : std::common_type {}; +struct std::common_type> : std::type_identity>> {}; namespace { -using namespace units; -using namespace units::isq::si; +using namespace mp_units; static_assert(Representation>); static_assert(Representation>); -// construction from a value -static_assert(std::constructible_from>, min_impl>); -static_assert(!std::convertible_to, length>>); +// construction from a value is not allowed +static_assert(!std::constructible_from>, min_impl>); +static_assert(!std::convertible_to, quantity>>); -static_assert(std::constructible_from>, min_impl>); -static_assert(!std::convertible_to, length>>); +static_assert(!std::constructible_from>, min_impl>); +static_assert(!std::convertible_to, quantity>>); -static_assert(std::constructible_from>, min_impl>); -static_assert(!std::convertible_to, length>>); +// multiply syntax should work +template +concept creates_quantity = requires { T{} * U; }; -static_assert(!std::constructible_from>, min_impl>); // narrowing conversion -static_assert(!std::convertible_to, length>>); +static_assert(creates_quantity, si::metre>); +static_assert(creates_quantity, si::metre>); -// construction from an underlying type -static_assert(std::constructible_from>, int>); -static_assert(!std::convertible_to>>); +// dimensionless quantity is constructible and convertible from a value +static_assert(std::constructible_from>, min_impl>); +static_assert(std::convertible_to, quantity>>); -static_assert(std::constructible_from>, double>); -static_assert(!std::convertible_to>>); +static_assert(std::constructible_from>, min_impl>); +static_assert(std::convertible_to, quantity>>); -static_assert(std::constructible_from>, int>); -static_assert(!std::convertible_to>>); +static_assert(std::constructible_from>, min_impl>); +static_assert(std::convertible_to, quantity>>); -static_assert(!std::constructible_from>, double>); // narrowing conversion -static_assert(!std::convertible_to>>); - -// dimensionless quantity is convertible from a value -static_assert(std::constructible_from>, min_impl>); -static_assert(std::convertible_to, dimensionless>>); - -static_assert(std::constructible_from>, min_impl>); -static_assert(std::convertible_to, dimensionless>>); - -static_assert(std::constructible_from>, min_impl>); -static_assert(std::convertible_to, dimensionless>>); - -static_assert(!std::constructible_from>, min_impl>); // narrowing conversion -static_assert(!std::convertible_to, dimensionless>>); +static_assert(!std::constructible_from>, min_impl>); // narrowing conversion +static_assert(!std::convertible_to, quantity>>); // and underlying type -static_assert(std::constructible_from>, int>); -static_assert(std::convertible_to>>); +static_assert(std::constructible_from>, int>); +static_assert(std::convertible_to>>); -static_assert(std::constructible_from>, double>); -static_assert(std::convertible_to>>); +static_assert(std::constructible_from>, double>); +static_assert(std::convertible_to>>); -static_assert(std::constructible_from>, int>); -static_assert(std::convertible_to>>); +static_assert(std::constructible_from>, int>); +static_assert(std::convertible_to>>); -static_assert(!std::constructible_from>, double>); // narrowing conversion -static_assert(!std::convertible_to>>); +static_assert(!std::constructible_from>, double>); // narrowing conversion +static_assert(!std::convertible_to>>); -// but only for ratio(1), otherwise not convertible -static_assert(std::constructible_from>, min_impl>); -static_assert(!std::convertible_to, dimensionless>>); +// but only for ratio(1) +static_assert(!std::constructible_from>, min_impl>); +static_assert(!std::convertible_to, quantity>>); -static_assert(std::constructible_from>, min_impl>); -static_assert(!std::convertible_to, dimensionless>>); +static_assert(!std::constructible_from>, min_impl>); +static_assert(!std::convertible_to, quantity>>); -static_assert(std::constructible_from>, min_impl>); -static_assert(!std::convertible_to, dimensionless>>); +static_assert(!std::constructible_from>, min_impl>); +static_assert(!std::convertible_to, quantity>>); -static_assert( - !std::constructible_from>, min_impl>); // narrowing conversion -static_assert(!std::convertible_to, dimensionless>>); +static_assert(!std::constructible_from>, min_impl>); // narrowing conversion +static_assert(!std::convertible_to, quantity>>); -// implicit conversion tests -static_assert(std::constructible_from, min_impl>); -static_assert(!std::convertible_to, length>); - -static_assert(std::constructible_from, min_impl>); -static_assert(!std::convertible_to, length>); - -static_assert(std::constructible_from, min_impl>); -static_assert(!std::convertible_to, length>); - -static_assert(!std::constructible_from, min_impl>); // narrowing conversion -static_assert(!std::convertible_to, length>); - -// construction from an underlying type -static_assert(std::constructible_from, min_impl>); -static_assert(!std::convertible_to, length>); - -static_assert(std::constructible_from, min_impl>); -static_assert(!std::convertible_to, length>); - -static_assert(std::constructible_from, min_impl>); -static_assert(!std::convertible_to, length>); - -static_assert(!std::constructible_from, min_impl>); // narrowing conversion -static_assert(!std::convertible_to, length>); - -// dimensionless quantity is convertible from a value -static_assert(std::constructible_from, min_impl>); -static_assert(std::convertible_to, dimensionless>); - -static_assert(std::constructible_from, min_impl>); -static_assert(std::convertible_to, dimensionless>); - -static_assert(std::constructible_from, min_impl>); -static_assert(std::convertible_to, dimensionless>); - -static_assert(!std::constructible_from, min_impl>); // narrowing conversion -static_assert(!std::convertible_to, dimensionless>); - -// but only for ratio(1), otherwise not convertible -static_assert(std::constructible_from, min_impl>); -static_assert(!std::convertible_to, dimensionless>); - -static_assert(std::constructible_from, min_impl>); -static_assert(!std::convertible_to, dimensionless>); - -static_assert(std::constructible_from, min_impl>); -static_assert(!std::convertible_to, dimensionless>); - -static_assert(!std::constructible_from, min_impl>); // narrowing conversion -static_assert(!std::convertible_to, dimensionless>); +// multiply syntax +static_assert(creates_quantity, one>); +static_assert(creates_quantity, one>); +static_assert(creates_quantity, percent>); +static_assert(creates_quantity, percent>); // construction from a quantity // min_impl -> min_impl -static_assert(std::constructible_from>, length>>); -static_assert(std::convertible_to>, length>>); +static_assert(std::constructible_from>, quantity>>); +static_assert(std::convertible_to>, quantity>>); -static_assert(std::constructible_from>, length>>); -static_assert(std::convertible_to>, length>>); +static_assert(std::constructible_from>, quantity>>); +static_assert(std::convertible_to>, quantity>>); -static_assert(std::constructible_from>, length>>); -static_assert(std::convertible_to>, length>>); +static_assert(std::constructible_from>, quantity>>); +static_assert(std::convertible_to>, quantity>>); -static_assert( - !std::constructible_from>, length>>); // narrowing conversion -static_assert(!std::convertible_to>, length>>); +static_assert(!std::constructible_from>, + quantity>>); // narrowing conversion +static_assert(!std::convertible_to>, quantity>>); // T -> min_impl -static_assert(std::constructible_from>, length>); -static_assert(std::convertible_to, length>>); +static_assert(std::constructible_from>, quantity>); +static_assert(std::convertible_to, quantity>>); -static_assert(std::constructible_from>, length>); -static_assert(std::convertible_to, length>>); +static_assert(std::constructible_from>, quantity>); +static_assert(std::convertible_to, quantity>>); -static_assert(std::constructible_from>, length>); -static_assert(std::convertible_to, length>>); +static_assert(std::constructible_from>, quantity>); +static_assert(std::convertible_to, quantity>>); -static_assert(!std::constructible_from>, length>); // narrowing conversion -static_assert(!std::convertible_to, length>>); +static_assert( + !std::constructible_from>, quantity>); // narrowing conversion +static_assert(!std::convertible_to, quantity>>); // min_impl -> T -static_assert(std::constructible_from, length>>); -static_assert(std::convertible_to>, length>); +static_assert(std::constructible_from, quantity>>); +static_assert(std::convertible_to>, quantity>); -static_assert(std::constructible_from, length>>); -static_assert(std::convertible_to>, length>); +static_assert(std::constructible_from, quantity>>); +static_assert(std::convertible_to>, quantity>); -static_assert(std::constructible_from, length>>); -static_assert(std::convertible_to>, length>); +static_assert(std::constructible_from, quantity>>); +static_assert(std::convertible_to>, quantity>); -static_assert(!std::constructible_from, length>>); // narrowing conversion -static_assert(!std::convertible_to>, length>); +static_assert( + !std::constructible_from, quantity>>); // narrowing conversion +static_assert(!std::convertible_to>, quantity>); // arithmetic operators -static_assert(length>(1) + length>(1) == length>(2)); -static_assert(length>(1) + length>(1.5) == - length>(2.5)); -static_assert(length(1) + length>(1) == length>(2)); -static_assert(length(1) + length>(1.5) == length>(2.5)); -static_assert(length>(1) + length(1) == length>(2)); -static_assert(length>(1) + length(1.5) == length>(2.5)); -static_assert(length>(1) + length>(1) == length(2)); -static_assert(length>(1) + length>(1.5) == length(2.5)); +static_assert(min_impl{1} * si::metre + min_impl{1} * si::metre == min_impl{2} * si::metre); +static_assert(min_impl{1} * si::metre + min_impl{1.5} * si::metre == min_impl{2.5} * si::metre); +static_assert(1 * si::metre + min_impl{1} * si::metre == min_impl{2} * si::metre); +static_assert(1 * si::metre + min_impl{1.5} * si::metre == min_impl{2.5} * si::metre); +static_assert(min_impl{1} * si::metre + 1 * si::metre == min_impl{2} * si::metre); +static_assert(min_impl{1} * si::metre + double{1.5} * si::metre == min_impl{2.5} * si::metre); +static_assert(min_impl{1} * si::metre + min_impl{1} * si::metre == 2 * si::metre); +static_assert(min_impl{1} * si::metre + min_impl{1.5} * si::metre == double{2.5} * si::metre); -static_assert(length>(1) + length>(1) == - length>(1001)); -static_assert(length>(1) + length>(1.5) == - length>(1001.5)); -static_assert(length(1) + length>(1) == length>(1001)); -static_assert(length(1) + length>(1.5) == - length>(1001.5)); -static_assert(length>(1) + length(1) == length>(1001)); -static_assert(length>(1) + length(1.5) == - length>(1001.5)); -static_assert(length>(1) + length>(1) == length(1001)); -static_assert(length>(1) + length>(1.5) == - length(1001.5)); +static_assert(min_impl{1} * si::kilo + min_impl{1} * si::metre == + min_impl{1'001} * si::metre); +static_assert(min_impl{1} * si::kilo + min_impl{1.5} * si::metre == + min_impl{1001.5} * si::metre); +static_assert(1 * si::kilo + min_impl{1} * si::metre == min_impl{1'001} * si::metre); +static_assert(1 * si::kilo + min_impl{1.5} * si::metre == min_impl{1001.5} * si::metre); +static_assert(min_impl{1} * si::kilo + 1 * si::metre == min_impl{1'001} * si::metre); +static_assert(min_impl{1} * si::kilo + double{1.5} * si::metre == min_impl{1001.5} * si::metre); +static_assert(min_impl{1} * si::kilo + min_impl{1} * si::metre == 1'001 * si::metre); +static_assert(min_impl{1} * si::kilo + min_impl{1.5} * si::metre == double{1001.5} * si::metre); -static_assert(length>(1) + length>(1) == - length>(1001)); -static_assert(length>(1) + length>(1.5) == - length>(1501)); -static_assert(length(1) + length>(1) == length>(1001)); -static_assert(length(1) + length>(1.5) == - length>(1501)); -static_assert(length>(1) + length(1) == length>(1001)); -static_assert(length>(1) + length(1.5) == - length>(1501)); -static_assert(length>(1) + length>(1) == length(1001)); -static_assert(length>(1) + length>(1.5) == - length(1501)); +static_assert(min_impl{1} * si::metre + min_impl{1} * si::kilo == + min_impl{1'001} * si::metre); +static_assert(min_impl{1} * si::metre + min_impl{1.5} * si::kilo == + min_impl{1'501} * si::metre); +static_assert(1 * si::metre + min_impl{1} * si::kilo == min_impl{1'001} * si::metre); +static_assert(1 * si::metre + min_impl{1.5} * si::kilo == min_impl{1'501} * si::metre); +static_assert(min_impl{1} * si::metre + 1 * si::kilo == min_impl{1'001} * si::metre); +static_assert(min_impl{1} * si::metre + double{1.5} * si::kilo == min_impl{1'501} * si::metre); +static_assert(min_impl{1} * si::metre + min_impl{1} * si::kilo == 1'001 * si::metre); +static_assert(min_impl{1} * si::metre + min_impl{1.5} * si::kilo == double{1'501} * si::metre); -static_assert(length>(2) - length>(1) == length>(1)); -static_assert(length>(2) - length>(1.5) == - length>(0.5)); -static_assert(length(2) - length>(1) == length>(1)); -static_assert(length(2) - length>(1.5) == length>(0.5)); -static_assert(length>(2) - length(1) == length>(1)); -static_assert(length>(2) - length(1.5) == length>(0.5)); -static_assert(length>(2) - length>(1) == length(1)); -static_assert(length>(2) - length>(1.5) == length(0.5)); +static_assert(min_impl{2} * si::metre - min_impl{1} * si::metre == min_impl{1} * si::metre); +static_assert(min_impl{2} * si::metre - min_impl{1.5} * si::metre == min_impl{0.5} * si::metre); +static_assert(2 * si::metre - min_impl{1} * si::metre == min_impl{1} * si::metre); +static_assert(2 * si::metre - min_impl{1.5} * si::metre == min_impl{0.5} * si::metre); +static_assert(min_impl{2} * si::metre - 1 * si::metre == min_impl{1} * si::metre); +static_assert(min_impl{2} * si::metre - double{1.5} * si::metre == min_impl{0.5} * si::metre); +static_assert(min_impl{2} * si::metre - min_impl{1} * si::metre == 1 * si::metre); +static_assert(min_impl{2} * si::metre - min_impl{1.5} * si::metre == double{0.5} * si::metre); -static_assert(length>(2) - length>(1) == - length>(1999)); -static_assert(length>(2) - length>(1.5) == - length>(1998.5)); -static_assert(length(2) - length>(1) == length>(1999)); -static_assert(length(2) - length>(1.5) == - length>(1998.5)); -static_assert(length>(2) - length(1) == length>(1999)); -static_assert(length>(2) - length(1.5) == - length>(1998.5)); -static_assert(length>(2) - length>(1) == length(1999)); -static_assert(length>(2) - length>(1.5) == - length(1998.5)); +static_assert(min_impl{2} * si::kilo - min_impl{1} * si::metre == + min_impl{1'999} * si::metre); +static_assert(min_impl{2} * si::kilo - min_impl{1.5} * si::metre == + min_impl{1998.5} * si::metre); +static_assert(2 * si::kilo - min_impl{1} * si::metre == min_impl{1'999} * si::metre); +static_assert(2 * si::kilo - min_impl{1.5} * si::metre == min_impl{1998.5} * si::metre); +static_assert(min_impl{2} * si::kilo - 1 * si::metre == min_impl{1'999} * si::metre); +static_assert(min_impl{2} * si::kilo - double{1.5} * si::metre == min_impl{1998.5} * si::metre); +static_assert(min_impl{2} * si::kilo - min_impl{1} * si::metre == 1'999 * si::metre); +static_assert(min_impl{2} * si::kilo - min_impl{1.5} * si::metre == double{1998.5} * si::metre); -static_assert(length>(2000) - length>(1) == - length>(1000)); -static_assert(length>(2000) - length>(1.5) == - length>(500)); -static_assert(length(2000) - length>(1) == length>(1000)); -static_assert(length(2000) - length>(1.5) == - length>(500)); -static_assert(length>(2000) - length(1) == length>(1000)); -static_assert(length>(2000) - length(1.5) == - length>(500)); -static_assert(length>(2000) - length>(1) == length(1000)); -static_assert(length>(2000) - length>(1.5) == - length(500)); +static_assert(min_impl{2'000} * si::metre - min_impl{1} * si::kilo == + min_impl{1'000} * si::metre); +static_assert(min_impl{2'000} * si::metre - min_impl{1.5} * si::kilo == + min_impl{500} * si::metre); +static_assert(2'000 * si::metre - min_impl{1} * si::kilo == min_impl{1'000} * si::metre); +static_assert(2'000 * si::metre - min_impl{1.5} * si::kilo == min_impl{500} * si::metre); +static_assert(min_impl{2'000} * si::metre - 1 * si::kilo == min_impl{1'000} * si::metre); +static_assert(min_impl{2'000} * si::metre - double{1.5} * si::kilo == + min_impl{500} * si::metre); +static_assert(min_impl{2'000} * si::metre - min_impl{1} * si::kilo == 1'000 * si::metre); +static_assert(min_impl{2'000} * si::metre - min_impl{1.5} * si::kilo == + double{500} * si::metre); -static_assert(length>(123) * min_impl(1.5) == length>(184.5)); -static_assert(length>(123) * 1.5 == length>(184.5)); -static_assert(length(123) * min_impl(1.5) == length>(184.5)); +static_assert(min_impl{123} * si::metre * min_impl(1.5) == min_impl{184.5} * si::metre); +static_assert(min_impl{123} * si::metre * 1.5 == min_impl{184.5} * si::metre); +static_assert(123 * si::metre * min_impl(1.5) == min_impl{184.5} * si::metre); -static_assert(length>(123) * quantity{min_impl(1.5)} == - length>(184.5)); -static_assert(length>(123) * quantity{1.5} == length>(184.5)); -static_assert(length(123) * quantity{min_impl(1.5)} == length>(184.5)); +static_assert(min_impl{123} * si::metre * (min_impl(1.5) * one) == min_impl{184.5} * si::metre); +static_assert(min_impl{123} * si::metre * (1.5 * one) == min_impl{184.5} * si::metre); +static_assert(123 * si::metre * (min_impl(1.5) * one) == min_impl{184.5} * si::metre); -static_assert(min_impl(1.5) * length>(123) == length>(184.5)); -static_assert(min_impl(1.5) * length(123) == length>(184.5)); -static_assert(1.5 * length>(123) == length>(184.5)); +static_assert(min_impl(1.5) * min_impl{123} * si::metre == min_impl{184.5} * si::metre); +static_assert(min_impl(1.5) * 123 * si::metre == min_impl{184.5} * si::metre); +static_assert(1.5 * min_impl{123} * si::metre == min_impl{184.5} * si::metre); -static_assert(quantity{min_impl(1.5)} * length>(123) == - length>(184.5)); -static_assert(quantity{min_impl(1.5)} * length(123) == length>(184.5)); -static_assert(quantity{1.5} * length>(123) == length>(184.5)); +static_assert(min_impl(1.5) * one * (min_impl{123} * si::metre) == min_impl{184.5} * si::metre); +static_assert(min_impl(1.5) * one * (123 * si::metre) == min_impl{184.5} * si::metre); +static_assert(1.5 * one * (min_impl{123} * si::metre) == min_impl{184.5} * si::metre); -static_assert(length>(123) / min_impl(2.) == length>(61.5)); -static_assert(length>(123) / 2. == length>(61.5)); -static_assert(length(123) / min_impl(2.) == length>(61.5)); +static_assert(min_impl{123} * si::metre / min_impl(2.) == min_impl{61.5} * si::metre); +static_assert(min_impl{123} * si::metre / 2. == min_impl{61.5} * si::metre); +static_assert(123 * si::metre / min_impl(2.) == min_impl{61.5} * si::metre); -static_assert(length>(123) / quantity{min_impl(2.)} == - length>(61.5)); -static_assert(length>(123) / quantity{2.} == length>(61.5)); -static_assert(length(123) / quantity{min_impl(2.)} == length>(61.5)); +static_assert(min_impl{123} * si::metre / (min_impl(2.) * one) == min_impl{61.5} * si::metre); +static_assert(min_impl{123} * si::metre / (2. * one) == min_impl{61.5} * si::metre); +static_assert(123 * si::metre / (min_impl(2.) * one) == min_impl{61.5} * si::metre); -static_assert(length>(123) / length>(2.) == 61.5); -static_assert(length>(123) / length(2.) == 61.5); -static_assert(length(123) / length>(2.) == 61.5); +static_assert(min_impl{123} * si::metre / (min_impl{2.} * si::metre) == 61.5); +static_assert(min_impl{123} * si::metre / (double{2.} * si::metre) == 61.5); +static_assert(123 * si::metre / (min_impl{2.} * si::metre) == 61.5); -static_assert(length>(123) % min_impl(100) == length(23)); -static_assert(length>(123) % 100 == length(23)); -static_assert(length(123) % min_impl(100) == length(23)); - -static_assert(length>(123) % quantity{min_impl(100)} == length(23)); -static_assert(length>(123) % quantity{100} == length(23)); -static_assert(length(123) % quantity{min_impl(100)} == length(23)); +static_assert(min_impl{123} * si::metre % (min_impl(100) * si::metre) == 23 * si::metre); +static_assert(min_impl{123} * si::metre % (100 * si::metre) == 23 * si::metre); +static_assert(123 * si::metre % (min_impl(100) * si::metre) == 23 * si::metre); } // namespace