AMDiS  0.3
The Adaptive Multi-Dimensional Simulation Toolbox
ForEach.hpp
1 #pragma once
2 
3 #include <initializer_list>
4 #include <tuple>
5 #include <type_traits>
6 
7 #include <amdis/common/Index.hpp>
8 #include <amdis/common/Range.hpp>
9 
10 namespace AMDiS
11 {
12  namespace Ranges
13  {
14  template <class Functor, class... Args>
15  constexpr void forVariadic(Functor&& f, Args&&... args)
16  {
17  (f(FWD(args)),...);
18  }
19 
20  template <std::size_t... I, class Tuple, class Functor>
21  constexpr void forEach(std::index_sequence<I...>, Tuple&& tuple, Functor&& f)
22  {
23  using std::get;
24  (f(get<I>(tuple)),...);
25  }
26 
27  template <class... T, class Functor>
28  constexpr void forEach(std::tuple<T...> const& tuple, Functor&& f)
29  {
30  Ranges::forEach(std::make_index_sequence<sizeof...(T)>{}, tuple, FWD(f));
31  }
32 
33  template <class... T, class Functor>
34  constexpr void forEach(std::tuple<T...>& tuple, Functor&& f)
35  {
36  Ranges::forEach(std::make_index_sequence<sizeof...(T)>{}, tuple, FWD(f));
37  }
38 
39  template <class Range, class Functor>
40  constexpr auto forEach(Range&& r, Functor&& f)
41  -> std::void_t<decltype((std::begin(r),std::end(r)))>
42  {
43  for (auto& ri : r)
44  f(ri);
45  }
46 
47  template <std::size_t I0 = 0, std::size_t... I, class Functor>
48  constexpr void forIndices(std::index_sequence<I...>, Functor&& f)
49  {
50  (f(index_t<I0+I>{}),...);
51  }
52 
53  template <std::size_t I0, std::size_t I1, class Functor>
54  constexpr void forIndices(index_t<I0>, index_t<I1>, Functor&& f)
55  {
56  Ranges::forIndices<I0>(std::make_index_sequence<std::size_t(I1-I0)>{}, FWD(f));
57  }
58 
59  template <std::size_t N, class Functor>
60  constexpr void forIndices(index_t<N>, Functor&& f)
61  {
62  Ranges::forIndices(std::make_index_sequence<N>{}, FWD(f));
63  }
64 
65  template <std::size_t I0, std::size_t I1, class Functor>
66  constexpr void forIndices(Functor&& f)
67  {
68  Ranges::forIndices<I0>(std::make_index_sequence<std::size_t(I1-I0)>{}, FWD(f));
69  }
70 
71  template <std::size_t N, class Functor>
72  constexpr void forIndices(Functor&& f)
73  {
74  Ranges::forIndices<0>(std::make_index_sequence<N>{}, FWD(f));
75  }
76 
77  } // end namespace Ranges
78 } // end namespace AMDiS
constexpr bool Functor
A Functor is a function F with signature Signature.
Definition: Concepts.hpp:134
Definition: AdaptBase.hpp:6