1#ifndef DUNE_FEM_COMMON_TUPLEUTILITY_HH
2#define DUNE_FEM_COMMON_TUPLEUTILITY_HH
7#include <dune/common/tupleutility.hh>
15 template<
class Tuple,
18 class StartType = std::tuple<>
22 static_assert( (begin+length <= std::tuple_size< Tuple >::value),
"Can not cut out tuple of given length" );
23 typedef typename Dune::PushBackTuple< StartType, std::tuple_element< begin, Tuple > >::type NextType;
26 typedef typename CutOutTuple< Tuple, (begin+1), (length-1), NextType >::type type;
29 template<
class Tuple,
int begin,
class ResultType >
30 struct CutOutTuple< Tuple, begin, 0, ResultType >
32 typedef ResultType type;
45 template< class Tuple, int size = std::tuple_size< Tuple >::value >
48 static_assert( (size == std::tuple_size< Tuple >::value),
49 "The \"size\" template parameter of PopFrontTuple "
50 "is an implementation detail and should never be "
53 typedef typename CutOutTuple< Tuple, 1, (std::tuple_size< Tuple >::value - 1) >
::type type;
56 template<
class Tuple >
67 template< class Tuple, int size = std::tuple_size< Tuple >::value >
70 static_assert( (size == std::tuple_size< Tuple >::value),
71 "The \"size\" template parameter of PopBackTuple "
72 "is an implementation detail and should never be "
75 typedef typename CutOutTuple< Tuple, 0, (std::tuple_size< Tuple >::value - 1) >
::type type;
78 template<
class Tuple >
89 template<
typename T,
typename... Args >
90 inline std::tuple< Args..., T >
tuple_push_back (
const std::tuple< Args... > &tup, T t )
92 return std::tuple_cat( tup, std::tuple< T > ( t ) );
100 template<
typename T,
typename... Args >
103 return std::tuple_cat( std::tuple< T > ( t ), tup );
111 template<
typename Tup, std::size_t... I >
113 decltype ( std::make_tuple( std::get< I > ( tup )... ) )
115 return std::make_tuple ( std::get< I > ( tup )... );
118 template<
typename T,
typename... Args >
120 decltype (
tuple_pop_back_impl ( tup , std::make_index_sequence<
sizeof...( Args ) > ( ) ) )
130 template<
typename Tup, std::size_t... I >
132 decltype ( std::make_tuple( std::get< I > ( tup )... ) )
134 return std::make_tuple ( std::get< I + 1 > ( tup )... );
137 template<
typename T,
typename... Args >
155 template<
class Tuple,
157 int N = std::tuple_size< Tuple >::value
161 static const bool value = ( std::is_same<
typename std::tuple_element< N-1, Tuple >::type, Type >
::value
165 template<
class Tuple,
181 template<
class Tuple,
183 class Seed = std::tuple<>,
185 int size = std::tuple_size< SubTuple >::value
189 static_assert( (index == std::tuple_size< Seed >::value),
190 "The \"index\" template parameter of FirstTypeIndexTuple"
191 "is an implementation detail and should never be "
195 typedef typename std::tuple_element< index, SubTuple >::type Element;
197 typedef typename Dune::FirstTypeIndex< Tuple, Element >::type Position;
199 typedef typename Dune::PushBackTuple< Seed, Position >::type NextSeed;
206 template<
class Tuple,
224 template<
class Tuple,
226 class Seed = std::tuple<>,
228 int size = std::tuple_size< Positions >::value
235 static const int position = std::tuple_element< index, Positions >::type::value;
238 typedef typename std::tuple_element< position, Tuple >::type AppendType;
240 typedef typename Dune::PushBackTuple< Seed, AppendType >::type AccumulatedType;
244 static typename NextType::type append ( Tuple &tuple, Seed &seed )
246 AppendType append = std::get< position >( tuple );
248 return NextType::append( tuple, next );
257 return append( tuple, seed );
261 template<
class Tuple,
269 static Seed append ( Tuple &tuple, Seed &seed ) {
return seed; }
285 template<
class VectorTupleType,
int pos >
292 typedef typename std::tuple_element< pos, TupleType >::type
ValueType;
304 assert( i <
size() );
305 return get< pos >(
vector_[ i ] );
312 assert( i <
size() );
313 return get< pos >(
vector_[ i ] );
342 template<
class Tuple,
344 class Seed = std::tuple<>,
345 int len = std::tuple_size< Tuple >::value
353 static Tuple
apply (
const Key &key = Key() )
356 return append( key, seed );
362 static Tuple append (
const Key &key, Seed &seed )
364 static const int index = std::tuple_size< Tuple >::value - len;
366 typedef typename std::tuple_element< index, Tuple >::type AppendType;
367 typedef typename Dune::PushBackTuple< Seed, AppendType >::type AccumulatedType;
369 AccumulatedType next = Dune::tuple_push_back< AppendType >( seed, AppendType( key ) );
374 template<
class Tuple,
class Key,
class Seed >
377 static Tuple
apply (
const Key &key = Key() ) {
return Tuple(); }
382 static Seed append (
const Key &key, Seed &seed ) {
return seed; }
Definition: bindguard.hh:11
auto tuple_pop_front_impl(const Tup &tup, const std::index_sequence< I... > &) -> decltype(std::make_tuple(std::get< I >(tup)...))
Definition: tupleutility.hh:131
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:138
std::tuple< Args..., T > tuple_push_back(const std::tuple< Args... > &tup, T t)
Definition: tupleutility.hh:90
auto tuple_pop_back_impl(const Tup &tup, const std::index_sequence< I... > &) -> decltype(std::make_tuple(std::get< I >(tup)...))
Definition: tupleutility.hh:112
std::tuple< T, Args... > tuple_push_front(const std::tuple< Args... > &tup, T t)
Definition: tupleutility.hh:101
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:119
Definition: tupleutility.hh:47
CutOutTuple< Tuple, 1,(std::tuple_size< Tuple >::value-1)>::type type
Definition: tupleutility.hh:53
Tuple type
Definition: tupleutility.hh:59
Definition: tupleutility.hh:69
CutOutTuple< Tuple, 0,(std::tuple_size< Tuple >::value-1)>::type type
Definition: tupleutility.hh:75
Tuple type
Definition: tupleutility.hh:81
Definition: tupleutility.hh:160
static const bool value
Definition: tupleutility.hh:161
Definition: tupleutility.hh:188
FirstTypeIndexTuple< Tuple, SubTuple, NextSeed,(index+1)>::type type
Definition: tupleutility.hh:203
Seed type
Definition: tupleutility.hh:213
Definition: tupleutility.hh:231
static type apply(Tuple &tuple)
Definition: tupleutility.hh:254
NextType::type type
Definition: tupleutility.hh:252
static type apply(Tuple &)
Definition: tupleutility.hh:274
Seed type
Definition: tupleutility.hh:272
wrapper class to convert a vector of tuples of RangeTypes into something that behaves like a vector< ...
Definition: tupleutility.hh:287
size_t size() const
return size of vector
Definition: tupleutility.hh:317
std::tuple_element< pos, TupleType >::type ValueType
Definition: tupleutility.hh:292
TupleToVectorConverter(const TupleToVectorConverter &)=delete
VectorTupleType & vector_
Definition: tupleutility.hh:320
TupleToVectorConverter(VectorTupleType &vector)
constructor
Definition: tupleutility.hh:296
ValueType & operator[](const size_t i)
return reference to i-th entry of vector and pos's tuple component
Definition: tupleutility.hh:301
VectorTupleType::value_type TupleType
Definition: tupleutility.hh:291
ValueType value_type
Definition: tupleutility.hh:293
Instantiate a tuple of elements with identical, simple constructors.
Definition: tupleutility.hh:348
static Tuple apply(const Key &key=Key())
create tuple instance
Definition: tupleutility.hh:353
static Tuple apply(const Key &key=Key())
Definition: tupleutility.hh:377