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_VALUE_INT_U_SAT_HH
00027 # define MLN_VALUE_INT_U_SAT_HH
00028
00033
00034 # include <mln/metal/math/pow.hh>
00035 # include <mln/value/internal/value_like.hh>
00036 # include <mln/value/concept/integer.hh>
00037 # include <mln/value/internal/encoding.hh>
00038 # include <mln/value/int_u.hh>
00039 # include <mln/trait/value_.hh>
00040 # include <mln/debug/format.hh>
00041
00042
00043 namespace mln
00044 {
00045
00046 namespace value
00047 {
00048
00049 template <unsigned n> struct int_u_sat;
00050 }
00051
00052 namespace trait
00053 {
00054
00055 template <unsigned n>
00056 struct value_< mln::value::int_u_sat<n> >
00057 {
00058 enum {
00059 dim = 1,
00060 card = metal::math::pow_int<2, n>::value,
00061 nbits = n
00062 };
00063
00064
00065 static const mln::value::int_u_sat<n> min() { return 0; }
00066 static const mln::value::int_u_sat<n> max() { return card - 1; }
00067
00068 typedef trait::value::nature::integer nature;
00069 typedef trait::value::kind::data kind;
00070
00071 typedef mln_value_quant_from_(card) quant;
00072
00073 typedef unsigned comp;
00074
00075 typedef float sum;
00076 };
00077
00078 }
00079
00080
00081 namespace value
00082 {
00083
00084
00089 template <unsigned n>
00090 struct int_u_sat
00091 :
00092 public Integer< int_u_sat<n> >,
00093
00094 public internal::value_like_< int_u<n>,
00095 mln_enc(int_u<n>),
00096 unsigned,
00097 int_u_sat<n> >
00098 {
00100 int_u_sat();
00101
00103 int_u_sat(int i);
00104
00106 operator int() const;
00107
00109 int_u_sat<n>& operator=(int i);
00110
00112 static const int_u_sat<n> zero;
00113
00115 static const int_u_sat<n> one;
00116
00118 int_u_sat<n>& operator+=(int i);
00119
00121 int_u_sat<n>& operator-=(int i);
00122
00123 private:
00124 typedef mln_enc(int_u<n>) enc_;
00125 };
00126
00127
00128
00129
00130 template <> struct int_u_sat<0>;
00131 template <> struct int_u_sat<1>;
00132
00141 template <unsigned n>
00142 std::ostream& operator<<(std::ostream& ostr, const int_u_sat<n>& i);
00143
00144
00145 # ifndef MLN_INCLUDE_ONLY
00146
00147 template <unsigned n>
00148 inline
00149 int_u_sat<n>::int_u_sat()
00150 {
00151 }
00152
00153 template <unsigned n>
00154 inline
00155 int_u_sat<n>::int_u_sat(int i)
00156 {
00157 static const unsigned max_ = mln_max(int_u<n>);
00158 if (i < 0)
00159 this->v_ = 0;
00160
00161
00162 else if (static_cast<unsigned>(i) > max_)
00163 this->v_ = static_cast<enc_>(max_);
00164 else
00165 this->v_ = static_cast<enc_>(i);
00166 }
00167
00168 template <unsigned n>
00169 inline
00170 int_u_sat<n>::operator int() const
00171 {
00172 return this->v_;
00173 }
00174
00175 template <unsigned n>
00176 inline
00177 int_u_sat<n>&
00178 int_u_sat<n>::operator=(int i)
00179 {
00180 static const unsigned max_ = mln_max(int_u<n>);
00181 if (i < 0)
00182 this->v_ = 0;
00183
00184
00185 else if (static_cast<unsigned>(i) > max_)
00186 this->v_ = static_cast<enc_>(max_);
00187 else
00188 this->v_ = static_cast<enc_>(i);
00189 return *this;
00190 }
00191
00192 template <unsigned n>
00193 inline
00194 int_u_sat<n>&
00195 int_u_sat<n>::operator+=(int i)
00196 {
00197 int v = int(this->v_) + i;
00198 *this = v;
00199 return *this;
00200 }
00201
00202 template <unsigned n>
00203 inline
00204 int_u_sat<n>&
00205 int_u_sat<n>::operator-=(int i)
00206 {
00207 int v = int(this->v_) - i;
00208 *this = v;
00209 return *this;
00210 }
00211
00212 template <unsigned n>
00213 const int_u_sat<n> int_u_sat<n>::zero = 0;
00214
00215 template <unsigned n>
00216 const int_u_sat<n> int_u_sat<n>::one = 1;
00217
00218 template <unsigned n>
00219 inline
00220 std::ostream& operator<<(std::ostream& ostr, const int_u_sat<n>& i)
00221 {
00222 return ostr << debug::format(i.to_equiv());
00223 }
00224
00225 # endif // ! MLN_INCLUDE_ONLY
00226
00227 }
00228
00229 }
00230
00231
00232 #endif // ! MLN_VALUE_INT_U_SAT_HH