forked from mpusz/mp-units
perf: conditional
replaced with constraints in clas template specializations
This commit is contained in:
31
src/include/units/bits/external/type_list.h
vendored
31
src/include/units/bits/external/type_list.h
vendored
@@ -111,14 +111,18 @@ struct split_impl<List, Idx, N> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<template<typename...> typename List, std::size_t Idx, std::size_t N, typename T, typename... Rest>
|
template<template<typename...> typename List, std::size_t Idx, std::size_t N, typename T, typename... Rest>
|
||||||
|
requires (Idx < N)
|
||||||
struct split_impl<List, Idx, N, T, Rest...> : split_impl<List, Idx + 1, N, Rest...> {
|
struct split_impl<List, Idx, N, T, Rest...> : split_impl<List, Idx + 1, N, Rest...> {
|
||||||
using base = split_impl<List, Idx + 1, N, Rest...>;
|
using base = split_impl<List, Idx + 1, N, Rest...>;
|
||||||
using first_list = conditional<Idx < N,
|
using first_list = TYPENAME type_list_push_front_impl<typename base::first_list, T>::type;
|
||||||
typename type_list_push_front_impl<typename base::first_list, T>::type,
|
using second_list = TYPENAME base::second_list;
|
||||||
typename base::first_list>;
|
};
|
||||||
using second_list = conditional<Idx < N,
|
|
||||||
typename base::second_list,
|
template<template<typename...> typename List, std::size_t Idx, std::size_t N, typename T, typename... Rest>
|
||||||
typename type_list_push_front_impl<typename base::second_list, T>::type>;
|
struct split_impl<List, Idx, N, T, Rest...> : split_impl<List, Idx + 1, N, Rest...> {
|
||||||
|
using base = split_impl<List, Idx + 1, N, Rest...>;
|
||||||
|
using first_list = TYPENAME base::first_list;
|
||||||
|
using second_list = TYPENAME type_list_push_front_impl<typename base::second_list, T>::type;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
@@ -165,15 +169,18 @@ struct type_list_merge_sorted_impl<List<>, List<Rhs...>, Pred> {
|
|||||||
using type = List<Rhs...>;
|
using type = List<Rhs...>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template<template<typename...> typename List, typename Lhs1, typename... LhsRest, typename Rhs1, typename... RhsRest,
|
||||||
|
template<typename, typename> typename Pred>
|
||||||
|
requires Pred<Lhs1, Rhs1>::value
|
||||||
|
struct type_list_merge_sorted_impl<List<Lhs1, LhsRest...>, List<Rhs1, RhsRest...>, Pred> {
|
||||||
|
using type = TYPENAME type_list_push_front_impl<typename type_list_merge_sorted_impl<List<LhsRest...>, List<Rhs1, RhsRest...>, Pred>::type, Lhs1>::type;
|
||||||
|
};
|
||||||
|
|
||||||
template<template<typename...> typename List, typename Lhs1, typename... LhsRest, typename Rhs1, typename... RhsRest,
|
template<template<typename...> typename List, typename Lhs1, typename... LhsRest, typename Rhs1, typename... RhsRest,
|
||||||
template<typename, typename> typename Pred>
|
template<typename, typename> typename Pred>
|
||||||
struct type_list_merge_sorted_impl<List<Lhs1, LhsRest...>, List<Rhs1, RhsRest...>, Pred> {
|
struct type_list_merge_sorted_impl<List<Lhs1, LhsRest...>, List<Rhs1, RhsRest...>, Pred> {
|
||||||
using type = conditional<
|
using type = TYPENAME type_list_push_front_impl<typename type_list_merge_sorted_impl<List<Lhs1, LhsRest...>, List<RhsRest...>, Pred>::type, Rhs1>::type;
|
||||||
Pred<Lhs1, Rhs1>::value,
|
|
||||||
typename type_list_push_front_impl<
|
|
||||||
typename type_list_merge_sorted_impl<List<LhsRest...>, List<Rhs1, RhsRest...>, Pred>::type, Lhs1>::type,
|
|
||||||
typename type_list_push_front_impl<
|
|
||||||
typename type_list_merge_sorted_impl<List<Lhs1, LhsRest...>, List<RhsRest...>, Pred>::type, Rhs1>::type>;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
Reference in New Issue
Block a user