Dune Core Modules (2.7.1)

tupleutility.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 
4 #ifndef DUNE_TUPLE_UTILITY_HH
5 #define DUNE_TUPLE_UTILITY_HH
6 
7 #include <cstddef>
8 #include <tuple>
9 #include <type_traits>
10 
11 #include <dune/common/hybridutilities.hh>
12 #include <dune/common/std/type_traits.hh>
13 #include <dune/common/std/utility.hh>
14 
15 namespace Dune {
16 
39  template<class F, class ArgTuple, class I, I... i>
40  decltype(auto) applyPartial(F&& f, ArgTuple&& args, std::integer_sequence<I, i...> /*indices*/)
41  {
42  return f(std::get<i>(args)...);
43  }
44 
45  template<class T>
46  struct TupleAccessTraits
47  {
48  typedef typename std::add_const<T>::type& ConstType;
49  typedef T& NonConstType;
50  typedef const typename std::remove_const<T>::type& ParameterType;
51  };
52 
53  template<class T>
54  struct TupleAccessTraits<T*>
55  {
56  typedef typename std::add_const<T>::type* ConstType;
57  typedef T* NonConstType;
58  typedef T* ParameterType;
59  };
60 
61  template<class T>
62  struct TupleAccessTraits<T&>
63  {
64  typedef T& ConstType;
65  typedef T& NonConstType;
66  typedef T& ParameterType;
67  };
68 
76  template<class T>
78 
79  template<class... Args>
80  struct NullPointerInitialiser<std::tuple<Args...> >
81  {
82  typedef std::tuple<Args...> ResultType;
83  static ResultType apply()
84  {
85  return ResultType(static_cast<Args>(nullptr)...);
86  }
87  };
88 
113  template<template <class> class TE, class T>
114  struct ForEachType;
115 
116  template<template <class> class TE, class... Args>
117  struct ForEachType<TE, std::tuple<Args...> >
118  {
119  typedef std::tuple<typename TE<Args>::Type...> Type;
120  };
121 
122 #ifndef DOXYGEN
123  template<class Tuple, class Functor, std::size_t... I>
124  inline auto genericTransformTupleBackendImpl(Tuple& t, Functor& f, const Std::index_sequence<I...>& )
125  -> std::tuple<decltype(f(std::get<I>(t)))...>
126  {
127  return std::tuple<decltype(f(std::get<I>(t)))...>(f(std::get<I>(t))...);
128  }
129 
130  template<class... Args, class Functor>
131  auto genericTransformTupleBackend(std::tuple<Args...>& t, Functor& f) ->
132  decltype(genericTransformTupleBackendImpl(t, f,Std::index_sequence_for<Args...>{}))
133  {
134  return genericTransformTupleBackendImpl(t, f,Std::index_sequence_for<Args...>{});
135  }
136 
137  template<class... Args, class Functor>
138  auto genericTransformTupleBackend(const std::tuple<Args...>& t, Functor& f) ->
139  decltype(genericTransformTupleBackendImpl(t, f, Std::index_sequence_for<Args...>{}))
140  {
141  return genericTransformTupleBackendImpl(t, f, Std::index_sequence_for<Args...>{});
142  }
143 #endif
144 
183  template<class Tuple, class Functor>
184  auto genericTransformTuple(Tuple&& t, Functor&& f) ->
185  decltype(genericTransformTupleBackend(t, f))
186  {
187  return genericTransformTupleBackend(t, f);
188  }
189 
222  template<template<class> class TE, class... Args>
224  {
225  mutable std::tuple<Args&...> tup;
226 
227  template<class T, std::size_t... I>
228  inline auto apply(T&& t, const Std::index_sequence<I...>& ) ->
229  decltype(TE<T>::apply(t,std::get<I>(tup)...)) const
230  {
231  return TE<T>::apply(t,std::get<I>(tup)...);
232  }
233 
234  public:
235  template<class T>
236  struct TypeEvaluator : public TE<T>
237  {};
238 
239  TransformTupleFunctor(Args&&... args)
240  : tup(args...)
241  { }
242 
243  template<class T>
244  inline auto operator()(T&& t) ->
245  decltype(this->apply(t,Std::index_sequence_for<Args...>{})) const
246  {
247  return apply(t,Std::index_sequence_for<Args...>{});
248  }
249  };
250 
251  template<template<class> class TE, class... Args>
252  TransformTupleFunctor<TE, Args...> makeTransformTupleFunctor(Args&&... args)
253  {
254  return TransformTupleFunctor<TE, Args...>(args...);
255  }
256 
289  template<template<class> class TypeEvaluator, class Tuple, class... Args>
290  auto transformTuple(Tuple&& orig, Args&&... args) ->
291  decltype(genericTransformTuple(orig, makeTransformTupleFunctor<TypeEvaluator>(args...)))
292  {
293  return genericTransformTuple(orig, makeTransformTupleFunctor<TypeEvaluator>(args...));
294  }
295 
297 
301  template<class T>
303  {
304  typedef T& Type;
305  static Type apply(T& t)
306  {
307  return t;
308  }
309  };
310 
312 
316  template<class T>
318  {
319  typedef typename std::remove_reference<T>::type* Type;
320  static Type apply(T& t)
321  {
322  return &t;
323  }
324  };
325 
326  // Specialization, in case the type is already a reference
327  template<class T>
328  struct AddPtrTypeEvaluator<T&>
329  {
330  typedef typename std::remove_reference<T>::type* Type;
331  static Type apply(T& t)
332  {
333  return &t;
334  }
335  };
336 
342  template<int N, class Tuple>
343  struct AtType
344  {
345  typedef typename std::tuple_element<std::tuple_size<Tuple>::value - N - 1, Tuple>::type Type;
346  };
347 
355  template<int N>
356  struct At
357  {
358  template<typename Tuple>
359  static typename TupleAccessTraits<typename AtType<N, Tuple>::Type>::NonConstType
360  get(Tuple& t)
361  {
362  return std::get<std::tuple_size<Tuple>::value - N - 1>(t);
363  }
364 
365  template<typename Tuple>
366  static typename TupleAccessTraits<typename AtType<N, Tuple>::Type>::ConstType
367  get(const Tuple& t)
368  {
369  return std::get<std::tuple_size<Tuple>::value - N - 1>(t);
370  }
371  };
372 
376  template<class Tuple>
378  {
379  template<typename... Ts>
380  static void apply(std::tuple<Ts...>& t)
381  {
382  Hybrid::forEach(t,[&](auto&& ti){delete ti; ti=nullptr;});
383  }
384  };
385 
409  template<class Tuple, template<class> class Predicate, std::size_t start = 0,
410  std::size_t size = std::tuple_size<Tuple>::value>
412  public std::conditional<Predicate<typename std::tuple_element<start,
413  Tuple>::type>::value,
414  std::integral_constant<std::size_t, start>,
415  FirstPredicateIndex<Tuple, Predicate, start+1> >::type
416  {
417  static_assert(std::tuple_size<Tuple>::value == size, "The \"size\" "
418  "template parameter of FirstPredicateIndex is an "
419  "implementation detail and should never be set "
420  "explicitly!");
421  };
422 
423 #ifndef DOXYGEN
424  template<class Tuple, template<class> class Predicate, std::size_t size>
425  class FirstPredicateIndex<Tuple, Predicate, size, size>
426  {
427  static_assert(Std::to_false_type<Tuple>::value, "None of the std::tuple element "
428  "types matches the predicate!");
429  };
430 #endif // !DOXYGEN
431 
441  template<class T>
442  struct IsType
443  {
445  template<class U>
446  struct Predicate : public std::is_same<T, U> {};
447  };
448 
462  template<class Tuple, class T, std::size_t start = 0>
463  struct FirstTypeIndex :
464  public FirstPredicateIndex<Tuple, IsType<T>::template Predicate, start>
465  { };
466 
473  template<class Tuple, class T>
475 
476  template<class... Args, class T>
477  struct PushBackTuple<typename std::tuple<Args...>, T>
478  {
479  typedef typename std::tuple<Args..., T> type;
480  };
481 
488  template<class Tuple, class T>
490 
491  template<class... Args, class T>
492  struct PushFrontTuple<typename std::tuple<Args...>, T>
493  {
494  typedef typename std::tuple<T, Args...> type;
495  };
496 
509  template<
510  template <class, class> class F,
511  class Tuple,
512  class Seed=std::tuple<>,
513  int N=std::tuple_size<Tuple>::value>
514  struct ReduceTuple
515  {
516  typedef typename ReduceTuple<F, Tuple, Seed, N-1>::type Accumulated;
517  typedef typename std::tuple_element<N-1, Tuple>::type Value;
518 
520  typedef typename F<Accumulated, Value>::type type;
521  };
522 
533  template<
534  template <class, class> class F,
535  class Tuple,
536  class Seed>
537  struct ReduceTuple<F, Tuple, Seed, 0>
538  {
540  typedef Seed type;
541  };
542 
552  template<class Head, class Tail>
553  struct JoinTuples
554  {
557  };
558 
567  template<class Tuple>
569  {
572  };
573 
575 }
576 
577 #endif
Finding the index of a certain type in a std::tuple.
Definition: tupleutility.hh:416
Definition: tupleutility.hh:224
decltype(auto) apply(F &&f, ArgTuple &&args)
Apply function with arguments given as tuple.
Definition: apply.hh:46
constexpr void forEach(Range &&range, F &&f)
Range based for loop.
Definition: hybridutilities.hh:267
auto transformTuple(Tuple &&orig, Args &&... args) -> decltype(genericTransformTuple(orig, makeTransformTupleFunctor< TypeEvaluator >(args...)))
Definition: tupleutility.hh:290
Seed type
Result of the reduce operation.
Definition: tupleutility.hh:540
ReduceTuple< PushBackTuple, Tail, Head >::type type
Result of the join operation.
Definition: tupleutility.hh:556
F< Accumulated, Value >::type type
Result of the reduce operation.
Definition: tupleutility.hh:520
ReduceTuple< JoinTuples, Tuple >::type type
Result of the flatten operation.
Definition: tupleutility.hh:571
auto genericTransformTuple(Tuple &&t, Functor &&f) -> decltype(genericTransformTupleBackend(t, f))
Definition: tupleutility.hh:184
decltype(auto) applyPartial(F &&f, ArgTuple &&args, std::integer_sequence< I, i... >)
Apply function with arguments from a given tuple.
Definition: tupleutility.hh:40
make_index_sequence< typename Dune::SizeOf< T... >{}> index_sequence_for
Create index_sequence from 0 to sizeof...(T)-1.
Definition: utility.hh:38
Dune namespace.
Definition: alignedallocator.hh:14
TypeEvaluator to turn a type T into a pointer to T
Definition: tupleutility.hh:318
TypeEvaluator to turn a type T into a reference to T
Definition: tupleutility.hh:303
Type for reverse element access.
Definition: tupleutility.hh:344
Reverse element access.
Definition: tupleutility.hh:357
Find the first occurrence of a type in a std::tuple.
Definition: tupleutility.hh:465
Flatten a std::tuple of std::tuple's.
Definition: tupleutility.hh:569
Helper template to clone the type definition of a std::tuple with the storage types replaced by a use...
Definition: tupleutility.hh:114
The actual predicate.
Definition: tupleutility.hh:446
Generator for predicates accepting one particular type.
Definition: tupleutility.hh:443
Join two std::tuple's.
Definition: tupleutility.hh:554
A helper template that initializes a std::tuple consisting of pointers to nullptr.
Definition: tupleutility.hh:77
Deletes all objects pointed to in a std::tuple of pointers.
Definition: tupleutility.hh:378
Helper template to append a type to a std::tuple.
Definition: tupleutility.hh:474
Helper template to prepend a type to a std::tuple.
Definition: tupleutility.hh:489
Apply reduce with meta binary function to template.
Definition: tupleutility.hh:515
template mapping a type to std::false_type
Definition: type_traits.hh:79
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 7, 22:32, 2024)