dune-fem 2.8.0
Loading...
Searching...
No Matches
typeindexedtuple.hh
Go to the documentation of this file.
1#ifndef DUNE_FEM_COMMON_TYPEINDEXEDTUPLE_HH
2#define DUNE_FEM_COMMON_TYPEINDEXEDTUPLE_HH
3
4#include <tuple>
5
6#include <dune/common/tupleutility.hh>
8
9namespace Dune
10{
11
12 // TypeIndexedTuple
13 // ----------------
14
15 /*
16 * \brief Please doc me.
17 */
18 template< class Tuple, class Types >
20 {
21 template< class T >
22 struct Position
23 {
24 static const int value = Dune::FirstTypeIndex< Types, T >::value;
25 };
26
27 // value selector for types that are contained
28 template< class T, bool contained >
29 struct ValueBase
30 {
31 typedef typename std::tuple_element< Position< T >::value, Tuple >::type Type;
32 static Type& at( Tuple& tuple )
33 {
34 return std::get< Position< T >::value >( tuple );
35 }
36 static const Type& at( const Tuple& tuple )
37 {
38 return std::get< Position< T >::value >( tuple );
39 }
40 };
41
42 // value selector for types that are not contained
43 template< class T >
44 struct ValueBase< T, false > // T is not contained in Tuple
45 {
46 typedef Tuple Type;
47 static Type& at( Tuple& tuple )
48 {
49 return tuple;
50 }
51 static const Type& at( const Tuple& tuple )
52 {
53 return tuple;
54 }
55 };
56
57 public:
58 template <class T>
59 struct Contains
60 {
62 };
63
64 template< class T >
65 struct Value : public ValueBase< T, Contains< T >::value >
66 {
67 };
68
69 explicit TypeIndexedTuple ( const Tuple &tuple = Tuple() )
70 : tuple_( tuple )
71 {}
72
74 template< class T >
75 typename Value< T >::Type &at ()
76 {
77 return Value< T >::at( tuple_ );
78 }
79
81 template< class T >
82 const typename Value< T >::Type &at () const
83 {
84 return Value< T >::at( tuple_ );
85 }
86
88 template< class T >
89 typename Value< T >::Type &operator[] ( const T & )
90 {
91 return at< T >();
92 }
93
95 template< class T >
96 const typename Value< T >::Type &operator[] ( const T & ) const
97 {
98 return at< T >();
99 }
100
102 template< class T >
103 bool active( const T& ) const { return Contains< T >::value; }
104
106 operator Tuple & () { return tuple_; }
107
109 operator const Tuple & () const { return tuple_; }
110
111 private:
112 Tuple tuple_;
113 };
114
115
116
117 // get for TypeIndexedTuple
118 // ------------------------
119
120 template< int i, class Tuple, class Types >
121 typename std::tuple_element< i, Tuple >::type &
123 {
124 return std::get< i >( static_cast< Tuple & >( tuple ) );
125 }
126
127 template< int i, class Tuple, class Types >
128 const typename std::tuple_element< i, Tuple >::type &
130 {
131 return std::get< i >( static_cast< const Tuple & >( tuple ) );
132 }
133
134} // namespace Dune
135
136
137// TODO please check this construction, later.
138// At the moment it is needed to make dune-fem-dg compile!
139namespace std
140{
141 template< size_t i, class Tuple, class Types >
142 class tuple_element< i, Dune::TypeIndexedTuple< Tuple, Types > >
143 {
144 public:
145 typedef typename std::tuple_element< i, Tuple >::type type;
146 };
147}
148
149#endif // #ifndef DUNE_FEM_COMMON_TYPEINDEXEDTUPLE_HH
STL namespace.
Definition: bindguard.hh:11
std::tuple_element< i, Tuple >::type & get(Dune::TypeIndexedTuple< Tuple, Types > &tuple)
Definition: typeindexedtuple.hh:122
Definition: tupleutility.hh:160
Definition: typeindexedtuple.hh:20
Value< T >::Type & at()
return reference to tuple member associated with type T
Definition: typeindexedtuple.hh:75
const Value< T >::Type & at() const
return reference to tuple member associated with type T
Definition: typeindexedtuple.hh:82
TypeIndexedTuple(const Tuple &tuple=Tuple())
Definition: typeindexedtuple.hh:69
bool active(const T &) const
return true if type T is contained in the tuple
Definition: typeindexedtuple.hh:103
Value< T >::Type & operator[](const T &)
return reference to tuple member associated with type T (integral_constant)
Definition: typeindexedtuple.hh:89
Definition: typeindexedtuple.hh:60
static const bool value
Definition: typeindexedtuple.hh:61
Definition: typeindexedtuple.hh:66
std::tuple_element< i, Tuple >::type type
Definition: typeindexedtuple.hh:145