46 template<
template<
typename...>
class List,
typename H,
typename... T>
47 struct Head<List<H, T...>>
52 template<
typename List>
55 template<
template<
typename...>
class List,
typename H,
typename... T>
56 constexpr List<T...>
Tail (List<H, T...>)
63 template<
int N,
typename List>
69 template<
typename List>
70 struct DropImpl<0, List>
76 template<
int N,
template<
typename...>
class List,
typename... Args>
77 constexpr
typename detail::DropImpl<N, List<Args...>>::Result_t
Drop (List<Args...>)
82 template<
template<
typename...>
class List,
typename... Args1,
typename... Args2>
83 constexpr List<Args1..., Args2...>
Concat (List<Args1...>, List<Args2...>)
88 template<
template<
typename...>
class List>
89 constexpr List<>
Reverse (List<>)
94 template<
template<
typename...>
class List,
typename Head,
typename...
Tail>
102 template<
template<
typename...>
class List,
typename Tuple,
size_t... Is>
103 constexpr
auto InitImpl (std::integer_sequence<size_t, Is...>)
105 return List<std::tuple_element_t<Is, Tuple>...> {};
109 template<
template<
typename...>
class List,
typename... Args>
110 constexpr
auto Init (List<Args...>)
112 return detail::InitImpl<List, std::tuple<Args...>> (std::make_index_sequence<
sizeof... (Args) - 1> {});
115 template<
typename Type,
template<
typename...>
class List,
typename... Args>
116 constexpr
bool HasType (List<Args...>)
118 return (std::is_same_v<Type, Args> || ...);
123 template<
template<
typename>
class,
typename,
typename =
void>
127 template<
template<
typename>
class Pred,
typename List>
128 using Filter_t =
typename detail::Filter<Pred, List>::Result_t;
132 template<
template<
typename>
class Pred,
template<
typename...>
class List,
typename Head,
typename...
Tail>
133 struct Filter<Pred, List<
Head,
Tail...>, std::enable_if_t<Pred<Head>::value>>
138 template<
template<
typename>
class Pred,
template<
typename...>
class List,
typename Head,
typename...
Tail>
139 struct Filter<Pred, List<Head,
Tail...>, std::enable_if_t<!Pred<Head>::value>>
141 using Result_t = Filter_t<Pred, List<
Tail...>>;
144 template<
template<
typename>
class Pred,
template<
typename...>
class List>
145 struct Filter<Pred, List<>>
147 using Result_t = List<>;
154 template<
template<
typename...>
class OtherList,
typename... Args>
155 struct AsTypelist<OtherList<Args...>>
157 using Result_t = Typelist<Args...>;
163 template<
typename F,
typename G,
typename Def,
typename Head,
typename... Args>
164 auto FirstMatching (F
f, G g, Def def, Util::Typelist<Head, Args...>)
169 if constexpr (
sizeof... (Args) > 0)
177 template<
template<
typename>
class Name,
typename Def,
typename... Args>
180 template<
template<
typename>
class Name,
typename Def,
typename T,
typename... Rest>
181 struct Find<Name, Def, T, Rest...> :
Find<Name, Def, Rest...> {};
183 template<
template<
typename>
class Name,
typename Def,
typename T,
typename... Rest>
184 struct Find<Name, Def, Name<T>, Rest...>
189 template<
template<
typename>
class Name,
typename Def>
196 template<
template<
typename>
class Name,
typename Def,
typename... Args>