8 #ifndef SIG_UTIL_FOLD_HPP
9 #define SIG_UTIL_FOLD_HPP
11 #include "../helper/helper_modules.hpp"
12 #include "../helper/container_helper.hpp"
42 template <
class F,
class T,
class C>
43 auto foldl(F&& func, T&& init, C&& list)
48 return std::accumulate(
impl::begin(std::forward<C>(list)),
impl::end(std::forward<C>(list)), static_cast<R>(init), std::forward<F>(func));
73 template <
class F,
class T,
class C>
74 auto foldr(F&& func, T&& init, C&& list)
79 return std::accumulate(
impl::rbegin(std::forward<C>(list)),
impl::rend(std::forward<C>(list)), static_cast<R>(std::forward<T>(init)), std::bind(std::forward<F>(func), _2, _1));
110 template <
class F1,
class F2,
class T,
class... Cs>
111 auto dotProduct(F1&& fold_func, F2&& oper_func, T&& init, Cs&&... lists)
114 std::forward<F1>(fold_func),
115 std::forward<T>(init),
117 std::forward<F2>(oper_func),
121 R result = std::forward<T>(init);
122 const uint length =
min(lists.size()...);
124 iterative_fold(length, result, std::forward<F2>(oper_func), std::forward<F1>(fold_func),
impl::begin(std::forward<Cs>(lists))...);
typename std::remove_const< typename std::remove_reference< T >::type >::type type
auto end(C &&c) -> std::move_iterator< typename RC::iterator >
auto rbegin(C &&c) -> std::move_iterator< typename RC::reverse_iterator >
auto foldl(F &&func, T &&init, C &&list)
コンテナの先頭からたたみ込み
auto dotProduct(F1 &&fold_func, F2 &&oper_func, T &&init, Cs &&...lists)
可変長個のコンテナに対して関数適用して結果を集約する関数
auto rend(C &&c) -> std::move_iterator< typename RC::reverse_iterator >
auto foldr(F &&func, T &&init, C &&list)
コンテナの末尾からたたみ込み
auto eval(F &&f, Args &&...args) -> decltype(f(std::forward< Args >(args)...))
void iterative_fold(uint loop, T &dest, F1 &&zip, F2 &&fold, Its...iterators)
auto begin(C &&c) -> std::move_iterator< typename RC::iterator >