1#ifndef __DUNE_ACFEM_MPL_FOREACH_HH__
2#define __DUNE_ACFEM_MPL_FOREACH_HH__
4#include <dune/common/hybridutilities.hh>
5#include "../common/types.hh"
29 template<std::size_t... I,
class F>
30 constexpr void forEach(F&& f, IndexSequence<I...> = IndexSequence<I...>{})
32 (... , std::forward<F>(f)(IndexConstant<I>{}));
35 template<std::size_t... I,
class F>
36 constexpr void forEach(IndexSequence<I...>, F&& f)
38 (... , std::forward<F>(f)(IndexConstant<I>{}));
41 template<
class... T,
class F>
42 constexpr void forEach(MPL::TypeTuple<T...>, F&& f)
44 (... , std::forward<F>(f)(MPL::TypeWrapper<T>{}));
47 template<class T, class F, std::enable_if_t<IsTupleLike<T>::value,
int> = 0>
48 constexpr void forEach(T&& t, F&& f)
50 forEach(MakeSequenceFor<T>{}, [&](
auto i) {
51 using I =
decltype(i);
52 std::forward<F>(f)(std::forward<TupleElement<I::value, T> >(get<I::value>(std::forward<T>(t))));
57 template<std::
size_t N,
class F>
58 constexpr void forLoop(F&& f)
60 forEach(MakeIndexSequence<N>{}, std::forward<F>(f));
76 template<std::size_t... I,
class F>
79 return (... && (std::forward<F>(f)(IndexConstant<I>{})));
83 template<std::size_t... I,
class F>
92 template<std::size_t... I,
class F,
class T>
95 return (std::forward<T>(init) + ... + (std::forward<F>(f)(IndexConstant<I>{})));
101 template<std::size_t... I,
class F,
class T>
105 return addEach<I...>(std::forward<F>(f), std::forward<T>(init));
109 template<std::
size_t N,
class F,
class T>
112 return addEach(MakeIndexSequence<N>{}, std::forward<F>(f), std::forward<T>(init));
118 template<std::size_t... I,
class F,
class T>
121 return (std::forward<T>(init) * ... * (std::forward<F>(f)(IndexConstant<I>{})));
127 template<std::size_t... I,
class F,
class T>
130 return multiplyEach<I...>(std::forward<F>(f), std::forward<T>(init));
134 template<std::
size_t N,
class F,
class T>
137 return multiplyEach(MakeIndexSequence<N>{}, std::forward<F>(f), std::forward<T>(init));
constexpr auto addEach(T &&init, F &&f, IndexSequence< I... >=IndexSequence< I... >{})
Invoke the given functor sizeof...(I) times and sum up the result, where init gives the initial value...
Definition: foreach.hh:93
constexpr bool forEachWhile(F &&f, IndexSequence< I... >=IndexSequence< I... >{})
Repeat until F returns false.
Definition: foreach.hh:77
constexpr auto addLoop(F &&f, T &&init, IndexConstant< N >=IndexConstant< N >{})
Version with just a plain number as argument.
Definition: foreach.hh:110
constexpr auto multiplyLoop(T &&init, F &&f, IndexConstant< N >=IndexConstant< N >{})
Version with just a plain number as argument.
Definition: foreach.hh:135
constexpr auto multiplyEach(T &&init, F &&f, IndexSequence< I... >=IndexSequence< I... >{})
Invoke the given functor sizeof...(I) times and multiply the result, where init gives the initial val...
Definition: foreach.hh:119
Sequence< std::size_t, V... > IndexSequence
Sequence of std::size_t values.
Definition: types.hh:64
Constant< std::size_t, V > IndexConstant
Short-cut for integral constant of type std::size_t.
Definition: types.hh:44