diff --git a/src/core/include/mp-units/framework/quantity.h b/src/core/include/mp-units/framework/quantity.h index 1017693b..bd412072 100644 --- a/src/core/include/mp-units/framework/quantity.h +++ b/src/core/include/mp-units/framework/quantity.h @@ -99,6 +99,9 @@ using common_quantity_for = quantity concept SameValueAs = detail::SameReference && std::same_as; +template +using quantity_like_type = quantity::reference, typename quantity_like_traits::rep>; + } // namespace detail MP_UNITS_EXPORT_BEGIN @@ -177,8 +180,7 @@ public: } template - requires detail::QuantityConvertibleTo< - quantity::reference, typename quantity_like_traits::rep>, quantity> + requires detail::QuantityConvertibleTo, quantity> constexpr explicit(is_specialization_of::to_numerical_value(std::declval())), convert_explicitly> || // NOLINTNEXTLINE(google-explicit-constructor, hicpp-explicit-conversions) @@ -199,14 +201,14 @@ public: return quantity{*this}; } - template ToRep> + template ToRep> requires detail::QuantityConvertibleTo> [[nodiscard]] constexpr QuantityOf auto in() const { return quantity{*this}; } - template ToRep, detail::UnitCompatibleWith ToU> + template ToRep, detail::UnitCompatibleWith ToU> requires detail::QuantityConvertibleTo> [[nodiscard]] constexpr QuantityOf auto in(ToU) const { @@ -220,14 +222,14 @@ public: return value_cast(*this); } - template ToRep> + template ToRep> requires requires(quantity q) { value_cast(q); } [[nodiscard]] constexpr QuantityOf auto force_in() const { return value_cast(*this); } - template ToRep, detail::UnitCompatibleWith ToU> + template ToRep, detail::UnitCompatibleWith ToU> requires requires(quantity q) { value_cast(q); } [[nodiscard]] constexpr QuantityOf auto force_in(ToU) const { @@ -274,8 +276,7 @@ public: // conversion operators template> - requires detail::QuantityConvertibleTo< - quantity, quantity::reference, typename quantity_like_traits::rep>> + requires detail::QuantityConvertibleTo> [[nodiscard]] explicit(is_specialization_of::from_numerical_value( numerical_value_is_an_implementation_detail_)), convert_explicitly> || @@ -289,8 +290,7 @@ public: } template> - requires detail::QuantityConvertibleTo< - quantity, quantity::reference, typename quantity_like_traits::rep>> + requires detail::QuantityConvertibleTo> [[nodiscard]] explicit(is_specialization_of::from_numerical_value( numerical_value_is_an_implementation_detail_)), convert_explicitly> || @@ -502,24 +502,23 @@ public: requires detail::InvocableQuantities, quantity, quantity> [[nodiscard]] friend constexpr Quantity auto operator*(const quantity& lhs, const quantity& rhs) { - return ::mp_units::quantity{lhs.numerical_value_ref_in(get_unit(R)) * rhs.numerical_value_ref_in(get_unit(R2)), - R * R2}; + return ::mp_units::quantity{lhs.numerical_value_ref_in(unit) * rhs.numerical_value_ref_in(rhs.unit), R * R2}; } template - requires(!Quantity) && (!Reference) && - detail::InvokeResultOf, Rep, const Value&> - [[nodiscard]] friend constexpr QuantityOf auto operator*(const quantity& q, const Value& v) + requires(!Quantity) && + (!Reference) && detail::InvokeResultOf, Rep, const Value&> + [[nodiscard]] friend constexpr QuantityOf auto operator*(const quantity& q, const Value& v) { - return ::mp_units::quantity{q.numerical_value_ref_in(get_unit(R)) * v, R}; + return ::mp_units::quantity{q.numerical_value_ref_in(unit) * v, R}; } template - requires(!Quantity) && (!Reference) && - detail::InvokeResultOf, const Value&, Rep> - [[nodiscard]] friend constexpr QuantityOf auto operator*(const Value& v, const quantity& q) + requires(!Quantity) && + (!Reference) && detail::InvokeResultOf, const Value&, Rep> + [[nodiscard]] friend constexpr QuantityOf auto operator*(const Value& v, const quantity& q) { - return ::mp_units::quantity{v * q.numerical_value_ref_in(get_unit(R)), R}; + return ::mp_units::quantity{v * q.numerical_value_ref_in(unit), R}; } template @@ -527,26 +526,24 @@ public: [[nodiscard]] friend constexpr Quantity auto operator/(const quantity& lhs, const quantity& rhs) { MP_UNITS_EXPECTS_DEBUG(rhs != rhs.zero()); - return ::mp_units::quantity{lhs.numerical_value_ref_in(get_unit(R)) / rhs.numerical_value_ref_in(get_unit(R2)), - R / R2}; + return ::mp_units::quantity{lhs.numerical_value_ref_in(unit) / rhs.numerical_value_ref_in(rhs.unit), R / R2}; } template - requires(!Quantity) && (!Reference) && - detail::InvokeResultOf, Rep, const Value&> - [[nodiscard]] friend constexpr QuantityOf auto operator/(const quantity& q, const Value& v) + requires(!Quantity) && + (!Reference) && detail::InvokeResultOf, Rep, const Value&> + [[nodiscard]] friend constexpr QuantityOf auto operator/(const quantity& q, const Value& v) { MP_UNITS_EXPECTS_DEBUG(v != quantity_values::zero()); - return ::mp_units::quantity{q.numerical_value_ref_in(get_unit(R)) / v, R}; + return ::mp_units::quantity{q.numerical_value_ref_in(unit) / v, R}; } template - requires(!Quantity) && (!Reference) && - detail::InvokeResultOf, const Value&, Rep> - [[nodiscard]] friend constexpr QuantityOf auto operator/(const Value& v, - const quantity& q) + requires(!Quantity) && + (!Reference) && detail::InvokeResultOf, const Value&, Rep> + [[nodiscard]] friend constexpr QuantityOf auto operator/(const Value& v, const quantity& q) { - return ::mp_units::quantity{v / q.numerical_value_ref_in(get_unit(R)), ::mp_units::one / R}; + return ::mp_units::quantity{v / q.numerical_value_ref_in(unit), ::mp_units::one / R}; } template diff --git a/src/core/include/mp-units/framework/quantity_point.h b/src/core/include/mp-units/framework/quantity_point.h index 8dbfdc48..97d358fc 100644 --- a/src/core/include/mp-units/framework/quantity_point.h +++ b/src/core/include/mp-units/framework/quantity_point.h @@ -159,14 +159,14 @@ public: ~quantity_point() = default; template - requires QuantityOf, get_quantity_spec(R)> && std::constructible_from && + requires QuantityOf, quantity_spec> && std::constructible_from && (point_origin == default_point_origin(R)) && (implicitly_convertible(Q::quantity_spec, quantity_spec)) constexpr explicit quantity_point(Q&& q) : quantity_from_origin_is_an_implementation_detail_(std::forward(q)) { } template - requires QuantityOf, get_quantity_spec(R)> && std::constructible_from + requires QuantityOf, quantity_spec> && std::constructible_from constexpr quantity_point(Q&& q, decltype(PO)) : quantity_from_origin_is_an_implementation_detail_(std::forward(q)) { } @@ -284,14 +284,14 @@ public: return ::mp_units::quantity_point{quantity_ref_from(PO).in(ToU{}), PO}; } - template ToRep> + template ToRep> requires detail::QuantityConvertibleTo> [[nodiscard]] constexpr QuantityPointOf auto in() const { return ::mp_units::quantity_point{quantity_ref_from(PO).template in(), PO}; } - template ToRep, detail::UnitCompatibleWith ToU> + template ToRep, detail::UnitCompatibleWith ToU> requires detail::QuantityConvertibleTo> [[nodiscard]] constexpr QuantityPointOf auto in(ToU) const { @@ -305,14 +305,14 @@ public: return ::mp_units::quantity_point{quantity_ref_from(PO).force_in(ToU{}), PO}; } - template ToRep> + template ToRep> requires requires(quantity_type q) { value_cast(q); } [[nodiscard]] constexpr QuantityPointOf auto force_in() const { return ::mp_units::quantity_point{quantity_ref_from(PO).template force_in(), PO}; } - template ToRep, detail::UnitCompatibleWith ToU> + template ToRep, detail::UnitCompatibleWith ToU> requires requires(quantity_type q) { value_cast(q); } [[nodiscard]] constexpr QuantityPointOf auto force_in(ToU) const {