Main Page   Packages   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Search  

C:/temp/src/j2k/Beta/Math/nb/MCNumber.hpp

Go to the documentation of this file.
00001 #ifndef __J2K__Number_Macro_HPP__
00002 #define __J2K__Number_Macro_HPP__
00003 
00004 // Missing += *= -=  /= <<= >>= &&= &= |= etc.
00005 
00006 // Too long to do it by hand, so let's do it with a Macro ! =)
00007 // e.g.  MC_Number_Operators1( Double, double )
00008 //       MC_Number_Operators2( Double, double, double  )
00009 //       MC_Number_Operators2( Double, double, int     )
00010 //       MC_Number_Operators2( Double, double, float   )
00011 //       MC_Number_Operators2( Double, double, long    )
00012 //       MC_Number_Verify( double, 0.0 )
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   // Arithmetic Operators: Part 2                                       \
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   // Arithmetic Operators: Part 3                                       \
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   // Other Operators: Part 2                                            \
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

Generated on Sun Oct 14 18:46:13 2001 for Standard J2K Library by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001