refactor: make reference's interface hidden friends

Addresses:
- https://github.com/mpusz/units/pull/261#discussion_r597135187
- https://github.com/mpusz/units/pull/261#discussion_r597152408
This commit is contained in:
Johel Ernesto Guerrero Peña
2021-03-18 17:11:54 -04:00
committed by Mateusz Pusz
parent 234337d310
commit ced4b3bbed
2 changed files with 19 additions and 24 deletions

View File

@@ -404,12 +404,6 @@ template<Quantity Q1, QuantityEquivalentTo<Q1> Q2>
return ret(ret(lhs).count() - ret(rhs).count()); return ret(ret(lhs).count() - ret(rhs).count());
} }
template<QuantityValue Rep, typename D, typename U>
[[nodiscard]] constexpr Quantity auto operator*(const Rep& lhs, reference<D, U>)
{
return quantity<D, U, Rep>(lhs);
}
template<Quantity Q1, Quantity Q2> template<Quantity Q1, Quantity Q2>
requires quantity_value_for_<std::multiplies<>, typename Q1::rep, typename Q2::rep> requires quantity_value_for_<std::multiplies<>, typename Q1::rep, typename Q2::rep>
[[nodiscard]] constexpr Quantity auto operator*(const Q1& lhs, const Q2& rhs) [[nodiscard]] constexpr Quantity auto operator*(const Q1& lhs, const Q2& rhs)
@@ -417,12 +411,6 @@ template<Quantity Q1, Quantity Q2>
return detail::make_quantity<Q1::reference * Q2::reference>(lhs.count() * rhs.count()); return detail::make_quantity<Q1::reference * Q2::reference>(lhs.count() * rhs.count());
} }
template<QuantityValue Rep, typename D, typename U>
[[nodiscard]] constexpr Quantity auto operator/(const Rep& lhs, reference<D, U>)
{
return lhs / quantity<D, U, Rep>::one();
}
template<Quantity Q1, Quantity Q2> template<Quantity Q1, Quantity Q2>
requires quantity_value_for_<std::divides<>, typename Q1::rep, typename Q2::rep> requires quantity_value_for_<std::divides<>, typename Q1::rep, typename Q2::rep>
[[nodiscard]] constexpr Quantity auto operator/(const Q1& lhs, const Q2& rhs) [[nodiscard]] constexpr Quantity auto operator/(const Q1& lhs, const Q2& rhs)

View File

@@ -27,6 +27,9 @@
namespace units { namespace units {
template<Dimension D, UnitOf<D> U, QuantityValue Rep>
class quantity;
template<Dimension D, UnitOf<D> U> template<Dimension D, UnitOf<D> U>
struct reference; struct reference;
@@ -92,24 +95,28 @@ struct reference {
// Hidden Friends // Hidden Friends
// Below friend functions are to be found via argument-dependent lookup only // Below friend functions are to be found via argument-dependent lookup only
#if !UNITS_COMP_MSVC template<Reference R2>
template<QuantityValue Rep, typename D2, typename U2> [[nodiscard]] friend constexpr reference_multiply<reference, R2> operator*(reference, R2) { return {}; }
friend constexpr Quantity auto operator*(const Rep& lhs, reference<D2, U2>);
template<QuantityValue Rep, typename D2, typename U2> template<Reference R2>
friend constexpr Quantity auto operator/(const Rep& lhs, reference<D2, U2>); [[nodiscard]] friend constexpr reference_divide<reference, R2> operator/(reference, R2) { return {}; }
#endif
template<QuantityValue Rep>
[[nodiscard]] friend constexpr Quantity auto operator*(const Rep& lhs, reference)
{
return quantity<D, U, Rep>(lhs);
}
template<QuantityValue Rep>
[[nodiscard]] friend constexpr Quantity auto operator/(const Rep& lhs, reference)
{
return lhs / quantity<D, U, Rep>::one();
}
friend void /*Use `q * (1 * r)` rather than `q * r`.*/ operator*(Quantity auto, reference) = delete; friend void /*Use `q * (1 * r)` rather than `q * r`.*/ operator*(Quantity auto, reference) = delete;
friend void /*Use `q / (1 * r)` rather than `q / r`.*/ operator/(Quantity auto, reference) = delete; friend void /*Use `q / (1 * r)` rather than `q / r`.*/ operator/(Quantity auto, reference) = delete;
}; };
template<Reference R1, Reference R2>
[[nodiscard]] constexpr reference_multiply<R1, R2> operator*(R1, R2) { return {}; }
template<Reference R1, Reference R2>
[[nodiscard]] constexpr reference_divide<R1, R2> operator/(R1, R2) { return {}; }
// type traits // type traits
namespace detail { namespace detail {