FirteX-高性能全文索引和检索平台API Documentation |
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