1#ifndef DUNE_FEM_PASS_COMMON_TUPLETYPETRAITS_HH
2#define DUNE_FEM_PASS_COMMON_TUPLETYPETRAITS_HH
7#include <dune/common/hybridutilities.hh>
8#include <dune/common/tupleutility.hh>
9#include <dune/common/typetraits.hh>
19 template<
class Tuple,
20 template<
class >
class Predicate,
21 int N = std::tuple_size< Tuple >::value
23 struct CheckAllElements
25 static const bool value = ( Predicate<
typename std::tuple_element< N-1, Tuple >::type >::value
26 && CheckAllElements< Tuple, Predicate, (N-1) >::value );
29 template<
class Tuple,
30 template<
class >
class Predicate
32 struct CheckAllElements< Tuple, Predicate, 0 >
34 static const bool value =
true;
52 class Seed = std::tuple<>,
90 template<
class Tuple >
96 static const bool value = std::is_pointer<T>::value;
102 static const bool value = std::is_lvalue_reference<T>::value;
106 struct PointeeTypeEvaluator
108 typedef typename std::remove_pointer<T>::type Type;
112 struct ReferredTypeEvaluator
114 typedef typename std::remove_reference<T>::type Type;
121 typename Dune::ForEachType< PointeeTypeEvaluator, Tuple >::Type,
140 template<
class Tuple >
144 struct PointerEvaluator
146 typedef typename std::remove_pointer<T>::type *
Type;
150 typedef typename Dune::ForEachType< PointerEvaluator, Tuple >::Type
Type;
163 template<
class Tuple >
167 struct ReferenceEvaluator
169 typedef typename std::remove_reference<T>::type &
Type;
173 typedef typename Dune::ForEachType< ReferenceEvaluator, Tuple >::Type
Type;
186 template<
class Tuple >
190 struct ConstEvaluator
192 typedef typename std::add_const<typename std::remove_cv<T>::type>::type
Type;
196 typedef typename Dune::ForEachType< ConstEvaluator, Tuple >::Type
Type;
207 template<
class Tuple >
211 struct RemoveConstEvaluator
213 typedef typename std::remove_cv< T >::type
Type;
217 typedef typename Dune::ForEachType< RemoveConstEvaluator, Tuple >::Type
Type;
228 template<
class Tuple >
244 template<
class Tuple >
249 static bool apply (
const Tuple &tuple )
252 Hybrid::forEach( tuple, [ & ](
auto&& ti ){ check &=
static_cast< bool >( ti ); } );
265 template<
class Tuple,
266 class Seed = std::tuple<>,
268 int size = std::tuple_size< Tuple >::value
274 typedef typename std::remove_pointer< typename std::tuple_element< index, Tuple >::type >::type & AppendType;
275 typedef typename Dune::PushBackTuple< Seed, AppendType >::type AccumulatedType;
287 return append( tuple, seed );
291 static Type append ( Tuple &tuple, Seed &seed )
293 typename std::tuple_element< index, Tuple >::type pointer = std::get< index >( tuple );
294 AppendType append = *pointer;
295 AccumulatedType next = Dune::tuple_push_back< AppendType >( seed, append );
296 return NextType::append( tuple, next );
300 template<
class Tuple,
313 static_assert( (std::is_same< Seed, Type >::value),
"Failed to dereference pointer tuple." );
321 static Seed append ( Tuple &tuple, Seed &seed ) {
return seed; }
Definition: bindguard.hh:11
static void forEach(IndexRange< T, sz > range, F &&f)
Definition: hybrid.hh:129
Definition: tupletypetraits.hh:56
SingleTypeTuple< T, size, typenameDune::PushBackTuple< Seed, T >::type,(index+1)>::Type Type
Definition: tupletypetraits.hh:57
Seed Type
Definition: tupletypetraits.hh:66
Definition: tupletypetraits.hh:80
Definition: tupletypetraits.hh:92
static const bool isReferenceTuple
Definition: tupletypetraits.hh:125
Dune::ForEachType< ReferredTypeEvaluator, Tuple >::Type ReferredTupleType
Definition: tupletypetraits.hh:127
std::conditional< isPointerTuple, typenameDune::ForEachType< PointeeTypeEvaluator, Tuple >::Type, EmptyTuple< std::tuple_size< Tuple >::value > >::type PointeeTupleType
Definition: tupletypetraits.hh:123
static const bool isPointerTuple
Definition: tupletypetraits.hh:118
Convert a tuple to a tuple of pointer types.
Definition: tupletypetraits.hh:142
Dune::ForEachType< PointerEvaluator, Tuple >::Type Type
Definition: tupletypetraits.hh:150
Convert a tuple to a tuple of references.
Definition: tupletypetraits.hh:165
Dune::ForEachType< ReferenceEvaluator, Tuple >::Type Type
Definition: tupletypetraits.hh:173
Add const qualifier to all tuple elements.
Definition: tupletypetraits.hh:188
Dune::ForEachType< ConstEvaluator, Tuple >::Type Type
Definition: tupletypetraits.hh:196
Remove const qualifiers from tuple.
Definition: tupletypetraits.hh:209
Dune::ForEachType< RemoveConstEvaluator, Tuple >::Type Type
Definition: tupletypetraits.hh:217
Definition: tupletypetraits.hh:230
RemoveConstTuple< Tuple >::Type type
Definition: tupletypetraits.hh:231
Check whether a pointer tuple can be dereferenced.
Definition: tupletypetraits.hh:246
static bool apply(const Tuple &tuple)
Definition: tupletypetraits.hh:249
Dereference pointer tuple.
Definition: tupletypetraits.hh:271
static Type apply(Tuple &tuple)
Definition: tupletypetraits.hh:284
Dune::ReferenceTuple< typenameDune::TupleTypeTraits< Tuple >::PointeeTupleType >::Type Type
Definition: tupletypetraits.hh:282
static Type apply(Tuple &)
Definition: tupletypetraits.hh:315
Dune::ReferenceTuple< typenameDune::TupleTypeTraits< Tuple >::PointeeTupleType >::Type Type
Definition: tupletypetraits.hh:311