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_SIGN_HH
00027 # define MLN_VALUE_SIGN_HH
00028
00033 # include <mln/value/internal/integer.hh>
00034 # include <mln/trait/value_.hh>
00035 # include <mln/literal/zero.hh>
00036 # include <mln/literal/one.hh>
00037 # include <mln/debug/format.hh>
00038
00039 namespace mln
00040 {
00041
00042 namespace value
00043 {
00049 class sign : public internal::Integer<sign>
00050 {
00051 public:
00053
00055 typedef int enc;
00056
00058 typedef int equiv;
00059
00060
00062 sign();
00063
00065 sign(int i);
00066
00068 sign(const mln::literal::zero_t&);
00069 sign& operator=(const mln::literal::zero_t&);
00070 sign(const mln::literal::one_t&);
00071 sign& operator=(const mln::literal::one_t&);
00073
00075 operator int() const;
00076
00078 int val_() const;
00079
00081 sign& operator=(int i);
00082
00083
00085 static const sign zero;
00086
00088 static const sign one;
00089
00090 protected:
00091
00093 int v_;
00094 };
00095
00103 std::ostream& operator<<(std::ostream& ostr, const sign& i);
00104
00106 bool operator==(const sign& lhs, const sign& rhs);
00107 bool operator<(const sign& lhs, const sign& rhs);
00108
00109 # ifndef MLN_INCLUDE_ONLY
00110
00111 inline
00112 sign::sign()
00113 {
00114 }
00115
00116 inline
00117 sign::operator int() const
00118 {
00119 return this->v_;
00120 }
00121
00122 inline
00123 int
00124 sign::val_() const
00125 {
00126 return this->v_;
00127 }
00128
00129 inline
00130 sign::sign(int i)
00131 {
00132 mln_precondition(i >= -1);
00133 mln_precondition(i <= 1);
00134 this->v_ = i;
00135 }
00136
00137 inline
00138 sign&
00139 sign::operator=(int i)
00140 {
00141 mln_precondition(i >= -1);
00142 mln_precondition(i <= 1);
00143 this->v_ = i;
00144 return *this;
00145 }
00146
00147 inline
00148 sign::sign(const mln::literal::zero_t&)
00149 {
00150 this->v_ = 0;
00151 }
00152
00153 inline
00154 sign&
00155 sign::operator=(const mln::literal::zero_t&)
00156 {
00157 this->v_ = 0;
00158 return *this;
00159 }
00160
00161 inline
00162 sign::sign(const mln::literal::one_t&)
00163 {
00164 this->v_ = 1;
00165 }
00166
00167 inline
00168 sign&
00169 sign::operator=(const mln::literal::one_t&)
00170 {
00171 this->v_ = 1;
00172 return *this;
00173 }
00174
00175 const sign sign::zero = 0;
00176
00177 const sign sign::one = 1;
00178
00179 inline
00180 std::ostream& operator<<(std::ostream& ostr, const sign& i)
00181 {
00182 return ostr << debug::format(i.val_());
00183 }
00184
00185 inline
00186 bool operator==(const sign& lhs, const sign& rhs)
00187 {
00188 return lhs.val_() == rhs.val_();
00189 }
00190
00191 inline
00192 bool operator<(const sign& lhs, const sign& rhs)
00193 {
00194 return lhs.val_() == rhs.val_();
00195 }
00196
00197 # endif // ! MLN_INCLUDE_ONLY
00198
00199 }
00200
00201 namespace trait
00202 {
00203
00204 template <>
00205 struct value_<mln::value::sign>
00206 {
00207
00208 enum {
00209 dim = 1,
00210 nbits = 2,
00211 card = 3
00212 };
00213
00214 typedef trait::value::nature::integer nature;
00215 typedef trait::value::kind::gray kind;
00216 typedef trait::value::quant::low quant;
00217
00218 static mln::value::sign min() { return -1; }
00219 static mln::value::sign max() { return 1; }
00220 static mln::value::sign epsilon() { return 0; }
00221
00222 typedef int comp;
00223
00224 typedef int sum;
00225 };
00226
00227 }
00228
00229 }
00230
00231
00232 #endif // ! MLN_VALUE_SIGN_HH