From 9c4671790e454ec0f179010573852110d0ab7036 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Fri, 29 Nov 2024 11:10:20 +0100 Subject: [PATCH] refactor: `all_are_kinds` removed and `get_associated_quantity` simplified --- .../mp-units/bits/get_associated_quantity.h | 67 +++---------------- .../include/mp-units/framework/reference.h | 2 +- 2 files changed, 11 insertions(+), 58 deletions(-) diff --git a/src/core/include/mp-units/bits/get_associated_quantity.h b/src/core/include/mp-units/bits/get_associated_quantity.h index d6140d18..5d7674e7 100644 --- a/src/core/include/mp-units/bits/get_associated_quantity.h +++ b/src/core/include/mp-units/bits/get_associated_quantity.h @@ -34,73 +34,26 @@ struct common_unit; namespace detail { template -[[nodiscard]] consteval auto all_are_kinds(U); - -template -[[nodiscard]] consteval auto all_are_kinds(power) -{ - return all_are_kinds(U{}); -} - -template -[[nodiscard]] consteval bool all_are_kinds(type_list, type_list) -{ - return (... && all_are_kinds(Nums{})) && (... && all_are_kinds(Dens{})); -} - -template -[[nodiscard]] consteval auto all_are_kinds(U) -{ - if constexpr (requires { U::_quantity_spec_; }) - return QuantityKindSpec; - else if constexpr (requires { U::_reference_unit_; }) - return all_are_kinds(U::_reference_unit_); - else if constexpr (requires { typename U::_num_; }) { - return all_are_kinds(typename U::_num_{}, typename U::_den_{}); - } -} - -template -[[nodiscard]] consteval auto determine_associated_quantity(U u); - -template -using to_quantity_spec = decltype(determine_associated_quantity(U{})); +[[nodiscard]] consteval auto get_associated_quantity(U u); template -[[nodiscard]] consteval auto determine_associated_quantity_impl(common_unit) +[[nodiscard]] consteval auto get_associated_quantity_impl(common_unit) { - return get_common_quantity_spec(determine_associated_quantity(Us{})...); + return get_common_quantity_spec(get_associated_quantity(Us{})...); } template -[[nodiscard]] consteval auto determine_associated_quantity_impl(U u) -{ - if constexpr (requires { U::_quantity_spec_; }) - return remove_kind(U::_quantity_spec_); - else if constexpr (requires { U::_reference_unit_; }) - return determine_associated_quantity(U::_reference_unit_); - else if constexpr (requires { typename U::_num_; }) { - return expr_map(u); - } -} - -template -constexpr auto determine_associated_quantity_result = determine_associated_quantity_impl(U{}); - -template -[[nodiscard]] consteval auto determine_associated_quantity(U) -{ - return determine_associated_quantity_result; -} +using to_quantity_spec = decltype(get_associated_quantity(U{})); template [[nodiscard]] consteval auto get_associated_quantity_impl(U u) { - constexpr bool all_kinds = all_are_kinds(U{}); - if constexpr (all_kinds) - return kind_of; - else - return determine_associated_quantity(u); + if constexpr (requires { U::_quantity_spec_; }) + return remove_kind(U::_quantity_spec_); + else if constexpr (requires { U::_reference_unit_; }) + return get_associated_quantity(U::_reference_unit_); + else if constexpr (requires { typename U::_num_; }) + return expr_map(u); } template diff --git a/src/core/include/mp-units/framework/reference.h b/src/core/include/mp-units/framework/reference.h index 82343482..e2336fff 100644 --- a/src/core/include/mp-units/framework/reference.h +++ b/src/core/include/mp-units/framework/reference.h @@ -51,7 +51,7 @@ MP_UNITS_EXPORT_BEGIN [[nodiscard]] consteval QuantitySpec auto get_quantity_spec(AssociatedUnit auto u) { - return detail::get_associated_quantity(u); + return kind_of; } /**