25 template<
template<
typename...>
class List,
typename H,
typename... T>
31 template<
typename List>
34 template<
template<
typename...>
class List,
typename H,
typename... T>
35 constexpr List<T...>
Tail (List<H, T...>)
42 template<
int N,
typename List>
48 template<
typename List>
55 template<
int N,
template<
typename...>
class List,
typename... Args>
61 template<
template<
typename...>
class List,
typename... Args1,
typename... Args2>
62 constexpr List<Args1..., Args2...>
Concat (List<Args1...>, List<Args2...>)
67 template<
template<
typename...>
class List>
73 template<
template<
typename...>
class List,
typename Head,
typename...
Tail>
74 constexpr auto Reverse (List<Head, Tail...>) ->
decltype (
Concat (
Reverse (List<Tail...> {}), List<Head> {}))
81 template<
template<
typename...>
class List,
typename Tuple,
size_t... Is>
82 constexpr auto InitImpl (std::integer_sequence<size_t, Is...>)
84 return List<std::tuple_element_t<Is, Tuple>...> {};
88 template<
template<
typename...>
class List,
typename... Args>
89 constexpr auto Init (List<Args...>)
91 return detail::InitImpl<List, std::tuple<Args...>> (std::make_index_sequence<
sizeof... (Args) - 1> {});
94 template<
typename Type,
template<
typename...>
class List,
typename... Args>
97 return (std::is_same_v<Type, Args> || ...);
102 template<
template<
typename>
class,
typename,
typename =
void>
106 template<
template<
typename>
class Pred,
typename List>
111 template<
template<
typename>
class Pred,
template<
typename...>
class List,
typename Head,
typename...
Tail>
117 template<
template<
typename>
class Pred,
template<
typename...>
class List,
typename Head,
typename...
Tail>
123 template<
template<
typename>
class Pred,
template<
typename...>
class List>
133 template<
template<
typename...>
class OtherList,
typename... Args>
142 template<
typename F,
typename G,
typename Def,
typename Head,
typename... Args>
148 if constexpr (
sizeof... (Args) > 0)
156 template<
template<
typename>
class Name,
typename Def,
typename... Args>
159 template<
template<
typename>
class Name,
typename Def,
typename T,
typename... Rest>
160 struct Find<Name, Def, T, Rest...> :
Find<Name, Def, Rest...> {};
162 template<
template<
typename>
class Name,
typename Def,
typename T,
typename... Rest>
163 struct Find<Name, Def, Name<T>, Rest...>
168 template<
template<
typename>
class Name,
typename Def>
175 template<
template<
typename>
class Name,
typename Def,
typename... Args>
constexpr auto InitImpl(std::integer_sequence< size_t, Is... >)
constexpr auto Init(List< Args... >)
constexpr List< T... > Tail(List< H, T... >)
typename AsTypelist< T >::Result_t AsTypelist_t
constexpr detail::DropImpl< N, List< Args... > >::Result_t Drop(List< Args... >)
constexpr bool HasType(List< Args... >)
typename detail::Find< Name, Def, Args... >::type Find
Container< T > Concat(const Container< Container< T > > &containers)
auto FirstMatching(F f, G g, Def def, Util::Typelist< Head, Args... >)
typename detail::Filter< Pred, List >::Result_t Filter_t
constexpr List Reverse(List<>)
typename Head< List >::Head_t Head_t
typename DropImpl< N - 1, decltype(Tail(List {}))>::Result_t Result_t
decltype(Concat(List< Head > {}, Filter_t< Pred, List< Tail... > > {})) Result_t
Filter_t< Pred, List< Tail... > > Result_t