1#ifndef __DUNE_ACFEM_MPL_TYPETUPLE_HH__
2#define __DUNE_ACFEM_MPL_TYPETUPLE_HH__
4#include "typepackelement.hh"
9 using ::Dune::ACFem::TypePackElement;
14 static constexpr std::size_t
size()
19 template<std::
size_t I>
20 using Get = TypePackElement<I, T...>;
28 static constexpr std::size_t
size()
33 template<std::
size_t I>
38 using TypeWrapper = TypeTuple<T>;
40 template<
class T0,
class T1>
41 struct TypeTuple<T0, T1>
46 static constexpr std::size_t
size()
51 template<std::
size_t I>
52 using Get = ConditionalType<I == 0, T0, T1>;
55 template<
class T0,
class T1>
56 using TypePair = TypeTuple<T0, T1>;
59 constexpr inline bool IsTypeTupleV =
false;
62 constexpr inline bool IsTypeTupleV<T&> = IsTypeTupleV<T>;
65 constexpr inline bool IsTypeTupleV<T&&> = IsTypeTupleV<T>;
68 constexpr inline bool IsTypeTupleV<TypeTuple<T...> > =
true;
70 template<std::
size_t N,
class Tuple>
71 using TypeTupleElement =
typename Tuple::template Get<N>;
73 template<std::
size_t N,
class Tuple>
74 using GetType =
typename Tuple::template Get<N>;
77 struct FrontTypeExpander;
79 template<
class T,
class... Rest>
80 struct FrontTypeExpander<TypeTuple<T, Rest...> >
83 using Tail = TypeTuple<Rest...>;
87 using FrontType =
typename FrontTypeExpander<Tuple>::Type;
90 using TailPart =
typename FrontTypeExpander<Tuple>::Tail;
92 template<
class T,
class... Rest>
93 constexpr auto addFrontType(TypeTuple<Rest...>)
95 return MPL::TypeTuple<T, Rest...>{};
98 template<
class T,
class TypeList>
99 using AddFrontType =
decltype(addFrontType<T>(TypeList{}));
101 template<
class T,
class... Types>
102 constexpr auto removeFrontType(TypeTuple<T, Types...>)
104 return TypeTuple<Types...>{};
107 template<
class TypeList>
108 using RemoveFrontType =
decltype(removeFrontType(TypeList{}));
110 template<
class T,
class... Types>
111 constexpr auto pushBackType(TypeTuple<Types...>)
113 return TypeTuple<Types..., T>{};
116 template<
class T,
class TypeList>
117 using PushBackType =
decltype(pushBackType<T>(TypeList{}));
119 template<
class... Types,
class T>
120 constexpr auto popBackType(TypeTuple<Types..., T>)
122 return TypeTuple<Types...>{};
125 template<
class TypeList>
126 using PopBackType =
decltype(popBackType(TypeList{}));
128 template<
class... Tuples>
129 struct TypeTupleCatHelper;
132 struct TypeTupleCatHelper<>
134 using Type = TypeTuple<>;
137 template<
class Tuple>
138 struct TypeTupleCatHelper<Tuple>
143 template<
class... T0,
class... T1>
144 struct TypeTupleCatHelper<TypeTuple<T0...>, TypeTuple<T1...> >
146 using Type = TypeTuple<T0..., T1...>;
149 template<
class... T0,
class... T1,
class... T2>
150 struct TypeTupleCatHelper<TypeTuple<T0...>, TypeTuple<T1...>, TypeTuple<T2...> >
152 using Type = TypeTuple<T0..., T1..., T2...>;
155 template<
class... T0,
class... T1,
class... T2,
class... T3>
156 struct TypeTupleCatHelper<TypeTuple<T0...>, TypeTuple<T1...>, TypeTuple<T2...>, TypeTuple<T3...> >
158 using Type = TypeTuple<T0..., T1..., T2..., T3...>;
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...> >
164 using Type = TypeTuple<T0..., T1..., T2..., T3..., T4...>;
167 template<
class... T0,
class... T1,
class... T2,
class... T3,
class... T4,
169 struct TypeTupleCatHelper<TypeTuple<T0...>, TypeTuple<T1...>, TypeTuple<T2...>, TypeTuple<T3...>, TypeTuple<T4...>,
172 using Type = TypeTuple<T0..., T1..., T2..., T3..., T4...,
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...> >
182 using Type = TypeTuple<T0..., T1..., T2..., T3..., T4...,
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...> >
191 using Type = TypeTuple<T0..., T1..., T2..., T3..., T4...,
192 T5..., T6..., T7...>;
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...> >
200 using Type = TypeTuple<T0..., T1..., T2..., T3..., T4...,
201 T5..., T6..., T7..., T8...>;
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...> >
209 using Type = TypeTuple<T0..., T1..., T2..., T3..., T4...,
210 T5..., T6..., T7..., T8..., T9...>;
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...>
216 using Type =
typename TypeTupleCatHelper<
217 typename TypeTupleCatHelper<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>::Type, Other, Rest...
221 template<
class... Tuples>
222 using TypeTupleCat =
typename TypeTupleCatHelper<Tuples...>::Type;
226 template<
class Tuple,
template<CXX17_P0522R0(
class T)>
class Transform>
227 struct TypeTupleTransformHelper;
229 template<
class... T,
template<CXX17_P0522R0(
class)>
class Transform>
230 struct TypeTupleTransformHelper<TypeTuple<T...>, Transform>
232 using Type = TypeTuple<Transform<T>...>;
237 template<
class Tuple,
template<CXX17_P0522R0(
class T)>
class Transform>
238 using TypeTupleTransform =
typename TypeTupleTransformHelper<Tuple, Transform>::Type;
247 constexpr inline std::size_t
SizeV<MPL::TypeTuple<T...> > =
sizeof...(T);
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