dune-fem  2.8-git
tupletypetraits.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_PASS_COMMON_TUPLETYPETRAITS_HH
2 #define DUNE_FEM_PASS_COMMON_TUPLETYPETRAITS_HH
3 
4 #include <tuple>
5 #include <type_traits>
6 
7 #include <dune/common/hybridutilities.hh>
8 #include <dune/common/tupleutility.hh>
9 #include <dune/common/typetraits.hh>
10 
12 
13 namespace
14 {
15 
16  // CheckAllElements
17  // ----------------
18 
19  template< class Tuple,
20  template< class > class Predicate,
21  int N = std::tuple_size< Tuple >::value
22  >
23  struct CheckAllElements
24  {
25  static const bool value = ( Predicate< typename std::tuple_element< N-1, Tuple >::type >::value
26  && CheckAllElements< Tuple, Predicate, (N-1) >::value );
27  };
28 
29  template< class Tuple,
30  template< class > class Predicate
31  >
32  struct CheckAllElements< Tuple, Predicate, 0 >
33  {
34  static const bool value = true;
35  };
36 
37 } // namespace
38 
39 
40 
41 namespace Dune
42 {
43 
44  // SingleTypeTuple
45  // ---------------
46 
47  /*
48  * \brief Make tuple of given length and single type.
49  */
50  template< class T,
51  int size,
52  class Seed = std::tuple<>,
53  int index = 0
54  >
56  {
58  };
59 
60  template< class T,
61  int size,
62  class Seed
63  >
64  struct SingleTypeTuple< T, size, Seed, size >
65  {
66  typedef Seed Type;
67  };
68 
69 
70 
71  // EmptyTuple
72  // ----------
73 
74  /*
75  * \brief a tuple consisting of Dune::Empty
76  */
77  template< int size >
78  struct EmptyTuple
79  : public SingleTypeTuple< Dune::Empty, size >
80  {};
81 
82 
83 
84  // TupleTypeTraits
85  // ---------------
86 
87  /*
88  * \brief Mimicks Dune::TypeTraits (see dune/common/typetraits.hh) for tuples.
89  */
90  template< class Tuple >
92  {
93  template< class T >
94  struct IsPointer
95  {
96  static const bool value = std::is_pointer<T>::value;
97  };
98 
99  template< class T >
100  struct IsReference
101  {
102  static const bool value = std::is_lvalue_reference<T>::value;
103  };
104 
105  template< class T >
106  struct PointeeTypeEvaluator
107  {
108  typedef typename std::remove_pointer<T>::type Type;
109  };
110 
111  template< class T >
112  struct ReferredTypeEvaluator
113  {
114  typedef typename std::remove_reference<T>::type Type;
115  };
116 
117  public:
118  static const bool isPointerTuple = CheckAllElements< Tuple, IsPointer >::value;
119 
120  typedef typename std::conditional< isPointerTuple,
121  typename Dune::ForEachType< PointeeTypeEvaluator, Tuple >::Type,
124 
125  static const bool isReferenceTuple = CheckAllElements< Tuple, IsReference >::value;
126 
127  typedef typename Dune::ForEachType< ReferredTypeEvaluator, Tuple >::Type ReferredTupleType;
128  };
129 
130 
131 
132  // PointerTuple
133  // ------------
134 
140  template< class Tuple >
142  {
143  template< class T >
144  struct PointerEvaluator
145  {
146  typedef typename std::remove_pointer<T>::type * Type;
147  };
148 
149  public:
150  typedef typename Dune::ForEachType< PointerEvaluator, Tuple >::Type Type;
151  };
152 
153 
154 
155  // ReferenceTuple
156  // --------------
157 
163  template< class Tuple >
165  {
166  template< class T >
167  struct ReferenceEvaluator
168  {
169  typedef typename std::remove_reference<T>::type & Type;
170  };
171 
172  public:
173  typedef typename Dune::ForEachType< ReferenceEvaluator, Tuple >::Type Type;
174  };
175 
176 
177 
178  // ConstTuple
179  // ----------
180 
186  template< class Tuple >
188  {
189  template< class T >
190  struct ConstEvaluator
191  {
192  typedef typename std::add_const<typename std::remove_cv<T>::type>::type Type;
193  };
194 
195  public:
196  typedef typename Dune::ForEachType< ConstEvaluator, Tuple >::Type Type;
197  };
198 
199 
200 
201  // RemoveConstTuple
202  // ----------------
203 
207  template< class Tuple >
209  {
210  template< class T >
211  struct RemoveConstEvaluator
212  {
213  typedef typename std::remove_cv< T >::type Type;
214  };
215 
216  public:
217  typedef typename Dune::ForEachType< RemoveConstEvaluator, Tuple >::Type Type;
218  };
219 
220 
221 
222  // tuple_remove_const
223  // ------------------
224 
225  /*
226  * \brief Convenience structure mimicking Dune::remove_const.
227  */
228  template< class Tuple >
230  {
232  };
233 
234 
235 
236  // ValidPointerTupleCheck
237  // ----------------------
238 
244  template< class Tuple >
246  {
247  static_assert( TupleTypeTraits< Tuple >::isPointerTuple, "Can not check non-pointer tuple." );
248 
249  static bool apply ( const Tuple &tuple )
250  {
251  bool check(true);
252  Hybrid::forEach( tuple, [ & ]( auto&& ti ){ check &= static_cast< bool >( ti ); } );
253  return check;
254  }
255  };
256 
257 
258 
259  // DereferenceTuple
260  // ----------------
261 
265  template< class Tuple,
266  class Seed = std::tuple<>,
267  int index = 0,
268  int size = std::tuple_size< Tuple >::value
269  >
271  {
272  template< class, class, int, int > friend class DereferenceTuple;
273 
274  typedef typename std::remove_pointer< typename std::tuple_element< index, Tuple >::type >::type & AppendType;
275  typedef typename Dune::PushBackTuple< Seed, AppendType >::type AccumulatedType;
276 
277  typedef DereferenceTuple< Tuple, AccumulatedType, (index+1), size > NextType;
278 
279  public:
280  typedef typename Dune::ReferenceTuple<
283 
284  static Type apply ( Tuple &tuple )
285  {
286  Seed seed;
287  return append( tuple, seed );
288  }
289 
290  private:
291  static Type append ( Tuple &tuple, Seed &seed )
292  {
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 );
297  }
298  };
299 
300  template< class Tuple,
301  class Seed,
302  int size
303  >
304  class DereferenceTuple< Tuple, Seed, size, size >
305  {
306  template< class, class, int, int > friend class DereferenceTuple;
307 
308  public:
309  typedef typename Dune::ReferenceTuple<
312 
313  static_assert( (std::is_same< Seed, Type >::value), "Failed to dereference pointer tuple." );
314 
315  static Type apply ( Tuple & )
316  {
317  return Type();
318  }
319 
320  private:
321  static Seed append ( Tuple &tuple, Seed &seed ) { return seed; }
322  };
323 
324 } // namespace Dune
325 
326 #endif // #ifndef DUNE_FEM_PASS_COMMON_TUPLETYPETRAITS_HH
Definition: bindguard.hh:11
static void forEach(IndexRange< T, sz > range, F &&f)
Definition: hybrid.hh:129
Definition: tupletypetraits.hh:56
SingleTypeTuple< T, size, typename Dune::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
Dune::ForEachType< ReferredTypeEvaluator, Tuple >::Type ReferredTupleType
Definition: tupletypetraits.hh:127
static const bool isReferenceTuple
Definition: tupletypetraits.hh:125
std::conditional< isPointerTuple, typename Dune::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
Dune::ReferenceTuple< typename Dune::TupleTypeTraits< Tuple >::PointeeTupleType >::Type Type
Definition: tupletypetraits.hh:282
static Type apply(Tuple &tuple)
Definition: tupletypetraits.hh:284
static Type apply(Tuple &)
Definition: tupletypetraits.hh:315
Dune::ReferenceTuple< typename Dune::TupleTypeTraits< Tuple >::PointeeTupleType >::Type Type
Definition: tupletypetraits.hh:311