5 #ifndef VCCC_UTILITY_TYPE_SEQUENCE_HPP
6 #define VCCC_UTILITY_TYPE_SEQUENCE_HPP
21 template<
typename S1,
typename S2>
22 struct type_sequence_cat_impl;
23 template<
typename... Ts,
typename... Us>
24 struct type_sequence_cat_impl<type_sequence<Ts...>, type_sequence<Us...>> {
25 using type = type_sequence<Ts..., Us...>;
27 template<
typename S1,
typename S2>
28 using type_sequence_cat_t =
typename type_sequence_cat_impl<S1, S2>::type;
30 template<
typename T, std::
size_t>
31 struct make_type_sequence_impl;
33 template<
typename T, std::
size_t N>
struct type_sequence_impl;
34 template<
typename T>
struct make_type_sequence_impl<T, 0> {
using type = type_sequence<>; };
35 template<
typename T>
struct make_type_sequence_impl<T, 1> {
using type = type_sequence<T>; };
36 template<
typename T>
struct make_type_sequence_impl<T, 2> {
using type = type_sequence<T, T>; };
37 template<
typename T, std::
size_t N>
38 struct make_type_sequence_impl {
39 using type = type_sequence_cat_t<
typename make_type_sequence_impl<T, (N / 2)>::type,
40 typename make_type_sequence_impl<T, N - (N / 2)>::type>;
43 template<std::
size_t N,
typename T,
typename TS>
44 struct type_sequence_type_count_impl;
46 template<std::
size_t N,
typename T>
47 struct type_sequence_type_count_impl<N, T, type_sequence<>>
48 : std::integral_constant<std::size_t, N> {};
50 template<std::size_t N,
typename T,
typename U1,
typename... Us>
51 struct type_sequence_type_count_impl<N, T, type_sequence<U1, Us...>>
52 : type_sequence_type_count_impl<N, T, type_sequence<Us...>> {};
54 template<std::size_t N,
typename T ,
typename... Us>
55 struct type_sequence_type_count_impl<N, T, type_sequence<T, Us...>>
56 : type_sequence_type_count_impl<N + 1, T, type_sequence<Us...>> {};
58 template<std::
size_t I,
typename T,
typename TS>
59 struct type_sequence_type_index_impl;
61 template<std::
size_t I,
typename T>
62 struct type_sequence_type_index_impl<I, T, type_sequence<>>
63 : std::integral_constant<std::size_t, I + 1> {};
65 template<std::size_t I,
typename T,
typename U1,
typename... Us>
66 struct type_sequence_type_index_impl<I, T, type_sequence<U1, Us...>>
67 : type_sequence_type_index_impl<I + 1, T, type_sequence<Us...>> {};
69 template<std::size_t I,
typename T,
typename... Us>
70 struct type_sequence_type_index_impl<I, T, type_sequence<T, Us...>>
71 : std::integral_constant<std::size_t, I> {};
76 template<
typename T, std::
size_t N>
80 template<
typename T,
typename TS>
86 template<
typename T,
typename TS>
91 template<std::
size_t I,
typename TS>
94 template<std::
size_t I>
97 template<
typename U,
typename... Us>
102 template<std::size_t I,
typename U,
typename... Us>
106 template<std::
size_t I,
typename TS>
109 template<
typename... Types>
120 template<std::
size_t I>
typename detail::make_type_sequence_impl< T, N >::type make_type_sequence
create a type_sequence that holds T of N times
Definition: type_sequence.hpp:77
typename type_sequence_element_type< I, TS >::type type_sequence_element_type_t
Definition: type_sequence.hpp:107
Definition: directory.h:12
U type
Definition: type_sequence.hpp:99
get type of -th element of type_sequence
Definition: type_sequence.hpp:92
count the number of occurences of T in type_sequence
Definition: type_sequence.hpp:81
get the index of T in type_sequence.
Definition: type_sequence.hpp:87
Definition: type_sequence.hpp:110
static constexpr bool unique
Definition: type_sequence.hpp:115
element_type< 0 > front
Definition: type_sequence.hpp:123
static constexpr std::size_t count
Definition: type_sequence.hpp:112
type_sequence_element_type_t< I, type_sequence > element_type
Definition: type_sequence.hpp:121
element_type< sizeof...(Types) - 1 > back
Definition: type_sequence.hpp:124
static constexpr std::size_t index
Definition: type_sequence.hpp:118