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,
template <
typename...>
typename SomeListOfTypes,
48 typename Head,
typename... Tail>
49constexpr decltype(
auto)
filter(Pred pred, SomeListOfTypes<Head, Tail...>*)
51 constexpr auto tail_arg =
static_cast<List<Tail...
>*>(
nullptr);
52 using TailFiltered =
decltype(
filter(pred, tail_arg));
55 std::conditional_t<pred((Head*)
nullptr),
70template <
typename List,
typename Pred>
81template <
template <
typename >
typename MapFromTypeToType,
85template <
template <
typename >
typename MapFromTypeToType,
86 template <
typename... >
typename List,
typename... Types>
87struct Map<MapFromTypeToType,
List<Types...>>
93template <
template <
typename >
typename MapFromTypeToType,
100template <
template <
typename... >
typename List,
typename Function,
101 typename Head,
typename... Tail>
105 std::common_type_t<std::invoke_result_t<Function, Head*>,
106 std::invoke_result_t<Function, Tail*>...>;
108 return std::array<CommonType, 1 +
sizeof...(Tail)>{f((Head*)
nullptr),
109 f((Tail*)
nullptr)...};
112template <
template <
typename... >
typename List,
typename Function>
126template <
typename List,
typename Function>
135template <
template <
typename... >
typename List,
typename Function,
139 (..., f((Types*)
nullptr));
149template <
typename List,
typename Function>
150void foreach (Function&& f)
157template <
typename List,
typename Type>
160 auto pred_is_same = []<
typename OtherType>(OtherType*)
161 {
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