tin  1.5.9
type_list.h
Go to the documentation of this file.
1 // Copyright (c) 2026 Tinverse LLC. All rights reserved.
2 // SPDX-License-Identifier: LicenseRef-Tinverse-Commercial
3 
11 
12 #pragma once
13 
14 #include <cstddef>
15 #include <tuple>
16 #include <type_traits>
17 
18 namespace tsm::detail {
19 
31 template<typename... Ts>
32 struct type_list {};
33 
38 struct type_list_traits {
39  template<typename Ts>
40  struct accepts : std::false_type {};
41 
42  template<typename... Ts>
43  struct accepts<type_list<Ts...>> : std::true_type {};
44 
45  template<template<typename> class Predicate, typename Ts>
46  struct all_satisfy : std::false_type {};
47 
48  template<template<typename> class Predicate, typename... Ts>
49  struct all_satisfy<Predicate, type_list<Ts...>>
50  : std::bool_constant<(Predicate<Ts>::value && ...)> {};
51 
52  template<template<typename> class Predicate, typename Ts>
53  struct any_satisfy : std::false_type {};
54 
55  template<template<typename> class Predicate, typename... Ts>
56  struct any_satisfy<Predicate, type_list<Ts...>>
57  : std::bool_constant<(false || ... || Predicate<Ts>::value)> {};
58 };
59 
60 template<typename Ts>
61 concept type_list_like = type_list_traits::accepts<Ts>::value;
62 
63 template<typename T>
64 struct front_type;
65 
66 template<typename T, typename... Ts>
67 struct front_type<type_list<T, Ts...>> {
68  using type = T;
69 };
70 
71 template<typename T>
72 using front_type_t = typename front_type<T>::type;
73 
74 template<typename List>
75 struct empty_type_list;
76 
77 template<typename... Ts>
78 struct empty_type_list<type_list<Ts...>>
79  : std::bool_constant<sizeof...(Ts) == 0U> {};
80 
81 template<typename List>
82 inline constexpr bool empty_type_list_v = empty_type_list<List>::value;
83 
91 template<std::size_t Index, typename List>
92 struct type_at;
93 
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...>>;
97 };
98 
99 template<std::size_t Index, typename List>
100 using type_at_t = typename type_at<Index, List>::type;
101 
102 template<typename T>
103 struct as_tuple;
104 
105 template<typename... Ts>
106 struct as_tuple<std::tuple<Ts...>> {
107  using type = std::tuple<Ts...>;
108 };
109 
110 template<typename... Ts>
111 struct as_tuple<type_list<Ts...>> {
112  using type = std::tuple<Ts...>;
113 };
114 
115 template<typename T>
116 using as_tuple_t = typename as_tuple<T>::type;
117 
123 template<typename T, typename... Ts>
124 consteval bool contains_type(type_list<Ts...>) {
125  return (std::is_same_v<T, Ts> || ...);
126 }
127 
128 template<typename T, typename... Ts>
129 consteval bool contains_type(std::tuple<Ts...>) {
130  return (std::is_same_v<T, Ts> || ...);
131 }
132 
133 template<typename T, typename... Ts>
134 consteval std::size_t max_sizeof(type_list<T, Ts...>) {
135  std::size_t result = sizeof(T);
136  ((result = sizeof(Ts) > result ? sizeof(Ts) : result), ...);
137  return result;
138 }
139 
140 template<typename T, typename... Ts>
141 consteval std::size_t max_sizeof(std::tuple<T, Ts...>) {
142  return max_sizeof(type_list<T, Ts...>{});
143 }
144 
145 template<typename T, typename... Ts>
146 consteval std::size_t max_alignof(type_list<T, Ts...>) {
147  std::size_t result = alignof(T);
148  ((result = alignof(Ts) > result ? alignof(Ts) : result), ...);
149  return result;
150 }
151 
152 template<typename T, typename... Ts>
153 consteval std::size_t max_alignof(std::tuple<T, Ts...>) {
154  return max_alignof(type_list<T, Ts...>{});
155 }
156 
161 template<typename T>
162 struct as_type_list;
163 
164 template<typename... Ts>
165 struct as_type_list<type_list<Ts...>> {
166  using type = type_list<Ts...>;
167 };
168 
169 template<typename... Ts>
170 struct as_type_list<std::tuple<Ts...>> {
171  using type = type_list<Ts...>;
172 };
173 
174 template<typename T>
175 using as_type_list_t = typename as_type_list<T>::type;
176 
182 template<typename... Lists>
183 struct concat_type_lists;
184 
185 template<>
186 struct concat_type_lists<> {
187  using type = type_list<>;
188 };
189 
190 template<typename... Ts>
191 struct concat_type_lists<type_list<Ts...>> {
192  using type = type_list<Ts...>;
193 };
194 
195 template<typename... As, typename... Bs, typename... Rest>
196 struct concat_type_lists<type_list<As...>, type_list<Bs...>, Rest...> {
197  using type =
198  typename concat_type_lists<type_list<As..., Bs...>, Rest...>::type;
199 };
200 
201 template<typename... Lists>
202 using concat_type_lists_t = typename concat_type_lists<Lists...>::type;
203 
204 template<template<typename> class Predicate, typename List>
205 struct filter_type_list;
206 
212 template<template<typename> class Predicate, typename... Ts>
213 struct filter_type_list<Predicate, type_list<Ts...>> {
214  template<typename T>
215  using keep_one =
216  std::conditional_t<Predicate<T>::value, type_list<T>, type_list<>>;
217 
218  using type = concat_type_lists_t<keep_one<Ts>...>;
219 };
220 
221 template<template<typename> class Predicate, typename List>
222 using filter_type_list_t = typename filter_type_list<Predicate, List>::type;
223 
227 template<template<class> class Wrapper, typename Tuple>
228 struct wrap_type_impl;
229 
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...>;
233 };
234 
235 template<template<class> class Wrapper, typename Tuple>
236 using wrap_type = typename wrap_type_impl<Wrapper, Tuple>::type;
237 
242 template<typename T, typename Tuple>
243 struct append_unique_impl;
244 
245 template<typename T>
246 struct append_unique_impl<T, std::tuple<>> {
247  using type = std::tuple<T>;
248 };
249 
250 template<typename T>
251 struct append_unique_impl<T, type_list<>> {
252  using type = type_list<T>;
253 };
254 
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>,
259  std::tuple<Ts...>>;
260 };
261 
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> || ...),
265  type_list<Ts..., T>,
266  type_list<Ts...>>;
267 };
268 
269 template<typename T, typename Tuple>
270 using append_unique = typename append_unique_impl<T, Tuple>::type;
271 
277 template<typename List>
278 struct type_set;
279 
280 template<typename... Ts>
281 struct type_set<type_list<Ts...>> {
282  using list = type_list<Ts...>;
283 
284  template<typename T>
285  using insert = type_set<append_unique<T, list>>;
286 
287  template<typename T>
288  static consteval bool contains() {
289  return contains_type<T>(list{});
290  }
291 };
292 
293 template<typename Set>
294 using type_set_list_t = typename Set::list;
295 
296 template<typename List, typename StateSet>
297 struct retain_if_in_set;
298 
299 template<typename StateSet, typename... Ts>
300 struct retain_if_in_set<type_list<Ts...>, StateSet> {
301  template<typename State>
302  using keep_one =
303  std::conditional_t<StateSet::template contains<State>(),
304  type_list<State>,
305  type_list<>>;
306 
307  using type = concat_type_lists_t<keep_one<Ts>...>;
308 };
309 
310 template<typename List, typename StateSet>
311 using retain_if_in_set_t = typename retain_if_in_set<List, StateSet>::type;
312 
318 template<typename... Ts>
319 struct type_map {};
320 
321 template<typename Key, typename Value>
322 struct type_map_entry {
323  using key = Key;
324  using value = Value;
325 };
326 
327 template<typename Key, typename Map>
328 struct type_map_lookup;
329 
330 template<typename Key>
331 struct type_map_lookup<Key, type_map<>> {
332  using type = void;
333 };
334 
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>;
341 };
342 
343 template<typename Key, typename Map>
344 using type_map_lookup_t = typename type_map_lookup<Key, Map>::type;
345 
346 template<typename EntryList>
347 struct type_map_from_entries;
348 
349 template<typename... Entries>
350 struct type_map_from_entries<type_list<Entries...>> {
351  using type = type_map<Entries...>;
352 };
353 
354 template<typename EntryList>
356  typename type_map_from_entries<EntryList>::type;
357 
365 template<typename Ts, typename Us>
366 struct unique_tuple_impl;
367 
368 template<typename... Us>
369 struct unique_tuple_impl<std::tuple<>, std::tuple<Us...>> {
370  using type = std::tuple<Us...>;
371 };
372 
373 template<typename T, typename... Ts, typename... Us>
374 struct unique_tuple_impl<std::tuple<T, Ts...>, std::tuple<Us...>> {
375  using type =
376  typename unique_tuple_impl<std::tuple<Ts...>,
377  append_unique<T, std::tuple<Us...>>>::type;
378 };
379 
380 template<typename... Us>
381 struct unique_tuple_impl<type_list<>, type_list<Us...>> {
382  using type = type_list<Us...>;
383 };
384 
385 template<typename T, typename... Ts, typename... Us>
386 struct unique_tuple_impl<type_list<T, Ts...>, type_list<Us...>> {
387  using type =
388  typename unique_tuple_impl<type_list<Ts...>,
389  append_unique<T, type_list<Us...>>>::type;
390 };
391 
392 template<typename Ts, typename Us = std::tuple<>>
393 struct unique_tuple {
394  using type = typename unique_tuple_impl<Ts, Us>::type;
395 };
396 
397 template<typename Ts>
398 using unique_tuple_t = typename unique_tuple<Ts>::type;
399 
400 } // namespace tsm::detail
Definition: linux.h:32
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