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_STAT_MEAN_HH
00027 # define MLN_ACCU_STAT_MEAN_HH
00028
00034
00035 # include <mln/accu/internal/base.hh>
00036 # include <mln/accu/math/count.hh>
00037 # include <mln/accu/math/sum.hh>
00038
00039
00040 namespace mln
00041 {
00042
00043 namespace accu
00044 {
00045
00046 namespace stat
00047 {
00048
00049
00050 template <typename T, typename S, typename M>
00051 struct mean;
00052
00053 }
00054
00055
00056
00057
00058 namespace meta
00059 {
00060
00061 namespace stat
00062 {
00063
00065 struct mean : public Meta_Accumulator< mean >
00066 {
00067 template < typename T,
00068 typename S = mln_sum(T),
00069 typename M = S >
00070 struct with
00071 {
00072 typedef accu::stat::mean<T,S,M> ret;
00073 };
00074 };
00075
00076 }
00077
00078 }
00079
00080 }
00081
00082
00083
00084
00085 namespace trait
00086 {
00087
00088 template <typename T, typename S, typename M>
00089 struct accumulator_< accu::stat::mean<T, S, M> >
00090 {
00091 typedef accumulator::has_untake::no has_untake;
00092 typedef accumulator::has_set_value::no has_set_value;
00093 typedef accumulator::has_stop::no has_stop;
00094 typedef accumulator::when_pix::use_v when_pix;
00095 };
00096
00097 }
00098
00099
00100 namespace accu
00101 {
00102
00103 namespace stat
00104 {
00105
00107
00116 template <typename T,
00117 typename S = mln_sum(T),
00118 typename M = S>
00119 struct mean : public mln::accu::internal::base< M , mean<T,S,M> >
00120 {
00121 typedef T argument;
00122 typedef M result;
00123
00124 mean();
00125
00128 void init();
00129 void take(const argument& t);
00130 void take(const mean<T,S,M>& other);
00132
00134 M to_result() const;
00135 operator M () const;
00136
00139 bool is_valid() const;
00140
00141 protected:
00142
00143 accu::math::count<T> count_;
00144 accu::math::sum<T,S> sum_;
00145 };
00146
00147
00148
00149 template <typename I, typename S, typename M>
00150 struct mean< util::pix<I>, S,M >;
00151
00152
00153 # ifndef MLN_INCLUDE_ONLY
00154
00155 template <typename T, typename S, typename M>
00156 inline
00157 mean<T,S,M>::mean()
00158 {
00159 init();
00160 }
00161
00162 template <typename T, typename S, typename M>
00163 inline
00164 void
00165 mean<T,S,M>::init()
00166 {
00167 count_.init();
00168 sum_.init();
00169 }
00170
00171 template <typename T, typename S, typename M>
00172 inline
00173 void mean<T,S,M>::take(const argument& t)
00174 {
00175 count_.take(t);
00176 sum_.take(t);
00177 }
00178
00179 template <typename T, typename S, typename M>
00180 inline
00181 void
00182 mean<T,S,M>::take(const mean<T,S,M>& other)
00183 {
00184 count_.take(other.count_);
00185 sum_.take(other.sum_);
00186 }
00187
00188 template <typename T, typename S, typename M>
00189 inline
00190 M
00191 mean<T,S,M>::to_result() const
00192 {
00193 unsigned n = count_.to_result();
00194 if (n == 0u)
00195 return M();
00196 return static_cast<M>(sum_.to_result() / n);
00197 }
00198
00199 template <typename T, typename S, typename M>
00200 inline
00201 mean<T,S,M>::operator M() const
00202 {
00203 return to_result();
00204 }
00205
00206 template <typename T, typename S, typename M>
00207 inline
00208 bool
00209 mean<T,S,M>::is_valid() const
00210 {
00211 return count_.to_result() != 0;
00212 }
00213
00214 # endif // ! MLN_INCLUDE_ONLY
00215
00216 }
00217
00218 }
00219
00220 }
00221
00222 #endif // ! MLN_ACCU_STAT_MEAN_HH