00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_ACCU_MATH_SUM_HH
00027 # define MLN_ACCU_MATH_SUM_HH
00028
00032
00033 # include <mln/core/concept/meta_accumulator.hh>
00034 # include <mln/accu/internal/base.hh>
00035
00036 # include <mln/util/pix.hh>
00037
00038 # include <mln/trait/value_.hh>
00039 # include <mln/value/builtin/all.hh>
00040 # include <mln/literal/zero.hh>
00041
00042
00043 namespace mln
00044 {
00045
00046 namespace accu
00047 {
00048
00049 namespace math
00050 {
00051
00052
00053 template <typename T, typename S>
00054 struct sum;
00055
00056 }
00057
00058 namespace meta
00059 {
00060
00061 namespace math
00062 {
00063
00065 struct sum : public Meta_Accumulator< sum >
00066 {
00067 template <typename T, typename S = mln_sum(T)>
00068 struct with
00069 {
00070 typedef accu::math::sum<T, S> ret;
00071 };
00072 };
00073
00074 }
00075
00076 }
00077
00078 }
00079
00080
00081 namespace trait
00082 {
00083
00084 template <typename T, typename S>
00085 struct accumulator_< accu::math::sum<T,S> >
00086 {
00087 typedef accumulator::has_untake::yes has_untake;
00088 typedef accumulator::has_set_value::yes has_set_value;
00089 typedef accumulator::has_stop::no has_stop;
00090 typedef accumulator::when_pix::not_ok when_pix;
00091 };
00092
00093 }
00094
00095
00096 namespace accu
00097 {
00098
00099 namespace math
00100 {
00101
00109
00110 template <typename T, typename S = mln_sum(T)>
00111 struct sum : public mln::accu::internal::base< const S&, sum<T,S> >
00112 {
00113 typedef T argument;
00114
00115 sum();
00116
00119 void init();
00120 void take(const argument& t);
00121 void take_as_init_(const argument& t);
00122 void take(const sum<T,S>& other);
00123
00124 void untake(const argument& t);
00125 void set_value(const S& s);
00127
00129 const S& to_result() const;
00130
00133 bool is_valid() const;
00134
00135 protected:
00136
00137 S s_;
00138 };
00139
00140
00141 template <typename I, typename S>
00142 struct sum< util::pix<I>, S >;
00143
00144
00145 # ifndef MLN_INCLUDE_ONLY
00146
00147
00148
00149 template <typename T, typename S>
00150 inline
00151 sum<T,S>::sum()
00152 {
00153 init();
00154 }
00155
00156 template <typename T, typename S>
00157 inline
00158 void
00159 sum<T,S>::init()
00160 {
00161 s_ = literal::zero;
00162 }
00163
00164 template <typename T, typename S>
00165 inline
00166 void sum<T,S>::take(const argument& t)
00167 {
00168 s_ += static_cast<S>(t);
00169 }
00170
00171 template <typename T, typename S>
00172 inline
00173 void sum<T,S>::untake(const argument& t)
00174 {
00175 s_ -= static_cast<S>(t);
00176 }
00177
00178 template <typename T, typename S>
00179 inline
00180 void sum<T,S>::take_as_init_(const argument& t)
00181 {
00182 s_ = static_cast<S>(t);
00183 }
00184
00185 template <typename T, typename S>
00186 inline
00187 void
00188 sum<T,S>::take(const sum<T,S>& other)
00189 {
00190 s_ += other.s_;
00191 }
00192
00193 template <typename T, typename S>
00194 inline
00195 const S&
00196 sum<T,S>::to_result() const
00197 {
00198 return s_;
00199 }
00200
00201 template <typename T, typename S>
00202 inline
00203 void
00204 sum<T,S>::set_value(const S& s)
00205 {
00206 s_ = s;
00207 }
00208
00209 template <typename T, typename S>
00210 inline
00211 bool
00212 sum<T,S>::is_valid() const
00213 {
00214 return true;
00215 }
00216
00217 # endif // ! MLN_INCLUDE_ONLY
00218
00219 }
00220
00221 }
00222
00223 }
00224
00225
00226 #endif // ! MLN_ACCU_MATH_SUM_HH