FirteX-高性能全文索引和检索平台

API Documentation


首页 | 名字空间列表 | 类继承关系 | 组合类型列表 | $(BL\录(B | 文件列表 | 名字空间成员 | 组合类型成员 | 文件成员

Number.h

浏览该文件的文档。
00001 //
00002 // Copyright(C) 2005--2006 Institute of Computing Tech, Chinese Academy of Sciences. 
00003 // All rights reserved.
00004 // This file is part of FirteX (www.firtex.org)
00005 //
00006 // Use of the FirteX is subject to the terms of the software license set forth in 
00007 // the LICENSE file included with this software, and also available at
00008 // http://www.firtex.org/license.html
00009 //
00010 // Author       : 郭瑞杰(GuoRuijie)
00011 // Email        : ruijieguo@software.ict.ac.cn,ruijieguo@gmail.com
00012 // Created      : 2006/5/20
00013 //
00014 #ifndef _NUMBER_H
00015 #define _NUMBER_H
00016 
00017 #include <string>
00018 #include <sstream>
00019 using namespace std;
00020 
00021 namespace firtex
00022 {
00023         namespace utility
00024         {
00025                 enum NUMENUM
00026                 {
00027                         NT_EMPTY        = 0,
00028                         NT_NULL         = 1,
00029                         NT_BOOL         = 2,
00030                         NT_I1           = 3,
00031                         NT_UI1          = 4,
00032                         NT_I2           = 5,
00033                         NT_UI2          = 6,
00034                         NT_I4           = 7,
00035                         NT_UI4          = 8,
00036                         NT_I8           = 9,
00037                         NT_UI8          = 10,
00038 
00039                         NT_R4           = 11,
00040                         NT_R8           = 12,
00041                 };
00042 
00043                 typedef unsigned short number_type;
00044                 typedef struct _tagnumbervar
00045                 {
00046                         number_type nt;                         //Number Type
00047                         union
00048                         {
00049                                 bool            bval;
00050                                 int8_t          i8val;
00051                                 uint8_t         ui8val;
00052                                 int16_t         i16val;
00053                                 uint16_t        ui16val;
00054                                 int32_t         i32val;
00055                                 uint32_t        ui32val;
00056                                 int64_t         i64val;
00057                                 uint64_t        ui64val;
00058 
00059                                 float           fval;
00060                                 double          dbval;                          
00061                         }value;
00062                 }numbervar;
00063                 
00064                 #define NUMBER_DEFINE(n, value) namespace number { const number_type n = (number_type)(value); }
00065 
00066                 class CNumber : public _tagnumbervar
00067                 {
00068                 public:
00069                         CNumber();      
00070                         CNumber(bool bv);
00071                         CNumber(int8_t i8v);
00072                         CNumber(uint8_t ui8v);
00073                         CNumber(int16_t i16v);
00074                         CNumber(uint16_t ui16v);
00075                         CNumber(int32_t i32v);
00076                         CNumber(uint32_t ui32v);
00077                         CNumber(int64_t i64v);
00078                         CNumber(uint64_t ui64v);
00079                         CNumber(float f);
00080                         CNumber(double d);
00081                         CNumber(const numbervar& src);
00082                         CNumber(const CNumber& clone);
00083                         ~CNumber(void);
00084                 public:
00085                         tstring toString();
00086                 public:
00087                         static int32_t toInt32(const tchar* str);
00088                         static int64_t toInt64(const tchar* str);                       
00089                 public:
00090                         operator bool() const ;                            // Extracts a bool from a NT_BOOL
00091                         operator int8_t() const ;                          // Extracts a int8_t from a NT_I1
00092                         operator uint8_t() const ;                         // Extracts a uint8_t from a NT_UI1
00093                         operator int16_t() const ;                         // Extracts a int16_t from a NT_I2
00094                         operator uint16_t() const ;                        // Extracts a uint16_t from a NT_UI1
00095                         operator int32_t() const ;                         // Extracts a int32_t from a NT_I4
00096                         operator uint32_t() const ;                        // Extracts a uint32_t from a NT_UI4
00097                         operator int64_t() const ;                         // Extracts a int64_t from a NT_I8
00098                         operator uint64_t() const ;                        // Extracts a uint64_t from a NT_UI8
00099                         operator float() const ;                           // Extracts a float from a VT_R4
00100                         operator double() const ;                          // Extracts a double from a VT_R8            
00101 
00102                         CNumber& operator=(bool bSrc) ;                                         // Assign a VT_BOOL
00103                         CNumber& operator=(int8_t i8Src) ;                                      // Assign a VT_I1
00104                         CNumber& operator=(uint8_t ui8Src) ;                            // Assign a VT_UI1
00105                         CNumber& operator=(int16_t i8Src) ;                                     // Assign a VT_I2
00106                         CNumber& operator=(uint16_t ui16Src) ;                          // Assign a VT_UI2
00107                         CNumber& operator=(int32_t i32Src) ;                            // Assign a VT_I4
00108                         CNumber& operator=(uint32_t ui32Src) ;                          // Assign a VT_UI4
00109                         CNumber& operator=(int64_t i64Src) ;                            // Assign a VT_I8
00110                         CNumber& operator=(uint64_t ui64Src) ;                          // Assign a VT_UI8
00111                         CNumber& operator=(float fltSrc) ;                                      // Assign a VT_R4
00112                         CNumber& operator=(double dblSrc) ;                                     // Assign a VT_R8, or a VT_DATE                 
00113 
00114                         bool operator==(const numbervar& varSrc) const throw();
00115                         bool operator==(const numbervar* pSrc) const throw();
00116 
00117                         bool operator!=(const numbervar& varSrc) const throw();
00118                         bool operator!=(const numbervar* pSrc) const throw();
00119 
00120                         bool operator!=(const CNumber& pSrc) const throw();
00121                 };
00123                 //inline functions      
00124                 inline CNumber::CNumber()
00125                 {
00126                         nt = NT_EMPTY;
00127                 }
00128                 inline CNumber::CNumber(bool bv)
00129                 {
00130                         nt = NT_BOOL;
00131                         value.bval = bv;
00132                 }
00133                 inline CNumber::CNumber(int8_t i8v)
00134                 {
00135                         nt = NT_I1;
00136                         value.i8val = i8v;
00137                 }
00138                 inline CNumber::CNumber(uint8_t ui8v)
00139                 {
00140                         nt = NT_UI1;
00141                         value.ui8val = ui8v;
00142                 }
00143                 inline CNumber::CNumber(int16_t i16v)
00144                 {
00145                         nt = NT_I2;
00146                         value.i16val = i16v;
00147                 }
00148                 inline CNumber::CNumber(uint16_t ui16v)
00149                 {
00150                         nt = NT_UI2;
00151                         value.ui16val = ui16v;
00152                 }
00153                 inline CNumber::CNumber(int32_t i32v)
00154                 {
00155                         nt = NT_I4;
00156                         value.i32val = i32v;
00157                 }
00158                 inline CNumber::CNumber(uint32_t ui32v)
00159                 {
00160                         nt = NT_UI4;
00161                         value.ui32val = ui32v;
00162                 }
00163                 inline CNumber::CNumber(int64_t i64v)
00164                 {
00165                         nt = NT_I8;
00166                         value.i64val = i64v;
00167                 }
00168                 inline CNumber::CNumber(uint64_t ui64v)
00169                 {
00170                         nt = NT_UI8;
00171                         value.ui64val = ui64v;
00172                 }
00173                 inline CNumber::CNumber(float f)
00174                 {
00175                         nt = NT_R4;
00176                         value.fval = f;
00177                 }
00178                 inline CNumber::CNumber(double d)
00179                 {
00180                         nt = NT_R8;
00181                         value.dbval = d;
00182                 }
00183                 inline CNumber::CNumber(const numbervar& src)
00184                 {
00185                         nt = src.nt;
00186                         value = src.value;
00187                 }
00188                 inline CNumber::CNumber(const CNumber& clone)
00189                 {
00190                         nt = clone.nt;
00191                         value = clone.value;
00192                 }
00193                 inline CNumber::~CNumber(void){}
00194         
00195                 inline tstring CNumber::toString()
00196                 {                       
00197                         stringstream ss;
00198                         switch(nt)
00199                         {
00200                         case NT_BOOL:
00201                                 return (value.bval?_T("true"):_T("false"));
00202                                 break;
00203                         case NT_I1:
00204                                 ss << value.i8val;
00205                                 break;
00206                         case NT_UI1:
00207                                 ss << value.ui8val;                             
00208                                 break;
00209                         case NT_I2:
00210                                 ss << value.i16val;                             
00211                                 break;
00212                         case NT_UI2:
00213                                 ss << value.ui16val;                            
00214                                 break;
00215                         case NT_I4:
00216                                 ss << value.i32val;                             
00217                                 break;
00218                         case NT_UI4:
00219                                 ss << value.ui32val;                            
00220                                 break;
00221                         case NT_I8:
00222                                 ss << value.i64val;                             
00223                                 break;
00224                         case NT_UI8:
00225                                 ss << value.ui64val;                            
00226                                 break;
00227                         case NT_R4:
00228                                 ss << value.fval;                               
00229                                 break;
00230                         case NT_R8:
00231                                 ss << value.dbval;                              
00232                                 break;
00233                         }                       
00234                         return ss.str();
00235                 }       
00236 
00237                 inline CNumber::operator bool() const 
00238                 {
00239                         return value.bval;
00240                 }
00241                 inline CNumber::operator int8_t() const 
00242                 {
00243                         return value.i8val;
00244                 }
00245                 inline CNumber::operator uint8_t() const 
00246                 {
00247                         return value.ui8val;
00248                 }
00249                 inline CNumber::operator int16_t() const
00250                 {
00251                         return value.i16val;
00252                 }
00253                 inline CNumber::operator uint16_t() const
00254                 {
00255                         return value.ui16val;
00256                 }
00257                 inline CNumber::operator int32_t() const
00258                 {
00259                         return value.i32val;
00260                 }
00261                 inline CNumber::operator uint32_t() const
00262                 {
00263                         return value.ui32val;
00264                 }
00265                 inline CNumber::operator int64_t() const
00266                 {
00267                         return value.i64val;
00268                 }
00269                 inline CNumber::operator uint64_t() const
00270                 {
00271                         return value.ui64val;
00272                 }
00273                 inline CNumber::operator float() const
00274                 {
00275                         return value.fval;
00276                 }
00277                 inline CNumber::operator double() const
00278                 {
00279                         return value.dbval;
00280                 }
00281                 
00283 
00284                 inline CNumber& CNumber::operator=(bool bSrc)
00285                 {
00286                         nt = NT_BOOL;
00287                         value.bval = bSrc;
00288                         return *this;
00289                 }
00290                 inline CNumber& CNumber::operator=(int8_t i8Src)
00291                 {
00292                         nt = NT_I1;
00293                         value.i8val = i8Src;
00294                         return *this;
00295                 }
00296                 inline CNumber& CNumber::operator=(uint8_t ui8Src)
00297                 {
00298                         nt = NT_UI1;
00299                         value.ui8val;
00300                         return *this;
00301                 }
00302                 inline CNumber& CNumber::operator=(int16_t i8Src)
00303                 {
00304                         nt = NT_I2;
00305                         value.i16val;
00306                         return *this;
00307                 }
00308                 inline CNumber& CNumber::operator=(uint16_t ui16Src)
00309                 {
00310                         nt = NT_UI2;
00311                         value.ui16val = ui16Src;
00312                         return *this;
00313                 }
00314                 inline CNumber& CNumber::operator=(int32_t i32Src)
00315                 {
00316                         nt = NT_I4;
00317                         value.i32val = i32Src;
00318                         return *this;
00319                 }
00320                 inline CNumber& CNumber::operator=(uint32_t ui32Src)
00321                 {
00322                         nt = NT_UI4;
00323                         value.ui32val = ui32Src;
00324                         return *this;
00325                 }
00326                 inline CNumber& CNumber::operator=(int64_t i64Src)
00327                 {
00328                         nt = NT_I8;
00329                         value.i64val = i64Src;
00330                         return *this;
00331                 }
00332                 inline CNumber& CNumber::operator=(uint64_t ui64Src)
00333                 {
00334                         nt = NT_UI8;
00335                         value.ui64val = ui64Src;
00336                         return *this;
00337                 }
00338                 inline CNumber& CNumber::operator=(float fltSrc)
00339                 {
00340                         nt = NT_R4;
00341                         value.fval = fltSrc;
00342                         return *this;
00343                 }
00344                 inline CNumber& CNumber::operator=(double dblSrc)
00345                 {
00346                         nt = NT_R8;
00347                         value.dbval = dblSrc;
00348                         return *this;
00349                 }
00350 
00352 
00353                 inline bool CNumber::operator==(const numbervar& varSrc) const throw()
00354                 {
00355                          return *this == &varSrc;
00356                 }
00357                 inline bool CNumber::operator==(const numbervar* pSrc) const throw()
00358                 {
00359                         if(!pSrc)
00360                                 return false;
00361                         if(this == pSrc)
00362                                 return true;
00363                         if(nt != pSrc->nt)
00364                                 return false;
00365                         switch(nt)
00366                         {
00367                         case NT_BOOL:
00368                                 return (value.bval == pSrc->value.bval);
00369                                 break;
00370                         case NT_I1:
00371                                 return (value.i8val == pSrc->value.i8val);
00372                                 break;
00373                         case NT_UI1:
00374                                 return (value.ui8val == pSrc->value.ui8val);
00375                                 break;
00376                         case NT_I2:
00377                                 return (value.i16val == pSrc->value.i16val);
00378                                 break;
00379                         case NT_UI2:
00380                                 return (value.ui16val == pSrc->value.ui16val);
00381                                 break;
00382                         case NT_I4:
00383                                 return (value.i32val == pSrc->value.i32val);
00384                                 break;
00385                         case NT_UI4:
00386                                 return (value.ui32val == pSrc->value.ui32val);
00387                                 break;
00388                         case NT_I8:
00389                                 return (value.i64val == pSrc->value.i64val);
00390                                 break;
00391                         case NT_UI8:
00392                                 return (value.ui64val == pSrc->value.ui64val);
00393                                 break;
00394                         case NT_R4:
00395                                 return (value.fval == pSrc->value.fval);
00396                                 break;
00397                         case NT_R8:
00398                                 return (value.dbval == pSrc->value.dbval);
00399                                 break;
00400                         }
00401                         return true;
00402                 }
00403 
00404                 inline bool CNumber::operator!=(const numbervar& varSrc) const throw()
00405                 {
00406                         return !(this == &varSrc);
00407                 }
00408                 inline bool CNumber::operator!=(const numbervar* pSrc) const throw()
00409                 {
00410                         return !(*this == pSrc);
00411                 }               
00412 
00413                 inline int32_t CNumber::toInt32(const tchar* str)
00414                 {
00415                         try
00416                         {
00417                                 return (int32_t)_ttoi(str);
00418                         }
00419                         catch (...)
00420                         {               
00421                                 FIRTEX_THROW3(NUMBER_FORMAT_ERROR,_T("CNumber::toInt32"));
00422                         }
00423                 }
00424                 inline int64_t CNumber::toInt64(const tchar* str)
00425                 {
00426                         try
00427                         {
00428                                 return (int64_t)_ttoi64(str);
00429                         }
00430                         catch (...)
00431                         {               
00432                                 FIRTEX_THROW3(NUMBER_FORMAT_ERROR,_T("CNumber::toInt64"));
00433                         }
00434                 }
00435         }
00436 }
00437 
00438 #endif

http://www.firtex.org http://www.sourceforge.net/projects/firtex