libtcspc C++ API
Streaming TCSPC and time tag data processing
Loading...
Searching...
No Matches
type_list.hpp
1/*
2 * This file is part of libtcspc
3 * Copyright 2019-2026 Board of Regents of the University of Wisconsin System
4 * SPDX-License-Identifier: MIT
5 */
6
7#pragma once
8
9#include "common.hpp"
10
11#include <concepts>
12#include <cstddef>
13#include <type_traits>
14
15namespace tcspc {
16
38template <typename... Ts> struct type_list {
39 type_list() = delete;
40};
41
43
44namespace internal {
45
46template <typename> struct is_type_list_impl : std::false_type {};
47
48template <typename... Ts>
49struct is_type_list_impl<type_list<Ts...>> : std::true_type {};
50
51} // namespace internal
52
54
63template <typename T>
64concept type_list_like = internal::is_type_list_impl<T>::value;
65
72
83template <typename TypeList> struct type_list_size;
84
86
87template <typename... Ts>
88struct type_list_size<type_list<Ts...>>
89 : std::integral_constant<std::size_t, sizeof...(Ts)> {};
90
92
96template <typename TypeList>
97inline constexpr std::size_t type_list_size_v =
99
101
108
117template <typename TypeList> struct type_list_singleton_element;
118
120
121template <typename T>
122struct type_list_singleton_element<type_list<T>> : std::type_identity<T> {};
123
125
129template <typename TypeList>
132
134
136
137namespace internal {
138
139template <typename TypeList, typename Type> struct type_list_contains_impl;
140
141template <typename Type, typename... Ts>
142struct type_list_contains_impl<type_list<Ts...>, Type>
143 : std::bool_constant<(std::same_as<Type, Ts> || ...)> {};
144
145} // namespace internal
146
148
157template <typename Type, typename TypeList>
159 internal::type_list_contains_impl<TypeList, Type>::value;
160
162
163namespace internal {
164
165template <typename Type, typename TypeList>
166struct is_convertible_to_type_list_member_impl;
167
168template <typename Type, typename... Ts>
169struct is_convertible_to_type_list_member_impl<Type, type_list<Ts...>>
170 : std::bool_constant<(std::convertible_to<Type, Ts> || ...)> {};
171
172} // namespace internal
173
175
185template <typename Type, typename TypeList>
187 internal::is_convertible_to_type_list_member_impl<Type, TypeList>::value;
188
195
205template <typename TL0, typename TL1> struct type_list_is_subset;
206
208
209template <typename... T0s, typename TL1>
210struct type_list_is_subset<type_list<T0s...>, TL1>
211 : std::bool_constant<(type_list_member<T0s, TL1> && ...)> {};
212
214
218template <typename TL0, typename TL1>
219inline constexpr bool type_list_is_subset_v =
221
223
230
243template <typename TL0, typename TL1>
245 : std::conjunction<type_list_is_subset<TL0, TL1>,
246 type_list_is_subset<TL1, TL0>> {};
247
251template <typename TL0, typename TL1>
252inline constexpr bool type_list_is_equal_set_v =
254
256
263
264namespace internal {
265
266template <typename Dest, typename Src> struct unique_type_list_impl;
267
268template <typename... Ds>
269struct unique_type_list_impl<type_list<Ds...>, type_list<>>
270 : std::type_identity<type_list<Ds...>> {};
271
272template <typename... Ds, typename T, typename... Ts>
273struct unique_type_list_impl<type_list<Ds...>, type_list<T, Ts...>>
274 : std::conditional_t<
275 type_list_member<T, type_list<Ds...>>,
276 unique_type_list_impl<type_list<Ds...>, type_list<Ts...>>,
277 unique_type_list_impl<type_list<Ds..., T>, type_list<Ts...>>> {};
278
279} // namespace internal
280
291template <typename TypeList>
293 : internal::unique_type_list_impl<type_list<>, TypeList> {};
294
298template <typename TypeList>
300
302
309
310namespace internal {
311
312template <typename Dest, typename Src0, typename Src1>
313struct type_list_union_impl;
314
315template <typename... Ds>
316struct type_list_union_impl<type_list<Ds...>, type_list<>, type_list<>>
317 : std::type_identity<type_list<Ds...>> {};
318
319template <typename... Ds, typename S1, typename... S1s>
320struct type_list_union_impl<type_list<Ds...>, type_list<>,
321 type_list<S1, S1s...>>
322 : std::conditional_t<
323 type_list_member<S1, type_list<Ds...>>,
324 type_list_union_impl<type_list<Ds...>, type_list<>,
325 type_list<S1s...>>,
326 type_list_union_impl<type_list<Ds..., S1>, type_list<>,
327 type_list<S1s...>>> {};
328
329template <typename... Ds, typename S0, typename... S0s, typename... S1s>
330struct type_list_union_impl<type_list<Ds...>, type_list<S0, S0s...>,
331 type_list<S1s...>>
332 : std::conditional_t<
333 type_list_member<S0, type_list<Ds...>>,
334 type_list_union_impl<type_list<Ds...>, type_list<S0s...>,
335 type_list<S1s...>>,
336 type_list_union_impl<type_list<Ds..., S0>, type_list<S0s...>,
337 type_list<S1s...>>> {};
338
339} // namespace internal
340
355template <typename TL0, typename TL1>
357 : internal::type_list_union_impl<type_list<>, TL0, TL1> {};
358
362template <typename TL0, typename TL1>
364
366
373
374namespace internal {
375
376template <typename Dest, typename Src0, typename Src1>
377struct type_list_intersection_impl;
378
379template <typename... Ds, typename... S1s>
380struct type_list_intersection_impl<type_list<Ds...>, type_list<>,
381 type_list<S1s...>>
382 : std::type_identity<type_list<Ds...>> {};
383
384template <typename... Ds, typename S0, typename... S0s, typename... S1s>
385struct type_list_intersection_impl<type_list<Ds...>, type_list<S0, S0s...>,
386 type_list<S1s...>>
387 : std::conditional_t<
388 type_list_member<S0, type_list<S1s...>>,
389 type_list_intersection_impl<type_list<Ds..., S0>, type_list<S0s...>,
390 type_list<S1s...>>,
391 type_list_intersection_impl<type_list<Ds...>, type_list<S0s...>,
392 type_list<S1s...>>> {};
393
394} // namespace internal
395
411template <typename TL0, typename TL1>
413 : internal::type_list_intersection_impl<type_list<>, TL0, TL1> {};
414
418template <typename TL0, typename TL1>
421
423
430
431namespace internal {
432
433template <typename Dest, typename Src0, typename Src1>
434struct type_list_set_difference_impl;
435
436template <typename... Ds, typename... S1s>
437struct type_list_set_difference_impl<type_list<Ds...>, type_list<>,
438 type_list<S1s...>>
439 : std::type_identity<type_list<Ds...>> {};
440
441template <typename... Ds, typename S0, typename... S0s, typename... S1s>
442struct type_list_set_difference_impl<type_list<Ds...>, type_list<S0, S0s...>,
443 type_list<S1s...>>
444 : std::conditional_t<
445 type_list_member<S0, type_list<S1s...>>,
446 type_list_set_difference_impl<type_list<Ds...>, type_list<S0s...>,
447 type_list<S1s...>>,
448 type_list_set_difference_impl<
449 type_list<Ds..., S0>, type_list<S0s...>, type_list<S1s...>>> {};
450
451} // namespace internal
452
469template <typename TL0, typename TL1>
471 : internal::type_list_set_difference_impl<type_list<>, TL0, TL1> {};
472
476template <typename TL0, typename TL1>
479
481
482} // namespace tcspc
Concept that is satisfied when a type is convertible to at least one of the members of a type list.
Definition type_list.hpp:186
Concept that is satisfied when a type is a tcspc::type_list specialization.
Definition type_list.hpp:64
Concept that is satisfied when a type is contained in a type list.
Definition type_list.hpp:158
typename type_list_intersection< TL0, TL1 >::type type_list_intersection_t
Helper type for tcspc::type_list_intersection.
Definition type_list.hpp:419
constexpr bool type_list_is_equal_set_v
Helper variable template for tcspc::type_list_is_equal_set.
Definition type_list.hpp:252
constexpr bool type_list_is_subset_v
Helper variable template for tcspc::type_list_is_subset.
Definition type_list.hpp:219
typename type_list_set_difference< TL0, TL1 >::type type_list_set_difference_t
Helper type for tcspc::type_list_set_difference.
Definition type_list.hpp:477
typename type_list_singleton_element< TypeList >::type type_list_singleton_element_t
Helper type for tcspc::type_list_singleton_element.
Definition type_list.hpp:130
constexpr std::size_t type_list_size_v
Helper variable template for tcspc::type_list_size.
Definition type_list.hpp:97
typename type_list_union< TL0, TL1 >::type type_list_union_t
Helper type for tcspc::type_list_union.
Definition type_list.hpp:363
typename unique_type_list< TypeList >::type unique_type_list_t
Helper type for tcspc::unique_type_list.
Definition type_list.hpp:299
libtcspc namespace.
Definition acquire.hpp:29
Metafunction to obtain the intersection of two sets of types.
Definition type_list.hpp:413
Metafunction to determine if a type list is set-equivalent to another.
Definition type_list.hpp:246
Metafunction to determine if a type list is a subset of another.
Definition type_list.hpp:205
Metafunction to obtain the set difference of two sets of types.
Definition type_list.hpp:471
Metafunction to obtain the contained type of a singleton type list.
Definition type_list.hpp:117
Metafunction to obtain the size (length) of a type list.
Definition type_list.hpp:83
Metafunction to obtain the union of two sets of types.
Definition type_list.hpp:357
Compile-time representation of a list of types.
Definition type_list.hpp:38
Metafunction to remove duplicate types from a type list.
Definition type_list.hpp:293