SigUtil  0.95
Utility modules for modern C++
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
fold.hpp
Go to the documentation of this file.
1 /*
2 Copyright© 2014 Akihiro Nishimura
3 
4 This software is released under the MIT License.
5 http://opensource.org/licenses/mit-license.php
6 */
7 
8 #ifndef SIG_UTIL_FOLD_HPP
9 #define SIG_UTIL_FOLD_HPP
10 
11 #include "../helper/helper_modules.hpp"
12 #include "../helper/container_helper.hpp"
13 
15 
16 namespace sig
17 {
19 
42 template <class F, class T, class C>
43 auto foldl(F&& func, T&& init, C&& list)
44 {
45  using CR = typename impl::remove_const_reference<C>::type;
46  using R = decltype(std::forward<F>(func)(std::forward<T>(init), std::declval<typename impl::container_traits<CR>::value_type>()));
47 
48  return std::accumulate(impl::begin(std::forward<C>(list)), impl::end(std::forward<C>(list)), static_cast<R>(init), std::forward<F>(func));
49 }
50 
51 #if SIG_ENABLE_FOLDR
52 
73 template <class F, class T, class C>
74 auto foldr(F&& func, T&& init, C&& list)
75 {
76  using CR = typename impl::remove_const_reference<C>::type;
77  using R = decltype(impl::eval(std::forward<F>(func), std::forward<T>(init), std::declval<typename impl::container_traits<CR>::value_type>()));
78 
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));
80 }
81 #endif
82 
83 
85 
110 template <class F1, class F2, class T, class... Cs>
111 auto dotProduct(F1&& fold_func, F2&& oper_func, T&& init, Cs&&... lists)
112 {
113  using R = decltype(impl::eval(
114  std::forward<F1>(fold_func),
115  std::forward<T>(init),
116  impl::eval(
117  std::forward<F2>(oper_func),
118  std::declval<typename impl::container_traits<typename impl::remove_const_reference<Cs>::type>::value_type>()...)
119  )
120  );
121  R result = std::forward<T>(init);
122  const uint length = min(lists.size()...);
123 
124  iterative_fold(length, result, std::forward<F2>(oper_func), std::forward<F1>(fold_func), impl::begin(std::forward<Cs>(lists))...);
125 
126  return result;
127 }
128 
129 }
130 #endif
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)
コンテナの先頭からたたみ込み
Definition: fold.hpp:43
auto dotProduct(F1 &&fold_func, F2 &&oper_func, T &&init, Cs &&...lists)
可変長個のコンテナに対して関数適用して結果を集約する関数
Definition: fold.hpp:111
auto rend(C &&c) -> std::move_iterator< typename RC::reverse_iterator >
auto foldr(F &&func, T &&init, C &&list)
コンテナの末尾からたたみ込み
Definition: fold.hpp:74
auto min(T v) -> T
auto eval(F &&f, Args &&...args) -> decltype(f(std::forward< Args >(args)...))
Definition: eval.hpp:37
void iterative_fold(uint loop, T &dest, F1 &&zip, F2 &&fold, Its...iterators)
Definition: array.hpp:15
auto begin(C &&c) -> std::move_iterator< typename RC::iterator >