From 17fd0900a4cb545d5d9b35f90bc4393956905041 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Sat, 22 Oct 2022 09:02:40 +0200 Subject: [PATCH] refactor: expression template operations now take function parameters --- .../include/units/bits/expression_template.h | 106 +++++++++--------- src/core/include/units/dimension.h | 28 ++--- 2 files changed, 67 insertions(+), 67 deletions(-) diff --git a/src/core/include/units/bits/expression_template.h b/src/core/include/units/bits/expression_template.h index e7ead18e..07dac42c 100644 --- a/src/core/include/units/bits/expression_template.h +++ b/src/core/include/units/bits/expression_template.h @@ -250,17 +250,17 @@ struct expr_simplify, NRest...>, type_list typename Pred> -struct expr_less_impl : Pred {}; +template typename Pred> +struct expr_less_impl : Pred {}; -template typename Pred> -struct expr_less_impl, power, Pred> : Pred {}; +template typename Pred> +struct expr_less_impl, power, Pred> : Pred {}; -template typename Pred> -struct expr_less_impl, T2, Pred> : Pred {}; +template typename Pred> +struct expr_less_impl, Rhs, Pred> : Pred {}; -template typename Pred> -struct expr_less_impl, Pred> : Pred {}; +template typename Pred> +struct expr_less_impl, Pred> : Pred {}; template typename Pred> struct expr_less_impl, Pred> : std::true_type {}; @@ -271,8 +271,8 @@ struct expr_less_impl, Pred> : std::true_type {}; * Algorithm accounts not only for explicit types but also for the case when they * are wrapped within `power`. */ -template typename Pred> -using expr_less = expr_less_impl; +template typename Pred> +using expr_less = expr_less_impl; // expr_fractions @@ -355,34 +355,34 @@ template typename Pred, - template typename To> -[[nodiscard]] consteval auto expr_multiply() +template typename To, typename OneType, template typename Pred, typename Lhs, + typename Rhs> +[[nodiscard]] consteval auto expr_multiply(Lhs, Rhs) { - if constexpr (is_same_v) { - return T2{}; - } else if constexpr (is_same_v) { - return T1{}; - } else if constexpr (is_specialization_of && is_specialization_of) { + if constexpr (is_same_v) { + return Rhs{}; + } else if constexpr (is_same_v) { + return Lhs{}; + } else if constexpr (is_specialization_of && is_specialization_of) { // two derived dimensions - return get_optimized_expression, - type_list_merge_sorted, OneType, Pred, - To>(); - } else if constexpr (is_specialization_of) { - return get_optimized_expression, Pred>, typename T1::_den_, - OneType, Pred, To>(); - } else if constexpr (is_specialization_of) { - return get_optimized_expression, Pred>, typename T2::_den_, - OneType, Pred, To>(); + return get_optimized_expression, + type_list_merge_sorted, OneType, + Pred, To>(); + } else if constexpr (is_specialization_of) { + return get_optimized_expression, Pred>, + typename Lhs::_den_, OneType, Pred, To>(); + } else if constexpr (is_specialization_of) { + return get_optimized_expression, Pred>, + typename Rhs::_den_, OneType, Pred, To>(); } else { // two base dimensions - return get_optimized_expression, type_list, Pred>, type_list<>, OneType, + return get_optimized_expression, type_list, Pred>, type_list<>, OneType, Pred, To>(); } } @@ -390,34 +390,34 @@ template typename Pred, - template typename To> -[[nodiscard]] consteval auto expr_divide() +template typename To, typename OneType, template typename Pred, typename Lhs, + typename Rhs> +[[nodiscard]] consteval auto expr_divide(Lhs, Rhs) { - if constexpr (is_same_v) { + if constexpr (is_same_v) { return OneType{}; - } else if constexpr (is_same_v) { - return T1{}; - } else if constexpr (is_specialization_of && is_specialization_of) { + } else if constexpr (is_same_v) { + return Lhs{}; + } else if constexpr (is_specialization_of && is_specialization_of) { // two derived dimensions - return get_optimized_expression, - type_list_merge_sorted, OneType, Pred, - To>(); - } else if constexpr (is_specialization_of) { - return get_optimized_expression, Pred>, - OneType, Pred, To>(); - } else if constexpr (is_specialization_of) { - return get_optimized_expression, Pred>, typename T2::_num_, - OneType, Pred, To>(); + return get_optimized_expression, + type_list_merge_sorted, OneType, + Pred, To>(); + } else if constexpr (is_specialization_of) { + return get_optimized_expression< + typename Lhs::_num_, type_list_merge_sorted, Pred>, OneType, Pred, To>(); + } else if constexpr (is_specialization_of) { + return get_optimized_expression, Pred>, + typename Rhs::_num_, OneType, Pred, To>(); } else { // two base dimensions - return To>{}; + return To>{}; } } @@ -428,8 +428,8 @@ template typename To> -[[nodiscard]] consteval auto expr_invert() +template typename To, typename OneType, typename T> +[[nodiscard]] consteval auto expr_invert(T) { if constexpr (is_specialization_of) return expr_make_spec{}; diff --git a/src/core/include/units/dimension.h b/src/core/include/units/dimension.h index 9e17d108..561f99c2 100644 --- a/src/core/include/units/dimension.h +++ b/src/core/include/units/dimension.h @@ -109,8 +109,8 @@ concept Dimension = BaseDimension || DerivedDimension; namespace detail { -template -struct base_dimension_less : std::bool_constant<(D1::symbol < D2::symbol)> {}; +template +struct base_dimension_less : std::bool_constant<(Lhs::symbol < Rhs::symbol)> {}; template using type_list_of_base_dimension_less = expr_less; @@ -249,34 +249,34 @@ using dim_type = dim_type_impl::type; // Operators -template -[[nodiscard]] consteval Dimension auto operator*(D1, D2) +template +[[nodiscard]] consteval Dimension auto operator*(Lhs, Rhs) { - return detail::expr_multiply, detail::dim_type, struct one_dim, - detail::type_list_of_base_dimension_less, derived_dimension>(); + return detail::expr_multiply( + detail::dim_type{}, detail::dim_type{}); } -template -[[nodiscard]] consteval Dimension auto operator/(D1, D2) +template +[[nodiscard]] consteval Dimension auto operator/(Lhs, Rhs) { - return detail::expr_divide, detail::dim_type, struct one_dim, - detail::type_list_of_base_dimension_less, derived_dimension>(); + return detail::expr_divide( + detail::dim_type{}, detail::dim_type{}); } template [[nodiscard]] consteval Dimension auto operator/(int value, D) { gsl_Assert(value == 1); - return detail::expr_invert, struct one_dim, derived_dimension>(); + return detail::expr_invert(detail::dim_type{}); } template [[nodiscard]] consteval Dimension auto operator/(D, int) = delete; -template -[[nodiscard]] consteval bool operator==(D1, D2) +template +[[nodiscard]] consteval bool operator==(Lhs, Rhs) { - return is_same_v; + return is_same_v; } template