forked from mpusz/mp-units
refactor: prepend_and_process_rest
refactored
This commit is contained in:
@@ -963,53 +963,43 @@ template<typename From, typename To>
|
|||||||
|
|
||||||
enum class extracted_entities : std::int8_t { numerators, denominators, from, to };
|
enum class extracted_entities : std::int8_t { numerators, denominators, from, to };
|
||||||
|
|
||||||
template<extracted_entities Entities, auto Ext, TypeList NumFrom, TypeList DenFrom, TypeList NumTo, TypeList DenTo>
|
|
||||||
[[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<NumFrom, elem>{}, den_from, num_to, den_to));
|
|
||||||
else
|
|
||||||
return min(res, are_ingredients_convertible(num_from, den_from, type_list_push_front<NumTo, elem>{}, den_to));
|
|
||||||
} else {
|
|
||||||
if constexpr (Ext.prepend == prepend_rest::first)
|
|
||||||
return min(res, are_ingredients_convertible(num_from, type_list_push_front<DenFrom, elem>{}, num_to, den_to));
|
|
||||||
else
|
|
||||||
return min(res, are_ingredients_convertible(num_from, den_from, num_to, type_list_push_front<DenTo, elem>{}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template<extracted_entities Entities, auto Ext, TypeList NumFrom, TypeList DenFrom, TypeList NumTo, TypeList DenTo>
|
template<extracted_entities Entities, auto Ext, TypeList NumFrom, TypeList DenFrom, TypeList NumTo, TypeList DenTo>
|
||||||
[[nodiscard]] consteval specs_convertible_result prepend_and_process_rest(NumFrom num_from, DenFrom den_from,
|
[[nodiscard]] consteval specs_convertible_result prepend_and_process_rest(NumFrom num_from, DenFrom den_from,
|
||||||
NumTo num_to, DenTo den_to)
|
NumTo num_to, DenTo den_to)
|
||||||
{
|
{
|
||||||
if constexpr (Entities == extracted_entities::numerators || Entities == extracted_entities::denominators) {
|
constexpr auto res = [&]() consteval {
|
||||||
return process_num_den<Entities, Ext>(num_from, den_from, num_to, den_to);
|
|
||||||
} else {
|
|
||||||
if constexpr (Ext.prepend == prepend_rest::no)
|
if constexpr (Ext.prepend == prepend_rest::no)
|
||||||
return are_ingredients_convertible(num_from, den_from, num_to, den_to);
|
return are_ingredients_convertible(num_from, den_from, num_to, den_to);
|
||||||
else {
|
else {
|
||||||
using elem = decltype(Ext.elem);
|
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<NumFrom, elem>{}, den_from, num_to, den_to);
|
||||||
|
else
|
||||||
|
return are_ingredients_convertible(num_from, den_from, type_list_push_front<NumTo, elem>{}, 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<DenFrom, elem>{}, num_to, den_to);
|
||||||
|
else
|
||||||
|
return are_ingredients_convertible(num_from, den_from, num_to, type_list_push_front<DenTo, elem>{});
|
||||||
|
} else if constexpr (Entities == extracted_entities::from) {
|
||||||
if constexpr (Ext.prepend == prepend_rest::first)
|
if constexpr (Ext.prepend == prepend_rest::first)
|
||||||
return are_ingredients_convertible(type_list_push_front<NumFrom, elem>{}, den_from, num_to, den_to);
|
return are_ingredients_convertible(type_list_push_front<NumFrom, elem>{}, den_from, num_to, den_to);
|
||||||
else
|
else
|
||||||
return are_ingredients_convertible(num_from, type_list_push_front<DenFrom, elem>{}, num_to, den_to);
|
return are_ingredients_convertible(num_from, type_list_push_front<DenFrom, elem>{}, num_to, den_to);
|
||||||
} else {
|
} else if constexpr (Entities == extracted_entities::to) {
|
||||||
if constexpr (Ext.prepend == prepend_rest::first)
|
if constexpr (Ext.prepend == prepend_rest::first)
|
||||||
return are_ingredients_convertible(num_from, den_from, type_list_push_front<NumTo, elem>{}, den_to);
|
return are_ingredients_convertible(num_from, den_from, type_list_push_front<NumTo, elem>{}, den_to);
|
||||||
else
|
else
|
||||||
return are_ingredients_convertible(num_from, den_from, num_to, type_list_push_front<DenTo, elem>{});
|
return are_ingredients_convertible(num_from, den_from, num_to, type_list_push_front<DenTo, elem>{});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}();
|
||||||
|
|
||||||
|
if constexpr (Entities == extracted_entities::numerators || Entities == extracted_entities::denominators)
|
||||||
|
return min(res, convertible_impl(Ext.from, Ext.to));
|
||||||
|
else
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename NumFrom, typename... NumsFrom, typename DenFrom, typename... DensFrom, typename NumTo,
|
template<typename NumFrom, typename... NumsFrom, typename DenFrom, typename... DensFrom, typename NumTo,
|
||||||
|
Reference in New Issue
Block a user