AMDiS  0.3
The Adaptive Multi-Dimensional Simulation Toolbox
RecursiveForEach.hpp
1 #pragma once
2 
3 #include <array>
4 #include <tuple>
5 #include <vector>
6 #include <type_traits>
7 #include <utility>
8 
9 #include <dune/common/tuplevector.hh>
10 #include <amdis/common/TypeTraits.hpp>
11 
12 namespace AMDiS
13 {
14  namespace Recursive
15  {
17 
20  template <class V>
21  struct ForEach
22  {
23  template <class Value, class F>
24  static void impl(Value&& v, F&& f)
25  {
26  f(v);
27  }
28  };
29 
31 
38  template <class Container, class F>
39  void forEach(Container&& container, F&& f)
40  {
42  }
43 
44 
45  // specializations for container types
46 
47  template <class... TT>
48  struct ForEach<std::tuple<TT...>>
49  {
50  using indices = std::make_index_sequence<sizeof...(TT)>;
51 
52  template <std::size_t... I, class Tuple, class F>
53  static void impl2(std::index_sequence<I...>, Tuple&& tuple, F&& f)
54  {
55  using std::get;
56  (Recursive::forEach(get<I>(tuple), f),...);
57  }
58 
59  template <class Tuple, class F>
60  static void impl(Tuple&& tuple, F&& f)
61  {
62  impl2(indices{}, tuple, f);
63  }
64  };
65 
66  template <class T1, class T2>
67  struct ForEach<std::pair<T1,T2>>
68  {
69  template <class Pair, class F>
70  static void impl(Pair&& pair, F&& f)
71  {
72  Recursive::forEach(pair.first, f);
73  Recursive::forEach(pair.second, f);
74  }
75  };
76 
77  template <class... TT>
78  struct ForEach<Dune::TupleVector<TT...>>
79  {
80  template <class Tuple, class F>
81  static void impl(Tuple&& tuple, F&& f)
82  {
83  ForEach<std::tuple<TT...>>::impl(tuple, f);
84  }
85  };
86 
87  template <class T, std::size_t n>
88  struct ForEach<std::array<T,n>>
89  {
90  template <class Array, class F>
91  static void impl(Array&& a, F&& f)
92  {
93  for (auto&& ai : a)
94  Recursive::forEach(ai, f);
95  }
96  };
97 
98  template <class T>
99  struct ForEach<std::vector<T>>
100  {
101  template <class Vector, class F>
102  static void impl(Vector&& v, F&& f)
103  {
104  for (auto&& vi : v)
105  Recursive::forEach(vi, f);
106  }
107  };
108 
109  } // end namespace Recursive
110 } // end namespace AMDiS
Definition: FieldMatVec.hpp:12
Default implementation of the recursive forEach function.
Definition: RecursiveForEach.hpp:21
Contains all classes needed for solving linear and non linear equation systems.
Definition: AdaptBase.hpp:6