diff --git a/src/core/include/mp-units/framework/quantity.h b/src/core/include/mp-units/framework/quantity.h index bd412072..d2acd5f6 100644 --- a/src/core/include/mp-units/framework/quantity.h +++ b/src/core/include/mp-units/framework/quantity.h @@ -463,9 +463,9 @@ public: } // binary operators on quantities - template + template Q, auto R2, typename Rep2> requires detail::CommonlyInvocableQuantities, quantity, quantity> - [[nodiscard]] friend constexpr Quantity auto operator+(const quantity& lhs, const quantity& rhs) + [[nodiscard]] friend constexpr Quantity auto operator+(const Q& lhs, const quantity& rhs) { using ret = detail::common_quantity_for, quantity, quantity>; const ret ret_lhs(lhs); @@ -474,9 +474,9 @@ public: ret::reference}; } - template + template Q, auto R2, typename Rep2> requires detail::CommonlyInvocableQuantities, quantity, quantity> - [[nodiscard]] friend constexpr Quantity auto operator-(const quantity& lhs, const quantity& rhs) + [[nodiscard]] friend constexpr Quantity auto operator-(const Q& lhs, const quantity& rhs) { using ret = detail::common_quantity_for, quantity, quantity>; const ret ret_lhs(lhs); @@ -485,10 +485,10 @@ public: ret::reference}; } - template + template Q, auto R2, typename Rep2> requires(!treat_as_floating_point) && (!treat_as_floating_point) && detail::CommonlyInvocableQuantities, quantity, quantity> - [[nodiscard]] friend constexpr Quantity auto operator%(const quantity& lhs, const quantity& rhs) + [[nodiscard]] friend constexpr Quantity auto operator%(const Q& lhs, const quantity& rhs) { MP_UNITS_EXPECTS_DEBUG(rhs != rhs.zero()); using ret = detail::common_quantity_for, quantity, quantity>; @@ -498,58 +498,58 @@ public: ret::reference}; } - template + template Q, auto R2, typename Rep2> requires detail::InvocableQuantities, quantity, quantity> - [[nodiscard]] friend constexpr Quantity auto operator*(const quantity& lhs, const quantity& rhs) + [[nodiscard]] friend constexpr Quantity auto operator*(const Q& lhs, const quantity& rhs) { return ::mp_units::quantity{lhs.numerical_value_ref_in(unit) * rhs.numerical_value_ref_in(rhs.unit), R * R2}; } - template + template Q, typename Value> requires(!Quantity) && (!Reference) && detail::InvokeResultOf, Rep, const Value&> - [[nodiscard]] friend constexpr QuantityOf auto operator*(const quantity& q, const Value& v) + [[nodiscard]] friend constexpr QuantityOf auto operator*(const Q& q, const Value& v) { return ::mp_units::quantity{q.numerical_value_ref_in(unit) * v, R}; } - template + template Q> requires(!Quantity) && (!Reference) && detail::InvokeResultOf, const Value&, Rep> - [[nodiscard]] friend constexpr QuantityOf auto operator*(const Value& v, const quantity& q) + [[nodiscard]] friend constexpr QuantityOf auto operator*(const Value& v, const Q& q) { return ::mp_units::quantity{v * q.numerical_value_ref_in(unit), R}; } - template + template Q, auto R2, typename Rep2> requires detail::InvocableQuantities, quantity, quantity> - [[nodiscard]] friend constexpr Quantity auto operator/(const quantity& lhs, const quantity& rhs) + [[nodiscard]] friend constexpr Quantity auto operator/(const Q& lhs, const quantity& rhs) { MP_UNITS_EXPECTS_DEBUG(rhs != rhs.zero()); return ::mp_units::quantity{lhs.numerical_value_ref_in(unit) / rhs.numerical_value_ref_in(rhs.unit), R / R2}; } - template + template Q, typename Value> requires(!Quantity) && (!Reference) && detail::InvokeResultOf, Rep, const Value&> - [[nodiscard]] friend constexpr QuantityOf auto operator/(const quantity& q, const Value& v) + [[nodiscard]] friend constexpr QuantityOf auto operator/(const Q& q, const Value& v) { MP_UNITS_EXPECTS_DEBUG(v != quantity_values::zero()); return ::mp_units::quantity{q.numerical_value_ref_in(unit) / v, R}; } - template + template Q> requires(!Quantity) && (!Reference) && detail::InvokeResultOf, const Value&, Rep> - [[nodiscard]] friend constexpr QuantityOf auto operator/(const Value& v, const quantity& q) + [[nodiscard]] friend constexpr QuantityOf auto operator/(const Value& v, const Q& q) { return ::mp_units::quantity{v / q.numerical_value_ref_in(unit), ::mp_units::one / R}; } - template + template Q, auto R2, typename Rep2> requires requires { typename std::common_type_t>; } && std::equality_comparable>::rep> - [[nodiscard]] friend constexpr bool operator==(const quantity& lhs, const quantity& rhs) + [[nodiscard]] friend constexpr bool operator==(const Q& lhs, const quantity& rhs) { using ct = std::common_type_t>; const ct ct_lhs(lhs); @@ -557,10 +557,10 @@ public: return ct_lhs.numerical_value_ref_in(ct::unit) == ct_rhs.numerical_value_ref_in(ct::unit); } - template + template Q, auto R2, typename Rep2> requires requires { typename std::common_type_t>; } && std::three_way_comparable>::rep> - [[nodiscard]] friend constexpr auto operator<=>(const quantity& lhs, const quantity& rhs) + [[nodiscard]] friend constexpr auto operator<=>(const Q& lhs, const quantity& rhs) { using ct = std::common_type_t>; const ct ct_lhs(lhs); diff --git a/src/core/include/mp-units/framework/quantity_point.h b/src/core/include/mp-units/framework/quantity_point.h index 97d358fc..d9395df3 100644 --- a/src/core/include/mp-units/framework/quantity_point.h +++ b/src/core/include/mp-units/framework/quantity_point.h @@ -415,10 +415,10 @@ public: } // binary operators on quantity points - template + template QP, auto R2, typename Rep2> // TODO simplify when gcc catches up requires ReferenceOf - [[nodiscard]] friend constexpr QuantityPoint auto operator+(const quantity_point& qp, const quantity& q) + [[nodiscard]] friend constexpr QuantityPoint auto operator+(const QP& qp, const quantity& q) requires requires { qp.quantity_ref_from(PO) + q; } { if constexpr (detail::is_zeroth_point_origin(PO)) @@ -427,19 +427,19 @@ public: return ::mp_units::quantity_point{qp.quantity_ref_from(PO) + q, PO}; } - template + template QP> // TODO simplify when gcc catches up requires ReferenceOf - [[nodiscard]] friend constexpr QuantityPoint auto operator+(const quantity& q, const quantity_point& qp) + [[nodiscard]] friend constexpr QuantityPoint auto operator+(const quantity& q, const QP& qp) requires requires { q + qp.quantity_ref_from(PO); } { return qp + q; } - template + template QP, auto R2, typename Rep2> // TODO simplify when gcc catches up requires ReferenceOf - [[nodiscard]] friend constexpr QuantityPoint auto operator-(const quantity_point& qp, const quantity& q) + [[nodiscard]] friend constexpr QuantityPoint auto operator-(const QP& qp, const quantity& q) requires requires { qp.quantity_ref_from(PO) - q; } { if constexpr (detail::is_zeroth_point_origin(PO)) @@ -448,8 +448,8 @@ public: return ::mp_units::quantity_point{qp.quantity_ref_from(PO) - q, PO}; } - template QP2> - [[nodiscard]] friend constexpr Quantity auto operator-(const quantity_point& lhs, const QP2& rhs) + template QP, QuantityPointOf QP2> + [[nodiscard]] friend constexpr Quantity auto operator-(const QP& lhs, const QP2& rhs) // TODO consider constraining it for both branches requires requires { lhs.quantity_ref_from(point_origin) - rhs.quantity_ref_from(QP2::point_origin); } { @@ -460,10 +460,10 @@ public: (lhs.point_origin - rhs.point_origin); } - template + template QP, PointOrigin PO2> requires QuantityPointOf && ReferenceOf, PO2::quantity_spec> - [[nodiscard]] friend constexpr Quantity auto operator-(const quantity_point& qp, PO2 po) + [[nodiscard]] friend constexpr Quantity auto operator-(const QP& qp, PO2 po) { if constexpr (point_origin == po) return qp.quantity_ref_from(point_origin); @@ -482,17 +482,17 @@ public: } } - template + template QP> requires QuantityPointOf && ReferenceOf, PO1::quantity_spec> - [[nodiscard]] friend constexpr Quantity auto operator-(PO1 po, const quantity_point& qp) + [[nodiscard]] friend constexpr Quantity auto operator-(PO1 po, const QP& qp) { return -(qp - po); } - template QP2> + template QP, QuantityPointOf QP2> requires std::equality_comparable_with - [[nodiscard]] friend constexpr bool operator==(const quantity_point& lhs, const QP2& rhs) + [[nodiscard]] friend constexpr bool operator==(const QP& lhs, const QP2& rhs) { if constexpr (point_origin == QP2::point_origin) return lhs.quantity_ref_from(point_origin) == rhs.quantity_ref_from(QP2::point_origin); @@ -500,9 +500,9 @@ public: return lhs - lhs.absolute_point_origin == rhs - rhs.absolute_point_origin; } - template QP2> + template QP, QuantityPointOf QP2> requires std::three_way_comparable_with - [[nodiscard]] friend constexpr auto operator<=>(const quantity_point& lhs, const QP2& rhs) + [[nodiscard]] friend constexpr auto operator<=>(const QP& lhs, const QP2& rhs) { if constexpr (point_origin == QP2::point_origin) return lhs.quantity_ref_from(point_origin) <=> rhs.quantity_ref_from(QP2::point_origin);