38template <
typename... Ts>
struct type_list {
46template <
typename>
struct is_type_list_impl : std::false_type {};
48template <
typename... Ts>
49struct is_type_list_impl<type_list<Ts...>> : std::true_type {};
70template <
typename EventList>
71inline constexpr bool is_copy_constructible_list_v =
false;
73template <
typename... Es>
74inline constexpr bool is_copy_constructible_list_v<
type_list<Es...>> =
75 (std::copy_constructible<Es> && ...);
77template <
typename EventList>
78inline constexpr bool is_move_constructible_list_v =
false;
80template <
typename... Es>
81inline constexpr bool is_move_constructible_list_v<
type_list<Es...>> =
82 (std::move_constructible<Es> && ...);
84template <
typename EventList>
85inline constexpr bool is_move_assignable_list_v =
false;
87template <
typename... Es>
88inline constexpr bool is_move_assignable_list_v<
type_list<Es...>> =
89 (std::is_move_assignable_v<Es> && ...);
91template <
typename EventList>
92inline constexpr bool is_equality_comparable_list_v =
false;
94template <
typename... Es>
95inline constexpr bool is_equality_comparable_list_v<
type_list<Es...>> =
96 (std::equality_comparable<Es> && ...);
123template <
typename... Ts>
125 : std::integral_constant<std::size_t, sizeof...(Ts)> {};
132template <
typename TypeList>
165template <
typename TypeList>
175template <
typename TypeList,
typename Type>
struct type_list_contains_impl;
177template <
typename Type,
typename... Ts>
178struct type_list_contains_impl<
type_list<Ts...>, Type>
179 : std::bool_constant<(std::same_as<Type, Ts> || ...)> {};
193template <
typename Type,
typename TypeList>
195 internal::type_list_contains_impl<TypeList, Type>::value;
201template <
typename Type,
typename TypeList>
202struct is_convertible_to_type_list_member_impl;
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> || ...)> {};
221template <
typename Type,
typename TypeList>
223 internal::is_convertible_to_type_list_member_impl<Type, TypeList>::value;
245template <
typename... T0s,
typename TL1>
247 : std::bool_constant<(type_list_member<T0s, TL1> && ...)> {};
254template <
typename TL0,
typename TL1>
279template <
typename TL0,
typename TL1>
281 : std::conjunction<type_list_is_subset<TL0, TL1>,
282 type_list_is_subset<TL1, TL0>> {};
287template <
typename TL0,
typename TL1>
302template <
typename Dest,
typename Src>
struct unique_type_list_impl;
304template <
typename... Ds>
306 : std::type_identity<type_list<Ds...>> {};
308template <
typename... Ds,
typename T,
typename... 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...>>> {};
327template <
typename TypeList>
329 : internal::unique_type_list_impl<type_list<>, TypeList> {};
334template <
typename TypeList>
348template <
typename Dest,
typename Src0,
typename Src1>
349struct type_list_union_impl;
351template <
typename... Ds>
353 : std::type_identity<type_list<Ds...>> {};
355template <
typename... Ds,
typename S1,
typename... S1s>
358 : std::conditional_t<
359 type_list_member<S1, type_list<Ds...>>,
360 type_list_union_impl<type_list<Ds...>, type_list<>,
362 type_list_union_impl<type_list<Ds..., S1>, type_list<>,
363 type_list<S1s...>>> {};
365template <
typename... Ds,
typename S0,
typename... S0s,
typename... S1s>
368 : std::conditional_t<
369 type_list_member<S0, type_list<Ds...>>,
370 type_list_union_impl<type_list<Ds...>, type_list<S0s...>,
372 type_list_union_impl<type_list<Ds..., S0>, type_list<S0s...>,
373 type_list<S1s...>>> {};
391template <
typename TL0,
typename TL1>
393 : internal::type_list_union_impl<type_list<>, TL0, TL1> {};
398template <
typename TL0,
typename TL1>
412template <
typename Dest,
typename Src0,
typename Src1>
413struct type_list_intersection_impl;
415template <
typename... Ds,
typename... S1s>
418 : std::type_identity<type_list<Ds...>> {};
420template <
typename... Ds,
typename S0,
typename... S0s,
typename... 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...>,
427 type_list_intersection_impl<type_list<Ds...>, type_list<S0s...>,
428 type_list<S1s...>>> {};
447template <
typename TL0,
typename TL1>
449 : internal::type_list_intersection_impl<type_list<>, TL0, TL1> {};
454template <
typename TL0,
typename TL1>
468template <
typename Dest,
typename Src0,
typename Src1>
469struct type_list_set_difference_impl;
471template <
typename... Ds,
typename... S1s>
474 : std::type_identity<type_list<Ds...>> {};
476template <
typename... Ds,
typename S0,
typename... S0s,
typename... 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...>,
483 type_list_set_difference_impl<
484 type_list<Ds..., S0>, type_list<S0s...>, type_list<S1s...>>> {};
504template <
typename TL0,
typename TL1>
506 : internal::type_list_set_difference_impl<type_list<>, TL0, TL1> {};
511template <
typename TL0,
typename TL1>
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