diff --git a/src/core/include/units/reference.h b/src/core/include/units/reference.h index e316d41a..d64d74b0 100644 --- a/src/core/include/units/reference.h +++ b/src/core/include/units/reference.h @@ -27,6 +27,31 @@ namespace units { +template U> +struct reference; + +namespace detail { + +template +using reference_multiply_impl = reference::ratio) * (U2::ratio / dimension_unit::ratio) * dimension_unit::ratio>>; + +template +using reference_divide_impl = reference::ratio) / (U2::ratio / dimension_unit::ratio) * dimension_unit::ratio>>; + +} // namespace detail + +template +using reference_multiply = detail::reference_multiply_impl< + dimension_multiply, + typename R1::dimension, typename R1::unit, typename R2::dimension, typename R2::unit>; + +template +using reference_divide = detail::reference_divide_impl< + dimension_divide, + typename R1::dimension, typename R1::unit, typename R2::dimension, typename R2::unit>; + /** * @brief The type for unit constants * @@ -63,37 +88,19 @@ template U> struct reference { using dimension = D; using unit = U; + + template + requires Quantity || QuantityValue + friend constexpr Quantity auto operator*(const QuantityOrQuantityValue& lhs, reference); + + template + requires Quantity || QuantityValue + friend constexpr Quantity auto operator/(const QuantityOrQuantityValue& lhs, reference); }; -namespace detail { - -template -using reference_multiply_impl = reference::ratio) * (U2::ratio / dimension_unit::ratio) * dimension_unit::ratio>>; - -} // namespace detail - -template -using reference_multiply = detail::reference_multiply_impl< - dimension_multiply, - typename R1::dimension, typename R1::unit, typename R2::dimension, typename R2::unit>; - template [[nodiscard]] constexpr reference_multiply operator*(R1, R2) { return {}; } -namespace detail { - -template -using reference_divide_impl = reference::ratio) / (U2::ratio / dimension_unit::ratio) * dimension_unit::ratio>>; - -} // namespace detail - -template -using reference_divide = detail::reference_divide_impl< - dimension_divide, - typename R1::dimension, typename R1::unit, typename R2::dimension, typename R2::unit>; - template [[nodiscard]] constexpr reference_divide operator/(R1, R2) { return {}; }