VCCC  2024.05
VisualCamp Common C++ library
type_sequence.hpp
Go to the documentation of this file.
1 //
2 // Created by yonggyulee on 1/12/24.
3 //
4 
5 #ifndef VCCC_UTILITY_TYPE_SEQUENCE_HPP
6 #define VCCC_UTILITY_TYPE_SEQUENCE_HPP
7 
8 #include <cstddef>
9 
10 namespace vccc {
11 
14 
15 // Simple type storage (same with not implemented std::tuple)
16 template<typename...>
17 struct type_sequence;
18 
19 namespace detail {
20 
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...>;
26 };
27 template<typename S1, typename S2>
28 using type_sequence_cat_t = typename type_sequence_cat_impl<S1, S2>::type;
29 
30 template<typename T, std::size_t>
31 struct make_type_sequence_impl;
32 
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>;
41 };
42 
43 template<std::size_t N, typename T, typename TS>
44 struct type_sequence_type_count_impl;
45 
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> {};
49 
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...>> {};
53 
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...>> {};
57 
58 template<std::size_t I, typename T, typename TS>
59 struct type_sequence_type_index_impl;
60 
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> {};
64 
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...>> {};
68 
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> {};
72 
73 } // namespace detail
74 
76 template<typename T, std::size_t N>
77 using make_type_sequence = typename detail::make_type_sequence_impl<T, N>::type;
78 
80 template<typename T, typename TS>
81 struct type_sequence_type_count : detail::type_sequence_type_count_impl<0, T, TS> {};
82 
86 template<typename T, typename TS>
87 struct type_sequence_type_index : detail::type_sequence_type_index_impl<0, T, TS> {};
88 
89 
91 template<std::size_t I, typename TS>
93 
94 template<std::size_t I>
96 
97 template<typename U, typename... Us>
99  using type = U;
100 };
101 
102 template<std::size_t I, typename U, typename... Us>
104  : type_sequence_element_type<I - 1, type_sequence<Us...>> {};
105 
106 template<std::size_t I, typename TS>
108 
109 template<typename... Types>
111  template<typename T>
113 
114  template<typename T>
116 
117  template<typename T>
119 
120  template<std::size_t I>
122 
124  using back = element_type<sizeof...(Types) - 1>;
125 };
126 
128 
129 } // namespace vccc
130 
131 #endif // VCCC_UTILITY_TYPE_SEQUENCE_HPP
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
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