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 {};
87template <
typename... Ts>
89 : std::integral_constant<std::size_t, sizeof...(Ts)> {};
96template <
typename TypeList>
129template <
typename TypeList>
139template <
typename TypeList,
typename Type>
struct type_list_contains_impl;
141template <
typename Type,
typename... Ts>
142struct type_list_contains_impl<
type_list<Ts...>, Type>
143 : std::bool_constant<(std::same_as<Type, Ts> || ...)> {};
157template <
typename Type,
typename TypeList>
159 internal::type_list_contains_impl<TypeList, Type>::value;
165template <
typename Type,
typename TypeList>
166struct is_convertible_to_type_list_member_impl;
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> || ...)> {};
185template <
typename Type,
typename TypeList>
187 internal::is_convertible_to_type_list_member_impl<Type, TypeList>::value;
209template <
typename... T0s,
typename TL1>
211 : std::bool_constant<(type_list_member<T0s, TL1> && ...)> {};
218template <
typename TL0,
typename TL1>
243template <
typename TL0,
typename TL1>
245 : std::conjunction<type_list_is_subset<TL0, TL1>,
246 type_list_is_subset<TL1, TL0>> {};
251template <
typename TL0,
typename TL1>
266template <
typename Dest,
typename Src>
struct unique_type_list_impl;
268template <
typename... Ds>
270 : std::type_identity<type_list<Ds...>> {};
272template <
typename... Ds,
typename T,
typename... 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...>>> {};
291template <
typename TypeList>
293 : internal::unique_type_list_impl<type_list<>, TypeList> {};
298template <
typename TypeList>
312template <
typename Dest,
typename Src0,
typename Src1>
313struct type_list_union_impl;
315template <
typename... Ds>
317 : std::type_identity<type_list<Ds...>> {};
319template <
typename... Ds,
typename S1,
typename... S1s>
322 : std::conditional_t<
323 type_list_member<S1, type_list<Ds...>>,
324 type_list_union_impl<type_list<Ds...>, type_list<>,
326 type_list_union_impl<type_list<Ds..., S1>, type_list<>,
327 type_list<S1s...>>> {};
329template <
typename... Ds,
typename S0,
typename... S0s,
typename... S1s>
332 : std::conditional_t<
333 type_list_member<S0, type_list<Ds...>>,
334 type_list_union_impl<type_list<Ds...>, type_list<S0s...>,
336 type_list_union_impl<type_list<Ds..., S0>, type_list<S0s...>,
337 type_list<S1s...>>> {};
355template <
typename TL0,
typename TL1>
357 : internal::type_list_union_impl<type_list<>, TL0, TL1> {};
362template <
typename TL0,
typename TL1>
376template <
typename Dest,
typename Src0,
typename Src1>
377struct type_list_intersection_impl;
379template <
typename... Ds,
typename... S1s>
382 : std::type_identity<type_list<Ds...>> {};
384template <
typename... Ds,
typename S0,
typename... S0s,
typename... 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...>,
391 type_list_intersection_impl<type_list<Ds...>, type_list<S0s...>,
392 type_list<S1s...>>> {};
411template <
typename TL0,
typename TL1>
413 : internal::type_list_intersection_impl<type_list<>, TL0, TL1> {};
418template <
typename TL0,
typename TL1>
433template <
typename Dest,
typename Src0,
typename Src1>
434struct type_list_set_difference_impl;
436template <
typename... Ds,
typename... S1s>
439 : std::type_identity<type_list<Ds...>> {};
441template <
typename... Ds,
typename S0,
typename... S0s,
typename... 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...>,
448 type_list_set_difference_impl<
449 type_list<Ds..., S0>, type_list<S0s...>, type_list<S1s...>>> {};
469template <
typename TL0,
typename TL1>
471 : internal::type_list_set_difference_impl<type_list<>, TL0, TL1> {};
476template <
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: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