feat: arithmetics on dimensionless quantities extended to units different than one

This commit is contained in:
Mateusz Pusz
2023-03-30 17:47:47 +02:00
parent 4d0d6b78a8
commit e39555e90d

View File

@@ -333,44 +333,44 @@ public:
[[nodiscard]] friend constexpr Quantity auto operator+(const quantity& lhs, const Value& rhs) [[nodiscard]] friend constexpr Quantity auto operator+(const quantity& lhs, const Value& rhs)
requires requires { // TODO: Simplify when Clang catches up. requires requires { // TODO: Simplify when Clang catches up.
requires !Quantity<Value>; requires !Quantity<Value>;
requires unit == ::mp_units::one; requires dimension == dimension_one;
requires detail::InvokeResultOf<quantity_spec.character, std::plus<>, rep, Value>; requires detail::InvokeResultOf<quantity_spec.character, std::plus<>, rep, Value>;
} }
{ {
return (lhs.number() + rhs) * R; return lhs + rhs * ::mp_units::one;
} }
template<typename Value> template<typename Value>
[[nodiscard]] friend constexpr Quantity auto operator+(const Value& lhs, const quantity& rhs) [[nodiscard]] friend constexpr Quantity auto operator+(const Value& lhs, const quantity& rhs)
requires requires { // TODO: Simplify when Clang catches up. requires requires { // TODO: Simplify when Clang catches up.
requires !Quantity<Value>; requires !Quantity<Value>;
requires unit == ::mp_units::one; requires dimension == dimension_one;
requires detail::InvokeResultOf<quantity_spec.character, std::plus<>, Value, rep>; requires detail::InvokeResultOf<quantity_spec.character, std::plus<>, Value, rep>;
} }
{ {
return (lhs + rhs.number()) * R; return lhs * ::mp_units::one + rhs;
} }
template<typename Value> template<typename Value>
[[nodiscard]] friend constexpr Quantity auto operator-(const quantity& lhs, const Value& rhs) [[nodiscard]] friend constexpr Quantity auto operator-(const quantity& lhs, const Value& rhs)
requires requires { // TODO: Simplify when Clang catches up. requires requires { // TODO: Simplify when Clang catches up.
requires !Quantity<Value>; requires !Quantity<Value>;
requires unit == ::mp_units::one; requires dimension == dimension_one;
requires detail::InvokeResultOf<quantity_spec.character, std::minus<>, rep, Value>; requires detail::InvokeResultOf<quantity_spec.character, std::minus<>, rep, Value>;
} }
{ {
return (lhs.number() - rhs) * R; return lhs - rhs * ::mp_units::one;
} }
template<typename Value> template<typename Value>
[[nodiscard]] friend constexpr Quantity auto operator-(const Value& lhs, const quantity& rhs) [[nodiscard]] friend constexpr Quantity auto operator-(const Value& lhs, const quantity& rhs)
requires requires { // TODO: Simplify when Clang catches up. requires requires { // TODO: Simplify when Clang catches up.
requires !Quantity<Value>; requires !Quantity<Value>;
requires unit == ::mp_units::one; requires dimension == dimension_one;
requires detail::InvokeResultOf<quantity_spec.character, std::minus<>, Value, rep>; requires detail::InvokeResultOf<quantity_spec.character, std::minus<>, Value, rep>;
} }
{ {
return (lhs - rhs.number()) * R; return lhs * ::mp_units::one - rhs;
} }
template<Representation Value> template<Representation Value>