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 #ifndef _terimber_numeric_h_
00029 #define _terimber_numeric_h_
00030
00031 #include "base/common.h"
00032 #include "base/number.h"
00033
00034 BEGIN_TERIMBER_NAMESPACE
00035 #pragma pack(4)
00036
00039 class numeric
00040 {
00041 public:
00043 numeric( byte_allocator* allocator_ = 0
00044 );
00046 ~numeric();
00048 explicit
00049 numeric( sb8_t x,
00050 byte_allocator* allocator_ = 0
00051 );
00053 explicit
00054 numeric( sb4_t x,
00055 byte_allocator* allocator_ = 0
00056 );
00058 explicit
00059 numeric( float x,
00060 byte_allocator* allocator_ = 0
00061 );
00063 explicit
00064 numeric( double x,
00065 byte_allocator* allocator_ = 0
00066 );
00068 explicit
00069 numeric( const char* x,
00070 size_t len,
00071 numeric_radix radix = RADIX10,
00072 byte_allocator* allocator_ = 0
00073 );
00075 explicit
00076 numeric( const char* x,
00077 size_t len,
00078 char delimeter,
00079 byte_allocator* allocator_ = 0
00080 );
00082 explicit
00083 numeric( const wchar_t* x,
00084 size_t len,
00085 wchar_t delimeter,
00086 byte_allocator* allocator_ = 0
00087 );
00089 numeric(const numeric& x);
00091 numeric& operator=(const numeric& x);
00093 numeric& operator++();
00095 numeric operator++(int);
00097 numeric& operator--();
00099 numeric operator--(int);
00101 numeric& operator+=(const numeric& x);
00103 numeric& operator-=(const numeric& x);
00105 numeric& operator*=(const numeric& x);
00107 numeric& operator/=(const numeric& x);
00109 numeric& operator%=(const numeric& x);
00111 bool operator==(const numeric& x);
00113 bool operator!=(const numeric& x);
00115 bool operator<(const numeric& x);
00117 bool operator<=(const numeric& x);
00119 bool operator>(const numeric& x);
00121 bool operator>=(const numeric& x);
00123 bool sign() const;
00125 size_t scale() const;
00127 bool is_zero() const;
00129 size_t precision() const;
00133 bool format(char* buf, char delimeter = '.') const;
00135 bool persist(ub1_t* buf, size_t size) const;
00137 bool parse(const ub1_t* buf);
00139 bool persist_orcl(ub1_t* buf) const;
00141 bool parse_orcl(const ub1_t* buf);
00143 bool persist_sql(ub1_t& sign, ub1_t* buf, ub1_t& precision, sb1_t& scale) const;
00145 bool parse_sql(ub1_t sign, const ub1_t* buf, ub1_t precision, sb1_t scale);
00147 size_t orcl_len() const;
00149 friend numeric operator+(const numeric& x, const numeric& y);
00151 friend numeric operator-(const numeric& x, const numeric& y);
00153 friend numeric operator*(const numeric& x, const numeric& y);
00155 friend numeric operator/(const numeric& x, const numeric& y);
00157 friend numeric operator%(const numeric& x, const numeric& y);
00159 static
00160 const numeric&
00161 zero();
00163 static
00164 const
00165 numeric&
00166 one();
00167
00169 static
00170 int
00171 compare_orcl( const ub1_t* x,
00172 const ub1_t* y
00173 );
00174
00175 private:
00177 static
00178 numeric&
00179 plus( numeric& res,
00180 const numeric& x,
00181 const numeric& y
00182 );
00184 static
00185 numeric&
00186 minus( numeric& res,
00187 const numeric& x,
00188 const numeric& y
00189 );
00191 static
00192 numeric&
00193 multiply( numeric& res,
00194 const numeric& x,
00195 const numeric& y
00196 );
00198 static
00199 numeric&
00200 divide( numeric& res,
00201 numeric& reminder,
00202 const numeric& dividend,
00203 const numeric& divider
00204 );
00206 static
00207 int
00208 compare( const numeric& x,
00209 const numeric& y
00210 );
00212 numeric( ub1_t x,
00213 size_t length,
00214 byte_allocator* allocator_ = 0
00215 );
00217 numeric( const ub1_t* x,
00218 size_t length,
00219 byte_allocator* allocator_ = 0
00220 );
00222 numeric&
00223 negative();
00225 numeric&
00226 cutjunk();
00228 numeric&
00229 round( size_t scale_
00230 );
00232 numeric&
00233 operator<<(int shift);
00235 numeric&
00236 operator>>(int shift);
00238 numeric&
00239 scan( const char *x,
00240 size_t len,
00241 char delimeter
00242 );
00244 numeric&
00245 scan( const wchar_t *x,
00246 size_t len,
00247 wchar_t delimeter
00248 );
00249 public:
00250 static const numeric_radix _radix;
00251
00252 private:
00253 room_array< ub1_t > _vec;
00254 size_t _scale;
00255 size_t _precision;
00256 bool _sign;
00257 };
00258
00260 numeric
00261 operator+( const numeric& x,
00262 const numeric& y
00263 );
00265 numeric
00266 operator-( const numeric& x,
00267 const numeric& y
00268 );
00270 numeric
00271 operator*( const numeric& x,
00272 const numeric& y
00273 );
00275 numeric
00276 operator/( const numeric& x,
00277 const numeric& y
00278 );
00280 numeric
00281 operator%( const numeric& x,
00282 const numeric& y
00283 );
00284
00285
00286 #pragma pack()
00287 END_TERIMBER_NAMESPACE
00288
00289 #endif // _terimber_numeric_h_
00290