24 #include <type_traits> 31 #define SUM(...) (get_sum(__VA_ARGS__)(__VA_ARGS__)) 33 #define get_sum(...) get_sum_macro(__VA_ARGS__, sum_user_t, sum_ptrdiff_t,) 35 #define get_sum_macro(_1, _2, _3, _4, _5, name, ...) name 37 #define sum_ptrdiff_t(idx, ini, fin, expr) \ 38 sum<std::ptrdiff_t>((ini), (fin), [&](std::ptrdiff_t (idx)) { return (expr); }) 40 #define sum_user_t(type, idx, ini, fin, expr) \ 41 sum<type>((ini), (fin), [&](type (idx)) { return (expr); }) 47 std::is_base_of<Eigen::EigenBase<T>, T>
::value;
50 template<
typename Idx,
typename Function,
bool isEigenType>
52 static auto eval(Idx i, Function
f) -> decltype(
f(i)) {
57 template<
typename Idx,
typename Function>
59 static auto eval(Idx i, Function
f) ->
60 typename std::remove_reference<decltype(
f(i).eval())>::type
66 template<
typename Idx,
typename Function>
77 template<
typename T,
bool isEigenType>
93 template<
class Idx,
class Function>
94 auto sum(Idx ini, Idx fin, Function
f) -> decltype(EvalEigenXpr<Idx>(ini,
f))
96 using Evaled = decltype(EvalEigenXpr<Idx>(ini,
f));
97 using Acc =
typename std::remove_cv<Evaled>::type;
99 for (Idx i = ini; i <= fin; i++) s +=
f(i);
auto sum(Idx ini, Idx fin, Function f) -> decltype(EvalEigenXpr< Idx >(ini, f))
static auto eval(Idx i, Function f) -> decltype(f(i))
static auto eval(Idx i, Function f) -> typename std::remove_reference< decltype(f(i).eval())>::type
static constexpr auto value
HimalayaErrorMessage [s_] s
auto EvalEigenXpr(Idx i, Function f) -> decltype(EvalEigenXprImpl< Idx, Function, is_eigen_type< decltype(f(i))>::value >::eval(i, f))
double f(double r) noexcept