From 0c69747f158a74d06a157e35169cd3d35d7162e3 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Thu, 3 Aug 2023 11:32:49 +0200 Subject: [PATCH] refactor: `quantity_point` compile-time optimizations --- src/core/include/mp-units/quantity_point.h | 24 ++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/core/include/mp-units/quantity_point.h b/src/core/include/mp-units/quantity_point.h index f86f61fb..c6788e5b 100644 --- a/src/core/include/mp-units/quantity_point.h +++ b/src/core/include/mp-units/quantity_point.h @@ -116,8 +116,8 @@ public: requires std::constructible_from constexpr explicit(!std::convertible_to) quantity_point(const QP& qp) : q_([&] { - if constexpr (std::is_same_v, - std::remove_const_t>) { + if constexpr (is_same_v, + std::remove_const_t>) { return qp.relative(); } else if constexpr (detail::is_derived_from_specialization_of_relative_point_origin< std::remove_const_t>) { @@ -144,7 +144,7 @@ public: template NewPO> [[nodiscard]] constexpr QuantityPointOf auto point_from(NewPO origin) const { - if constexpr (std::is_same_v>) { + if constexpr (is_same_v>) { return *this; } else if constexpr (detail::is_derived_from_specialization_of_relative_point_origin) { auto q = absolute() - origin.quantity_point.absolute(); @@ -276,21 +276,33 @@ template QP2> [[nodiscard]] constexpr Quantity auto operator-(const QP1& lhs, const QP2& rhs) requires requires { lhs.absolute() - rhs.absolute(); } { - return lhs.absolute() - rhs.absolute(); + if constexpr (is_same_v, + std::remove_const_t>) + return lhs.relative() - rhs.relative(); + else + return lhs.absolute() - rhs.absolute(); } template QP2> requires std::three_way_comparable_with [[nodiscard]] constexpr auto operator<=>(const QP1& lhs, const QP2& rhs) { - return lhs.absolute() <=> rhs.absolute(); + if constexpr (is_same_v, + std::remove_const_t>) + return lhs.relative() <=> rhs.relative(); + else + return lhs.absolute() <=> rhs.absolute(); } template QP2> requires std::equality_comparable_with [[nodiscard]] constexpr bool operator==(const QP1& lhs, const QP2& rhs) { - return lhs.absolute() == rhs.absolute(); + if constexpr (is_same_v, + std::remove_const_t>) + return lhs.relative() == rhs.relative(); + else + return lhs.absolute() == rhs.absolute(); } } // namespace mp_units