diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index ad028535..220030e1 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,8 @@ # Release notes - **0.8.0 WIP** + - (!) refactor: `common_quantity`, `common_quantity_for`, `common_quantity_point`, `common_quantity_kind`, and `common_quantity_point_kind` removed + - refactor: `quantity` `op+()` and `op-()` reimplemented in terms of `reference` rather then `quantity` types - (!) fix: add `quantity_point::origin`, like `std::chrono::time_point::clock` - fix: account for different dimensions in `quantity_point_cast`'s constraint - build: doxygen updated to 1.9.1 diff --git a/src/core/include/units/bits/common_quantity.h b/src/core/include/units/bits/common_type.h similarity index 69% rename from src/core/include/units/bits/common_quantity.h rename to src/core/include/units/bits/common_type.h index 789ff5b1..46940940 100644 --- a/src/core/include/units/bits/common_quantity.h +++ b/src/core/include/units/bits/common_type.h @@ -28,6 +28,9 @@ namespace units { +template U> +struct reference; + template U, Representation Rep> class quantity; @@ -42,49 +45,42 @@ class quantity_point_kind; namespace detail { -template -struct common_quantity_impl; +template +struct common_quantity_reference_impl; -template -struct common_quantity_impl, quantity, Rep> { - using type = quantity; +template +struct common_quantity_reference_impl, reference> { + using type = reference; }; -template -struct common_quantity_impl, quantity, Rep> { - using type = quantity, Rep>; +template +struct common_quantity_reference_impl, reference> { + using type = reference>; }; -template +template requires same_unit_reference, dimension_unit>::value -struct common_quantity_impl, quantity, Rep> { - using type = quantity, Rep>; +struct common_quantity_reference_impl, reference> { + using type = reference>; }; -template -struct common_quantity_impl, quantity, Rep> { +template +struct common_quantity_reference_impl, reference> { using dimension = conditional, D2, D1>; static constexpr ratio r1 = D1::base_units_ratio * U1::ratio; static constexpr ratio r2 = D2::base_units_ratio * U2::ratio; static constexpr ratio cr = common_ratio(r1, r2); using unit = downcast_unit; - using type = quantity; + using type = reference; }; + +template Q2> +using common_quantity_reference = + TYPENAME detail::common_quantity_reference_impl < + std::remove_const_t, std::remove_const_t>::type; + } // namespace detail - -template Q2, Representation Rep = std::common_type_t> -using common_quantity = TYPENAME detail::common_quantity_impl::type; - -template QP2> -using common_quantity_point = std::common_type_t; - -template QK2> -using common_quantity_kind = std::common_type_t; - -template QPK2> -using common_quantity_point_kind = std::common_type_t; - } // namespace units namespace std { @@ -92,7 +88,10 @@ namespace std { template Q2> requires requires { typename common_type_t; } struct common_type { - using type = units::common_quantity; +private: + using ref = units::detail::common_quantity_reference; +public: + using type = units::quantity>; }; template QP2> diff --git a/src/core/include/units/quantity.h b/src/core/include/units/quantity.h index da3825a1..75d81d5f 100644 --- a/src/core/include/units/quantity.h +++ b/src/core/include/units/quantity.h @@ -23,7 +23,7 @@ #pragma once -#include +#include #include // IWYU pragma: begin_exports @@ -90,10 +90,6 @@ concept have_quantity_for_ = (!Quantity) && quantity_value_for_; -template Q2> - requires quantity_value_for_ -using common_quantity_for = common_quantity>; - template using quantity_like_type = quantity::dimension, typename quantity_like_traits::unit, typename quantity_like_traits::rep>; @@ -400,7 +396,8 @@ template Q2> requires quantity_value_for_, typename Q1::rep, typename Q2::rep> [[nodiscard]] constexpr Quantity auto operator+(const Q1& lhs, const Q2& rhs) { - using ret = common_quantity_for, Q1, Q2>; + using ref = detail::common_quantity_reference; + using ret = quantity; return ret(ret(lhs).number() + ret(rhs).number()); } @@ -408,7 +405,8 @@ template Q2> requires quantity_value_for_, typename Q1::rep, typename Q2::rep> [[nodiscard]] constexpr Quantity auto operator-(const Q1& lhs, const Q2& rhs) { - using ret = common_quantity_for, Q1, Q2>; + using ref = detail::common_quantity_reference; + using ret = quantity; return ret(ret(lhs).number() - ret(rhs).number()); } @@ -442,7 +440,7 @@ template Q2> requires std::three_way_comparable_with [[nodiscard]] constexpr auto operator<=>(const Q1& lhs, const Q2& rhs) { - using cq = common_quantity; + using cq = std::common_type_t; return cq(lhs).number() <=> cq(rhs).number(); } @@ -450,7 +448,7 @@ template Q2> requires std::equality_comparable_with [[nodiscard]] constexpr bool operator==(const Q1& lhs, const Q2& rhs) { - using cq = common_quantity; + using cq = std::common_type_t; return cq(lhs).number() == cq(rhs).number(); } diff --git a/test/unit_test/static/quantity_point_test.cpp b/test/unit_test/static/quantity_point_test.cpp index d8e810d9..19b6e32f 100644 --- a/test/unit_test/static/quantity_point_test.cpp +++ b/test/unit_test/static/quantity_point_test.cpp @@ -22,7 +22,7 @@ #include #include "test_tools.h" -#include +#include #include #include #include @@ -233,17 +233,17 @@ static_assert(2_q_dm3 + quantity_point(2_q_cm3) == quantity_point(2002_q_ml)); static_assert(QuantityPoint, millimetre, int>>); -// common_quantity_point +// common_type -static_assert(compare< - common_quantity_point, metre, int>, quantity_point, kilometre, int>>, - quantity_point, metre, int>>); -static_assert(compare, kilometre, long long>, - quantity_point, metre, int>>, - quantity_point, metre, long long>>); -static_assert(compare, kilometre, long long>, - quantity_point, millimetre, double>>, - quantity_point, millimetre, double>>); +static_assert(compare, metre, int>, + quantity_point, kilometre, int>>, + quantity_point, metre, int>>); +static_assert(compare, kilometre, long long>, + quantity_point, metre, int>>, + quantity_point, metre, long long>>); +static_assert(compare, kilometre, long long>, + quantity_point, millimetre, double>>, + quantity_point, millimetre, double>>); // common_type