00001 #ifndef __J2K__Number_Macro_HPP__
00002 #define __J2K__Number_Macro_HPP__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #define MC_Number_Verify( cast, ZERO ) \
00015 inline void verify() { \
00016 if ( s != Valid ) return; \
00017 if ( temp > ZERO ) { status = Pos; } \
00018 if ( temp < ZERO ) { status = Neg; } \
00019 status = Zero; \
00020 } \
00021 \
00022 inline MathState verify( cast n ) { \
00023 if ( n > ZERO ) return Pos; \
00024 if ( n < ZERO ) return Neg; \
00025 return Zero; \
00026 } \
00027
00028
00029 #define MC_Number_Operators1( Number, cast ) \
00030 // Compare Operators: Part 1 \
00031 friend BOOL isEqualTo( const Number& l, const Number& r ) { \
00032 int temp = MathStateEqualTo[ (int)l.state ][ (int)r.state ]; \
00033 if ( temp < 2 ) return (BOOL)temp; \
00034 return ( l.value == r.value ); \
00035 } \
00036 \
00037 friend BOOL isLessThan( const Number& l, const Number& r ) { \
00038 int temp = MathStateLessThan[ (int)l.state ][ (int)r.state ]; \
00039 if ( temp < 2 ) return (BOOL)temp; \
00040 return (l.value < r.value); \
00041 } \
00042 \
00043 friend BOOL isBiggerThan( const Number& l, const Number& r ) { \
00044 int temp = MathStateBiggerThan[ (int)l.state ][ (int)r.state ]; \
00045 if ( temp < 2 ) return (BOOL)temp; \
00046 return (l.value > r.value); \
00047 } \
00048 \
00049 inline friend BOOL operator==( const Number& l, const Number& r ) { \
00050 return isEqualTo( l, r ); \
00051 } \
00052 \
00053 inline friend BOOL operator!=( const Number& l, const Number& r ) { \
00054 return !isEqualTo( l, r ); \
00055 } \
00056 \
00057 inline friend BOOL operator<( const Number& l, const Number& r ) { \
00058 return isLessThan( l, r ); \
00059 } \
00060 \
00061 inline friend BOOL operator<=( const Number& l, const Number& r ) { \
00062 return ( isLessThan( l, r ) || isEqualTo( l, r ) ); \
00063 } \
00064 \
00065 inline friend BOOL operator>( const Number& l, const Number& r ) { \
00066 return isBiggerThan( l, r ); \
00067 } \
00068 \
00069 inline friend BOOL operator>=( const Number& l, const Number& r ) { \
00070 return ( isBiggerThan( l, r ) || isEqualTo( l, r ) ); \
00071 } \
00072 \
00073 // Arithmetic Operators: Part 1 \
00074 friend Number add( const Number& l, const Number& r ) { \
00075 MathState s = MathStateAdd[ (int)l.state ][ (int)r.state ]; \
00076 return Number( l.value + r.value, s ); \
00077 } \
00078 \
00079 friend Number sub( const Number& l, const Number& r ) { \
00080 MathState s = MathStateSub[ (int)l.state ][ (int)r.state ]; \
00081 return Number( l.value - r.value, s ); \
00082 } \
00083 \
00084 friend Number mult( const Number& l, const Number& r ) { \
00085 MathState s = MathStateMult[ (int)l.state ][ (int)r.state ]; \
00086 return Number( l.value * r.value, s ); \
00087 } \
00088 \
00089 friend Number div( const Number& l, const Number& r ) { \
00090 MathState s = MathStateDiv[ (int)l.state ][ (int)r.state ]; \
00091 if ( s != Valid ) return Number( l.value, s ); \
00092 return Number( l.value / r.value, s ); \
00093 } \
00094 \
00095 inline friend Number operator+( const Number& l, const Number& r ) { \
00096 return add( l, r ); \
00097 } \
00098 \
00099 inline friend Number operator-( const Number& l, const Number& r ) { \
00100 return sub( l, r ); \
00101 } \
00102 \
00103 inline friend Number operator*( const Number& l, const Number& r ) { \
00104 return mult( l, r ); \
00105 } \
00106 \
00107 inline friend Number operator/( const Number& l, const Number& r ) { \
00108 return div( l, r ); \
00109 } \
00110 \
00111 // Other Operators: Part 1 \
00112 inline const Number &operator=(const Number& N ) { \
00113 value = N.value; \
00114 status = N.status; \
00115 return *this; \
00116 } \
00117 \
00118 inline Number operator!() { \
00119 return Number( !value, status ); \
00120 } \
00121 \
00122 inline Number operator-() { \
00123 if ( (int)status < 4 ) return Number( (-1) * value, Valid ); \
00124 return Number( (-1) * value, status ); \
00125 } \
00126 \
00127 // (int) means post-increment/decrement \
00128 inline Number operator--() { \
00129 --value; \
00130 return *this; \
00131 } \
00132 \
00133 inline Number operator--( int ) { \
00134 value--; \
00135 return *this; \
00136 } \
00137 \
00138 inline Number operator++() { \
00139 ++value; \
00140 return *this; \
00141 } \
00142 \
00143 inline Number operator++( int ) { \
00144 value++; \
00145 return *this; \
00146 } \
00147
00148
00149 #define MC_Number_Operators2( Number, cast, number ) \
00150 // Compare Operators: Part 3 \
00151 friend BOOL isEqualTo( const Number& l, const number& n ) { \
00152 cast v = (cast)n; \
00153 int temp = MathStateEqualTo[ (int)l.state ][ (int)verify(v) ]; \
00154 if ( temp < 2 ) return (BOOL)temp; \
00155 return ( l.value == v ); \
00156 } \
00157 \
00158 friend BOOL isLessThan( const Number& l, const number& n ) { \
00159 cast v = (cast)n; \
00160 int temp = MathStateLessThan[ (int)l.state ][ (int)verify(v) ]; \
00161 if ( temp < 2 ) return (BOOL)temp; \
00162 return ( l.value < v ); \
00163 } \
00164 \
00165 friend BOOL isBiggerThan( const Number& l, const number& n ) { \
00166 cast v = (cast)n; \
00167 int temp = MathStateBiggerThan[ (int)l.state ][ (int)verify(v) ]; \
00168 if ( temp < 2 ) return (BOOL)temp; \
00169 return (l.value > v ); \
00170 } \
00171 \
00172 inline friend BOOL operator==( const Number& l, const number n ) { \
00173 return isEqualTo( l, n ); \
00174 } \
00175 \
00176 inline friend BOOL operator!=( const Number& l, const number n ) { \
00177 return !isEqualTo( l, n ); \
00178 } \
00179 \
00180 inline friend BOOL operator<( const Number& l, const number n ) { \
00181 return isLessThan( l, n ); \
00182 } \
00183 \
00184 inline friend BOOL operator<=( const Number& l, const number n ) { \
00185 return ( isLessThan( l, n ) || isEqualTo( l, n ) ); \
00186 } \
00187 \
00188 inline friend BOOL operator>( const Number& l, const number n ) { \
00189 return isBiggerThan( l, n ); \
00190 } \
00191 \
00192 inline friend BOOL operator>=( const Number& l, const number n ) { \
00193 return ( isBiggerThan( l, n ) || isEqualTo( l, n ) ); \
00194 } \
00195 \
00196 inline friend BOOL operator==( const number n, const Number& r ) { \
00197 return isEqualTo( r, n ); \
00198 } \
00199 \
00200 inline friend BOOL operator!=( const number n, const Number& r ) { \
00201 return !isEqualTo( r, n ); \
00202 } \
00203 \
00204 inline friend BOOL operator<( const number n, const Number& r ) { \
00205 return isBiggerThan( r, n ); \
00206 } \
00207 \
00208 inline friend BOOL operator<=( const number n, const Number& r ) { \
00209 return ( isBiggerThan( r, n ) || isEqualTo( r, n ) ); \
00210 } \
00211 \
00212 inline friend BOOL operator>( const number n, const Number& r ) { \
00213 return isLessThan( r, n ); \
00214 } \
00215 \
00216 inline friend BOOL operator>=( const number n, const Number& r ) { \
00217 return ( isLessThan( r, n ) || isEqualTo( r, n ) ); \
00218 } \
00219 \
00220
00221 friend Number add( const Number& l, const number n ) { \
00222 cast v = (cast)n; \
00223 MathState s = MathStateAdd[ (int)l.state ][ (int)verify(v) ]; \
00224 return Number( l.value + v, s ); \
00225 } \
00226 \
00227 friend Number sub( const Number& l, const number n ) { \
00228 cast v = (cast)n; \
00229 MathState s = MathStateSub[ (int)l.state ][ (int)verify(v) ]; \
00230 return Number( l.value - v, s ); \
00231 } \
00232 \
00233 friend Number sub( const number n, const Number& r ) { \
00234 cast v = (cast)n; \
00235 MathState s = MathStateSub[ (int)verify(v) ][ (int)r.state ] \
00236 return Number( v - r.value, s ); \
00237 } \
00238 \
00239 friend Number mult( const Number& l, const number n ) { \
00240 cast v = (cast)n; \
00241 MathState s = MathStateMult[ (int)l.state ][ (int)verify(v) ]; \
00242 return Number( l.value * v, s ); \
00243 } \
00244 \
00245 friend Number div( const Number& l, const number n ) { \
00246 cast v = (cast)n; \
00247 MathState s = MathStateDiv[ (int)l.state ][ (int)verify(v) ]; \
00248 if ( s != Valid ) return Number( l.value, s ); \
00249 return Number( l.value / v, s ); \
00250 } \
00251 \
00252 friend Number div( const number n, const Number& r ) { \
00253 cast v = (cast)n; \
00254 MathState s = MathStateDiv[ (int)verify(v) ][ (int)r.state ]; \
00255 if ( s != Valid ) return Number( v, s ); \
00256 return Number( v / r.value, s ); \
00257 } \
00258 \
00259 inline friend Number operator+( number n, const Number& r ) { \
00260 return add( r, n ); \
00261 } \
00262 \
00263 inline friend Number operator-( number n, const Number& r ) { \
00264 return sub( n, r ); \
00265 } \
00266 \
00267 inline friend Number operator*( number n, const Number& r ) { \
00268 return mult( r, n ); \
00269 } \
00270 \
00271 inline friend Number operator/( number n, const Number& r ) { \
00272 return div( n, r ); \
00273 } \
00274 \
00275
00276 inline friend Number operator+( const Number& l, const number n ) { \
00277 return add( l, n ); \
00278 } \
00279 \
00280 inline friend Number operator-( const Number& l, const number n ) { \
00281 return sub( l, n ); \
00282 } \
00283 \
00284 inline friend Number operator*( const Number& l, const number n ) { \
00285 return mult( l, n ); \
00286 } \
00287 \
00288 inline friend Number operator/( const Number& l, const number n ) { \
00289 return div( l, n ); \
00290 } \
00291 \
00292
00293 inline const Number &operator=(number n) { \
00294 value = (cast)n; \
00295 status = verify( value ); \
00296 return *this; \
00297 } \
00298 \
00299 inline operator number() const { return (number)value; } \
00300
00301
00302
00303 #endif