From 0586ce030bb6d59c6350cffe551e1dd56d2f1d4d Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Sun, 7 Jul 2024 22:27:35 +0100 Subject: [PATCH] refactor: `prepend_and_process_rest` refactored --- .../mp-units/framework/quantity_spec.h | 48 ++++++++----------- 1 file changed, 19 insertions(+), 29 deletions(-) diff --git a/src/core/include/mp-units/framework/quantity_spec.h b/src/core/include/mp-units/framework/quantity_spec.h index 79675d96..d769d04a 100644 --- a/src/core/include/mp-units/framework/quantity_spec.h +++ b/src/core/include/mp-units/framework/quantity_spec.h @@ -963,53 +963,43 @@ template enum class extracted_entities : std::int8_t { numerators, denominators, from, to }; -template -[[nodiscard]] consteval specs_convertible_result process_num_den(NumFrom num_from, DenFrom den_from, NumTo num_to, - DenTo den_to) -{ - constexpr auto res = convertible_impl(Ext.from, Ext.to); - if constexpr (Ext.prepend == prepend_rest::no) - return min(res, are_ingredients_convertible(num_from, den_from, num_to, den_to)); - else { - using elem = decltype(Ext.elem); - if constexpr (Entities == extracted_entities::numerators) { - if constexpr (Ext.prepend == prepend_rest::first) - return min(res, are_ingredients_convertible(type_list_push_front{}, den_from, num_to, den_to)); - else - return min(res, are_ingredients_convertible(num_from, den_from, type_list_push_front{}, den_to)); - } else { - if constexpr (Ext.prepend == prepend_rest::first) - return min(res, are_ingredients_convertible(num_from, type_list_push_front{}, num_to, den_to)); - else - return min(res, are_ingredients_convertible(num_from, den_from, num_to, type_list_push_front{})); - } - } -} - template [[nodiscard]] consteval specs_convertible_result prepend_and_process_rest(NumFrom num_from, DenFrom den_from, NumTo num_to, DenTo den_to) { - if constexpr (Entities == extracted_entities::numerators || Entities == extracted_entities::denominators) { - return process_num_den(num_from, den_from, num_to, den_to); - } else { + constexpr auto res = [&]() consteval { if constexpr (Ext.prepend == prepend_rest::no) return are_ingredients_convertible(num_from, den_from, num_to, den_to); else { using elem = decltype(Ext.elem); - if constexpr (Entities == extracted_entities::from) { + if constexpr (Entities == extracted_entities::numerators) { + if constexpr (Ext.prepend == prepend_rest::first) + return are_ingredients_convertible(type_list_push_front{}, den_from, num_to, den_to); + else + return are_ingredients_convertible(num_from, den_from, type_list_push_front{}, den_to); + } else if constexpr (Entities == extracted_entities::denominators) { + if constexpr (Ext.prepend == prepend_rest::first) + return are_ingredients_convertible(num_from, type_list_push_front{}, num_to, den_to); + else + return are_ingredients_convertible(num_from, den_from, num_to, type_list_push_front{}); + } else if constexpr (Entities == extracted_entities::from) { if constexpr (Ext.prepend == prepend_rest::first) return are_ingredients_convertible(type_list_push_front{}, den_from, num_to, den_to); else return are_ingredients_convertible(num_from, type_list_push_front{}, num_to, den_to); - } else { + } else if constexpr (Entities == extracted_entities::to) { if constexpr (Ext.prepend == prepend_rest::first) return are_ingredients_convertible(num_from, den_from, type_list_push_front{}, den_to); else return are_ingredients_convertible(num_from, den_from, num_to, type_list_push_front{}); } } - } + }(); + + if constexpr (Entities == extracted_entities::numerators || Entities == extracted_entities::denominators) + return min(res, convertible_impl(Ext.from, Ext.to)); + else + return res; } template