1 #ifndef DUNE_FEM_COMMON_TUPLEUTILITY_HH 2 #define DUNE_FEM_COMMON_TUPLEUTILITY_HH 4 #include <dune/common/tuples.hh> 5 #include <dune/common/tupleutility.hh> 6 #include <dune/common/std/utility.hh> 8 #ifdef HAVE_TR1_TUPLE // #ifdef HAVE_TUPLE 9 #define DUNE_OPEN_TUPLE_NAMESPACE namespace std { namespace tr1 { 10 #define DUNE_CLOSE_TUPLE_NAMESPACE } } 11 #else // #if defined HAVE_TR1_TUPLE 12 #define DUNE_OPEN_TUPLE_NAMESPACE namespace std { 13 #define DUNE_CLOSE_TUPLE_NAMESPACE } 14 #endif // #ifdef HAVE_TR1_TUPLE 23 template<
class Tuple,
26 class StartType = std::tuple<>
30 static_assert( (begin+length <= std::tuple_size< Tuple >::value),
31 "Can not cut out tuple of given length" );
32 typedef typename Dune::PushBackTuple< StartType, std::tuple_element< begin, Tuple > >::type NextType;
35 typedef typename CutOutTuple< Tuple, (begin+1), (length-1), NextType >::type type;
38 template<
class Tuple,
int begin,
class ResultType >
39 struct CutOutTuple< Tuple, begin, 0, ResultType >
41 typedef ResultType type;
54 template< class Tuple, int size = std::tuple_size< Tuple >::value >
57 static_assert( (size == std::tuple_size< Tuple >::value),
58 "The \"size\" template parameter of PopFrontTuple " 59 "is an implementation detail and should never be " 62 typedef typename CutOutTuple< Tuple, 1, (std::tuple_size< Tuple >::value - 1) >::
type type;
65 template<
class Tuple >
76 template< class Tuple, int size = std::tuple_size< Tuple >::value >
79 static_assert( (size == std::tuple_size< Tuple >::value),
80 "The \"size\" template parameter of PopBackTuple " 81 "is an implementation detail and should never be " 84 typedef typename CutOutTuple< Tuple, 0, (std::tuple_size< Tuple >::value - 1) >::
type type;
87 template<
class Tuple >
98 template<
typename T,
typename... Args >
99 inline std::tuple< Args..., T >
tuple_push_back (
const std::tuple< Args... > &tup, T t )
101 return std::tuple_cat( tup, std::tuple< T > ( t ) );
109 template<
typename T,
typename... Args >
112 return std::tuple_cat( std::tuple< T > ( t ), tup );
120 template<
typename Tup, std::size_t... I >
122 decltype ( std::make_tuple( std::get< I > ( tup )... ) )
124 return std::make_tuple ( std::get< I > ( tup )... );
127 template<
typename T,
typename... Args >
129 decltype (
tuple_pop_back_impl ( tup , Std::make_index_sequence<
sizeof...( Args ) > ( ) ) )
139 template<
typename Tup, std::size_t... I >
141 decltype ( std::make_tuple( std::get< I > ( tup )... ) )
143 return std::make_tuple ( std::get< I + 1 > ( tup )... );
146 template<
typename T,
typename... Args >
164 template<
class Tuple,
166 int N = std::tuple_size< Tuple >::value
170 static const bool value = ( std::is_same<
typename std::tuple_element< N-1, Tuple >::type, Type >::value
174 template<
class Tuple,
179 static const bool value =
false;
190 template<
class Tuple,
192 class Seed = std::tuple<>,
194 int size = std::tuple_size< SubTuple >::value
198 static_assert( (index == std::tuple_size< Seed >::value),
199 "The \"index\" template parameter of FirstTypeIndexTuple" 200 "is an implementation detail and should never be " 204 typedef typename std::tuple_element< index, SubTuple >::type Element;
206 typedef typename Dune::FirstTypeIndex< Tuple, Element >::type Position;
208 typedef typename Dune::PushBackTuple< Seed, Position >::type NextSeed;
215 template<
class Tuple,
233 template<
class Tuple,
235 class Seed = std::tuple<>,
237 int size = std::tuple_size< Positions >::value
244 static const int position = std::tuple_element< index, Positions >::type::value;
247 typedef typename std::tuple_element< position, Tuple >::type AppendType;
249 typedef typename Dune::PushBackTuple< Seed, AppendType >::type AccumulatedType;
253 static typename NextType::type append ( Tuple &tuple, Seed &seed )
255 AppendType append = Dune::template get< position >( tuple );
257 return NextType::append( tuple, next );
266 return append( tuple, seed );
270 template<
class Tuple,
278 static Seed append ( Tuple &tuple, Seed &seed ) {
return seed; }
283 static type
apply ( Tuple & ) {
return type(); }
294 template<
class VectorTupleType,
int pos >
302 typedef typename tuple_element< pos, TupleType >::type
ValueType;
311 ValueType &operator [] (
const size_t i )
313 assert( i < size() );
314 return get< pos >( vector_[ i ] );
318 const ValueType &operator [] (
const size_t i )
const 320 assert( i < size() );
321 return get< pos >( vector_[ i ] );
325 size_t size ()
const {
return vector_.size(); }
350 template<
class Tuple,
352 class Seed = std::tuple<>,
353 int len = std::tuple_size< Tuple >::value
361 static Tuple
apply (
const Key &key = Key() )
364 return append( key, seed );
370 static Tuple append (
const Key &key, Seed &seed )
372 static const int index = std::tuple_size< Tuple >::value - len;
374 typedef typename std::tuple_element< index, Tuple >::type AppendType;
375 typedef typename Dune::PushBackTuple< Seed, AppendType >::type AccumulatedType;
377 AccumulatedType next = Dune::tuple_push_back< AppendType >( seed, AppendType( key ) );
382 template<
class Tuple,
class Key,
class Seed >
385 static Tuple
apply (
const Key &key = Key() ) {
return Tuple(); }
390 static Seed append (
const Key &key, Seed &seed ) {
return seed; }
395 #endif // #ifndef DUNE_FEM_COMMON_TUPLEUTILITY_HH Tuple type
Definition: tupleutility.hh:68
CutOutTuple< Tuple, 0,(std::tuple_size< Tuple >::value-1) >::type type
Definition: tupleutility.hh:82
static Tuple apply(const Key &key=Key())
Definition: tupleutility.hh:385
auto tuple_pop_back_impl(const Tup &tup, const Std::index_sequence< I... > &) -> decltype(std::make_tuple(std::get< I >(tup)...))
Definition: tupleutility.hh:121
std::tuple< Args..., T > tuple_push_back(const std::tuple< Args... > &tup, T t)
Definition: tupleutility.hh:99
TupleToVectorConverter(VectorTupleType &vector)
constructor
Definition: tupleutility.hh:306
auto tuple_pop_front(const std::tuple< T, Args... > &tup) -> decltype(tuple_pop_front_impl(tup, Std::make_index_sequence< sizeof...(Args) >()))
Definition: tupleutility.hh:147
Tuple type
Definition: tupleutility.hh:90
Seed type
Definition: tupleutility.hh:281
Definition: tupleutility.hh:55
tuple_element< pos, TupleType >::type ValueType
Definition: tupleutility.hh:302
Instantiate a tuple of elements with identical, simple constructors.
Definition: tupleutility.hh:355
static type apply(Tuple &tuple)
Definition: tupleutility.hh:263
std::tuple< T, Args... > tuple_push_front(const std::tuple< Args... > &tup, T t)
Definition: tupleutility.hh:110
VectorTupleType & vector_
Definition: tupleutility.hh:328
size_t size() const
return size of vector
Definition: tupleutility.hh:325
Definition: tupleutility.hh:196
Definition: coordinate.hh:4
static type apply(Tuple &)
Definition: tupleutility.hh:283
Definition: tupleutility.hh:168
FirstTypeIndexTuple< Tuple, SubTuple, NextSeed,(index+1) >::type type
Definition: tupleutility.hh:212
wrapper class to convert a vector of tuples of RangeTypes into something that behaves like a vector< ...
Definition: tupleutility.hh:295
VectorTupleType::value_type TupleType
Definition: tupleutility.hh:301
Definition: tupleutility.hh:239
auto tuple_pop_back(const std::tuple< T, Args... > &tup) -> decltype(tuple_pop_back_impl(tup, Std::make_index_sequence< sizeof...(Args) >()))
Definition: tupleutility.hh:128
static Tuple apply(const Key &key=Key())
create tuple instance
Definition: tupleutility.hh:361
ValueType value_type
Definition: tupleutility.hh:303
NextType::type type
Definition: tupleutility.hh:261
Definition: tupleutility.hh:77
Seed type
Definition: tupleutility.hh:222
CutOutTuple< Tuple, 1,(std::tuple_size< Tuple >::value-1) >::type type
Definition: tupleutility.hh:60
auto tuple_pop_front_impl(const Tup &tup, const Std::index_sequence< I... > &) -> decltype(std::make_tuple(std::get< I >(tup)...))
Definition: tupleutility.hh:140