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_MAX_HH
00027 # define MLN_ACCU_STAT_MAX_HH
00028
00032
00033 # include <mln/core/concept/meta_accumulator.hh>
00034 # include <mln/accu/internal/base.hh>
00035 # include <mln/trait/value_.hh>
00036 # include <mln/util/pix.hh>
00037
00038
00039 namespace mln
00040 {
00041
00042 namespace accu
00043 {
00044
00045 namespace stat
00046 {
00047
00048
00049 template <typename T>
00050 struct max;
00051
00052 }
00053
00054
00055 namespace meta
00056 {
00057
00058 namespace stat
00059 {
00060
00062 struct max : public Meta_Accumulator< max >
00063 {
00064 template <typename T>
00065 struct with
00066 {
00067 typedef accu::stat::max<T> ret;
00068 };
00069 };
00070
00071 }
00072
00073 }
00074
00075
00076 namespace stat
00077 {
00078
00084 template <typename T>
00085 struct max : public mln::accu::internal::base< const T& , max<T> >
00086 {
00087 typedef T argument;
00088
00089 max();
00090
00093 void init();
00094 void take_as_init_(const argument& t);
00095 void take(const argument& t);
00096 void take(const max<T>& other);
00098
00100 const T& to_result() const;
00101
00104 bool is_valid() const;
00105
00106 protected:
00107
00108 T t_;
00109 };
00110
00111
00112 template <typename I> struct max< util::pix<I> >;
00113
00114 # ifndef MLN_INCLUDE_ONLY
00115
00116 template <typename T>
00117 inline
00118 max<T>::max()
00119 {
00120 init();
00121 }
00122
00123 template <typename T>
00124 inline
00125 void
00126 max<T>::init()
00127 {
00128 t_ = mln_min(T);
00129 }
00130
00131 template <typename T>
00132 inline
00133 void
00134 max<T>::take_as_init_(const argument& t)
00135 {
00136 t_ = t;
00137 }
00138
00139 template <typename T>
00140 inline
00141 void
00142 max<T>::take(const argument& t)
00143 {
00144 if (t > t_)
00145 t_ = t;
00146 }
00147
00148 template <typename T>
00149 inline
00150 void
00151 max<T>::take(const max<T>& other)
00152 {
00153 if (other.t_ > t_)
00154 t_ = other.t_;
00155 }
00156
00157 template <typename T>
00158 inline
00159 const T&
00160 max<T>::to_result() const
00161 {
00162 return t_;
00163 }
00164
00165 template <typename T>
00166 inline
00167 bool
00168 max<T>::is_valid() const
00169 {
00170 return true;
00171 }
00172
00173 # endif // ! MLN_INCLUDE_ONLY
00174
00175 }
00176
00177 }
00178
00179 }
00180
00181
00182 #endif // ! MLN_ACCU_STAT_MAX_HH