1 #ifndef DUNE_FEM_PASS_COMMON_TUPLETYPETRAITS_HH 2 #define DUNE_FEM_PASS_COMMON_TUPLETYPETRAITS_HH 4 #include <dune/common/tuples.hh> 5 #include <dune/common/tupleutility.hh> 6 #include <dune/common/typetraits.hh> 16 template<
class Tuple,
17 template<
class >
class Predicate,
18 int N = std::tuple_size< Tuple >::value
20 struct CheckAllElements
22 static const bool value = ( Predicate<
typename std::tuple_element< N-1, Tuple >::type >::value
23 && CheckAllElements< Tuple, Predicate, (N-1) >::value );
26 template<
class Tuple,
27 template<
class >
class Predicate
29 struct CheckAllElements< Tuple, Predicate, 0 >
31 static const bool value =
true;
49 class Seed = std::tuple<>,
87 template<
class Tuple >
93 static const bool value = Dune::TypeTraits< T >::isPointer;
99 static const bool value = Dune::TypeTraits< T >::isReference;
103 struct PointeeTypeEvaluator
105 typedef typename Dune::TypeTraits< T >::PointeeType Type;
109 struct ReferredTypeEvaluator
111 typedef typename Dune::TypeTraits< T >::ReferredType Type;
115 static const bool isPointerTuple = CheckAllElements< Tuple, IsPointer >::value;
117 typedef typename Dune::conditional< isPointerTuple,
118 typename Dune::ForEachType< PointeeTypeEvaluator, Tuple >::Type,
122 static const bool isReferenceTuple = CheckAllElements< Tuple, IsReference >::value;
137 template<
class Tuple >
141 struct PointerEvaluator
143 typedef typename Dune::TypeTraits< T >::PointeeType *
Type;
147 typedef typename Dune::ForEachType< PointerEvaluator, Tuple >::Type
Type;
160 template<
class Tuple >
164 struct ReferenceEvaluator
166 typedef typename Dune::TypeTraits< T >::ReferredType &
Type;
170 typedef typename Dune::ForEachType< ReferenceEvaluator, Tuple >::Type
Type;
183 template<
class Tuple >
187 struct ConstEvaluator
189 typedef typename Dune::ConstantVolatileTraits< T >::ConstType
Type;
193 typedef typename Dune::ForEachType< ConstEvaluator, Tuple >::Type
Type;
204 template<
class Tuple >
208 struct RemoveConstEvaluator
210 typedef typename Dune::ConstantVolatileTraits< T >::UnqualifiedType
Type;
214 typedef typename Dune::ForEachType< RemoveConstEvaluator, Tuple >::Type
Type;
225 template<
class Tuple >
241 template<
class Tuple >
245 "Can not check non-pointer tuple." );
249 ValidPointer () : v_(
true ) {}
251 template<
class Ptr >
252 void visit ( Ptr &ptr )
257 operator bool()
const {
return v_; }
264 static bool apply (
const Tuple &tuple )
266 Dune::ForEachValue< Tuple > forEach( tuple );
268 forEach.apply( check );
281 template<
class Tuple,
282 class Seed = std::tuple<>,
284 int size = std::tuple_size< Tuple >::value
290 typedef typename Dune::TypeTraits< typename std::tuple_element< index, Tuple >::type >::PointeeType & AppendType;
291 typedef typename Dune::PushBackTuple< Seed, AppendType >::type AccumulatedType;
303 return append( tuple, seed );
307 static Type append ( Tuple &tuple, Seed &seed )
309 typename std::tuple_element< index, Tuple >::type pointer = std::get< index >( tuple );
310 AppendType append = *pointer;
311 AccumulatedType next = Dune::tuple_push_back< AppendType >( seed, append );
312 return NextType::append( tuple, next );
316 template<
class Tuple,
329 static_assert( (std::is_same< Seed, Type >::value),
"Failed to dereference pointer tuple." );
337 static Seed append ( Tuple &tuple, Seed &seed ) {
return seed; }
342 #endif // #ifndef DUNE_FEM_PASS_COMMON_TUPLETYPETRAITS_HH static Type apply(Tuple &)
Definition: tupletypetraits.hh:331
Dune::ForEachType< RemoveConstEvaluator, Tuple >::Type Type
Definition: tupletypetraits.hh:214
Dune::conditional< isPointerTuple, typename Dune::ForEachType< PointeeTypeEvaluator, Tuple >::Type, EmptyTuple< std::tuple_size< Tuple >::value > >::type PointeeTupleType
Definition: tupletypetraits.hh:120
Dune::ForEachType< PointerEvaluator, Tuple >::Type Type
Definition: tupletypetraits.hh:147
Seed Type
Definition: tupletypetraits.hh:63
Dune::ForEachType< ReferredTypeEvaluator, Tuple >::Type ReferredTupleType
Definition: tupletypetraits.hh:124
static bool apply(const Tuple &tuple)
Definition: tupletypetraits.hh:264
Definition: tupletypetraits.hh:88
Dune::ForEachType< ReferenceEvaluator, Tuple >::Type Type
Definition: tupletypetraits.hh:170
static Type apply(Tuple &tuple)
Definition: tupletypetraits.hh:300
Check whether a pointer tuple can be dereferenced.
Definition: tupletypetraits.hh:242
Add const qualifier to all tuple elements.
Definition: tupletypetraits.hh:184
RemoveConstTuple< Tuple >::Type type
Definition: tupletypetraits.hh:228
Remove const qualifiers from tuple.
Definition: tupletypetraits.hh:205
Dune::ReferenceTuple< typename Dune::TupleTypeTraits< Tuple >::PointeeTupleType >::Type Type
Definition: tupletypetraits.hh:298
Definition: tupletypetraits.hh:226
Dune::ForEachType< ConstEvaluator, Tuple >::Type Type
Definition: tupletypetraits.hh:193
Definition: coordinate.hh:4
Convert a tuple to a tuple of references.
Definition: tupletypetraits.hh:161
Definition: tupletypetraits.hh:52
Dune::ReferenceTuple< typename Dune::TupleTypeTraits< Tuple >::PointeeTupleType >::Type Type
Definition: tupletypetraits.hh:327
Convert a tuple to a tuple of pointer types.
Definition: tupletypetraits.hh:138
Dereference pointer tuple.
Definition: tupletypetraits.hh:286
SingleTypeTuple< Dune::Empty, size, typename Dune::PushBackTuple< std::tuple<>, Dune::Empty >::type,(0+1) >::Type Type
Definition: tupletypetraits.hh:54
Definition: tupletypetraits.hh:75