From b12b9f87ae275a51876bb14702a22cb2e573e24d Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Sat, 30 Sep 2023 22:14:20 -0600 Subject: [PATCH] feat: `quantity` and `quantity_point` conversion operators now can also convert to const references --- src/core/include/mp-units/quantity.h | 10 ++++++---- src/core/include/mp-units/quantity_point.h | 9 ++++++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/core/include/mp-units/quantity.h b/src/core/include/mp-units/quantity.h index f9fae4d7..afc1ad2b 100644 --- a/src/core/include/mp-units/quantity.h +++ b/src/core/include/mp-units/quantity.h @@ -143,7 +143,7 @@ public: quantity& operator=(const quantity&) = default; quantity& operator=(quantity&&) = default; - // conversions + // unit conversions template U> requires detail::QuantityConvertibleTo> [[nodiscard]] constexpr Quantity auto in(U) const @@ -192,7 +192,8 @@ public: } // conversion operators - template + template + requires QuantityLike> [[nodiscard]] explicit(is_specialization_of::from_numerical_value(numerical_value_)), convert_explicitly>) constexpr operator Q() const& noexcept(noexcept(quantity_like_traits::from_numerical_value(numerical_value_)) && @@ -201,11 +202,12 @@ public: return quantity_like_traits::from_numerical_value(numerical_value_).value; } - template + template + requires QuantityLike> [[nodiscard]] explicit(is_specialization_of::from_numerical_value(numerical_value_)), convert_explicitly>) constexpr operator Q() && noexcept(noexcept(quantity_like_traits::from_numerical_value(numerical_value_)) && - std::is_nothrow_move_constructible_v) + std::is_nothrow_move_constructible_v) { return quantity_like_traits::from_numerical_value(std::move(numerical_value_)).value; } diff --git a/src/core/include/mp-units/quantity_point.h b/src/core/include/mp-units/quantity_point.h index 068a4a40..3095d0fb 100644 --- a/src/core/include/mp-units/quantity_point.h +++ b/src/core/include/mp-units/quantity_point.h @@ -170,6 +170,7 @@ public: return *this - PO2{}; } + // unit conversions template U> requires detail::QuantityConvertibleTo> [[nodiscard]] constexpr QuantityPoint auto in(U) const @@ -185,7 +186,8 @@ public: } // conversion operators - template + template + requires QuantityPointLike> [[nodiscard]] explicit( is_specialization_of::from_quantity(quantity_from_origin_)), convert_explicitly>) constexpr @@ -195,12 +197,13 @@ public: return quantity_point_like_traits::from_quantity(quantity_from_origin_).value; } - template + template + requires QuantityPointLike> [[nodiscard]] explicit( is_specialization_of::from_quantity(quantity_from_origin_)), convert_explicitly>) constexpr operator QP() && noexcept(noexcept(quantity_point_like_traits::from_quantity(quantity_from_origin_)) && - std::is_nothrow_move_constructible_v) + std::is_nothrow_move_constructible_v) { return quantity_point_like_traits::from_quantity(std::move(quantity_from_origin_)).value; }