dune-fem  2.4.1-rc
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 <dune/common/tuples.hh>
5 #include <dune/common/tupleutility.hh>
6 #include <dune/common/typetraits.hh>
7 
8 #include "tupleutility.hh"
9 
10 namespace
11 {
12 
13  // CheckAllElements
14  // ----------------
15 
16  template< class Tuple,
17  template< class > class Predicate,
18  int N = std::tuple_size< Tuple >::value
19  >
20  struct CheckAllElements
21  {
22  static const bool value = ( Predicate< typename std::tuple_element< N-1, Tuple >::type >::value
23  && CheckAllElements< Tuple, Predicate, (N-1) >::value );
24  };
25 
26  template< class Tuple,
27  template< class > class Predicate
28  >
29  struct CheckAllElements< Tuple, Predicate, 0 >
30  {
31  static const bool value = true;
32  };
33 
34 } // namespace
35 
36 
37 
38 namespace Dune
39 {
40 
41  // SingleTypeTuple
42  // ---------------
43 
44  /*
45  * \brief Make tuple of given length and single type.
46  */
47  template< class T,
48  int size,
49  class Seed = std::tuple<>,
50  int index = 0
51  >
53  {
55  };
56 
57  template< class T,
58  int size,
59  class Seed
60  >
61  struct SingleTypeTuple< T, size, Seed, size >
62  {
63  typedef Seed Type;
64  };
65 
66 
67 
68  // EmptyTuple
69  // ----------
70 
71  /*
72  * \brief a tuple consisting of Dune::Empty
73  */
74  template< int size >
75  struct EmptyTuple
76  : public SingleTypeTuple< Dune::Empty, size >
77  {};
78 
79 
80 
81  // TupleTypeTraits
82  // ---------------
83 
84  /*
85  * \brief Mimicks Dune::TypeTraits (see dune/common/typetraits.hh) for tuples.
86  */
87  template< class Tuple >
89  {
90  template< class T >
91  struct IsPointer
92  {
93  static const bool value = Dune::TypeTraits< T >::isPointer;
94  };
95 
96  template< class T >
97  struct IsReference
98  {
99  static const bool value = Dune::TypeTraits< T >::isReference;
100  };
101 
102  template< class T >
103  struct PointeeTypeEvaluator
104  {
105  typedef typename Dune::TypeTraits< T >::PointeeType Type;
106  };
107 
108  template< class T >
109  struct ReferredTypeEvaluator
110  {
111  typedef typename Dune::TypeTraits< T >::ReferredType Type;
112  };
113 
114  public:
115  static const bool isPointerTuple = CheckAllElements< Tuple, IsPointer >::value;
116 
117  typedef typename Dune::conditional< isPointerTuple,
118  typename Dune::ForEachType< PointeeTypeEvaluator, Tuple >::Type,
121 
122  static const bool isReferenceTuple = CheckAllElements< Tuple, IsReference >::value;
123 
124  typedef typename Dune::ForEachType< ReferredTypeEvaluator, Tuple >::Type ReferredTupleType;
125  };
126 
127 
128 
129  // PointerTuple
130  // ------------
131 
137  template< class Tuple >
139  {
140  template< class T >
141  struct PointerEvaluator
142  {
143  typedef typename Dune::TypeTraits< T >::PointeeType * Type;
144  };
145 
146  public:
147  typedef typename Dune::ForEachType< PointerEvaluator, Tuple >::Type Type;
148  };
149 
150 
151 
152  // ReferenceTuple
153  // --------------
154 
160  template< class Tuple >
162  {
163  template< class T >
164  struct ReferenceEvaluator
165  {
166  typedef typename Dune::TypeTraits< T >::ReferredType & Type;
167  };
168 
169  public:
170  typedef typename Dune::ForEachType< ReferenceEvaluator, Tuple >::Type Type;
171  };
172 
173 
174 
175  // ConstTuple
176  // ----------
177 
183  template< class Tuple >
185  {
186  template< class T >
187  struct ConstEvaluator
188  {
189  typedef typename Dune::ConstantVolatileTraits< T >::ConstType Type;
190  };
191 
192  public:
193  typedef typename Dune::ForEachType< ConstEvaluator, Tuple >::Type Type;
194  };
195 
196 
197 
198  // RemoveConstTuple
199  // ----------------
200 
204  template< class Tuple >
206  {
207  template< class T >
208  struct RemoveConstEvaluator
209  {
210  typedef typename Dune::ConstantVolatileTraits< T >::UnqualifiedType Type;
211  };
212 
213  public:
214  typedef typename Dune::ForEachType< RemoveConstEvaluator, Tuple >::Type Type;
215  };
216 
217 
218 
219  // tuple_remove_const
220  // ------------------
221 
222  /*
223  * \brief Convenience structure mimicking Dune::remove_const.
224  */
225  template< class Tuple >
227  {
229  };
230 
231 
232 
233  // ValidPointerTupleCheck
234  // ----------------------
235 
241  template< class Tuple >
243  {
245  "Can not check non-pointer tuple." );
246 
247  struct ValidPointer
248  {
249  ValidPointer () : v_( true ) {}
250 
251  template< class Ptr >
252  void visit ( Ptr &ptr )
253  {
254  v_ &= bool( ptr );
255  }
256 
257  operator bool() const { return v_; }
258 
259  private:
260  bool v_;
261  };
262 
263  public:
264  static bool apply ( const Tuple &tuple )
265  {
266  Dune::ForEachValue< Tuple > forEach( tuple );
267  ValidPointer check;
268  forEach.apply( check );
269  return check;
270  }
271  };
272 
273 
274 
275  // DereferenceTuple
276  // ----------------
277 
281  template< class Tuple,
282  class Seed = std::tuple<>,
283  int index = 0,
284  int size = std::tuple_size< Tuple >::value
285  >
287  {
288  template< class, class, int, int > friend class DereferenceTuple;
289 
290  typedef typename Dune::TypeTraits< typename std::tuple_element< index, Tuple >::type >::PointeeType & AppendType;
291  typedef typename Dune::PushBackTuple< Seed, AppendType >::type AccumulatedType;
292 
294 
295  public:
296  typedef typename Dune::ReferenceTuple<
299 
300  static Type apply ( Tuple &tuple )
301  {
302  Seed seed;
303  return append( tuple, seed );
304  }
305 
306  private:
307  static Type append ( Tuple &tuple, Seed &seed )
308  {
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 );
313  }
314  };
315 
316  template< class Tuple,
317  class Seed,
318  int size
319  >
320  class DereferenceTuple< Tuple, Seed, size, size >
321  {
322  template< class, class, int, int > friend class DereferenceTuple;
323 
324  public:
325  typedef typename Dune::ReferenceTuple<
328 
329  static_assert( (std::is_same< Seed, Type >::value), "Failed to dereference pointer tuple." );
330 
331  static Type apply ( Tuple & )
332  {
333  return Type();
334  }
335 
336  private:
337  static Seed append ( Tuple &tuple, Seed &seed ) { return seed; }
338  };
339 
340 } // namespace Dune
341 
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