18template <
typename List1,
typename List2>
21template <
template <
typename... >
typename List,
typename... Types1,
29template <
typename List1,
typename List2>
41template <
typename Pred,
template <
typename...>
typename SomeListOfTypes>
47template <
typename Pred,
48 template <
typename...>
typename SomeListOfTypes,
51constexpr decltype(
auto)
filter(Pred pred,
52 SomeListOfTypes<Head, Tail...>* )
54 constexpr auto tail_arg =
static_cast<List<Tail...
>*>(
nullptr);
55 using TailFiltered =
decltype(
filter(pred, tail_arg));
58 std::conditional_t<pred((Head*)
nullptr),
73template <
typename List,
typename Pred>
84template <
template <
typename >
typename MapFromTypeToType,
88template <
template <
typename >
typename MapFromTypeToType,
89 template <
typename... >
typename List,
typename... Types>
90struct Map<MapFromTypeToType,
List<Types...>>
96template <
template <
typename >
typename MapFromTypeToType,
103template <
template <
typename... >
typename List,
111 std::common_type_t<std::invoke_result_t<Function, Head*>,
112 std::invoke_result_t<Function, Tail*>...>;
114 return std::array<CommonType, 1 +
sizeof...(Tail)>{f((Head*)
nullptr),
115 f((Tail*)
nullptr)...};
118template <
template <
typename... >
typename List,
typename Function>
133template <
typename List,
typename Function>
142template <
template <
typename... >
typename List,
147 (..., f((Types*)
nullptr));
157template <
typename List,
typename Function>
158void foreach (Function&& f)
165template <
typename List,
typename Type>
168 auto pred_is_same = []<
typename OtherType>(OtherType*)
169 {
return std::is_same_v<Type, OtherType>; };
constexpr decltype(auto) map_to_array(Function &&f, List< Head, Tail... > *)
void foreach(Function &&f, List< Types... > *)
constexpr List filter(Pred, SomeListOfTypes<> *)
constexpr decltype(auto) map_to_array(Function &&f)
typename Concat< List1, List2 >::type Concat_t
constexpr bool contains()
Returns if Type is contained in the given List of types.
decltype(auto) filter(Pred pred)
typename Map< MapFromTypeToType, List >::type Map_t
constexpr bool any_of(List const &values)
Checks if any of the elements in the given list is true.
List< Types1..., Types2... > type
List< MapFromTypeToType< Types >... > type