From 1c7928021d75b57a738dd012a487621867609d5e Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Wed, 13 Sep 2023 10:18:07 +0200 Subject: [PATCH] feat: `force_in(U)` support added --- src/core/include/mp-units/quantity.h | 21 ++++++++++++++------- test/unit_test/static/quantity_test.cpp | 4 ++++ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/core/include/mp-units/quantity.h b/src/core/include/mp-units/quantity.h index 563cdcd7..1e07a43e 100644 --- a/src/core/include/mp-units/quantity.h +++ b/src/core/include/mp-units/quantity.h @@ -141,6 +141,20 @@ public: quantity& operator=(const quantity&) = default; quantity& operator=(quantity&&) = default; + // conversions + template + requires detail::QuantityConvertibleTo> + [[nodiscard]] constexpr quantity in(U) const + { + return quantity{*this}; + } + template + requires requires(quantity q) { value_cast(q); } + [[nodiscard]] constexpr quantity force_in(U) const + { + return value_cast(*this); + } + // data access #ifdef __cpp_explicit_this_parameter template @@ -190,13 +204,6 @@ public: return value_cast(*this).numerical_value_in(U{}); } - template - requires detail::QuantityConvertibleTo> - [[nodiscard]] constexpr quantity in(U) const - { - return quantity{*this}; - } - // member unary operators [[nodiscard]] constexpr Quantity auto operator+() const requires requires(rep v) { diff --git a/test/unit_test/static/quantity_test.cpp b/test/unit_test/static/quantity_test.cpp index 83c43c96..3d04f754 100644 --- a/test/unit_test/static/quantity_test.cpp +++ b/test/unit_test/static/quantity_test.cpp @@ -900,6 +900,10 @@ static_assert(value_cast(2000 * m).numerical_value_ref_in(km) == 2); static_assert(value_cast(1.23 * m).numerical_value_ref_in(m) == 1); static_assert(value_cast(2000.0 * m / (3600.0 * s)).numerical_value_ref_in(km / h) == 2); +static_assert((2 * km).force_in(m).numerical_value_ref_in(m) == 2000); +static_assert((2000 * m).force_in(km).numerical_value_ref_in(km) == 2); +static_assert((2000.0 * m / (3600.0 * s)).force_in(km / h).numerical_value_ref_in(km / h) == 2); + ////////////////// // quantity_cast //////////////////