From fe099b5ad1109b86633716a396eca5fc9d5f31d0 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 21 Dec 2023 12:25:09 +0100 Subject: [PATCH] feat: propagation of point origins for scaled units added --- src/core/include/mp-units/unit.h | 14 +++++++++++++- test/unit_test/static/quantity_point_test.cpp | 10 ++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/core/include/mp-units/unit.h b/src/core/include/mp-units/unit.h index 90ecc0ac..f03257b4 100644 --- a/src/core/include/mp-units/unit.h +++ b/src/core/include/mp-units/unit.h @@ -40,6 +40,18 @@ namespace mp_units { +namespace detail { + +template +struct propagate_point_origin {}; + +template +struct propagate_point_origin { + static constexpr auto point_origin = U::point_origin; +}; + +} // namespace detail + /** * @brief Unit being a scaled version of another unit * @@ -50,7 +62,7 @@ namespace mp_units { * instantiate this type automatically based on the unit arithmetic equation provided by the user. */ template -struct scaled_unit { +struct scaled_unit : detail::propagate_point_origin { static constexpr MP_UNITS_CONSTRAINED_AUTO_WORKAROUND(Magnitude) auto mag = M; static constexpr U reference_unit{}; }; diff --git a/test/unit_test/static/quantity_point_test.cpp b/test/unit_test/static/quantity_point_test.cpp index 2e4dfc85..ac0e6b9a 100644 --- a/test/unit_test/static/quantity_point_test.cpp +++ b/test/unit_test/static/quantity_point_test.cpp @@ -106,6 +106,16 @@ static_assert(relative_po + isq::height(42 * m)>.quanti static_assert(relative_po> + isq::height(42 * m)>.quantity_spec == isq::height); static_assert(relative_po + 42 * m>.quantity_spec == isq::height); +inline constexpr struct my_kelvin : named_unit<"my_K", mag<10> * si::kelvin> { +} my_kelvin; + +static_assert(zeroth_point_origin(si::kelvin) == si::absolute_zero); +static_assert(zeroth_point_origin(si::milli) == si::absolute_zero); +static_assert(zeroth_point_origin(mag<10> * si::kelvin) == si::absolute_zero); +static_assert(zeroth_point_origin(my_kelvin) == si::absolute_zero); + +static_assert(zeroth_point_origin(si::degree_Celsius) == si::ice_point); +static_assert(zeroth_point_origin(mag<10> * si::degree_Celsius) == si::ice_point); ///////////////////// // class invariants