From 07ce64d6e7f8d984432927eb39c3dc597b7de25a Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Fri, 18 Aug 2023 18:44:52 +0200 Subject: [PATCH] refactor: `relative()` renamed to `quantity_from_origin()` Resolves #479 --- example/kalman_filter/kalman.h | 2 +- .../kalman_filter/kalman_filter-example_6.cpp | 2 +- .../kalman_filter/kalman_filter-example_7.cpp | 2 +- .../kalman_filter/kalman_filter-example_8.cpp | 2 +- .../mp-units/bits/quantity_point_concepts.h | 10 +- .../include/mp-units/customization_points.h | 4 +- src/core/include/mp-units/quantity_point.h | 39 ++-- src/utility/include/mp-units/chrono.h | 5 +- test/unit_test/static/quantity_point_test.cpp | 209 ++++++++++-------- 9 files changed, 149 insertions(+), 126 deletions(-) diff --git a/example/kalman_filter/kalman.h b/example/kalman_filter/kalman.h index 09867fa2..0d38ebaa 100644 --- a/example/kalman_filter/kalman.h +++ b/example/kalman_filter/kalman.h @@ -212,7 +212,7 @@ struct MP_UNITS_STD_FMT::formatter> { if constexpr (mp_units::Quantity) return t; else - return t.relative(); + return t.quantity_from_origin(); }(kalman::get<0>(e.state)); std::string value_buffer; diff --git a/example/kalman_filter/kalman_filter-example_6.cpp b/example/kalman_filter/kalman_filter-example_6.cpp index d60b4b9a..1c31c199 100644 --- a/example/kalman_filter/kalman_filter-example_6.cpp +++ b/example/kalman_filter/kalman_filter-example_6.cpp @@ -45,7 +45,7 @@ template K> void print(auto iteration, K gain, QP measured, kalman::estimation current, kalman::estimation next) { std::cout << MP_UNITS_STD_FMT::format("{:2} | {:7%.4Q} | {:10%.3Q %q} | {:>18.3} | {:>18.3}\n", iteration, gain, - measured.relative(), current, next); + measured.quantity_from_origin(), current, next); } int main() diff --git a/example/kalman_filter/kalman_filter-example_7.cpp b/example/kalman_filter/kalman_filter-example_7.cpp index 9e1109d8..a8b67fd8 100644 --- a/example/kalman_filter/kalman_filter-example_7.cpp +++ b/example/kalman_filter/kalman_filter-example_7.cpp @@ -45,7 +45,7 @@ template K> void print(auto iteration, K gain, QP measured, kalman::estimation current, kalman::estimation next) { std::cout << MP_UNITS_STD_FMT::format("{:2} | {:7%.4Q} | {:10%.3Q %q} | {:>18.3} | {:>18.3}\n", iteration, gain, - measured.relative(), current, next); + measured.quantity_from_origin(), current, next); } int main() diff --git a/example/kalman_filter/kalman_filter-example_8.cpp b/example/kalman_filter/kalman_filter-example_8.cpp index cd7f8222..2765a1f3 100644 --- a/example/kalman_filter/kalman_filter-example_8.cpp +++ b/example/kalman_filter/kalman_filter-example_8.cpp @@ -45,7 +45,7 @@ template K> void print(auto iteration, K gain, QP measured, kalman::estimation current, kalman::estimation next) { std::cout << MP_UNITS_STD_FMT::format("{:2} | {:7%.3Q} | {:10%.3Q %q} | {:>16.2} | {:>16.2}\n", iteration, gain, - measured.relative(), current, next); + measured.quantity_from_origin(), current, next); } int main() diff --git a/src/core/include/mp-units/bits/quantity_point_concepts.h b/src/core/include/mp-units/bits/quantity_point_concepts.h index 0b8af05f..c3808fb9 100644 --- a/src/core/include/mp-units/bits/quantity_point_concepts.h +++ b/src/core/include/mp-units/bits/quantity_point_concepts.h @@ -22,6 +22,7 @@ #pragma once +#include #include #include #include @@ -163,7 +164,7 @@ concept QuantityPointOf = * all quantity_point-specific information. */ template -concept QuantityPointLike = requires(T q) { +concept QuantityPointLike = requires(T qp) { quantity_point_like_traits::reference; quantity_point_like_traits::point_origin; typename quantity_point_like_traits::rep; @@ -171,10 +172,11 @@ concept QuantityPointLike = requires(T q) { requires PointOrigin::point_origin)>>; requires RepresentationOf::rep, get_quantity_spec(quantity_point_like_traits::reference).character>; + requires Quantity::quantity_from_origin(qp))>>; requires std::constructible_from< - typename quantity_point::reference, quantity_point_like_traits::point_origin, - typename quantity_point_like_traits::rep>::quantity_type, - decltype(quantity_point_like_traits::relative(q))>; + quantity_point::reference, quantity_point_like_traits::point_origin, + typename quantity_point_like_traits::rep>, + decltype(quantity_point_like_traits::quantity_from_origin(qp))>; }; } // namespace mp_units diff --git a/src/core/include/mp-units/customization_points.h b/src/core/include/mp-units/customization_points.h index 316d1d18..a16d158a 100644 --- a/src/core/include/mp-units/customization_points.h +++ b/src/core/include/mp-units/customization_points.h @@ -149,8 +149,8 @@ struct quantity_like_traits; * @brief Provides support for external quantity point-like types * * The type trait should provide nested @c reference and @c origin objects, - * a type alias @c rep, and a static member function @c relative(T) that will return - * the quantity-like value of the quantity point. + * a type alias @c rep, and a static member function @c quantity_from_origin(T) that will + * return the quantity being the offset of the point from the origin. * * Usage example can be found in @c units/chrono.h header file. * diff --git a/src/core/include/mp-units/quantity_point.h b/src/core/include/mp-units/quantity_point.h index 0e801d2d..41a6225b 100644 --- a/src/core/include/mp-units/quantity_point.h +++ b/src/core/include/mp-units/quantity_point.h @@ -121,7 +121,7 @@ public: q_([&] { if constexpr (is_same_v, std::remove_const_t>) { - return qp.relative(); + return qp.quantity_from_origin(); } else if constexpr (detail::is_derived_from_specialization_of_absolute_point_origin< std::remove_const_t>) { return qp.absolute(); @@ -137,7 +137,8 @@ public: std::remove_const_t> && std::convertible_to::quantity_type, quantity_type> constexpr explicit quantity_point(const QP& qp) : - q_(typename detail::quantity_point_like_type::quantity_type{quantity_point_like_traits::relative(qp)}) + q_(typename detail::quantity_point_like_type::quantity_type{ + quantity_point_like_traits::quantity_from_origin(qp)}) { } @@ -161,24 +162,24 @@ public: // data access #ifdef __cpp_explicit_this_parameter template - [[nodiscard]] constexpr auto&& relative(this Self&& self) noexcept + [[nodiscard]] constexpr auto&& quantity_from_origin(this Self&& self) noexcept { return std::forward(self).q_; } #else - [[nodiscard]] constexpr quantity_type& relative() & noexcept { return q_; } - [[nodiscard]] constexpr const quantity_type& relative() const& noexcept { return q_; } - [[nodiscard]] constexpr quantity_type&& relative() && noexcept { return std::move(q_); } - [[nodiscard]] constexpr const quantity_type&& relative() const&& noexcept { return std::move(q_); } + [[nodiscard]] constexpr quantity_type& quantity_from_origin() & noexcept { return q_; } + [[nodiscard]] constexpr const quantity_type& quantity_from_origin() const& noexcept { return q_; } + [[nodiscard]] constexpr quantity_type&& quantity_from_origin() && noexcept { return std::move(q_); } + [[nodiscard]] constexpr const quantity_type&& quantity_from_origin() const&& noexcept { return std::move(q_); } #endif [[nodiscard]] constexpr Quantity auto absolute() const noexcept { if constexpr (detail::is_derived_from_specialization_of_absolute_point_origin< std::remove_const_t>) - return relative(); + return quantity_from_origin(); else - return point_origin.quantity_point.absolute() + relative(); + return point_origin.quantity_point.absolute() + quantity_from_origin(); } template @@ -247,9 +248,9 @@ template requires ReferenceOf, get_quantity_spec(R1)> [[nodiscard]] constexpr QuantityPoint auto operator+(const quantity_point& qp, const quantity& q) - requires requires { qp.relative() + q; } + requires requires { qp.quantity_from_origin() + q; } { - auto temp = qp.relative() + q; + auto temp = qp.quantity_from_origin() + q; using q_type = decltype(temp); return quantity_point(std::move(temp)); } @@ -259,7 +260,7 @@ template requires ReferenceOf, get_quantity_spec(R2)> [[nodiscard]] constexpr QuantityPoint auto operator+(const quantity& q, const quantity_point& qp) - requires requires { q + qp.relative(); } + requires requires { q + qp.quantity_from_origin(); } { return qp + q; } @@ -283,9 +284,9 @@ template requires ReferenceOf, get_quantity_spec(R1)> [[nodiscard]] constexpr QuantityPoint auto operator-(const quantity_point& qp, const quantity& q) - requires requires { qp.relative() - q; } + requires requires { qp.quantity_from_origin() - q; } { - const auto temp = qp.relative() - q; + const auto temp = qp.quantity_from_origin() - q; using q_type = decltype(temp); return quantity_point(std::move(temp)); } @@ -306,7 +307,7 @@ template QP2> std::remove_const_t>) { constexpr auto common_qs = common_quantity_spec(QP1::quantity_spec, QP1::point_origin.quantity_spec, QP2::quantity_spec, QP2::point_origin.quantity_spec); - return quantity_cast(lhs.relative() - rhs.relative()); + return quantity_cast(lhs.quantity_from_origin() - rhs.quantity_from_origin()); } else return lhs.absolute() - rhs.absolute(); } @@ -318,12 +319,12 @@ template QP> constexpr auto common_qs = common_quantity_spec(PO::quantity_spec, QP::quantity_spec, QP::point_origin.quantity_spec); if constexpr (detail::is_derived_from_specialization_of_absolute_point_origin) { if constexpr (is_same_v, std::remove_const_t>) - return quantity_cast(qp.relative()); + return quantity_cast(qp.quantity_from_origin()); else return quantity_cast(qp.absolute()); } else { if constexpr (is_same_v, std::remove_const_t>) - return quantity_cast(qp.relative()); + return quantity_cast(qp.quantity_from_origin()); else return quantity_cast(qp.absolute() - PO::quantity_point.absolute()); } @@ -358,7 +359,7 @@ template QP2> { if constexpr (is_same_v, std::remove_const_t>) - return lhs.relative() <=> rhs.relative(); + return lhs.quantity_from_origin() <=> rhs.quantity_from_origin(); else return lhs.absolute() <=> rhs.absolute(); } @@ -369,7 +370,7 @@ template QP2> { if constexpr (is_same_v, std::remove_const_t>) - return lhs.relative() == rhs.relative(); + return lhs.quantity_from_origin() == rhs.quantity_from_origin(); else return lhs.absolute() == rhs.absolute(); } diff --git a/src/utility/include/mp-units/chrono.h b/src/utility/include/mp-units/chrono.h index 42eef599..512b5df3 100644 --- a/src/utility/include/mp-units/chrono.h +++ b/src/utility/include/mp-units/chrono.h @@ -80,9 +80,10 @@ struct quantity_point_like_traits(); static constexpr auto point_origin = chrono_point_origin; using rep = Rep; - [[nodiscard]] static constexpr auto relative(const std::chrono::time_point>& qp) + [[nodiscard]] static constexpr auto quantity_from_origin( + const std::chrono::time_point>& qp) { - return qp.time_since_epoch(); + return quantity{qp.time_since_epoch()}; } }; diff --git a/test/unit_test/static/quantity_point_test.cpp b/test/unit_test/static/quantity_point_test.cpp index 87f0b388..c171fc7d 100644 --- a/test/unit_test/static/quantity_point_test.cpp +++ b/test/unit_test/static/quantity_point_test.cpp @@ -198,15 +198,20 @@ static_assert(is_same_v::zero().relative().number() == 0); -static_assert(quantity_point::min().relative().number() == std::numeric_limits::lowest()); -static_assert(quantity_point::max().relative().number() == std::numeric_limits::max()); -static_assert(quantity_point{}, int>::zero().relative().number() == - 0); -static_assert(quantity_point{}, int>::min().relative().number() == - std::numeric_limits::lowest()); -static_assert(quantity_point{}, int>::max().relative().number() == - std::numeric_limits::max()); +static_assert(quantity_point::zero().quantity_from_origin().number() == 0); +static_assert(quantity_point::min().quantity_from_origin().number() == + std::numeric_limits::lowest()); +static_assert(quantity_point::max().quantity_from_origin().number() == + std::numeric_limits::max()); +static_assert( + quantity_point{}, int>::zero().quantity_from_origin().number() == + 0); +static_assert( + quantity_point{}, int>::min().quantity_from_origin().number() == + std::numeric_limits::lowest()); +static_assert( + quantity_point{}, int>::max().quantity_from_origin().number() == + std::numeric_limits::max()); ////////////////////////////// @@ -383,42 +388,51 @@ static_assert(!std::convertible_to>); // obtaining a relative quantity ////////////////////////////////// -static_assert(quantity_point(42 * m).relative() == 42 * m); -static_assert(quantity_point(isq::height(42 * m)).relative() == 42 * m); +static_assert(quantity_point(42 * m).quantity_from_origin() == 42 * m); +static_assert(quantity_point(isq::height(42 * m)).quantity_from_origin() == 42 * m); -static_assert(quantity_point(1 * one).relative() == 1 * one); -static_assert(quantity_point(dimensionless(1 * one)).relative() == 1 * one); +static_assert(quantity_point(1 * one).quantity_from_origin() == 1 * one); +static_assert(quantity_point(dimensionless(1 * one)).quantity_from_origin() == 1 * one); -static_assert(quantity_point(42 * m).relative() == 42 * m); -static_assert(quantity_point(42 * m).relative() == 42 * m); -static_assert(quantity_point(42 * m).relative() == 42 * m); +static_assert(quantity_point(42 * m).quantity_from_origin() == 42 * m); +static_assert(quantity_point(42 * m).quantity_from_origin() == 42 * m); +static_assert(quantity_point(42 * m).quantity_from_origin() == 42 * m); static_assert(quantity_point(quantity_point(42 * m)) - .relative() == 84 * m); + .quantity_from_origin() == 84 * m); static_assert(quantity_point(quantity_point(42 * m)) - .relative() == 126 * m); + .quantity_from_origin() == 126 * m); static_assert(quantity_point(quantity_point(84 * m)) - .relative() == 42 * m); + .quantity_from_origin() == 42 * m); static_assert(quantity_point(quantity_point(42 * m)) - .relative() == 84 * m); + .quantity_from_origin() == 84 * m); static_assert(quantity_point(quantity_point(42 * m)) - .relative() == -42 * m); + .quantity_from_origin() == -42 * m); static_assert(quantity_point(quantity_point(84 * m)) - .relative() == 42 * m); + .quantity_from_origin() == 42 * m); -static_assert(quantity_point(42 * m).point_from(mean_sea_level).relative() == 42 * m); -static_assert(quantity_point(42 * m).point_from(mean_sea_level).relative() == 84 * m); -static_assert(quantity_point(42 * m).point_from(mean_sea_level).relative() == 126 * m); +static_assert( + quantity_point(42 * m).point_from(mean_sea_level).quantity_from_origin() == 42 * m); +static_assert(quantity_point(42 * m).point_from(mean_sea_level).quantity_from_origin() == + 84 * m); +static_assert(quantity_point(42 * m).point_from(mean_sea_level).quantity_from_origin() == + 126 * m); -static_assert(quantity_point(84 * m).point_from(ground_level).relative() == 84 * m); -static_assert(quantity_point(84 * m).point_from(ground_level).relative() == 42 * m); -static_assert(quantity_point(42 * m).point_from(ground_level).relative() == 84 * m); +static_assert(quantity_point(84 * m).point_from(ground_level).quantity_from_origin() == + 84 * m); +static_assert(quantity_point(84 * m).point_from(ground_level).quantity_from_origin() == + 42 * m); +static_assert(quantity_point(42 * m).point_from(ground_level).quantity_from_origin() == + 84 * m); -static_assert(quantity_point(42 * m).point_from(tower_peak).relative() == 42 * m); -static_assert(quantity_point(42 * m).point_from(tower_peak).relative() == -42 * m); -static_assert(quantity_point(84 * m).point_from(tower_peak).relative() == 42 * m); +static_assert(quantity_point(42 * m).point_from(tower_peak).quantity_from_origin() == + 42 * m); +static_assert(quantity_point(42 * m).point_from(tower_peak).quantity_from_origin() == + -42 * m); +static_assert(quantity_point(84 * m).point_from(tower_peak).quantity_from_origin() == + 42 * m); static_assert(is_of_type(42 * m).point_from(mean_sea_level), quantity_point>); @@ -468,13 +482,15 @@ static_assert(quantity_point(84 * m).point_from(to // converting to a different unit /////////////////////////////////// -static_assert(quantity_point(2. * km)[km].relative().number() == 2.); -static_assert(quantity_point(2. * km)[m].relative().number() == 2000.); -static_assert(quantity_point(2000. * m)[km].relative().number() == 2.); -static_assert( - quantity_point{}, int>(2 * km)[km].relative().number() == 2); -static_assert( - quantity_point{}, int>(2 * km)[m].relative().number() == 2000); +static_assert(quantity_point(2. * km)[km].quantity_from_origin().number() == 2.); +static_assert(quantity_point(2. * km)[m].quantity_from_origin().number() == 2000.); +static_assert(quantity_point(2000. * m)[km].quantity_from_origin().number() == 2.); +static_assert(quantity_point{}, int>(2 * km)[km] + .quantity_from_origin() + .number() == 2); +static_assert(quantity_point{}, int>(2 * km)[m] + .quantity_from_origin() + .number() == 2000); #if MP_UNITS_COMP_GCC != 10 || MP_UNITS_COMP_GCC_MINOR > 2 template typename QP> @@ -521,18 +537,18 @@ static_assert(([]() { quantity_point l1{1 * m}, l2{2 * m}; return l2 = l1; }()) - .relative() == 1 * m); + .quantity_from_origin() == 1 * m); static_assert(([]() { const quantity_point l1{1 * m}; quantity_point l2{2 * m}; return l2 = l1; }()) - .relative() == 1 * m); + .quantity_from_origin() == 1 * m); static_assert(([]() { quantity_point l1{1 * m}, l2{2 * m}; return l2 = std::move(l1); }()) - .relative() == 1 * m); + .quantity_from_origin() == 1 * m); //////////////////// @@ -562,14 +578,14 @@ static_assert([](auto v) { //////////////////////// // same type -static_assert((quantity_point(1 * m) += 1 * m).relative().number() == 2); -static_assert((quantity_point(2 * m) -= 1 * m).relative().number() == 1); +static_assert((quantity_point(1 * m) += 1 * m).quantity_from_origin().number() == 2); +static_assert((quantity_point(2 * m) -= 1 * m).quantity_from_origin().number() == 1); // different types -static_assert((quantity_point(2.5 * m) += 3 * m).relative().number() == 5.5); -static_assert((quantity_point(123 * m) += 1 * km).relative().number() == 1123); -static_assert((quantity_point(5.5 * m) -= 3 * m).relative().number() == 2.5); -static_assert((quantity_point(1123 * m) -= 1 * km).relative().number() == 123); +static_assert((quantity_point(2.5 * m) += 3 * m).quantity_from_origin().number() == 5.5); +static_assert((quantity_point(123 * m) += 1 * km).quantity_from_origin().number() == 1123); +static_assert((quantity_point(5.5 * m) -= 3 * m).quantity_from_origin().number() == 2.5); +static_assert((quantity_point(1123 * m) -= 1 * km).quantity_from_origin().number() == 123); template typename QP> @@ -950,18 +966,21 @@ static_assert(is_of_type<(1 * m + tower_peak) - (1 * m + other_ground_level), qu // check for integral types promotion static_assert( - is_same_v); + is_same_v); static_assert( - is_same_v); + is_same_v); static_assert( - is_same_v); + is_same_v); static_assert( is_same_v); -static_assert((quantity_point{std::uint8_t(128) * m} + std::uint8_t(128) * m).relative().number() == +static_assert((quantity_point{std::uint8_t(128) * m} + std::uint8_t(128) * m).quantity_from_origin().number() == std::uint8_t(128) + std::uint8_t(128)); -static_assert((std::uint8_t(128) * m + quantity_point{std::uint8_t(128) * m}).relative().number() == +static_assert((std::uint8_t(128) * m + quantity_point{std::uint8_t(128) * m}).quantity_from_origin().number() == std::uint8_t(128) + std::uint8_t(128)); -static_assert((quantity_point{std::uint8_t(0) * m} - std::uint8_t(1) * m).relative().number() == +static_assert((quantity_point{std::uint8_t(0) * m} - std::uint8_t(1) * m).quantity_from_origin().number() == std::uint8_t(0) - std::uint8_t(1)); static_assert((quantity_point{std::uint8_t(0) * m} - quantity_point{std::uint8_t(1) * m}).number() == std::uint8_t(0) - std::uint8_t(1)); @@ -1051,32 +1070,32 @@ static_assert(is_of_type>); -static_assert((quantity_point{1 * m} + 1 * m).relative().number() == 2); -static_assert((1 * m + quantity_point{1 * m}).relative().number() == 2); -static_assert((quantity_point{1 * m} + 1 * km).relative().number() == 1001); -static_assert((1 * m + quantity_point{1 * km}).relative().number() == 1001); -static_assert((quantity_point{1 * km} + 1 * m).relative().number() == 1001); -static_assert((1 * km + quantity_point{1 * m}).relative().number() == 1001); -static_assert((quantity_point{2 * m} - 1 * m).relative().number() == 1); -static_assert((quantity_point{1 * km} - 1 * m).relative().number() == 999); +static_assert((quantity_point{1 * m} + 1 * m).quantity_from_origin().number() == 2); +static_assert((1 * m + quantity_point{1 * m}).quantity_from_origin().number() == 2); +static_assert((quantity_point{1 * m} + 1 * km).quantity_from_origin().number() == 1001); +static_assert((1 * m + quantity_point{1 * km}).quantity_from_origin().number() == 1001); +static_assert((quantity_point{1 * km} + 1 * m).quantity_from_origin().number() == 1001); +static_assert((1 * km + quantity_point{1 * m}).quantity_from_origin().number() == 1001); +static_assert((quantity_point{2 * m} - 1 * m).quantity_from_origin().number() == 1); +static_assert((quantity_point{1 * km} - 1 * m).quantity_from_origin().number() == 999); -static_assert((quantity_point{1.5 * m} + 1 * m).relative().number() == 2.5); -static_assert((1.5 * m + quantity_point{1 * m}).relative().number() == 2.5); -static_assert((quantity_point{1.5 * m} + 1 * km).relative().number() == 1001.5); -static_assert((1.5 * m + quantity_point{1 * km}).relative().number() == 1001.5); -static_assert((quantity_point{1.5 * km} + 1 * m).relative().number() == 1501); -static_assert((1.5 * km + quantity_point{1 * m}).relative().number() == 1501); -static_assert((quantity_point{2.5 * m} - 1 * m).relative().number() == 1.5); -static_assert((quantity_point{1.5 * km} - 1 * m).relative().number() == 1499); +static_assert((quantity_point{1.5 * m} + 1 * m).quantity_from_origin().number() == 2.5); +static_assert((1.5 * m + quantity_point{1 * m}).quantity_from_origin().number() == 2.5); +static_assert((quantity_point{1.5 * m} + 1 * km).quantity_from_origin().number() == 1001.5); +static_assert((1.5 * m + quantity_point{1 * km}).quantity_from_origin().number() == 1001.5); +static_assert((quantity_point{1.5 * km} + 1 * m).quantity_from_origin().number() == 1501); +static_assert((1.5 * km + quantity_point{1 * m}).quantity_from_origin().number() == 1501); +static_assert((quantity_point{2.5 * m} - 1 * m).quantity_from_origin().number() == 1.5); +static_assert((quantity_point{1.5 * km} - 1 * m).quantity_from_origin().number() == 1499); -static_assert((quantity_point{1 * m} + 1.5 * m).relative().number() == 2.5); -static_assert((1 * m + quantity_point{1.5 * m}).relative().number() == 2.5); -static_assert((quantity_point{1 * m} + 1.5 * km).relative().number() == 1501); -static_assert((1 * m + quantity_point{1.5 * km}).relative().number() == 1501); -static_assert((quantity_point{1 * km} + 1.5 * m).relative().number() == 1001.5); -static_assert((1 * km + quantity_point{1.5 * m}).relative().number() == 1001.5); -static_assert((quantity_point{2 * m} - 1.5 * m).relative().number() == 0.5); -static_assert((quantity_point{1 * km} - 1.5 * m).relative().number() == 998.5); +static_assert((quantity_point{1 * m} + 1.5 * m).quantity_from_origin().number() == 2.5); +static_assert((1 * m + quantity_point{1.5 * m}).quantity_from_origin().number() == 2.5); +static_assert((quantity_point{1 * m} + 1.5 * km).quantity_from_origin().number() == 1501); +static_assert((1 * m + quantity_point{1.5 * km}).quantity_from_origin().number() == 1501); +static_assert((quantity_point{1 * km} + 1.5 * m).quantity_from_origin().number() == 1001.5); +static_assert((1 * km + quantity_point{1.5 * m}).quantity_from_origin().number() == 1001.5); +static_assert((quantity_point{2 * m} - 1.5 * m).quantity_from_origin().number() == 0.5); +static_assert((quantity_point{1 * km} - 1.5 * m).quantity_from_origin().number() == 998.5); static_assert((quantity_point{2 * m} - quantity_point{1 * m}).number() == 1); static_assert((quantity_point{1 * km} - quantity_point{1 * m}).number() == 999); @@ -1098,18 +1117,18 @@ static_assert(quantity_point(42 * m, tower_peak) - quantity_point(42 * m, other_ // commutativity and associativity -static_assert((quantity_point{10 * isq::length[si::metre] / (2 * isq::time[s])} + 5 * isq::speed[m / s]).relative() == - 10 * isq::speed[m / s]); -static_assert((10 * isq::length[si::metre] / (2 * isq::time[s]) + quantity_point{5 * isq::speed[m / s]}).relative() == - 10 * isq::speed[m / s]); -static_assert((quantity_point{5 * isq::speed[m / s]} + 10 * isq::length[m] / (2 * isq::time[s])).relative() == - 10 * isq::speed[m / s]); -static_assert((5 * isq::speed[m / s] + quantity_point{10 * isq::length[m] / (2 * isq::time[s])}).relative() == - 10 * isq::speed[m / s]); -static_assert((quantity_point{10 * isq::length[m] / (2 * isq::time[s])} - 5 * isq::speed[m / s]).relative() == - 0 * isq::speed[m / s]); -static_assert((quantity_point{5 * isq::speed[m / s]} - 10 * isq::length[m] / (2 * isq::time[s])).relative() == - 0 * isq::speed[m / s]); +static_assert((quantity_point{10 * isq::length[si::metre] / (2 * isq::time[s])} + 5 * isq::speed[m / s]) + .quantity_from_origin() == 10 * isq::speed[m / s]); +static_assert((10 * isq::length[si::metre] / (2 * isq::time[s]) + quantity_point{5 * isq::speed[m / s]}) + .quantity_from_origin() == 10 * isq::speed[m / s]); +static_assert((quantity_point{5 * isq::speed[m / s]} + 10 * isq::length[m] / (2 * isq::time[s])) + .quantity_from_origin() == 10 * isq::speed[m / s]); +static_assert((5 * isq::speed[m / s] + quantity_point{10 * isq::length[m] / (2 * isq::time[s])}) + .quantity_from_origin() == 10 * isq::speed[m / s]); +static_assert((quantity_point{10 * isq::length[m] / (2 * isq::time[s])} - 5 * isq::speed[m / s]) + .quantity_from_origin() == 0 * isq::speed[m / s]); +static_assert((quantity_point{5 * isq::speed[m / s]} - 10 * isq::length[m] / (2 * isq::time[s])) + .quantity_from_origin() == 0 * isq::speed[m / s]); static_assert(quantity_point{10 * isq::length[m] / (2 * isq::time[s])} - quantity_point{5 * isq::speed[m / s]} == 0 * isq::speed[m / s]); static_assert(quantity_point{5 * isq::speed[m / s]} - quantity_point{10 * isq::length[m] / (2 * isq::time[s])} == @@ -1136,17 +1155,17 @@ static_assert( quantity>); // NOTE: 1 / isq::time[s] works for quantities but not for quantity_point (origin can't be weakened) -static_assert((quantity_point{10 / (2 * isq::period_duration[s])} + 5 * isq::frequency[Hz]).relative() == +static_assert((quantity_point{10 / (2 * isq::period_duration[s])} + 5 * isq::frequency[Hz]).quantity_from_origin() == 10 * isq::frequency[Hz]); -static_assert((10 / (2 * isq::period_duration[s]) + quantity_point{5 * isq::frequency[Hz]}).relative() == +static_assert((10 / (2 * isq::period_duration[s]) + quantity_point{5 * isq::frequency[Hz]}).quantity_from_origin() == 10 * isq::frequency[Hz]); -static_assert((quantity_point{5 * isq::frequency[Hz]} + 10 / (2 * isq::period_duration[s])).relative() == +static_assert((quantity_point{5 * isq::frequency[Hz]} + 10 / (2 * isq::period_duration[s])).quantity_from_origin() == 10 * isq::frequency[Hz]); -static_assert((5 * isq::frequency[Hz] + quantity_point{10 / (2 * isq::period_duration[s])}).relative() == +static_assert((5 * isq::frequency[Hz] + quantity_point{10 / (2 * isq::period_duration[s])}).quantity_from_origin() == 10 * isq::frequency[Hz]); -static_assert((quantity_point{10 / (2 * isq::period_duration[s])} - 5 * isq::frequency[Hz]).relative() == +static_assert((quantity_point{10 / (2 * isq::period_duration[s])} - 5 * isq::frequency[Hz]).quantity_from_origin() == 0 * isq::frequency[Hz]); -static_assert((quantity_point{5 * isq::frequency[Hz]} - 10 / (2 * isq::period_duration[s])).relative() == +static_assert((quantity_point{5 * isq::frequency[Hz]} - 10 / (2 * isq::period_duration[s])).quantity_from_origin() == 0 * isq::frequency[Hz]); static_assert(quantity_point{10 / (2 * isq::period_duration[s])} - quantity_point{5 * isq::frequency[Hz]} == 0 * isq::frequency[Hz]);