16 #include <type_traits>
31 template<
typename...
Ts>
38 struct type_list_traits {
40 struct accepts : std::false_type {};
42 template<
typename...
Ts>
43 struct accepts<type_list<
Ts...>> : std::true_type {};
45 template<
template<
typename>
class Predicate,
typename Ts>
46 struct all_satisfy : std::false_type {};
48 template<
template<
typename>
class Predicate,
typename...
Ts>
49 struct all_satisfy<Predicate, type_list<
Ts...>>
50 : std::bool_constant<(Predicate<Ts>::value && ...)> {};
52 template<
template<
typename>
class Predicate,
typename Ts>
53 struct any_satisfy : std::false_type {};
55 template<
template<
typename>
class Predicate,
typename...
Ts>
56 struct any_satisfy<Predicate, type_list<
Ts...>>
57 : std::bool_constant<(false || ... || Predicate<Ts>::value)> {};
66 template<
typename T,
typename...
Ts>
67 struct front_type<type_list<T,
Ts...>> {
74 template<
typename List>
75 struct empty_type_list;
77 template<
typename...
Ts>
78 struct empty_type_list<type_list<
Ts...>>
79 : std::bool_constant<sizeof...(Ts) == 0U> {};
81 template<
typename List>
91 template<std::
size_t Index,
typename List>
94 template<std::size_t Index,
typename...
Ts>
95 struct type_at<Index, type_list<
Ts...>> {
96 using type = std::tuple_element_t<Index, std::tuple<
Ts...>>;
99 template<std::
size_t Index,
typename List>
105 template<
typename...
Ts>
106 struct as_tuple<std::tuple<Ts...>> {
107 using type = std::tuple<
Ts...>;
110 template<
typename...
Ts>
111 struct as_tuple<type_list<
Ts...>> {
112 using type = std::tuple<
Ts...>;
123 template<
typename T,
typename...
Ts>
125 return (std::is_same_v<T, Ts> || ...);
128 template<
typename T,
typename...
Ts>
130 return (std::is_same_v<T, Ts> || ...);
133 template<
typename T,
typename...
Ts>
135 std::size_t result =
sizeof(T);
136 ((result =
sizeof(
Ts) > result ?
sizeof(
Ts) : result), ...);
140 template<
typename T,
typename...
Ts>
145 template<
typename T,
typename...
Ts>
147 std::size_t result =
alignof(T);
148 ((result =
alignof(
Ts) > result ?
alignof(
Ts) : result), ...);
152 template<
typename T,
typename...
Ts>
164 template<
typename...
Ts>
165 struct as_type_list<type_list<
Ts...>> {
166 using type = type_list<
Ts...>;
169 template<
typename...
Ts>
170 struct as_type_list<std::tuple<Ts...>> {
171 using type = type_list<
Ts...>;
182 template<
typename... Lists>
183 struct concat_type_lists;
186 struct concat_type_lists<> {
187 using type = type_list<>;
190 template<
typename...
Ts>
191 struct concat_type_lists<type_list<
Ts...>> {
192 using type = type_list<
Ts...>;
195 template<
typename... As,
typename... Bs,
typename... Rest>
196 struct concat_type_lists<type_list<As...>, type_list<Bs...>, Rest...> {
198 typename concat_type_lists<type_list<As..., Bs...>, Rest...>::type;
201 template<
typename... Lists>
204 template<
template<
typename>
class Predicate,
typename List>
205 struct filter_type_list;
212 template<
template<
typename>
class Predicate,
typename...
Ts>
213 struct filter_type_list<Predicate, type_list<
Ts...>> {
216 std::conditional_t<Predicate<T>::value, type_list<T>, type_list<>>;
221 template<
template<
typename>
class Predicate,
typename List>
227 template<
template<
class>
class Wrapper,
typename Tuple>
228 struct wrap_type_impl;
230 template<
template<
class>
class Wrapper,
typename...
Ts>
231 struct wrap_type_impl<Wrapper, std::tuple<Ts...>> {
232 using type = std::tuple<typename Wrapper<Ts>::type...>;
235 template<
template<
class>
class Wrapper,
typename Tuple>
236 using wrap_type =
typename wrap_type_impl<Wrapper, Tuple>::type;
242 template<
typename T,
typename Tuple>
243 struct append_unique_impl;
246 struct append_unique_impl<T, std::tuple<>> {
247 using type = std::tuple<T>;
251 struct append_unique_impl<T, type_list<>> {
252 using type = type_list<T>;
255 template<
typename T,
typename...
Ts>
256 struct append_unique_impl<T, std::tuple<Ts...>> {
257 using type = std::conditional_t<!(std::is_same_v<T, Ts> || ...),
258 std::tuple<
Ts..., T>,
262 template<
typename T,
typename...
Ts>
263 struct append_unique_impl<T, type_list<
Ts...>> {
264 using type = std::conditional_t<!(std::is_same_v<T, Ts> || ...),
269 template<
typename T,
typename Tuple>
277 template<
typename List>
280 template<
typename...
Ts>
281 struct type_set<type_list<
Ts...>> {
282 using list = type_list<
Ts...>;
285 using insert = type_set<append_unique<T, list>>;
288 static consteval
bool contains() {
289 return contains_type<T>(list{});
293 template<
typename Set>
296 template<
typename List,
typename StateSet>
297 struct retain_if_in_set;
299 template<
typename StateSet,
typename...
Ts>
300 struct retain_if_in_set<type_list<
Ts...>, StateSet> {
301 template<
typename State>
303 std::conditional_t<StateSet::template contains<State>(),
310 template<
typename List,
typename StateSet>
318 template<
typename...
Ts>
321 template<
typename Key,
typename Value>
322 struct type_map_entry {
327 template<
typename Key,
typename Map>
328 struct type_map_lookup;
330 template<
typename Key>
331 struct type_map_lookup<Key, type_map<>> {
335 template<
typename Key,
typename First,
typename... Rest>
336 struct type_map_lookup<Key, type_map<First, Rest...>> {
337 using type = std::conditional_t<
338 std::is_same_v<Key, typename First::key>,
339 typename First::value,
340 typename type_map_lookup<Key, type_map<Rest...>>::type>;
343 template<
typename Key,
typename Map>
346 template<
typename EntryList>
347 struct type_map_from_entries;
349 template<
typename... Entries>
350 struct type_map_from_entries<type_list<Entries...>> {
351 using type = type_map<Entries...>;
354 template<
typename EntryList>
356 typename type_map_from_entries<EntryList>::type;
365 template<
typename Ts,
typename Us>
366 struct unique_tuple_impl;
368 template<
typename... Us>
369 struct unique_tuple_impl<std::tuple<>, std::tuple<Us...>> {
370 using type = std::tuple<Us...>;
373 template<
typename T,
typename...
Ts,
typename... Us>
374 struct unique_tuple_impl<std::tuple<T, Ts...>, std::tuple<Us...>> {
376 typename unique_tuple_impl<std::tuple<
Ts...>,
380 template<
typename... Us>
381 struct unique_tuple_impl<type_list<>, type_list<Us...>> {
382 using type = type_list<Us...>;
385 template<
typename T,
typename...
Ts,
typename... Us>
386 struct unique_tuple_impl<type_list<T,
Ts...>, type_list<Us...>> {
388 typename unique_tuple_impl<type_list<
Ts...>,
392 template<
typename Ts,
typename Us = std::tuple<>>
393 struct unique_tuple {
394 using type =
typename unique_tuple_impl<Ts, Us>::type;
397 template<
typename Ts>
typename type_map_lookup< Key, Map >::type type_map_lookup_t
Definition: type_list.h:344
typename wrap_type_impl< Wrapper, Tuple >::type wrap_type
Definition: type_list.h:236
consteval std::size_t max_alignof(type_list< T, Ts... >)
Definition: type_list.h:146
typename Set::list type_set_list_t
Definition: type_list.h:294
typename concat_type_lists< Lists... >::type concat_type_lists_t
Definition: type_list.h:202
concept type_list_like
Definition: type_list.h:61
constexpr bool empty_type_list_v
Definition: type_list.h:82
typename retain_if_in_set< List, StateSet >::type retain_if_in_set_t
Definition: type_list.h:311
typename as_tuple< T >::type as_tuple_t
Definition: type_list.h:116
typename as_type_list< T >::type as_type_list_t
Definition: type_list.h:175
consteval std::size_t max_sizeof(type_list< T, Ts... >)
Definition: type_list.h:134
typename filter_type_list< Predicate, List >::type filter_type_list_t
Definition: type_list.h:222
typename front_type< T >::type front_type_t
Definition: type_list.h:72
typename type_at< Index, List >::type type_at_t
Definition: type_list.h:100
typename type_map_from_entries< EntryList >::type type_map_from_entries_t
Definition: type_list.h:356
consteval bool contains_type(type_list< Ts... >)
Definition: type_list.h:124
typename unique_tuple< Ts >::type unique_tuple_t
Definition: type_list.h:398
typename append_unique_impl< T, Tuple >::type append_unique
Definition: type_list.h:270
transition_table< TransitionEntries... > Ts
Definition: tsm.h:2445