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
67
68namespace internal {
69
70template <typename EventList>
71inline constexpr bool is_copy_constructible_list_v = false;
72
73template <typename... Es>
74inline constexpr bool is_copy_constructible_list_v<type_list<Es...>> =
75 (std::copy_constructible<Es> && ...);
76
77template <typename EventList>
78inline constexpr bool is_move_constructible_list_v = false;
79
80template <typename... Es>
81inline constexpr bool is_move_constructible_list_v<type_list<Es...>> =
82 (std::move_constructible<Es> && ...);
83
84template <typename EventList>
85inline constexpr bool is_move_assignable_list_v = false;
86
87template <typename... Es>
88inline constexpr bool is_move_assignable_list_v<type_list<Es...>> =
89 (std::is_move_assignable_v<Es> && ...);
90
91template <typename EventList>
92inline constexpr bool is_equality_comparable_list_v = false;
93
94template <typename... Es>
95inline constexpr bool is_equality_comparable_list_v<type_list<Es...>> =
96 (std::equality_comparable<Es> && ...);
97
98} // namespace internal
99
101
108
119template <typename TypeList> struct type_list_size;
120
122
123template <typename... Ts>
124struct type_list_size<type_list<Ts...>>
125 : std::integral_constant<std::size_t, sizeof...(Ts)> {};
126
128
132template <typename TypeList>
133inline constexpr std::size_t type_list_size_v =
135
137
144
153template <typename TypeList> struct type_list_singleton_element;
154
156
157template <typename T>
158struct type_list_singleton_element<type_list<T>> : std::type_identity<T> {};
159
161
165template <typename TypeList>
168
170
172
173namespace internal {
174
175template <typename TypeList, typename Type> struct type_list_contains_impl;
176
177template <typename Type, typename... Ts>
178struct type_list_contains_impl<type_list<Ts...>, Type>
179 : std::bool_constant<(std::same_as<Type, Ts> || ...)> {};
180
181} // namespace internal
182
184
193template <typename Type, typename TypeList>
195 internal::type_list_contains_impl<TypeList, Type>::value;
196
198
199namespace internal {
200
201template <typename Type, typename TypeList>
202struct is_convertible_to_type_list_member_impl;
203
204template <typename Type, typename... Ts>
205struct is_convertible_to_type_list_member_impl<Type, type_list<Ts...>>
206 : std::bool_constant<(std::convertible_to<Type, Ts> || ...)> {};
207
208} // namespace internal
209
211
221template <typename Type, typename TypeList>
223 internal::is_convertible_to_type_list_member_impl<Type, TypeList>::value;
224
231
241template <typename TL0, typename TL1> struct type_list_is_subset;
242
244
245template <typename... T0s, typename TL1>
246struct type_list_is_subset<type_list<T0s...>, TL1>
247 : std::bool_constant<(type_list_member<T0s, TL1> && ...)> {};
248
250
254template <typename TL0, typename TL1>
255inline constexpr bool type_list_is_subset_v =
257
259
266
279template <typename TL0, typename TL1>
281 : std::conjunction<type_list_is_subset<TL0, TL1>,
282 type_list_is_subset<TL1, TL0>> {};
283
287template <typename TL0, typename TL1>
288inline constexpr bool type_list_is_equal_set_v =
290
292
299
300namespace internal {
301
302template <typename Dest, typename Src> struct unique_type_list_impl;
303
304template <typename... Ds>
305struct unique_type_list_impl<type_list<Ds...>, type_list<>>
306 : std::type_identity<type_list<Ds...>> {};
307
308template <typename... Ds, typename T, typename... Ts>
309struct unique_type_list_impl<type_list<Ds...>, type_list<T, Ts...>>
310 : std::conditional_t<
311 type_list_member<T, type_list<Ds...>>,
312 unique_type_list_impl<type_list<Ds...>, type_list<Ts...>>,
313 unique_type_list_impl<type_list<Ds..., T>, type_list<Ts...>>> {};
314
315} // namespace internal
316
327template <typename TypeList>
329 : internal::unique_type_list_impl<type_list<>, TypeList> {};
330
334template <typename TypeList>
336
338
345
346namespace internal {
347
348template <typename Dest, typename Src0, typename Src1>
349struct type_list_union_impl;
350
351template <typename... Ds>
352struct type_list_union_impl<type_list<Ds...>, type_list<>, type_list<>>
353 : std::type_identity<type_list<Ds...>> {};
354
355template <typename... Ds, typename S1, typename... S1s>
356struct type_list_union_impl<type_list<Ds...>, type_list<>,
357 type_list<S1, S1s...>>
358 : std::conditional_t<
359 type_list_member<S1, type_list<Ds...>>,
360 type_list_union_impl<type_list<Ds...>, type_list<>,
361 type_list<S1s...>>,
362 type_list_union_impl<type_list<Ds..., S1>, type_list<>,
363 type_list<S1s...>>> {};
364
365template <typename... Ds, typename S0, typename... S0s, typename... S1s>
366struct type_list_union_impl<type_list<Ds...>, type_list<S0, S0s...>,
367 type_list<S1s...>>
368 : std::conditional_t<
369 type_list_member<S0, type_list<Ds...>>,
370 type_list_union_impl<type_list<Ds...>, type_list<S0s...>,
371 type_list<S1s...>>,
372 type_list_union_impl<type_list<Ds..., S0>, type_list<S0s...>,
373 type_list<S1s...>>> {};
374
375} // namespace internal
376
391template <typename TL0, typename TL1>
393 : internal::type_list_union_impl<type_list<>, TL0, TL1> {};
394
398template <typename TL0, typename TL1>
400
402
409
410namespace internal {
411
412template <typename Dest, typename Src0, typename Src1>
413struct type_list_intersection_impl;
414
415template <typename... Ds, typename... S1s>
416struct type_list_intersection_impl<type_list<Ds...>, type_list<>,
417 type_list<S1s...>>
418 : std::type_identity<type_list<Ds...>> {};
419
420template <typename... Ds, typename S0, typename... S0s, typename... S1s>
421struct type_list_intersection_impl<type_list<Ds...>, type_list<S0, S0s...>,
422 type_list<S1s...>>
423 : std::conditional_t<
424 type_list_member<S0, type_list<S1s...>>,
425 type_list_intersection_impl<type_list<Ds..., S0>, type_list<S0s...>,
426 type_list<S1s...>>,
427 type_list_intersection_impl<type_list<Ds...>, type_list<S0s...>,
428 type_list<S1s...>>> {};
429
430} // namespace internal
431
447template <typename TL0, typename TL1>
449 : internal::type_list_intersection_impl<type_list<>, TL0, TL1> {};
450
454template <typename TL0, typename TL1>
456
458
465
466namespace internal {
467
468template <typename Dest, typename Src0, typename Src1>
469struct type_list_set_difference_impl;
470
471template <typename... Ds, typename... S1s>
472struct type_list_set_difference_impl<type_list<Ds...>, type_list<>,
473 type_list<S1s...>>
474 : std::type_identity<type_list<Ds...>> {};
475
476template <typename... Ds, typename S0, typename... S0s, typename... S1s>
477struct type_list_set_difference_impl<type_list<Ds...>, type_list<S0, S0s...>,
478 type_list<S1s...>>
479 : std::conditional_t<
480 type_list_member<S0, type_list<S1s...>>,
481 type_list_set_difference_impl<type_list<Ds...>, type_list<S0s...>,
482 type_list<S1s...>>,
483 type_list_set_difference_impl<
484 type_list<Ds..., S0>, type_list<S0s...>, type_list<S1s...>>> {};
485
486} // namespace internal
487
504template <typename TL0, typename TL1>
506 : internal::type_list_set_difference_impl<type_list<>, TL0, TL1> {};
507
511template <typename TL0, typename TL1>
513
515
516} // 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:222
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:194
type_list_intersection< TL0, TL1 >::type type_list_intersection_t
Helper type for tcspc::type_list_intersection.
Definition type_list.hpp:455
constexpr bool type_list_is_equal_set_v
Helper variable template for tcspc::type_list_is_equal_set.
Definition type_list.hpp:288
constexpr bool type_list_is_subset_v
Helper variable template for tcspc::type_list_is_subset.
Definition type_list.hpp:255
type_list_set_difference< TL0, TL1 >::type type_list_set_difference_t
Helper type for tcspc::type_list_set_difference.
Definition type_list.hpp:512
type_list_singleton_element< TypeList >::type type_list_singleton_element_t
Helper type for tcspc::type_list_singleton_element.
Definition type_list.hpp:166
constexpr std::size_t type_list_size_v
Helper variable template for tcspc::type_list_size.
Definition type_list.hpp:133
type_list_union< TL0, TL1 >::type type_list_union_t
Helper type for tcspc::type_list_union.
Definition type_list.hpp:399
unique_type_list< TypeList >::type unique_type_list_t
Helper type for tcspc::unique_type_list.
Definition type_list.hpp:335
libtcspc namespace.
Definition acquire.hpp:30
Metafunction to obtain the intersection of two sets of types.
Definition type_list.hpp:449
Metafunction to determine if a type list is set-equivalent to another.
Definition type_list.hpp:282
Metafunction to determine if a type list is a subset of another.
Definition type_list.hpp:241
Metafunction to obtain the set difference of two sets of types.
Definition type_list.hpp:506
Metafunction to obtain the contained type of a singleton type list.
Definition type_list.hpp:153
Metafunction to obtain the size (length) of a type list.
Definition type_list.hpp:119
Metafunction to obtain the union of two sets of types.
Definition type_list.hpp:393
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:329