DUNE-ACFEM (unstable)

typetuple.hh
1#ifndef __DUNE_ACFEM_MPL_TYPETUPLE_HH__
2#define __DUNE_ACFEM_MPL_TYPETUPLE_HH__
3
4#include "typepackelement.hh"
5#include "size.hh"
6
7namespace Dune::ACFem::MPL {
8
9 using ::Dune::ACFem::TypePackElement;
10
11 template<class... T>
12 struct TypeTuple
13 {
14 static constexpr std::size_t size()
15 {
16 return sizeof...(T);
17 }
18
19 template<std::size_t I>
20 using Get = TypePackElement<I, T...>;
21 };
22
23 template<class T>
24 struct TypeTuple<T>
25 {
26 using Type = T;
27
28 static constexpr std::size_t size()
29 {
30 return 1;
31 }
32
33 template<std::size_t I>
34 using Get = T;
35 };
36
37 template<class T>
38 using TypeWrapper = TypeTuple<T>;
39
40 template<class T0, class T1>
41 struct TypeTuple<T0, T1>
42 {
43 using First = T0;
44 using Second = T1;
45
46 static constexpr std::size_t size()
47 {
48 return 2;
49 }
50
51 template<std::size_t I>
52 using Get = ConditionalType<I == 0, T0, T1>;
53 };
54
55 template<class T0, class T1>
56 using TypePair = TypeTuple<T0, T1>;
57
58 template<class T>
59 constexpr inline bool IsTypeTupleV = false;
60
61 template<class T>
62 constexpr inline bool IsTypeTupleV<T&> = IsTypeTupleV<T>;
63
64 template<class T>
65 constexpr inline bool IsTypeTupleV<T&&> = IsTypeTupleV<T>;
66
67 template<class... T>
68 constexpr inline bool IsTypeTupleV<TypeTuple<T...> > = true;
69
70 template<std::size_t N, class Tuple>
71 using TypeTupleElement = typename Tuple::template Get<N>;
72
73 template<std::size_t N, class Tuple>
74 using GetType = typename Tuple::template Get<N>;
75
76 template<class Tuple>
77 struct FrontTypeExpander;
78
79 template<class T, class... Rest>
80 struct FrontTypeExpander<TypeTuple<T, Rest...> >
81 {
82 using Type = T;
83 using Tail = TypeTuple<Rest...>;
84 };
85
86 template<class Tuple>
87 using FrontType = typename FrontTypeExpander<Tuple>::Type;
88
89 template<class Tuple>
90 using TailPart = typename FrontTypeExpander<Tuple>::Tail;
91
92 template<class T, class... Rest>
93 constexpr auto addFrontType(TypeTuple<Rest...>)
94 {
95 return MPL::TypeTuple<T, Rest...>{};
96 }
97
98 template<class T, class TypeList>
99 using AddFrontType = decltype(addFrontType<T>(TypeList{}));
100
101 template<class T, class... Types>
102 constexpr auto removeFrontType(TypeTuple<T, Types...>)
103 {
104 return TypeTuple<Types...>{};
105 };
106
107 template<class TypeList>
108 using RemoveFrontType = decltype(removeFrontType(TypeList{}));
109
110 template<class T, class... Types>
111 constexpr auto pushBackType(TypeTuple<Types...>)
112 {
113 return TypeTuple<Types..., T>{};
114 }
115
116 template<class T, class TypeList>
117 using PushBackType = decltype(pushBackType<T>(TypeList{}));
118
119 template<class... Types, class T>
120 constexpr auto popBackType(TypeTuple<Types..., T>)
121 {
122 return TypeTuple<Types...>{};
123 }
124
125 template<class TypeList>
126 using PopBackType = decltype(popBackType(TypeList{}));
127
128 template<class... Tuples>
129 struct TypeTupleCatHelper;
130
131 template<>
132 struct TypeTupleCatHelper<>
133 {
134 using Type = TypeTuple<>;
135 };
136
137 template<class Tuple>
138 struct TypeTupleCatHelper<Tuple>
139 {
140 using Type = Tuple;
141 };
142
143 template<class... T0, class... T1>
144 struct TypeTupleCatHelper<TypeTuple<T0...>, TypeTuple<T1...> >
145 {
146 using Type = TypeTuple<T0..., T1...>;
147 };
148
149 template<class... T0, class... T1, class... T2>
150 struct TypeTupleCatHelper<TypeTuple<T0...>, TypeTuple<T1...>, TypeTuple<T2...> >
151 {
152 using Type = TypeTuple<T0..., T1..., T2...>;
153 };
154
155 template<class... T0, class... T1, class... T2, class... T3>
156 struct TypeTupleCatHelper<TypeTuple<T0...>, TypeTuple<T1...>, TypeTuple<T2...>, TypeTuple<T3...> >
157 {
158 using Type = TypeTuple<T0..., T1..., T2..., T3...>;
159 };
160
161 template<class... T0, class... T1, class... T2, class... T3, class... T4>
162 struct TypeTupleCatHelper<TypeTuple<T0...>, TypeTuple<T1...>, TypeTuple<T2...>, TypeTuple<T3...>, TypeTuple<T4...> >
163 {
164 using Type = TypeTuple<T0..., T1..., T2..., T3..., T4...>;
165 };
166
167 template<class... T0, class... T1, class... T2, class... T3, class... T4,
168 class... T5>
169 struct TypeTupleCatHelper<TypeTuple<T0...>, TypeTuple<T1...>, TypeTuple<T2...>, TypeTuple<T3...>, TypeTuple<T4...>,
170 TypeTuple<T5...> >
171 {
172 using Type = TypeTuple<T0..., T1..., T2..., T3..., T4...,
173 T5...>;
174 };
175
176
177 template<class... T0, class... T1, class... T2, class... T3, class... T4,
178 class... T5, class... T6>
179 struct TypeTupleCatHelper<TypeTuple<T0...>, TypeTuple<T1...>, TypeTuple<T2...>, TypeTuple<T3...>, TypeTuple<T4...>,
180 TypeTuple<T5...>, TypeTuple<T6...> >
181 {
182 using Type = TypeTuple<T0..., T1..., T2..., T3..., T4...,
183 T5..., T6...>;
184 };
185
186 template<class... T0, class... T1, class... T2, class... T3, class... T4,
187 class... T5, class... T6, class... T7>
188 struct TypeTupleCatHelper<TypeTuple<T0...>, TypeTuple<T1...>, TypeTuple<T2...>, TypeTuple<T3...>, TypeTuple<T4...>,
189 TypeTuple<T5...>, TypeTuple<T6...>, TypeTuple<T7...> >
190 {
191 using Type = TypeTuple<T0..., T1..., T2..., T3..., T4...,
192 T5..., T6..., T7...>;
193 };
194
195 template<class... T0, class... T1, class... T2, class... T3, class... T4,
196 class... T5, class... T6, class... T7, class... T8>
197 struct TypeTupleCatHelper<TypeTuple<T0...>, TypeTuple<T1...>, TypeTuple<T2...>, TypeTuple<T3...>, TypeTuple<T4...>,
198 TypeTuple<T5...>, TypeTuple<T6...>, TypeTuple<T7...>, TypeTuple<T8...> >
199 {
200 using Type = TypeTuple<T0..., T1..., T2..., T3..., T4...,
201 T5..., T6..., T7..., T8...>;
202 };
203
204 template<class... T0, class... T1, class... T2, class... T3, class... T4,
205 class... T5, class... T6, class... T7, class... T8, class... T9>
206 struct TypeTupleCatHelper<TypeTuple<T0...>, TypeTuple<T1...>, TypeTuple<T2...>, TypeTuple<T3...>, TypeTuple<T4...>,
207 TypeTuple<T5...>, TypeTuple<T6...>, TypeTuple<T7...>, TypeTuple<T8...>, TypeTuple<T9...> >
208 {
209 using Type = TypeTuple<T0..., T1..., T2..., T3..., T4...,
210 T5..., T6..., T7..., T8..., T9...>;
211 };
212
213 template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class Other, class... Rest>
214 struct TypeTupleCatHelper<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Other, Rest...>
215 {
216 using Type = typename TypeTupleCatHelper<
217 typename TypeTupleCatHelper<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::Type, Other, Rest...
218 >::Type;
219 };
220
221 template<class... Tuples>
222 using TypeTupleCat = typename TypeTupleCatHelper<Tuples...>::Type;
223
224 namespace {
225
226 template<class Tuple, template<CXX17_P0522R0(class T)> class Transform>
227 struct TypeTupleTransformHelper;
228
229 template<class... T, template<CXX17_P0522R0(class)> class Transform>
230 struct TypeTupleTransformHelper<TypeTuple<T...>, Transform>
231 {
232 using Type = TypeTuple<Transform<T>...>;
233 };
234
235 }
236
237 template<class Tuple, template<CXX17_P0522R0(class T)> class Transform>
238 using TypeTupleTransform = typename TypeTupleTransformHelper<Tuple, Transform>::Type;
239
240}
241
242#include "size.hh"
243
244namespace Dune::ACFem {
245
246 template<class... T>
247 constexpr inline std::size_t SizeV<MPL::TypeTuple<T...> > = sizeof...(T);
248
249}
250
251#endif // __DUNE_ACFEM_MPL_TYPETUPLE_HH__
constexpr std::size_t SizeV
Gives the number of elements in tuple-likes and std::integer_sequence.
Definition: size.hh:40
typename GetTailPartHelper< Seq::size() -Cnt, Seq >::Type TailPart
Extract Cnt many consecutive elements from the end of Seq.
Definition: access.hh:221
constexpr std::size_t size()
Gives the number of elements in tuple-likes and std::integer_sequence.
Definition: size.hh:73
Form a sub-sequence with the values at the positions NOT given in Indices.
Definition: conditional.hh:8
A namespace encapsulating everything defined in our dune-acfem project.
Definition: ellipticfemscheme.hh:56
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Jun 19, 23:17, 2026)