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_MIN_HH
00027 # define MLN_ACCU_STAT_MIN_HH
00028
00032
00033 # include <mln/accu/internal/base.hh>
00034 # include <mln/core/concept/meta_accumulator.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 min;
00051
00052 }
00053
00054 namespace meta
00055 {
00056
00057 namespace stat
00058 {
00060
00061 struct min : public Meta_Accumulator< min >
00062 {
00063 template <typename T>
00064 struct with
00065 {
00066 typedef accu::stat::min<T> ret;
00067 };
00068 };
00069
00070 }
00071
00072 }
00073
00074
00075 namespace stat
00076 {
00077
00079
00084 template <typename T>
00085 struct min : public mln::accu::internal::base< const T&, min<T> >
00086 {
00087 typedef T argument;
00088
00089 min();
00090
00093 void init();
00094 void take_as_init_(const argument& t);
00095 void take(const argument& t);
00096 void take(const min<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 min< util::pix<I> >;
00113
00114
00115 # ifndef MLN_INCLUDE_ONLY
00116
00117 template <typename T>
00118 inline
00119 min<T>::min()
00120 {
00121 init();
00122 }
00123
00124 template <typename T>
00125 inline
00126 void
00127 min<T>::init()
00128 {
00129 t_ = mln_max(T);
00130 }
00131
00132 template <typename T>
00133 inline
00134 void min<T>::take_as_init_(const argument& t)
00135 {
00136 t_ = t;
00137 }
00138
00139 template <typename T>
00140 inline
00141 void min<T>::take(const argument& t)
00142 {
00143 if (t < t_)
00144 t_ = t;
00145 }
00146
00147 template <typename T>
00148 inline
00149 void
00150 min<T>::take(const min<T>& other)
00151 {
00152 if (other.t_ < t_)
00153 t_ = other.t_;
00154 }
00155
00156 template <typename T>
00157 inline
00158 const T&
00159 min<T>::to_result() const
00160 {
00161 return t_;
00162 }
00163
00164 template <typename T>
00165 inline
00166 bool
00167 min<T>::is_valid() const
00168 {
00169 return true;
00170 }
00171
00172 # endif // ! MLN_INCLUDE_ONLY
00173
00174 }
00175
00176 }
00177
00178 }
00179
00180
00181 #endif // ! MLN_ACCU_STAT_MIN_HH