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
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00092 #ifndef infin_INCLUDED
00093 #define infin_INCLUDED "infin.h"
00094
00095 #ifdef _KEEP_RCS_ID
00096 static char *infin_rcs_id = infin_INCLUDED "$Revision$";
00097 #endif
00098
00099 #ifndef defs_INCLUDED
00100 #include "defs.h"
00101 #endif
00102 #ifndef errors_INCLUDED
00103 #include "errors.h"
00104 #endif
00105
00106 class INT32_INFIN {
00107 INT32 _val;
00108 enum {INFINITE = 2147483647,NEGINFINITE = -2147483647-1};
00109 public:
00110
00111 INT32_INFIN(const INT32 i) { _val = i; }
00112 INT32_INFIN() { _val = 0; }
00113 INT32_INFIN(const INT32_INFIN& i) { _val = i._val; }
00114 BOOL Is_Infinite() const { return(_val == INFINITE); }
00115 void Set_Infinite() { _val = INFINITE; }
00116 BOOL Is_Neg_Infinite() const { return(_val == NEGINFINITE); }
00117 void Set_Neg_Infinite() { _val = NEGINFINITE; }
00118 INT32 Value() { return _val; }
00119
00120 INT32_INFIN &operator =(const INT32_INFIN i) { _val = i._val; return(*this);}
00121 friend inline INT32_INFIN operator +(const INT32_INFIN ,const INT32_INFIN) ;
00122 inline INT32_INFIN operator -() const;
00123 friend inline INT32_INFIN operator -(const INT32_INFIN, const INT32_INFIN) ;
00124 friend inline INT32_INFIN operator *(const INT32_INFIN, const INT32_INFIN) ;
00125
00126 friend inline BOOL operator >(const INT32_INFIN, const INT32_INFIN) ;
00127 friend inline BOOL operator >=(const INT32_INFIN, const INT32_INFIN) ;
00128 friend inline BOOL operator <(const INT32_INFIN, const INT32_INFIN) ;
00129 friend inline BOOL operator <=(const INT32_INFIN, const INT32_INFIN) ;
00130 friend inline BOOL operator ==(const INT32_INFIN, const INT32_INFIN) ;
00131 friend inline BOOL operator !=(const INT32_INFIN, const INT32_INFIN) ;
00132
00133 void Print(FILE *fp) const {
00134 if (this->Is_Infinite()) {
00135 fprintf(fp," infinite ");
00136 } else if (this->Is_Neg_Infinite()) {
00137 fprintf(fp," -infinite ");
00138 } else {
00139 fprintf(fp," %d ",_val);
00140 }
00141 }
00142
00143 };
00144
00145
00146
00147 inline INT32_INFIN operator +(const INT32_INFIN a, const INT32_INFIN b)
00148 {
00149
00150 if (a.Is_Infinite() || b.Is_Infinite()) {
00151 return INT32_INFIN::INFINITE;
00152 } else if (a.Is_Neg_Infinite() || b.Is_Neg_Infinite()) {
00153 return INT32_INFIN::NEGINFINITE;
00154 } else {
00155 return(a._val+b._val);
00156 }
00157 }
00158
00159 inline INT32_INFIN INT32_INFIN::operator -() const
00160 {
00161
00162 if (this->Is_Infinite()) {
00163 return NEGINFINITE;
00164 } else if (this->Is_Neg_Infinite()) {
00165 return INFINITE;
00166 } else {
00167 return(-_val);
00168 }
00169 }
00170
00171 inline INT32_INFIN operator -(const INT32_INFIN a, const INT32_INFIN b)
00172 {
00173 return(a + -b);
00174 }
00175
00176 inline INT32_INFIN operator *(const INT32_INFIN a, const INT32_INFIN b)
00177 {
00178 INT64 prod = (INT64)a._val * (INT64)b._val;
00179 if (prod >= (INT64) INT32_INFIN::INFINITE) {
00180 return INT32_INFIN::INFINITE;
00181 } else if (prod <= (INT64) INT32_INFIN::NEGINFINITE) {
00182 return INT32_INFIN::NEGINFINITE;
00183 } else {
00184 return((INT32) prod);
00185 }
00186 }
00187
00188 inline BOOL operator >(const INT32_INFIN a, const INT32_INFIN b)
00189 {
00190 return(a._val > b._val);
00191 }
00192
00193 inline BOOL operator >=(const INT32_INFIN a, const INT32_INFIN b)
00194 {
00195 return(a._val >= b._val);
00196 }
00197
00198 inline BOOL operator <(const INT32_INFIN a, const INT32_INFIN b)
00199 {
00200 return(a._val < b._val);
00201 }
00202
00203 inline BOOL operator <=(const INT32_INFIN a, const INT32_INFIN b)
00204 {
00205 return(a._val <= b._val);
00206 }
00207
00208 inline BOOL operator ==(const INT32_INFIN a, const INT32_INFIN b)
00209 {
00210 return(a._val == b._val);
00211 }
00212
00213 inline BOOL operator !=(const INT32_INFIN a, const INT32_INFIN b)
00214 {
00215 return(a._val != b._val);
00216 }
00217
00218
00219 #endif
00220
00221
00222