00001
00002 #ifndef _INSTIGATE_STL_INTERNAL_HEADER_IN_ALGORITHM
00003 #error This is an internal header file used to implement Instigate STL.\
00004 It should never be included directly by a program.
00005 #endif
00006
00007 #ifndef INSTIGATE_STL_ACCUMULATE_HPP
00008 #define INSTIGATE_STL_ACCUMULATE_HPP
00009
00058
00059 #include "_basis.hpp"
00060 #include "concept.hpp"
00061
00062
00063 #include <generic/base.hpp>
00064
00065
00066
00067
00068 namespace instigate {
00069 namespace stl {
00070 template <typename I, typename T>
00071 T accumulate(I b, I e, T i);
00072 template <typename I, typename T, typename F>
00073 T accumulate(I b, I e, T i, F f);
00074 }
00075 }
00076
00105 template <typename I, typename T>
00106 T instigate::stl::accumulate(I b, I e, T i)
00107 {
00108 typedef typename instigate::stl::readable_iterator::interface<I>::
00109 value_type value_type;
00110 CHECK(instigate::stl::single_pass_iterator::requirements<I>);
00111 CHECK(instigate::stl::readable_iterator::requirements<I>);
00112 CHECK_CONVERTIBILITY(T, value_type);
00113 CHECK(instigate::generic::assignable::requirements<T>);
00114 while (!equal(b, e)) {
00115 assign(i, i + const_dereference(b));
00116 increment(b);
00117 }
00118 return i;
00119 }
00120
00165 template <typename I, typename T, typename F>
00166 T instigate::stl::accumulate(I b, I e, T i, F f)
00167 {
00168 namespace SP = instigate::stl::single_pass_iterator;
00169 typedef typename instigate::stl::readable_iterator::interface<I>::
00170 value_type value_type;
00171 CHECK(SP::requirements<I>);
00172 CHECK(instigate::generic::assignable::requirements<T>);
00173 CHECK_CONVERTIBILITY(T, value_type);
00174 while (!equal(b, e)) {
00175 assign(i, invoke(f, i, const_dereference(b)));
00176 increment(b);
00177 }
00178 return i;
00179 }
00180
00181
00182
00183 #endif // INSTIGATE_STL_ACCUMULATE_HPP