diff --git a/src/include/units/quantity.h b/src/include/units/quantity.h index 14097d77..360dc654 100644 --- a/src/include/units/quantity.h +++ b/src/include/units/quantity.h @@ -94,24 +94,24 @@ namespace units { namespace detail { - template + template struct quantity_cast_impl { template static constexpr To cast(const Q& q) { if constexpr(treat_as_floating_point) { return To(static_cast(static_cast(q.count()) * - (static_cast(CR::num) / static_cast(CR::den)))); + (static_cast(CRatio::num) / static_cast(CRatio::den)))); } else { return To( - static_cast(static_cast(q.count()) * static_cast(CR::num) / static_cast(CR::den))); + static_cast(static_cast(q.count()) * static_cast(CRatio::num) / static_cast(CRatio::den))); } } }; - template - struct quantity_cast_impl { + template + struct quantity_cast_impl { template static constexpr To cast(const Q& q) { @@ -119,26 +119,26 @@ namespace units { } }; - template - struct quantity_cast_impl { + template + struct quantity_cast_impl { template static constexpr To cast(const Q& q) { if constexpr(treat_as_floating_point) { - return To(static_cast(static_cast(q.count()) * (CRep{1} / static_cast(CR::den)))); + return To(static_cast(static_cast(q.count()) * (CRep{1} / static_cast(CRatio::den)))); } else { - return To(static_cast(static_cast(q.count()) / static_cast(CR::den))); + return To(static_cast(static_cast(q.count()) / static_cast(CRatio::den))); } } }; - template - struct quantity_cast_impl { + template + struct quantity_cast_impl { template static constexpr To cast(const Q& q) { - return To(static_cast(static_cast(q.count()) * static_cast(CR::num))); + return To(static_cast(static_cast(q.count()) * static_cast(CRatio::num))); } }; @@ -195,6 +195,7 @@ namespace units { quantity() = default; quantity(const quantity&) = default; + quantity(quantity&&) = default; template requires std::convertible_to && @@ -213,7 +214,8 @@ namespace units { { } - quantity& operator=(const quantity& other) = default; + quantity& operator=(const quantity&) = default; + quantity& operator=(quantity&&) = default; [[nodiscard]] constexpr rep count() const noexcept { return value_; } @@ -331,7 +333,7 @@ namespace units { { using common_rep = decltype(q.count() * v); using ret = quantity; - return ret(ret(q).count() * v); + return ret(q.count() * v); } template @@ -370,9 +372,8 @@ namespace units { using dim = dim_invert; using common_rep = decltype(v / q.count()); - using den = quantity; - return ret(v / den(q).count()); using ret = quantity>>, common_rep>; + return ret(v / q.count()); } template @@ -383,7 +384,7 @@ namespace units { using common_rep = decltype(q.count() / v); using ret = quantity; - return ret(ret(q).count() / v); + return ret(q.count() / v); } template @@ -400,7 +401,7 @@ namespace units { template [[nodiscard]] constexpr Quantity AUTO operator/(const quantity& lhs, const quantity& rhs) requires (!same_dim) && - (treat_as_floating_point || + (treat_as_floating_point || (ratio_divide::den == 1)) { Expects(rhs != std::remove_cvref_t(0)); @@ -413,14 +414,16 @@ namespace units { template [[nodiscard]] constexpr Quantity AUTO operator%(const quantity& q, const Rep2& v) + requires (!treat_as_floating_point && !treat_as_floating_point) { using common_rep = decltype(q.count() % v); using ret = quantity; - return ret(ret(q).count() % v); + return ret(q.count() % v); } template [[nodiscard]] constexpr Quantity AUTO operator%(const quantity& lhs, const quantity& rhs) + requires (!treat_as_floating_point && !treat_as_floating_point) { using common_rep = decltype(lhs.count() % rhs.count()); using ret = common_quantity, quantity, common_rep>; @@ -431,8 +434,8 @@ namespace units { [[nodiscard]] constexpr bool operator==(const quantity& lhs, const quantity& rhs) requires same_dim { - using ct = common_quantity, quantity>; - return ct(lhs).count() == ct(rhs).count(); + using cq = common_quantity, quantity>; + return cq(lhs).count() == cq(rhs).count(); } template @@ -446,8 +449,8 @@ namespace units { [[nodiscard]] constexpr bool operator<(const quantity& lhs, const quantity& rhs) requires same_dim { - using ct = common_quantity, quantity>; - return ct(lhs).count() < ct(rhs).count(); + using cq = common_quantity, quantity>; + return cq(lhs).count() < cq(rhs).count(); } template