1#ifndef __DUNE_ACFEM_MPL_ACCUMULATE_HH__
2#define __DUNE_ACFEM_MPL_ACCUMULATE_HH__
31 template<
class Sequence,
class Functor>
32 struct AccumulateSequenceHelper;
34 template<
class T, T I, T... Rest,
class F>
35 struct AccumulateSequenceHelper<
Sequence<T, I, Rest...>, F>
37 static const T value =
38 F::template Apply<T, I, AccumulateSequenceHelper<
Sequence<T, Rest...>, F>::value>::value;
41 template<
class T,
class F>
42 struct AccumulateSequenceHelper<
Sequence<T>, F>
44 static constexpr T value = F::template NeutralValue<T>::value;
72 template<
class F,
class Seq>
81 struct LogicalAndFunctor
86 template<
class T, T I1, T I2>
90 struct LogicalOrFunctor
93 using NeutralValue = Constant<T, false>;
95 template<
class T, T I1, T I2>
96 using Apply = BoolConstant<I1 || I2>;
99 struct BitwiseAndFunctor
103 using NeutralValue =
Constant<T, T(~0UL)>;
105 template<
class T, T I1, T I2>
106 using Apply = Constant<T, I1 & I2>;
109 struct BitwiseOrFunctor
113 using NeutralValue =
Constant<T, T(0UL)>;
115 template<
class T, T I1, T I2>
116 using Apply = Constant<T, I1 | I2>;
122 using NeutralValue = Constant<T, std::numeric_limits<T>::max()>;
124 template<
class T, T I1, T I2>
125 using Apply =
Constant<T, std::min(I1, I2)>;
131 using NeutralValue = Constant<T, std::numeric_limits<T>::min()>;
133 template<
class T, T I1, T I2>
134 using Apply =
Constant<T, std::max(I1, I2)>;
140 using NeutralValue =
Constant<T, T(0)>;
142 template<
class T, T I1, T I2>
143 using Apply = Constant<T, I1 + I2>;
149 using NeutralValue =
Constant<T, T(1)>;
151 template<
class T, T I1, T I2>
152 using Apply = Constant<T, I1 * I2>;
155 template<
class F, F V>
156 struct MultiplyAddFunctor
159 using NeutralValue =
Constant<T, T(0)>;
161 template<
class T, T Front, T Rest>
162 using Apply = Constant<T, Front + V * Rest>;
172 template<
class T, T... Ts>
173 constexpr bool logicalAnd(Sequence<T, Ts...>)
175 return (... && ((
bool)Ts));
178 template<
class T, T... Ts>
179 constexpr bool logicalOr(Sequence<T, Ts...>)
181 return (... || ((
bool)Ts));
184 template<
class T, T... Ts>
185 constexpr T bitwiseAnd(Sequence<T, Ts...>)
187 return (T(~0UL) & ... & ((
bool)Ts));
190 template<
class T, T... Ts>
191 constexpr T bitwiseOr(Sequence<T, Ts...>)
193 return (T(0) | ... | ((
bool)Ts));
196 template<
class T, T... Ts>
197 constexpr T sum(Sequence<T, Ts...>)
199 return (T(0) + ... + Ts);
202 template<
class T, T... Ts>
203 constexpr T prod(Sequence<T, Ts...>)
205 return (T(1) * ... * Ts);
208 template<
class T, T... Ts>
209 constexpr T max(Sequence<T, Ts...>)
214 template<
class T, T... Ts>
215 constexpr T min(Sequence<T, Ts...>)
227 using BitwiseAnd =
Constant<
typename Seq::value_type, bitwiseAnd(Seq{})>;
230 using BitwiseOr =
Constant<
typename Seq::value_type, bitwiseOr(Seq{})>;
233 using Sum =
Constant<
typename Seq::value_type, sum(Seq{})>;
236 using Prod =
Constant<
typename Seq::value_type, prod(Seq{})>;
239 using Min =
Constant<
typename Seq::value_type, min(Seq{})>;
242 using Max =
Constant<
typename Seq::value_type, max(Seq{})>;
Constant< typename Seq::value_type, AccumulateSequenceHelper< Seq, F >::value > AccumulateSequence
Accumulate the values of the sequence according to the supplied functor.
Definition: accumulate.hh:73
integral_constant< T, V > Constant
Short-cut for any integral constant.
Definition: types.hh:40
Constant< bool, V > BoolConstant
Short-cut for integral constant of type bool.
Definition: types.hh:48
std::integer_sequence< T, V... > Sequence
Sequence of any type of integer values.
Definition: types.hh:56