6 #ifndef DUNE_TUPLE_UTILITY_HH 7 #define DUNE_TUPLE_UTILITY_HH 11 #include <type_traits> 41 template<
class F,
class ArgTuple,
class I, I...
i>
44 return f(std::get<i>(args)...);
50 typedef typename std::add_const<T>::type&
ConstType;
58 typedef typename std::add_const<T>::type*
ConstType;
81 template<
class... Args>
87 return ResultType(static_cast<Args>(
nullptr)...);
115 template<
template <
class>
class TE,
class T>
118 template<
template <
class>
class TE,
class... Args>
121 typedef std::tuple<typename TE<Args>::Type...>
Type;
125 template<
class Tuple,
class Functor, std::size_t... I>
126 inline auto genericTransformTupleBackendImpl(Tuple& t, Functor& f,
const std::index_sequence<I...>& )
127 -> std::tuple<decltype(f(std::get<I>(t)))...>
129 return std::tuple<decltype(f(std::get<I>(t)))...>(f(std::get<I>(t))...);
132 template<
class... Args,
class Functor>
133 auto genericTransformTupleBackend(std::tuple<Args...>& t, Functor& f) ->
134 decltype(genericTransformTupleBackendImpl(t, f,std::index_sequence_for<Args...>{}))
136 return genericTransformTupleBackendImpl(t, f,std::index_sequence_for<Args...>{});
139 template<
class... Args,
class Functor>
140 auto genericTransformTupleBackend(
const std::tuple<Args...>& t, Functor& f) ->
141 decltype(genericTransformTupleBackendImpl(t, f, std::index_sequence_for<Args...>{}))
143 return genericTransformTupleBackendImpl(t, f, std::index_sequence_for<Args...>{});
185 template<
class Tuple,
class Functor>
187 decltype(genericTransformTupleBackend(t, f))
189 return genericTransformTupleBackend(t, f);
224 template<
template<
class>
class TE,
class... Args>
227 mutable std::tuple<Args&...> tup;
229 template<
class T, std::size_t... I>
230 inline auto apply(T&& t,
const std::index_sequence<I...>& ) ->
231 decltype(TE<T>::apply(t,std::get<I>(tup)...))
const 233 return TE<T>::apply(t,std::get<I>(tup)...);
247 decltype(this->apply(t,std::index_sequence_for<Args...>{}))
const 249 return apply(t,std::index_sequence_for<Args...>{});
253 template<
template<
class>
class TE,
class... Args>
291 template<
template<
class>
class TypeEvaluator,
class Tuple,
class... Args>
321 typedef typename std::remove_reference<T>::type*
Type;
332 typedef typename std::remove_reference<T>::type*
Type;
344 template<
int N,
class Tuple>
347 typedef typename std::tuple_element<std::tuple_size<Tuple>::value - N - 1, Tuple>::type
Type;
360 template<
typename Tuple>
364 return std::get<std::tuple_size<Tuple>::value - N - 1>(t);
367 template<
typename Tuple>
371 return std::get<std::tuple_size<Tuple>::value - N - 1>(t);
378 template<
class Tuple>
381 template<
typename... Ts>
382 static void apply(std::tuple<Ts...>& t)
411 template<
class Tuple,
template<
class>
class Predicate, std::size_t start = 0,
412 std::size_t
size = std::tuple_size<Tuple>::value>
414 public std::conditional<Predicate<typename std::tuple_element<start,
415 Tuple>::type>::value,
416 std::integral_constant<std::size_t, start>,
417 FirstPredicateIndex<Tuple, Predicate, start+1> >::type
419 static_assert(std::tuple_size<Tuple>::value ==
size,
"The \"size\" " 420 "template parameter of FirstPredicateIndex is an " 421 "implementation detail and should never be set " 426 template<
class Tuple,
template<
class>
class Predicate, std::size_t
size>
430 "types matches the predicate!");
464 template<
class Tuple,
class T, std::
size_t start = 0>
475 template<
class Tuple,
class T>
478 template<
class... Args,
class T>
481 typedef typename std::tuple<Args..., T>
type;
490 template<
class Tuple,
class T>
493 template<
class... Args,
class T>
496 typedef typename std::tuple<T, Args...>
type;
512 template <
class,
class>
class F,
514 class Seed=std::tuple<>,
515 int N=std::tuple_size<Tuple>::value>
522 typedef typename F<Accumulated, Value>::type
type;
536 template <
class,
class>
class F,
554 template<
class Head,
class Tail>
569 template<
class Tuple>
Definition: tupleutility.hh:225
std::remove_reference< T >::type * Type
Definition: tupleutility.hh:321
F< Accumulated, Value >::type type
Result of the reduce operation.
Definition: tupleutility.hh:522
std::tuple< Args..., T > type
Definition: tupleutility.hh:481
std::add_const< T >::type & ConstType
Definition: tupleutility.hh:50
TypeEvaluator to turn a type T into a reference to T
Definition: tupleutility.hh:304
const std::remove_const< T >::type & ParameterType
Definition: tupleutility.hh:52
Deletes all objects pointed to in a std::tuple of pointers.
Definition: tupleutility.hh:379
auto operator()(T &&t) -> decltype(this->apply(t, std::index_sequence_for< Args... >
Definition: tupleutility.hh:246
auto genericTransformTuple(Tuple &&t, Functor &&f) -> decltype(genericTransformTupleBackend(t, f))
Definition: tupleutility.hh:186
static Type apply(T &t)
Definition: tupleutility.hh:333
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition: integersequence.hh:75
std::tuple< Args... > ResultType
Definition: tupleutility.hh:84
auto transformTuple(Tuple &&orig, Args &&... args) -> decltype(genericTransformTuple(orig, makeTransformTupleFunctor< TypeEvaluator >(args...)))
Definition: tupleutility.hh:292
std::remove_reference< T >::type * Type
Definition: tupleutility.hh:332
std::add_const< T >::type * ConstType
Definition: tupleutility.hh:58
Helper template to append a type to a std::tuple.
Definition: tupleutility.hh:476
Generator for predicates accepting one particular type.
Definition: tupleutility.hh:444
std::tuple< typename TE< Args >::Type... > Type
Definition: tupleutility.hh:121
static Type apply(T &t)
Definition: tupleutility.hh:322
static ResultType apply()
Definition: tupleutility.hh:85
std::tuple_element< std::tuple_size< Tuple >::value - N - 1, Tuple >::type Type
Definition: tupleutility.hh:347
ReduceTuple< PushBackTuple, Tail, Head >::type type
Result of the join operation.
Definition: tupleutility.hh:558
Helper template to prepend a type to a std::tuple.
Definition: tupleutility.hh:491
I i
Definition: hybridmultiindex.hh:328
ReduceTuple< F, Tuple, Seed, N-1 >::type Accumulated
Definition: tupleutility.hh:518
Dune namespace
Definition: alignedallocator.hh:12
Reverse element access.
Definition: tupleutility.hh:358
Flatten a std::tuple of std::tuple's.
Definition: tupleutility.hh:570
TypeEvaluator to turn a type T into a pointer to T
Definition: tupleutility.hh:319
static void apply(std::tuple< Ts... > &t)
Definition: tupleutility.hh:382
ReduceTuple< JoinTuples, Tuple >::type type
Result of the flatten operation.
Definition: tupleutility.hh:573
Find the first occurrence of a type in a std::tuple.
Definition: tupleutility.hh:465
Finding the index of a certain type in a std::tuple.
Definition: tupleutility.hh:413
Type for reverse element access.
Definition: tupleutility.hh:345
Seed type
Result of the reduce operation.
Definition: tupleutility.hh:542
static Type apply(T &t)
Definition: tupleutility.hh:307
Apply reduce with meta binary function to template.
Definition: tupleutility.hh:516
T & NonConstType
Definition: tupleutility.hh:51
T & Type
Definition: tupleutility.hh:306
template which always yields a false value
Definition: typetraits.hh:124
The actual predicate.
Definition: tupleutility.hh:448
TransformTupleFunctor(Args &&... args)
Definition: tupleutility.hh:241
T * NonConstType
Definition: tupleutility.hh:59
A helper template that initializes a std::tuple consisting of pointers to nullptr.
Definition: tupleutility.hh:79
decltype(auto) applyPartial(F &&f, ArgTuple &&args, std::integer_sequence< I, i... >)
Apply function with arguments from a given tuple.
Definition: tupleutility.hh:42
Definition: tupleutility.hh:48
T * ParameterType
Definition: tupleutility.hh:60
Join two std::tuple's.
Definition: tupleutility.hh:555
T & NonConstType
Definition: tupleutility.hh:67
std::tuple_element< N-1, Tuple >::type Value
Definition: tupleutility.hh:519
T & ParameterType
Definition: tupleutility.hh:68
Definition: tupleutility.hh:238
Traits for type conversions and type information.
std::tuple< T, Args... > type
Definition: tupleutility.hh:496
Helper template to clone the type definition of a std::tuple with the storage types replaced by a use...
Definition: tupleutility.hh:116
T & ConstType
Definition: tupleutility.hh:66
constexpr void forEach(Range &&range, F &&f)
Range based for loop.
Definition: hybridutilities.hh:261
TransformTupleFunctor< TE, Args... > makeTransformTupleFunctor(Args &&... args)
Definition: tupleutility.hh:254