SNAP Library 2.0, Developer Reference
2013-05-13 16:33:57
SNAP, a general purpose, high performance system for analysis and manipulation of large networks
|
00001 #include "bd.h" 00002 00004 // Forward 00005 class TILx; 00006 class TOLx; 00007 ClassHdTP(TXmlTok, PXmlTok); 00008 00010 // Random 00011 class TRnd{ 00012 public: 00013 static const int RndSeed; 00014 private: 00015 static const int a, m, q, r; 00016 int Seed; 00017 int GetNextSeed(){ 00018 if ((Seed=a*(Seed%q)-r*(Seed/q))>0){return Seed;} else {return Seed+=m;}} 00019 public: 00020 TRnd(const int& _Seed=1, const int& Steps=0){ 00021 PutSeed(_Seed); Move(Steps);} 00022 explicit TRnd(TSIn& SIn){SIn.Load(Seed);} 00023 void Save(TSOut& SOut) const {SOut.Save(Seed);} 00024 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm); 00025 void SaveXml(TSOut& SOut, const TStr& Nm) const; 00026 00027 TRnd& operator=(const TRnd& Rnd){Seed=Rnd.Seed; return *this;} 00028 bool operator==(const TRnd&) const {Fail; return false;} 00029 00030 double GetUniDev(){return GetNextSeed()/double(m);} 00031 int GetUniDevInt(const int& Range=0); 00032 int GetUniDevInt(const int& MnVal, const int& MxVal){ 00033 IAssert(MnVal<=MxVal); return MnVal+GetUniDevInt(MxVal-MnVal+1);} 00034 uint GetUniDevUInt(const uint& Range=0); 00035 int64 GetUniDevInt64(const int64& Range=0); 00036 uint64 GetUniDevUInt64(const uint64& Range=0); 00037 double GetNrmDev(); 00038 double GetNrmDev( 00039 const double& Mean, const double& SDev, const double& Mn, const double& Mx); 00040 double GetExpDev(); 00041 double GetExpDev(const double& Lambda); // mean=1/lambda 00042 double GetGammaDev(const int& Order); 00043 double GetPoissonDev(const double& Mean); 00044 double GetBinomialDev(const double& Prb, const int& Trials); 00045 int GetGeoDev(const double& Prb){ 00046 return 1+(int)floor(log(1.0-GetUniDev())/log(1.0-Prb));} 00047 double GetPowerDev(const double& AlphaSlope){ // power-law degree distribution (AlphaSlope>0) 00048 IAssert(AlphaSlope>1.0); 00049 return pow(1.0-GetUniDev(), -1.0/(AlphaSlope-1.0));} 00050 double GetRayleigh(const double& Sigma) { // 1/sqrt(alpha) = sigma 00051 IAssert(Sigma>0.0); 00052 return Sigma*sqrt(-2*log(1-GetUniDev()));} 00053 double GetWeibull(const double& K, const double& Lambda) { // 1/alpha = lambda 00054 IAssert(Lambda>0.0 && K>0.0); 00055 return Lambda*pow(-log(1-GetUniDev()), 1.0/K);} 00056 //void GetSphereDev(const int& Dim, TFltV& ValV); 00057 00058 void PutSeed(const int& _Seed); 00059 int GetSeed() const {return Seed;} 00060 void Randomize(){PutSeed(RndSeed);} 00061 void Move(const int& Steps); 00062 bool Check(); 00063 00064 static double GetUniDevStep(const int& Seed, const int& Steps){ 00065 TRnd Rnd(Seed); Rnd.Move(Steps); return Rnd.GetUniDev();} 00066 static double GetNrmDevStep(const int& Seed, const int& Steps){ 00067 TRnd Rnd(Seed); Rnd.Move(Steps); return Rnd.GetNrmDev();} 00068 static double GetExpDevStep(const int& Seed, const int& Steps){ 00069 TRnd Rnd(Seed); Rnd.Move(Steps); return Rnd.GetExpDev();} 00070 00071 static TRnd LoadTxt(TILx& Lx); 00072 void SaveTxt(TOLx& Lx) const; 00073 }; 00074 00076 // Memory 00077 ClassTP(TMem, PMem)//{ 00078 private: 00079 int MxBfL, BfL; 00080 char* Bf; 00081 void Resize(const int& _MxBfL); 00082 bool DoFitLen(const int& LBfL) const {return BfL+LBfL<=MxBfL;} 00083 public: 00084 TMem(const int& _MxBfL=0): 00085 MxBfL(_MxBfL), BfL(0), Bf(NULL){ IAssert(BfL>=0); 00086 if (MxBfL>0){Bf=new char[MxBfL]; IAssert(Bf!=NULL);}} 00087 static PMem New(const int& MxBfL=0){return new TMem(MxBfL);} 00088 TMem(const void* _Bf, const int& _BfL): 00089 MxBfL(_BfL), BfL(_BfL), Bf(NULL){ IAssert(BfL>=0); 00090 if (BfL>0){Bf=new char[BfL]; IAssert(Bf!=NULL); memcpy(Bf, _Bf, BfL);}} 00091 static PMem New(const void* Bf, const int& BfL){return new TMem(Bf, BfL);} 00092 TMem(const TMem& Mem): 00093 MxBfL(Mem.MxBfL), BfL(Mem.BfL), Bf(NULL){ 00094 if (MxBfL>0){Bf=new char[MxBfL]; memcpy(Bf, Mem.Bf, BfL);}} 00095 static PMem New(const TMem& Mem){return new TMem(Mem);} 00096 static PMem New(const PMem& Mem){return new TMem(*Mem);} 00097 TMem(const TStr& Str); 00098 static PMem New(const TStr& Str){return new TMem(Str);} 00099 ~TMem(){if (Bf!=NULL){delete[] Bf;}} 00100 explicit TMem(TSIn& SIn){ 00101 SIn.Load(MxBfL); SIn.Load(BfL); 00102 Bf=new char[MxBfL=BfL]; SIn.LoadBf(Bf, BfL);} 00103 void Save(TSOut& SOut) const { 00104 SOut.Save(MxBfL); SOut.Save(BfL); SOut.SaveBf(Bf, BfL);} 00105 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm); 00106 void SaveXml(TSOut& SOut, const TStr& Nm) const; 00107 00108 TMem& operator=(const TMem& Mem){ 00109 if (this!=&Mem){ 00110 if (Bf!=NULL){delete[] Bf;} 00111 MxBfL=Mem.MxBfL; BfL=Mem.BfL; Bf=NULL; 00112 if (MxBfL>0){Bf=new char[MxBfL]; memcpy(Bf, Mem.Bf, BfL);}} 00113 return *this;} 00114 char* operator()() const {return Bf;} 00115 TMem& operator+=(const char& Ch); 00116 TMem& operator+=(const TMem& Mem); 00117 TMem& operator+=(const TStr& Str); 00118 TMem& operator+=(const PSIn& SIn); 00119 char& operator[](const int& ChN) const { 00120 Assert((0<=ChN)&&(ChN<BfL)); return Bf[ChN];} 00121 int GetMemUsed() const {return int(2*sizeof(int)+sizeof(char*)+MxBfL);} 00122 00123 void Gen(const int& _BfL){ 00124 Clr(); Resize(_BfL); BfL=_BfL;} 00125 void GenZeros(const int& _BfL){ 00126 Clr(false); Resize(_BfL); BfL=_BfL; 00127 if (BfL > 0) memset(Bf, 0, BfL);} 00128 void Reserve(const int& _MxBfL, const bool& DoClr = true){ 00129 if (DoClr){ Clr(); } Resize(_MxBfL);} 00130 void Del(const int& BChN, const int& EChN); 00131 void Clr(const bool& DoDel=true){ 00132 if (DoDel){if (Bf!=NULL){delete[] Bf;} MxBfL=0; BfL=0; Bf=NULL;} 00133 else {BfL=0;}} 00134 int Len() const {return BfL;} 00135 bool Empty() const {return BfL==0;} 00136 void Trunc(const int& _BfL){ 00137 if ((0<=_BfL)&&(_BfL<=BfL)){BfL=_BfL;}} 00138 void Push(const char& Ch){operator+=(Ch);} 00139 char Pop(){IAssert(BfL>0); BfL--; return Bf[BfL];} 00140 00141 bool DoFitStr(const TStr& Str) const; 00142 //int AddStr(const TStr& Str); 00143 void AddBf(const void* Bf, const int& BfL); 00144 char* GetBf() const {return Bf;} 00145 TStr GetAsStr(const char& NewNullCh='\0') const; 00146 PSIn GetSIn() const { 00147 TMOut MOut(BfL); MOut.SaveBf(Bf, BfL); return MOut.GetSIn();} 00148 00149 static void LoadMem(const PSIn& SIn, TMem& Mem){ 00150 Mem.Clr(); Mem.Gen(SIn->Len()); SIn->GetBf(Mem.Bf, SIn->Len());} 00151 static void LoadMem(const PSIn& SIn, const PMem& Mem){ 00152 Mem->Clr(); Mem->Gen(SIn->Len()); SIn->GetBf(Mem->Bf, SIn->Len());} 00153 void SaveMem(const PSOut& SOut) const {SOut->SaveBf(Bf, Len());} 00154 }; 00155 00157 // Input-Memory 00158 class TMemIn: public TSIn{ 00159 private: 00160 PMem Mem; 00161 const char* Bf; 00162 int BfC, BfL; 00163 public: 00164 TMemIn(const TMem& _Mem, const int& _BfC=0); 00165 static PSIn New(const TMem& Mem){ 00166 return PSIn(new TMemIn(Mem));} 00167 static PSIn New(const PMem& Mem){ 00168 TMemIn* MemIn=new TMemIn(*Mem); MemIn->Mem=Mem; return PSIn(MemIn);} 00169 ~TMemIn(){} 00170 00171 bool Eof(){return BfC==BfL;} 00172 int Len() const {return BfL-BfC;} 00173 char GetCh(){Assert(BfC<BfL); return Bf[BfC++];} 00174 char PeekCh(){Assert(BfC<BfL); return Bf[BfC];} 00175 int GetBf(const void* LBf, const TSize& LBfL); 00176 void Reset(){Cs=TCs(); BfC=0;} 00177 bool GetNextLnBf(TChA& LnChA); 00178 }; 00179 00181 // Output-Memory 00182 class TMemOut: public TSOut{ 00183 private: 00184 PMem Mem; 00185 private: 00186 void FlushBf(); 00187 public: 00188 TMemOut(const PMem& _Mem); 00189 static PSOut New(const PMem& Mem){ 00190 return new TMemOut(Mem);} 00191 ~TMemOut(){} 00192 00193 int PutCh(const char& Ch){ 00194 Mem->operator+=(Ch); return Ch;} 00195 int PutBf(const void* LBf, const TSize& LBfL); 00196 void Flush(){} 00197 }; 00198 00200 // Char-Array 00201 class TChA{ 00202 private: 00203 int MxBfL, BfL; 00204 char* Bf; 00205 void Resize(const int& _MxBfL); 00206 public: 00207 explicit TChA(const int& _MxBfL=256){ 00208 Bf=new char[(MxBfL=_MxBfL)+1]; Bf[BfL=0]=0;} 00209 TChA(const char* CStr){ 00210 Bf=new char[(MxBfL=BfL=int(strlen(CStr)))+1]; strcpy(Bf, CStr);} 00211 TChA(const char* CStr, const int& StrLen) : MxBfL(StrLen), BfL(StrLen) { 00212 Bf=new char[StrLen+1]; strncpy(Bf, CStr, StrLen); Bf[StrLen]=0;} 00213 TChA(const TChA& ChA){ 00214 Bf=new char[(MxBfL=ChA.MxBfL)+1]; BfL=ChA.BfL; strcpy(Bf, ChA.CStr());} 00215 TChA(const TStr& Str); 00216 TChA(const TMem& Mem){ 00217 Bf=new char[(MxBfL=BfL=Mem.Len())+1]; Bf[MxBfL]=0; 00218 memcpy(CStr(), Mem(), Mem.Len());} 00219 ~TChA(){delete[] Bf;} 00220 explicit TChA(TSIn& SIn){ 00221 SIn.Load(MxBfL); SIn.Load(BfL); SIn.Load(Bf, MxBfL, BfL);} 00222 void Load(TSIn& SIn){ delete[] Bf; 00223 SIn.Load(MxBfL); SIn.Load(BfL); SIn.Load(Bf, MxBfL, BfL);} 00224 void Save(TSOut& SOut, const bool& SaveCompact=true) const { //J: 00225 SOut.Save(SaveCompact?BfL:MxBfL); SOut.Save(BfL); SOut.Save(Bf, BfL);} 00226 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm); 00227 void SaveXml(TSOut& SOut, const TStr& Nm) const; 00228 00229 TChA& operator=(const TChA& ChA); 00230 TChA& operator=(const TStr& Str); 00231 TChA& operator=(const char* CStr); 00232 bool operator==(const TChA& ChA) const {return strcmp(CStr(), ChA.CStr())==0;} 00233 bool operator==(const char* _CStr) const {return strcmp(CStr(), _CStr)==0;} 00234 bool operator==(const char& Ch) const {return (BfL==1)&&(Bf[0]==Ch);} 00235 bool operator!=(const TChA& ChA) const {return strcmp(CStr(), ChA.CStr())!=0;} 00236 bool operator!=(const char* _CStr) const {return strcmp(CStr(), _CStr)!=0;} 00237 bool operator!=(const char& Ch) const {return !((BfL==1)&&(Bf[0]==Ch));} 00238 bool operator<(const TChA& ChA) const {return strcmp(CStr(), ChA.CStr())<0;} 00239 00240 TChA& operator+=(const TMem& Mem); 00241 TChA& operator+=(const TChA& ChA); 00242 TChA& operator+=(const TStr& Str); 00243 TChA& operator+=(const char* CStr); 00244 TChA& operator+=(const char& Ch){ 00245 if (BfL==MxBfL){Resize(BfL+1);} 00246 Bf[BfL]=Ch; BfL++; Bf[BfL]=0; return *this;} 00247 char operator[](const int& ChN) const { 00248 Assert((0<=ChN)&&(ChN<BfL)); return Bf[ChN];} 00249 char& operator[](const int& ChN){ 00250 Assert((0<=ChN)&&(ChN<BfL)); return Bf[ChN];} 00251 int GetMemUsed() const {return int(2*sizeof(int)+sizeof(char*)+sizeof(char)*MxBfL);} 00252 00253 char* operator ()(){return Bf;} 00254 const char* operator ()() const {return Bf;} 00255 char* CStr() {return Bf;} 00256 const char* CStr() const {return Bf;} 00257 00258 void Clr(){Bf[BfL=0]=0;} 00259 int Len() const {return BfL;} 00260 bool Empty() const {return BfL==0;} 00261 void Ins(const int& BChN, const char* CStr); 00262 void Del(const int& ChN); 00263 void DelLastCh(){Pop();} 00264 void Push(const char& Ch){operator+=(Ch);} 00265 char Pop(){IAssert(BfL>0); BfL--; char Ch=Bf[BfL]; Bf[BfL]=0; return Ch;} 00266 void Trunc(); 00267 void Trunc(const int& _BfL){ 00268 if ((0<=_BfL)&&(_BfL<=BfL)){Bf[BfL=_BfL]=0;}} 00269 void Reverse(); 00270 00271 void AddCh(const char& Ch, const int& MxLen=-1){ 00272 if ((MxLen==-1)||(BfL<MxLen)){operator+=(Ch);}} 00273 void AddChTo(const char& Ch, const int& ToChN){ 00274 while (Len()<ToChN){AddCh(Ch);}} 00275 void AddBf(char *NewBf, const int& BfS){ 00276 if ((BfL+BfS+1)>MxBfL){Resize(BfL+BfS+1);} 00277 strncpy(Bf+BfL,NewBf,BfS); BfL+=BfS; Bf[BfL]=0;} 00278 void PutCh(const int& ChN, const char& Ch){ 00279 Assert((0<=ChN)&&(ChN<BfL)); Bf[ChN]=Ch;} 00280 char GetCh(const int& ChN) const {return operator[](ChN);} 00281 char LastCh() const { Assert(1<=BfL); return Bf[BfL-1]; } 00282 char LastLastCh() const { Assert(2<=BfL); return Bf[BfL-2]; } 00283 00284 TChA GetSubStr(const int& BChN, const int& EChN) const; 00285 00286 int CountCh(const char& Ch, const int& BChN=0) const; 00287 int SearchCh(const char& Ch, const int& BChN=0) const; 00288 int SearchChBack(const char& Ch, int BChN=-1) const; 00289 int SearchStr(const TChA& Str, const int& BChN=0) const; 00290 int SearchStr(const TStr& Str, const int& BChN=0) const; 00291 int SearchStr(const char* CStr, const int& BChN=0) const; 00292 bool IsStrIn(const TStr& Str) const {return SearchStr(Str)!=-1;} 00293 bool IsPrefix(const char* CStr, const int& BChN=0) const; 00294 bool IsPrefix(const TStr& Str) const; 00295 bool IsPrefix(const TChA& Str) const; 00296 bool IsSuffix(const char* CStr) const; 00297 bool IsSuffix(const TStr& Str) const; 00298 bool IsSuffix(const TChA& Str) const; 00299 00300 bool IsChIn(const char& Ch) const {return SearchCh(Ch)!=-1;} 00301 void ChangeCh(const char& SrcCh, const char& DstCh); 00302 TChA& ToUc(); 00303 TChA& ToLc(); 00304 TChA& ToTrunc(); 00305 void CompressWs(); 00306 void Swap(const int& ChN1, const int& ChN2); 00307 void Swap(TChA& ChA); 00308 00309 int GetPrimHashCd() const; 00310 int GetSecHashCd() const; 00311 00312 static void LoadTxt(const PSIn& SIn, TChA& ChA); 00313 void SaveTxt(const PSOut& SOut) const; 00314 00315 //friend TChA operator+(const TChA& LStr, const TChA& RStr); 00316 //friend TChA operator+(const TChA& LStr, const TStr& RStr); 00317 //friend TChA operator+(const TChA& LStr, const char* RCStr); 00318 }; 00319 00321 // Input-Char-Array 00322 class TChAIn: public TSIn{ 00323 private: 00324 const char* Bf; 00325 int BfC, BfL; 00326 private: 00327 TChAIn(); 00328 TChAIn(const TChAIn&); 00329 TChAIn& operator=(const TChAIn&); 00330 public: 00331 TChAIn(const TChA& ChA, const int& _BfC=0); 00332 static PSIn New(const TChA& ChA){return PSIn(new TChAIn(ChA));} 00333 ~TChAIn(){} 00334 00335 bool Eof(){return BfC==BfL;} 00336 int Len() const {return BfL-BfC;} 00337 char GetCh(){Assert(BfC<BfL); return Bf[BfC++];} 00338 char PeekCh(){Assert(BfC<BfL); return Bf[BfC];} 00339 int GetBf(const void* LBf, const TSize& LBfL); 00340 void Reset(){Cs=TCs(); BfC=0;} 00341 bool GetNextLnBf(TChA& LnChA); 00342 }; 00343 00345 // Ref-String 00346 class TRStr{ 00347 public: 00348 char* Bf; 00349 int Refs; 00350 public: 00351 TRStr(){Refs=1; Bf=new char[0+1]; Bf[0]=0;} 00352 TRStr(const int& Len){ 00353 IAssert(Len>=0); Refs=0; Bf=new char[Len+1]; Bf[Len]=0;} 00354 TRStr(const char* CStr){ 00355 Refs=0; Bf=new char[strlen(CStr)+1]; strcpy(Bf, CStr);} 00356 TRStr(const char* CStr, const int& MxLen){ 00357 Refs=0; Bf=new char[MxLen+1]; strncpy(Bf, CStr, MxLen); Bf[MxLen]=0;} 00358 TRStr(const char* CStr1, const char* CStr2){ 00359 Refs=0; int CStr1Len=int(strlen(CStr1)); Bf=new char[CStr1Len+int(strlen(CStr2))+1]; 00360 strcpy(Bf, CStr1); strcpy(Bf+CStr1Len, CStr2);} 00361 TRStr(const char& Ch){ 00362 Refs=0; Bf=new char[1+1]; Bf[0]=Ch; Bf[1]=0;} 00363 TRStr(const char& Ch1, const char& Ch2){ 00364 Refs=0; Bf=new char[2+1]; Bf[0]=Ch1; Bf[1]=Ch2; Bf[2]=0;} 00365 ~TRStr(){ 00366 Assert(((this!=GetNullRStr())&&(Refs==0))||((this==GetNullRStr())&&(Refs==1))); 00367 delete[] Bf;} 00368 explicit TRStr(TSIn& SIn, const bool& IsSmall){ 00369 if (IsSmall){Refs=0; SIn.Load(Bf);} 00370 else {Refs=0; int BfL; SIn.Load(BfL); SIn.Load(Bf, BfL, BfL);}} 00371 void Save(TSOut& SOut, const bool& IsSmall) const { 00372 if (IsSmall){SOut.Save(Bf);} 00373 else {int BfL=int(strlen(Bf)); SOut.Save(BfL); SOut.Save(Bf, BfL);}} 00374 00375 TRStr& operator=(const TRStr&){Fail; return *this;} 00376 int GetMemUsed() const {return int(sizeof(int))+int(strlen(Bf));} 00377 00378 void MkRef(){Refs++;} 00379 void UnRef(){Assert(Refs>0); if (--Refs==0){delete this;}} 00380 00381 const char* CStr() const {return Bf;} 00382 char* CStr() {return Bf;} 00383 bool Empty() const {return Bf[0]==0;} 00384 int Len() const {return int(strlen(Bf));} 00385 00386 void PutCh(const int& ChN, const char& Ch){ 00387 Assert((0<=ChN)&&(ChN<Len())); Bf[ChN]=Ch;} 00388 char GetCh(const int& ChN) const { 00389 Assert((0<=ChN)&&(ChN<Len())); return Bf[ChN];} 00390 00391 bool IsUc() const; 00392 void ToUc(); 00393 bool IsLc() const; 00394 void ToLc(); 00395 void ToCap(); 00396 void ConvUsFromYuAscii(); 00397 static int CmpI(const char* CStr1, const char* CStr2); 00398 00399 int GetPrimHashCd() const; 00400 int GetSecHashCd() const; 00401 00402 static TRStr* GetNullRStr(){ 00403 static TRStr NullRStr; Assert(NullRStr.Bf!=NULL); return &NullRStr;} 00404 }; 00405 00407 // String 00408 class TStr; 00409 template <class TVal, class TSizeTy> class TVec; 00410 typedef TVec<TStr, int> TStrV; 00411 00412 class TStr{ 00413 private: 00414 TRStr* RStr; 00415 private: 00416 TStr(const char& Ch, bool){ 00417 RStr=new TRStr(Ch); RStr->MkRef();} 00418 TStr(const char& Ch1, const char& Ch2, bool){ 00419 RStr=new TRStr(Ch1, Ch2); RStr->MkRef();} 00420 static TRStr* GetRStr(const char* CStr); 00421 void Optimize(); 00422 public: 00423 TStr(){RStr=TRStr::GetNullRStr(); RStr->MkRef();} 00424 TStr(const TStr& Str){RStr=Str.RStr; RStr->MkRef();} 00425 TStr(const TChA& ChA){RStr=GetRStr(ChA.CStr()); RStr->MkRef();} 00426 TStr(const TSStr& SStr){RStr=GetRStr(SStr.CStr()); RStr->MkRef();} 00427 TStr(const char* CStr){RStr=GetRStr(CStr); RStr->MkRef();} 00428 explicit TStr(const char& Ch){RStr=GetChStr(Ch).RStr; RStr->MkRef();} 00429 TStr(const TMem& Mem){ 00430 RStr=new TRStr(Mem.Len()); RStr->MkRef(); 00431 memcpy(CStr(), Mem(), Mem.Len()); Optimize();} 00432 explicit TStr(const PSIn& SIn){ 00433 int SInLen=SIn->Len(); RStr=new TRStr(SInLen); RStr->MkRef(); 00434 SIn->GetBf(CStr(), SInLen); Optimize();} 00435 ~TStr(){RStr->UnRef();} 00436 explicit TStr(TSIn& SIn, const bool& IsSmall=false): 00437 RStr(new TRStr(SIn, IsSmall)){RStr->MkRef(); Optimize();} 00438 void Load(TSIn& SIn, const bool& IsSmall=false){ 00439 *this=TStr(SIn, IsSmall);} 00440 void Save(TSOut& SOut, const bool& IsSmall=false) const { 00441 RStr->Save(SOut, IsSmall);} 00442 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm); 00443 void SaveXml(TSOut& SOut, const TStr& Nm) const; 00444 00445 TStr& operator=(const TStr& Str){ 00446 if (this!=&Str){RStr->UnRef(); RStr=Str.RStr; RStr->MkRef();} return *this;} 00447 TStr& operator=(const TChA& ChA){ 00448 RStr->UnRef(); RStr=GetRStr(ChA.CStr()); RStr->MkRef(); return *this;} 00449 TStr& operator=(const char* CStr){ 00450 RStr->UnRef(); RStr=GetRStr(CStr); RStr->MkRef(); return *this;} 00451 TStr& operator=(const char& Ch){ 00452 RStr->UnRef(); RStr=GetChStr(Ch).RStr; RStr->MkRef(); return *this;} 00453 TStr& operator+=(const TStr& Str){ 00454 TRStr* NewRStr=new TRStr(RStr->CStr(), Str.RStr->CStr()); 00455 RStr->UnRef(); RStr=NewRStr; RStr->MkRef(); 00456 Optimize(); return *this;} 00457 TStr& operator+=(const char* CStr){ 00458 TRStr* NewRStr=new TRStr(RStr->CStr(), CStr); 00459 RStr->UnRef(); RStr=NewRStr; RStr->MkRef(); 00460 Optimize(); return *this;} 00461 bool operator==(const TStr& Str) const { 00462 return (RStr==Str.RStr)||(strcmp(RStr->CStr(), Str.RStr->CStr())==0);} 00463 bool operator==(const char* CStr) const { 00464 return strcmp(RStr->CStr(), CStr)==0;} 00465 // bool operator!=(const TStr& Str) const { 00466 // return strcmp(RStr->CStr(), Str.RStr->CStr())!=0;} 00467 bool operator!=(const char* CStr) const { 00468 return strcmp(RStr->CStr(), CStr)!=0;} 00469 bool operator<(const TStr& Str) const { 00470 return strcmp(RStr->CStr(), Str.RStr->CStr())<0;} 00471 char operator[](const int& ChN) const {return RStr->GetCh(ChN);} 00472 int GetMemUsed() const {return int(sizeof(TRStr*)+RStr->GetMemUsed());} 00473 00474 char* operator()(){return RStr->CStr();} 00475 const char* operator()() const {return RStr->CStr();} 00476 char* CStr() {return RStr->CStr();} 00477 const char* CStr() const {return RStr->CStr();} 00478 00479 void PutCh(const int& ChN, const char& Ch){ 00480 TRStr* NewRStr=new TRStr(RStr->CStr()); 00481 RStr->UnRef(); RStr=NewRStr; RStr->MkRef(); 00482 RStr->PutCh(ChN, Ch); Optimize();} 00483 char GetCh(const int& ChN) const {return RStr->GetCh(ChN);} 00484 char LastCh() const {return GetCh(Len()-1);} 00485 00486 void Clr(){RStr->UnRef(); RStr=TRStr::GetNullRStr(); RStr->MkRef();} 00487 int Len() const {return RStr->Len();} 00488 bool Empty() const {return RStr->Empty();} 00489 00490 // upper-case 00491 bool IsUc() const {return RStr->IsUc();} 00492 TStr& ToUc(); 00493 TStr GetUc() const {return TStr(*this).ToUc();} 00494 int CmpI(const TStr& Str) const {return TRStr::CmpI(CStr(), Str.CStr());} 00495 bool EqI(const TStr& Str) const {return TRStr::CmpI(CStr(), Str.CStr())==0;} 00496 // lower-case 00497 bool IsLc() const {return RStr->IsLc();} 00498 TStr& ToLc(); 00499 TStr GetLc() const {return TStr(*this).ToLc();} 00500 // capitalize 00501 TStr& ToCap(); 00502 TStr GetCap() const {return TStr(*this).ToCap();} 00503 00504 // truncate 00505 TStr& ToTrunc(); 00506 TStr GetTrunc() const {return TStr(*this).ToTrunc();} 00507 // Yu-Ascii to Us-Ascii 00508 TStr& ConvUsFromYuAscii(); 00509 TStr GetUsFromYuAscii() const {return TStr(*this).ConvUsFromYuAscii();} 00510 // hex 00511 TStr& ToHex(); 00512 TStr GetHex() const {return TStr(*this).ToHex();} 00513 TStr& FromHex(); 00514 TStr GetFromHex() const {return TStr(*this).FromHex();} 00515 00516 TStr GetSubStr(const int& BChN, const int& EChN) const; 00517 TStr GetSubStr(const int& BChN) const { return GetSubStr(BChN, Len()-1); } 00518 void InsStr(const int& BChN, const TStr& Str); 00519 void DelChAll(const char& Ch); 00520 void DelSubStr(const int& BChN, const int& EChN); 00521 bool DelStr(const TStr& Str); 00522 TStr LeftOf(const char& SplitCh) const; 00523 TStr LeftOfLast(const char& SplitCh) const; 00524 TStr RightOf(const char& SplitCh) const; 00525 TStr RightOfLast(const char& SplitCh) const; 00526 void SplitOnCh(TStr& LStr, const char& SplitCh, TStr& RStr) const; 00527 void SplitOnLastCh(TStr& LStr, const char& SplitCh, TStr& RStr) const; 00528 void SplitOnAllCh( 00529 const char& SplitCh, TStrV& StrV, const bool& SkipEmpty=true) const; 00530 void SplitOnAllAnyCh( 00531 const TStr& SplitChStr, TStrV& StrV, const bool& SkipEmpty=true) const; 00532 void SplitOnWs(TStrV& StrV) const; 00533 void SplitOnNonAlNum(TStrV& StrV) const; 00534 void SplitOnStr(const TStr& SplitStr, TStrV& StrV) const; 00535 void SplitOnStr(TStr& LeftStr, const TStr& MidStr, TStr& RightStr) const; 00536 00537 //TStr Left(const int& Chs) const { return Chs>0 ? GetSubStr(0, Chs-1) : GetSubStr(0, Len()-Chs-1);} 00538 //TStr Right(const int& Chs) const {return GetSubStr(Len()-Chs, Len()-1);} 00539 TStr Mid(const int& BChN, const int& Chs) const { return GetSubStr(BChN, BChN+Chs-1); } 00540 TStr Mid(const int& BChN) const {return GetSubStr(BChN, Len()-1); } 00541 //TStr Slice(const int& BChN, const int& EChNP1) const {return GetSubStr(BChN, EChNP1-1);} 00542 //TStr operator()(const int& BChN, const int& EChNP1) const {return Slice(BChN, EChNP1);} 00543 //J: as in python or matlab: 1 is 1st character, -1 is last character 00544 // TODO ROK, ask Jure about this comment 00545 TStr Left(const int& EChN) const { return EChN>0 ? GetSubStr(0, EChN-1) : GetSubStr(0, Len()+EChN-1);} 00546 TStr Right(const int& BChN) const {return BChN>=0 ? GetSubStr(BChN, Len()-1) : GetSubStr(Len()+BChN, Len()-1);} 00547 TStr Slice(int BChN, int EChNP1) const { if(BChN<0){BChN=Len()+BChN;} if(EChNP1<=0){EChNP1=Len()+EChNP1;} return GetSubStr(BChN, EChNP1-1); } 00548 TStr operator()(const int& BChN, const int& EChNP1) const {return Slice(BChN, EChNP1);} 00549 00550 int CountCh(const char& Ch, const int& BChN=0) const; 00551 int SearchCh(const char& Ch, const int& BChN=0) const; 00552 int SearchChBack(const char& Ch, int BChN=-1) const; 00553 int SearchStr(const TStr& Str, const int& BChN=0) const; 00554 bool IsChIn(const char& Ch) const {return SearchCh(Ch)!=-1;} 00555 bool IsStrIn(const TStr& Str) const {return SearchStr(Str)!=-1;} 00556 bool IsPrefix(const char *Str) const; 00557 bool IsPrefix(const TStr& Str) const { 00558 return IsPrefix(Str.CStr());} 00559 bool IsSuffix(const char *Str) const; 00560 bool IsSuffix(const TStr& Str) const { 00561 return IsSuffix(Str.CStr());} 00562 00563 int ChangeCh(const char& SrcCh, const char& DstCh, const int& BChN=0); 00564 int ChangeChAll(const char& SrcCh, const char& DstCh); 00565 int ChangeStr(const TStr& SrcStr, const TStr& DstStr, const int& BChN=0); 00566 int ChangeStrAll(const TStr& SrcStr, const TStr& DstStr, const bool& FromStartP=false); 00567 TStr Reverse() const { 00568 TChA ChA(*this); ChA.Reverse(); return ChA;} 00569 00570 int GetPrimHashCd() const {return RStr->GetPrimHashCd();} 00571 int GetSecHashCd() const {return RStr->GetSecHashCd();} 00572 00573 bool IsBool(bool& Val) const; 00574 00575 bool IsInt( 00576 const bool& Check, const int& MnVal, const int& MxVal, int& Val) const; 00577 bool IsInt(int& Val) const {return IsInt(false, 0, 0, Val);} 00578 bool IsInt() const {int Val; return IsInt(false, 0, 0, Val);} 00579 int GetInt() const {int Val; IAssertR(IsInt(false, 0, 0, Val), *this); return Val;} 00580 int GetInt(const int& DfVal) const { 00581 int Val; if (IsInt(false, 0, 0, Val)){return Val;} else {return DfVal;}} 00582 00583 bool IsUInt( 00584 const bool& Check, const uint& MnVal, const uint& MxVal, uint& Val) const; 00585 bool IsUInt(uint& Val) const {return IsUInt(false, 0, 0, Val);} 00586 bool IsUInt() const {uint Val; return IsUInt(false, 0, 0, Val);} 00587 uint GetUInt() const {uint Val; IAssert(IsUInt(false, 0, 0, Val)); return Val;} 00588 uint GetUInt(const uint& DfVal) const { 00589 uint Val; if (IsUInt(false, 0, 0, Val)){return Val;} else {return DfVal;}} 00590 00591 bool IsInt64( 00592 const bool& Check, const int64& MnVal, const int64& MxVal, int64& Val) const; 00593 bool IsInt64(int64& Val) const {return IsInt64(false, 0, 0, Val);} 00594 bool IsInt64() const {int64 Val; return IsInt64(false, 0, 0, Val);} 00595 int64 GetInt64() const { 00596 int64 Val; IAssert(IsInt64(false, 0, 0, Val)); return Val;} 00597 int64 GetInt64(const int64& DfVal) const { 00598 int64 Val; if (IsInt64(false, 0, 0, Val)){return Val;} else {return DfVal;}} 00599 00600 bool IsUInt64( 00601 const bool& Check, const uint64& MnVal, const uint64& MxVal, uint64& Val) const; 00602 bool IsUInt64(uint64& Val) const {return IsUInt64(false, 0, 0, Val);} 00603 bool IsUInt64() const {uint64 Val; return IsUInt64(false, 0, 0, Val);} 00604 uint64 GetUInt64() const { 00605 uint64 Val; IAssert(IsUInt64(false, 0, 0, Val)); return Val;} 00606 uint64 GetUInt64(const uint64& DfVal) const { 00607 uint64 Val; if (IsUInt64(false, 0, 0, Val)){return Val;} else {return DfVal;}} 00608 00609 bool IsHexInt(const bool& Check, const int& MnVal, const int& MxVal, int& Val) const; 00610 bool IsHexInt(int& Val) const {return IsHexInt(false, 0, 0, Val);} 00611 bool IsHexInt() const {int Val; return IsHexInt(false, 0, 0, Val);} 00612 int GetHexInt() const { 00613 int Val; IAssert(IsHexInt(false, 0, 0, Val)); return Val;} 00614 int GetHexInt(const int& DfVal) const { 00615 int Val; if (IsHexInt(false, 0, 0, Val)){return Val;} else {return DfVal;}} 00616 00617 bool IsHexInt64(const bool& Check, const int64& MnVal, const int64& MxVal, int64& Val) const; 00618 bool IsHexInt64(int64& Val) const {return IsHexInt64(false, 0, 0, Val);} 00619 bool IsHexInt64() const {int64 Val; return IsHexInt64(false, 0, 0, Val);} 00620 int64 GetHexInt64() const { 00621 int64 Val; IAssert(IsHexInt64(false, 0, 0, Val)); return Val;} 00622 int64 GetHexInt64(const int64& DfVal) const { 00623 int64 Val; if (IsHexInt64(false, 0, 0, Val)){return Val;} else {return DfVal;}} 00624 00625 bool IsFlt(const bool& Check, const double& MnVal, const double& MxVal, 00626 double& Val, const char& DecDelimCh='.') const; 00627 bool IsFlt(double& Val) const {return IsFlt(false, 0, 0, Val);} 00628 bool IsFlt() const {double Val; return IsFlt(false, 0, 0, Val);} 00629 double GetFlt() const { 00630 double Val; IAssert(IsFlt(false, 0, 0, Val)); return Val;} 00631 double GetFlt(const double& DfVal) const { 00632 double Val; if (IsFlt(false, 0, 0, Val)){return Val;} else {return DfVal;}} 00633 00634 bool IsWord(const bool& WsPrefixP=true, const bool& FirstUcAllowedP=true) const; 00635 bool IsWs() const; 00636 00637 bool IsWcMatch( 00638 const int& StrBChN, const TStr& WcStr, const int& WcStrBChN, TStrV& StarStrV, 00639 const char& StarCh='*', const char& QuestCh='?') const; 00640 bool IsWcMatch( 00641 const TStr& WcStr, TStrV& StarStrV, 00642 const char& StarCh='*', const char& QuestCh='?') const; 00643 bool IsWcMatch(const TStr& WcStr, const char& StarCh, const char& QuestCh) const; 00644 bool IsWcMatch(const TStr& WcStr, const int& StarStrN, TStr& StarStr) const; 00645 bool IsWcMatch(const TStr& WcStr) const; 00646 TStr GetWcMatch(const TStr& WcStr, const int& StarStrN=0) const; 00647 00648 TStr GetFPath() const; 00649 TStr GetFBase() const; 00650 TStr GetFMid() const; 00651 TStr GetFExt() const; 00652 static TStr GetNrFPath(const TStr& FPath); 00653 static TStr GetNrFMid(const TStr& FMid); 00654 static TStr GetNrFExt(const TStr& FExt); 00655 static TStr GetNrNumFExt(const int& FExtN); 00656 static TStr GetNrFNm(const TStr& FNm); 00657 static TStr GetNrAbsFPath(const TStr& FPath, const TStr& BaseFPath=TStr()); 00658 static bool IsAbsFPath(const TStr& FPath); 00659 static TStr PutFExt(const TStr& FNm, const TStr& FExt); 00660 static TStr PutFExtIfEmpty(const TStr& FNm, const TStr& FExt); 00661 static TStr PutFBase(const TStr& FNm, const TStr& FBase); 00662 static TStr PutFBaseIfEmpty(const TStr& FNm, const TStr& FBase); 00663 static TStr AddToFMid(const TStr& FNm, const TStr& ExtFMid); 00664 static TStr GetNumFNm(const TStr& FNm, const int& Num); 00665 static TStr GetFNmStr(const TStr& Str, const bool& AlNumOnlyP=true); 00666 00667 static TStr LoadTxt(const PSIn& SIn){ 00668 return TStr(SIn);} 00669 static TStr LoadTxt(const TStr& FNm){ 00670 PSIn SIn=TFIn::New(FNm); return LoadTxt(SIn);} 00671 void SaveTxt(const PSOut& SOut) const { 00672 SOut->SaveBf(CStr(), Len());} 00673 void SaveTxt(const TStr& FNm) const { 00674 PSOut SOut=TFOut::New(FNm); SaveTxt(SOut);} 00675 00676 static TStr& GetChStr(const char& Ch); 00677 static TStr& GetDChStr(const char& Ch1, const char& Ch2); 00678 00679 TStr GetStr() const {return *this;} 00680 static TStr GetStr(const TStr& Str, const char* FmtStr); 00681 static TStr GetStr(const TStr& Str, const TStr& FmtStr){ 00682 return GetStr(Str, FmtStr.CStr());} 00683 static TStr GetStr(const TStrV& StrV, const TStr& DelimiterStr); 00684 static TStr Fmt(const char *FmtStr, ...); 00685 static TStr GetSpaceStr(const int& Spaces); 00686 char* GetCStr() const { 00687 char* Bf=new char[Len()+1]; strcpy(Bf, CStr()); return Bf;} 00688 00689 static TStr MkClone(const TStr& Str){return TStr(Str.CStr());} 00690 static TStr GetNullStr(); 00691 00692 friend TStr operator+(const TStr& LStr, const TStr& RStr); 00693 friend TStr operator+(const TStr& LStr, const char* RCStr); 00694 }; 00695 00697 // Input-String 00698 class TStrIn: public TSIn{ 00699 private: 00700 TStr Str; 00701 char* Bf; 00702 int BfC, BfL; 00703 private: 00704 TStrIn(); 00705 TStrIn(const TStrIn&); 00706 TStrIn& operator = (const TStrIn&); 00707 public: 00708 TStrIn(const TStr& _Str); 00709 static PSIn New(const TStr& Str){return PSIn(new TStrIn(Str));} 00710 ~TStrIn(){} 00711 00712 bool Eof(){return BfC==BfL;} 00713 int Len() const {return BfL-BfC;} 00714 char GetCh(){Assert(BfC<BfL); return Bf[BfC++];} 00715 char PeekCh(){Assert(BfC<BfL); return Bf[BfC];} 00716 int GetBf(const void* LBf, const TSize& LBfL); 00717 void Reset(){Cs=TCs(); BfC=0;} 00718 bool GetNextLnBf(TChA& LnChA); 00719 }; 00720 00722 // Double-String 00723 class TDbStr{ 00724 public: 00725 TStr Str1; 00726 TStr Str2; 00727 public: 00728 TDbStr(): Str1(), Str2(){} 00729 TDbStr(const TDbStr& DbStr): Str1(DbStr.Str1), Str2(DbStr.Str2){} 00730 TDbStr(const TStr& _Str1): Str1(_Str1), Str2(){} 00731 TDbStr(const TStr& _Str1, const TStr& _Str2): Str1(_Str1), Str2(_Str2){} 00732 explicit TDbStr(TSIn& SIn): Str1(SIn), Str2(SIn){} 00733 void Save(TSOut& SOut) const {Str1.Save(SOut); Str2.Save(SOut);} 00734 00735 TDbStr& operator=(const TDbStr& DbStr){ 00736 if (this!=&DbStr){Str1=DbStr.Str1; Str2=DbStr.Str2;} return *this;} 00737 bool operator==(const TDbStr& DbStr) const { 00738 return (Str1==DbStr.Str1)&&(Str2==DbStr.Str2);} 00739 bool operator<(const TDbStr& DbStr) const { 00740 return (Str1<DbStr.Str1)||((Str1==DbStr.Str1)&&(Str2<DbStr.Str2));} 00741 00742 TStr GetStr(const TStr& MidStr=TStr()) const { 00743 if (Filled()){return Str1+MidStr+Str2;} else {return Str1+Str2;}} 00744 int GetPrimHashCd() const { 00745 return Str1.GetPrimHashCd()+Str2.GetPrimHashCd();} 00746 int GetSecHashCd() const { 00747 return Str1.GetSecHashCd()+Str2.GetSecHashCd();} 00748 00749 bool Empty() const {return (Str1.Empty())&&(Str2.Empty());} 00750 bool Filled() const {return (!Str2.Empty())&&(!Str1.Empty());} 00751 }; 00752 00754 // Simple-String-Pool 00755 //ClassTP(TSStrPool, PSStrPool)//{ 00756 //private: 00757 // TMem Bf; 00758 //public: 00759 // TSStrPool(const int& MxLen=0): Bf(MxLen){} 00760 // TSStrPool(TSStrPool& StrPool): Bf(StrPool.Bf){} 00761 // TSStrPool(TSIn& SIn): Bf(SIn){} 00762 // void Save(TSOut& SOut) const {Bf.Save(SOut);} 00763 // 00764 // TSStrPool& operator=(const TSStrPool& StrPool){ 00765 // Bf=StrPool.Bf; return *this;} 00766 // 00767 // int Len() const {return Bf.Len();} 00768 // void Clr(){Bf.Clr();} 00769 // int AddStr(const TStr& Str){ 00770 // if (Str.Empty()){return -1;} 00771 // else {int StrId=Bf.Len(); Bf+=Str; Bf+=char(0); return StrId;}} 00772 // TStr GetStr(const int& StrId) const { 00773 // if (StrId==-1){return "";} 00774 // else {return TStr(Bf()+StrId);}} 00775 //}; 00776 00778 // String-Pool 00779 ClassTP(TStrPool, PStrPool)//{ 00780 private: 00781 uint MxBfL, BfL, GrowBy; 00782 char *Bf; 00783 private: 00784 void Resize(const uint& _MxBfL); 00785 public: 00786 TStrPool(const uint& MxBfLen = 0, const uint& _GrowBy = 16*1024*1024); 00787 TStrPool(TSIn& SIn, bool LoadCompact = true); 00788 TStrPool(const TStrPool& Pool) : MxBfL(Pool.MxBfL), BfL(Pool.BfL), GrowBy(Pool.GrowBy) { 00789 Bf = (char *) malloc(Pool.MxBfL); IAssertR(Bf, TStr::Fmt("Can not resize buffer to %u bytes. [Program failed to allocate more memory. Solution: Get a bigger machine.]", MxBfL).CStr()); memcpy(Bf, Pool.Bf, Pool.BfL); } 00790 ~TStrPool() { if (Bf) free(Bf); else IAssertR(MxBfL == 0, TStr::Fmt("size: %u, expected size: 0", MxBfL).CStr()); Bf = 0; MxBfL = 0; BfL = 0; } 00791 00792 static PStrPool New(const uint& _MxBfLen = 0, const uint& _GrowBy = 16*1024*1024) { return PStrPool(new TStrPool(_MxBfLen, _GrowBy)); } 00793 static PStrPool New(TSIn& SIn) { return new TStrPool(SIn); } 00794 static PStrPool New(const TStr& fileName) { PSIn SIn = TFIn::New(fileName); return new TStrPool(*SIn); } 00795 static PStrPool Load(TSIn& SIn, bool LoadCompacted = true) { return PStrPool(new TStrPool(SIn, LoadCompacted)); } 00796 void Save(TSOut& SOut) const; 00797 void Save(const TStr& FNm){PSOut SOut=TFOut::New(FNm); Save(*SOut);} 00798 00799 uint Len() const { return BfL; } 00800 uint Size() const { return MxBfL; } 00801 bool Empty() const { return ! Len(); } 00802 char* operator () () const { return Bf; } 00803 TStrPool& operator = (const TStrPool& Pool); 00804 00805 uint AddStr(const char *Str, const uint& Len); 00806 uint AddStr(const char *Str) { return AddStr(Str, uint(strlen(Str)) + 1); } 00807 uint AddStr(const TStr& Str) { return AddStr(Str.CStr(), Str.Len() + 1); } 00808 00809 TStr GetStr(const uint& Offset) const { Assert(Offset < BfL); 00810 if (Offset == 0) return TStr::GetNullStr(); else return TStr(Bf + Offset); } 00811 const char *GetCStr(const uint& Offset) const { Assert(Offset < BfL); 00812 if (Offset == 0) return TStr::GetNullStr().CStr(); else return Bf + Offset; } 00813 00814 // Clr() removes the empty string at the start. 00815 // Call AddStr("") after Clr(), if you want to use the pool again. 00816 void Clr(bool DoDel = false) { BfL = 0; if (DoDel && Bf) { free(Bf); Bf = 0; MxBfL = 0; } } 00817 int Cmp(const uint& Offset, const char *Str) const { Assert(Offset < BfL); 00818 if (Offset != 0) return strcmp(Bf + Offset, Str); else return strcmp("", Str); } 00819 00820 static int GetPrimHashCd(const char *CStr); 00821 static int GetSecHashCd(const char *CStr); 00822 int GetPrimHashCd(const uint& Offset) { Assert(Offset < BfL); 00823 if (Offset != 0) return GetPrimHashCd(Bf + Offset); else return GetPrimHashCd(""); } 00824 int GetSecHashCd(const uint& Offset) { Assert(Offset < BfL); 00825 if (Offset != 0) return GetSecHashCd(Bf + Offset); else return GetSecHashCd(""); } 00826 }; 00827 00829 // String-Pool-64bit 00830 ClassTP(TStrPool64, PStrPool64)//{ 00831 private: 00832 ::TSize MxBfL, BfL, GrowBy; 00833 char *Bf; 00834 private: 00835 void Resize(const ::TSize& _MxBfL); 00836 public: 00837 TStrPool64(::TSize _MxBfL = 0, ::TSize _GrowBy = 16*1024*1024); 00838 TStrPool64(const TStrPool64& StrPool); 00839 TStrPool64(TSIn& SIn, bool LoadCompact = true); 00840 ~TStrPool64() { Clr(true); } 00841 void Save(TSOut& SOut) const; 00842 00843 static PStrPool64 New(::TSize MxBfL = 0, ::TSize GrowBy = 16*1024*1024) { 00844 return PStrPool64(new TStrPool64(MxBfL, GrowBy)); } 00845 static PStrPool64 Load(TSIn& SIn, bool LoadCompact = true) { 00846 return PStrPool64(new TStrPool64(SIn, LoadCompact)); } 00847 00848 TStrPool64& operator=(const TStrPool64& StrPool); 00849 00850 uint64 GetMemUsed() const { return 3*sizeof(::TSize) + uint64(MxBfL); } 00851 00852 bool Empty() const { return (BfL == 0); } 00853 uint64 Len() const {return BfL;} 00854 uint64 Reserved() const { return MxBfL; } 00855 void Clr(bool DoDel = false); 00856 int Cmp(uint64 Offset, const char *Str) const { Assert(Offset < BfL); 00857 if (Offset != 0) return strcmp(Bf + Offset, Str); else return strcmp("", Str); } 00858 00859 uint64 AddStr(const TStr& Str); 00860 TStr GetStr(const uint64& StrId) const; 00861 }; 00862 00864 // Void 00865 class TVoid{ 00866 public: 00867 TVoid(){} 00868 TVoid(TSIn&){} 00869 void Save(TSOut&) const {} 00870 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm); 00871 void SaveXml(TSOut& SOut, const TStr& Nm) const; 00872 00873 TVoid& operator=(const TVoid&){return *this;} 00874 bool operator==(const TVoid&) const {return true;} 00875 bool operator<(const TVoid&) const {Fail; return false;} 00876 int GetMemUsed() const {return sizeof(TVoid);} 00877 }; 00878 00880 // Boolean 00881 class TBool{ 00882 public: 00883 bool Val; 00884 public: 00885 static const bool Mn; 00886 static const bool Mx; 00887 static const int Vals; 00888 static TRnd Rnd; 00889 00890 static const TStr FalseStr; 00891 static const TStr TrueStr; 00892 static const TStr NStr; 00893 static const TStr YStr; 00894 static const TStr NoStr; 00895 static const TStr YesStr; 00896 00897 TBool(): Val(false){} 00898 TBool(const bool& _Val): Val(_Val){} 00899 operator bool() const {return Val;} 00900 explicit TBool(TSIn& SIn){SIn.Load(Val);} 00901 void Load(TSIn& SIn){SIn.Load(Val);} 00902 void Save(TSOut& SOut) const {SOut.Save(Val);} 00903 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm); 00904 void SaveXml(TSOut& SOut, const TStr& Nm) const; 00905 00906 TBool& operator=(const TBool& Bool){Val=Bool.Val; return *this;} 00907 bool operator==(const TBool& Bool) const {return Val==Bool.Val;} 00908 bool operator<(const TBool& Bool) const {//return Val<Bool.Val; 00909 return (Val==false)&&(Bool.Val==true);} 00910 bool operator()() const {return Val;} 00911 int GetMemUsed() const {return sizeof(TBool);} 00912 00913 int GetPrimHashCd() const {return Val;} 00914 int GetSecHashCd() const {return Val;} 00915 00916 static bool GetRnd(){return Rnd.GetUniDevInt(2)==1;} 00917 00918 static TStr GetStr(const bool& Val){ 00919 if (Val){return TrueStr;} else {return FalseStr;}} 00920 static TStr GetStr(const TBool& Bool){ 00921 return GetStr(Bool.Val);} 00922 static TStr GetYNStr(const bool& Val){ 00923 if (Val){return YStr;} else {return NStr;}} 00924 static TStr GetYesNoStr(const bool& Val){ 00925 if (Val){return YesStr;} else {return NoStr;}} 00926 static TStr Get01Str(const bool& Val){ 00927 if (Val){return "1";} else {return "0";}} 00928 static bool IsValStr(const TStr& Str); 00929 static bool GetValFromStr(const TStr& Str); 00930 static bool GetValFromStr(const TStr& Str, const bool& DfVal); 00931 }; 00932 00934 // Char 00935 class TCh{ 00936 public: 00937 char Val; 00938 public: 00939 static const char Mn; 00940 static const char Mx; 00941 static const int Vals; 00942 00943 static const char NullCh; 00944 static const char TabCh; 00945 static const char LfCh; 00946 static const char CrCh; 00947 static const char EofCh; 00948 static const char HashCh; 00949 00950 TCh(): Val(TCh::NullCh){} 00951 TCh(const char& _Val): Val(_Val){} 00952 operator char() const {return Val;} 00953 explicit TCh(TSIn& SIn){SIn.Load(Val);} 00954 void Save(TSOut& SOut) const {SOut.Save(Val);} 00955 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm); 00956 void SaveXml(TSOut& SOut, const TStr& Nm) const; 00957 00958 TCh& operator=(const TCh& Ch){Val=Ch.Val; return *this;} 00959 bool operator==(const TCh& Ch) const {return Val==Ch.Val;} 00960 bool operator<(const TCh& Ch) const {return Val<Ch.Val;} 00961 char operator()() const {return Val;} 00962 int GetMemUsed() const {return sizeof(TCh);} 00963 00964 int GetPrimHashCd() const {return Val;} 00965 int GetSecHashCd() const {return Val;} 00966 00967 static bool IsWs(const char& Ch){ 00968 return (Ch==' ')||(Ch==TabCh)||(Ch==CrCh)||(Ch==LfCh);} 00969 static bool IsAlpha(const char& Ch){ 00970 return (('A'<=Ch)&&(Ch<='Z'))||(('a'<=Ch)&&(Ch<='z'));} 00971 static bool IsNum(const char& Ch){return ('0'<=Ch)&&(Ch<='9');} 00972 static bool IsAlNum(const char& Ch){return IsAlpha(Ch)||IsNum(Ch);} 00973 static int GetNum(const char& Ch){Assert(IsNum(Ch)); return Ch-'0';} 00974 static bool IsHex(const char& Ch){return 00975 (('0'<=Ch)&&(Ch<='9'))||(('A'<=Ch)&&(Ch<='F'))||(('a'<=Ch)&&(Ch<='f'));} 00976 static int GetHex(const char& Ch){ 00977 if (('0'<=Ch)&&(Ch<='9')){return Ch-'0';} 00978 else if (('A'<=Ch)&&(Ch<='F')){return Ch-'A'+10;} 00979 else if (('a'<=Ch)&&(Ch<='f')){return Ch-'a'+10;} 00980 else Fail; return 0;} 00981 static char GetHexCh(const int& Val){ 00982 if ((0<=Val)&&(Val<=9)){return char('0'+char(Val));} 00983 else if ((10<=Val)&&(Val<=15)){return char('A'+char(Val-10));} 00984 else Fail; return 0;} 00985 static char IsUc(const char& Ch){ 00986 return ('A'<=Ch)&&(Ch<='Z');} 00987 static char GetUc(const char& Ch){ 00988 if (('a'<=Ch)&&(Ch<='z')){return Ch-'a'+'A';} else {return Ch;}} 00989 static char GetUsFromYuAscii(const char& Ch); 00990 00991 static TStr GetStr(const TCh& Ch){ 00992 return TStr(Ch.Val);} 00993 }; 00994 00996 // Unsigned-Char 00997 class TUCh{ 00998 public: 00999 uchar Val; 01000 public: 01001 static const uchar Mn; 01002 static const uchar Mx; 01003 static const int Vals; 01004 01005 TUCh(): Val(TCh::NullCh){} 01006 TUCh(const uchar& _Val): Val(_Val){} 01007 operator uchar() const {return Val;} 01008 explicit TUCh(TSIn& SIn){SIn.Load(Val);} 01009 void Save(TSOut& SOut) const {SOut.Save(Val);} 01010 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm); 01011 void SaveXml(TSOut& SOut, const TStr& Nm) const; 01012 01013 TUCh& operator=(const TUCh& UCh){Val=UCh.Val; return *this;} 01014 bool operator==(const TUCh& UCh) const {return Val==UCh.Val;} 01015 bool operator<(const TUCh& UCh) const {return Val<UCh.Val;} 01016 uchar operator()() const {return Val;} 01017 int GetMemUsed() const {return sizeof(TUCh);} 01018 01019 int GetPrimHashCd() const {return Val;} 01020 int GetSecHashCd() const {return Val;} 01021 }; 01022 01024 // Short-Integer 01025 class TSInt{ 01026 public: 01027 int16 Val; 01028 public: 01029 TSInt(): Val(0){} 01030 TSInt(const int16& _Val): Val(_Val){} 01031 operator int16() const {return Val;} 01032 explicit TSInt(TSIn& SIn){SIn.Load(Val);} 01033 void Load(TSIn& SIn){SIn.Load(Val);} 01034 void Save(TSOut& SOut) const {SOut.Save(Val);} 01035 int GetPrimHashCd() const {return Val;} 01036 int GetSecHashCd() const {return Val/0x10;} 01037 }; 01038 01040 // Integer 01041 class TInt{ 01042 public: 01043 int Val; 01044 public: 01045 static const int Mn; 01046 static const int Mx; 01047 static const int Kilo; 01048 static const int Mega; 01049 static const int Giga; 01050 static TRnd Rnd; 01051 01052 TInt(): Val(0){} 01053 TInt(const int& _Val): Val(_Val){} 01054 operator int() const {return Val;} 01055 explicit TInt(TSIn& SIn){SIn.Load(Val);} 01056 void Load(TSIn& SIn){SIn.Load(Val);} 01057 void Save(TSOut& SOut) const {SOut.Save(Val);} 01058 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm); 01059 void SaveXml(TSOut& SOut, const TStr& Nm) const; 01060 01061 TInt& operator=(const TInt& Int){Val=Int.Val; return *this;} 01062 TInt& operator=(const int& Int){Val=Int; return *this;} 01063 bool operator==(const TInt& Int) const {return Val==Int.Val;} 01064 bool operator==(const int& Int) const {return Val==Int;} 01065 bool operator!=(const int& Int) const {return Val!=Int;} 01066 bool operator<(const TInt& Int) const {return Val<Int.Val;} 01067 bool operator<(const int& Int) const {return Val<Int;} 01068 int operator()() const {return Val;} 01069 TInt& operator+=(const int& Int){Val+=Int; return *this;} 01070 TInt& operator-=(const int& Int){Val-=Int; return *this;} 01071 TInt operator++(int){Val++; return *this;} 01072 TInt operator--(int){Val--; return *this;} 01073 int GetMemUsed() const {return sizeof(TInt);} 01074 01075 int GetPrimHashCd() const {return Val;} 01076 int GetSecHashCd() const {return Val/0x10;} 01077 01078 static int Abs(const int& Int){return Int<0?-Int:Int;} 01079 static int Sign(const int& Int){return Int<0?-1:(Int>0?1:0);} 01080 static void Swap(int& Int1, int& Int2){ 01081 int SwapInt1=Int1; Int1=Int2; Int2=SwapInt1;} 01082 static int GetRnd(const int& Range=0){return Rnd.GetUniDevInt(Range);} 01083 01084 static bool IsOdd(const int& Int){return ((Int%2)==1);} 01085 static bool IsEven(const int& Int){return ((Int%2)==0);} 01086 01087 static int GetMn(const int& Int1, const int& Int2){ 01088 return Int1<Int2?Int1:Int2;} 01089 static int GetMx(const int& Int1, const int& Int2){ 01090 return Int1>Int2?Int1:Int2;} 01091 static int GetMn(const int& Int1, const int& Int2, const int& Int3){ 01092 return GetMn(Int1, GetMn(Int2, Int3));} 01093 static int GetMn(const int& Int1, const int& Int2, 01094 const int& Int3, const int& Int4){ 01095 return GetMn(GetMn(Int1, Int2), GetMn(Int3, Int4));} 01096 static int GetMx(const int& Int1, const int& Int2, const int& Int3){ 01097 return GetMx(Int1, GetMx(Int2, Int3));} 01098 static int GetMx(const int& Int1, const int& Int2, 01099 const int& Int3, const int& Int4){ 01100 return GetMx(GetMx(Int1, Int2), GetMx(Int3, Int4));} 01101 static int GetInRng(const int& Val, const int& Mn, const int& Mx){ 01102 IAssert(Mn<=Mx); return Val<Mn?Mn:(Val>Mx?Mx:Val);} 01103 01104 TStr GetStr() const {return TInt::GetStr(Val);} 01105 01106 static TStr GetStr(const int& Val){ return TStr::Fmt("%d", Val); } 01107 static TStr GetStr(const TInt& Int){ return GetStr(Int.Val);} 01108 static TStr GetStr(const int& Val, const char* FmtStr); 01109 static TStr GetStr(const int& Val, const TStr& FmtStr){ return GetStr(Val, FmtStr.CStr());} 01110 01111 //J: So that TInt can convert any kind of integer to a string 01112 static TStr GetStr(const uint& Val){ return TStr::Fmt("%u", Val); } 01113 #ifdef GLib_WIN 01114 static TStr GetStr(const int64& Val) {return TStr::Fmt("%I64d", Val);} 01115 static TStr GetStr(const uint64& Val) {return TStr::Fmt("%I64u", Val);} 01116 #else 01117 static TStr GetStr(const int64& Val) {return TStr::Fmt("%lld", Val);} 01118 static TStr GetStr(const uint64& Val) {return TStr::Fmt("%llu", Val);} 01119 #endif 01120 01121 static TStr GetHexStr(const int& Val){ 01122 char Bf[255]; sprintf(Bf, "%X", Val); return TStr(Bf);} 01123 static TStr GetHexStr(const TInt& Int){ 01124 return GetHexStr(Int.Val);} 01125 01126 static TStr GetKiloStr(const int& Val){ 01127 if (Val>=100*1000){return GetStr(Val/1000)+"K";} 01128 else if (Val>=1000){return GetStr(Val/1000)+"."+GetStr((Val%1000)/100)+"K";} 01129 else {return GetStr(Val);}} 01130 static TStr GetMegaStr(const int& Val){ 01131 if (Val>=100*1000000){return GetStr(Val/1000000)+"M";} 01132 else if (Val>=1000000){ 01133 return GetStr(Val/1000000)+"."+GetStr((Val%1000000)/100000)+"M";} 01134 else {return GetKiloStr(Val);}} 01135 01136 // frugal 01137 static char* SaveFrugalInt(char *pDest, int i); 01138 static char* LoadFrugalInt(char *pSrc, int& i); 01139 static void TestFrugalInt(); 01140 static void SaveFrugalIntV(TSOut& SOut, const TVec<TInt, int>& IntV); 01141 static void LoadFrugalIntV(TSIn& SIn, TVec<TInt, int>& IntV, bool ClrP=true); 01142 }; 01143 01145 // Unsigned-Integer 01146 class TUInt{ 01147 public: 01148 uint Val; 01149 public: 01150 static const uint Mn; 01151 static const uint Mx; 01152 static TRnd Rnd; 01153 01154 TUInt(): Val(0){} 01155 TUInt(const uint& _Val): Val(_Val){} 01156 operator uint() const {return Val;} 01157 explicit TUInt(TSIn& SIn){SIn.Load(Val);} 01158 void Load(TSIn& SIn){SIn.Load(Val);} 01159 void Save(TSOut& SOut) const {SOut.Save(Val);} 01160 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm); 01161 void SaveXml(TSOut& SOut, const TStr& Nm) const; 01162 01163 TUInt& operator=(const TUInt& UInt){Val=UInt.Val; return *this;} 01164 TUInt& operator=(const uint& _Val){Val=_Val; return *this;} 01165 TUInt operator++(int){Val++; return *this;} 01166 TUInt operator--(int){Val--; return *this;} 01167 //bool operator==(const TUInt& UInt) const {return Val==UInt.Val;} 01168 //bool operator==(const uint& UInt) const {return Val==UInt;} 01169 //bool operator!=(const uint& UInt) const {return Val!=UInt;} 01170 //bool operator<(const TUInt& UInt) const {return Val<UInt.Val;} 01171 uint operator()() const {return Val;} 01172 uint& operator()() {return Val;} 01173 TUInt& operator~(){Val=~Val; return *this;} 01174 TUInt& operator&=(const TUInt& UInt){Val&=UInt.Val; return *this;} 01175 TUInt& operator|=(const TUInt& UInt){Val|=UInt.Val; return *this;} 01176 TUInt& operator^=(const TUInt& UInt){Val^=UInt.Val; return *this;} 01177 TUInt& operator>>=(const int& ShiftBits){Val>>=ShiftBits; return *this;} 01178 TUInt& operator<<=(const int& ShiftBits){Val<<=ShiftBits; return *this;} 01179 int GetMemUsed() const {return sizeof(TUInt);} 01180 01181 int GetPrimHashCd() const {return int(Val);} 01182 int GetSecHashCd() const {return Val/0x10;} 01183 01184 static uint GetRnd(const uint& Range=0){return Rnd.GetUniDevUInt(Range);} 01185 01186 TStr GetStr() const {return TUInt::GetStr(Val);} 01187 static TStr GetStr(const uint& Val){ 01188 char Bf[255]; sprintf(Bf, "%u", Val); return TStr(Bf);} 01189 static TStr GetStr(const TUInt& UInt){ 01190 return GetStr(UInt.Val);} 01191 static TStr GetStr(const uint& Val, const char* FmtStr); 01192 static TStr GetStr(const uint& Val, const TStr& FmtStr){ 01193 return GetStr(Val, FmtStr.CStr());} 01194 01195 static TStr GetKiloStr(const uint& Val){ 01196 if (Val>100*1000){return GetStr(Val/1000)+"K";} 01197 else if (Val>1000){return GetStr(Val/1000)+"."+GetStr((Val%1000)/100)+"K";} 01198 else {return GetStr(Val);}} 01199 static TStr GetMegaStr(const uint& Val){ 01200 if (Val>100*1000000){return GetStr(Val/1000000)+"M";} 01201 else if (Val>1000000){ 01202 return GetStr(Val/1000000)+"."+GetStr((Val%1000000)/100000)+"M";} 01203 else {return GetKiloStr(Val);}} 01204 01205 static uint JavaUIntToCppUInt(const uint& JavaUInt){ 01206 uint B1=(JavaUInt & 0xFF000000) >> 24; 01207 uint B2=(JavaUInt & 0x00FF0000) >> 16; 01208 uint B3=(JavaUInt & 0x0000FF00) >> 8; 01209 uint B4=(JavaUInt & 0x000000FF) >> 0; 01210 uint CppUInt=(B4<<24)+(B3<<16)+(B2<<8)+(B1<<0); 01211 return CppUInt;} 01212 01213 static bool IsIpStr(const TStr& IpStr, uint& Ip, const char& SplitCh = '.'); 01214 static bool IsIpStr(const TStr& IpStr, const char& SplitCh = '.') { uint Ip; return IsIpStr(IpStr, Ip, SplitCh); } 01215 static uint GetUIntFromIpStr(const TStr& IpStr, const char& SplitCh = '.'); 01216 static TStr GetStrFromIpUInt(const uint& Ip); 01217 static bool IsIpv6Str(const TStr& IpStr, const char& SplitCh = ':'); 01218 }; 01219 01221 // Unsigned-Integer-64Bit 01222 class TUInt64{ 01223 public: 01224 uint64 Val; 01225 public: 01226 static const TUInt64 Mn; 01227 static const TUInt64 Mx; 01228 01229 TUInt64(): Val(0){} 01230 TUInt64(const TUInt64& Int): Val(Int.Val){} 01231 TUInt64(const uint64& Int): Val(Int){} 01232 TUInt64(const uint& MsVal, const uint& LsVal): Val(0){ 01233 Val=(((uint64)MsVal) << 32) | ((uint64)LsVal);} 01234 explicit TUInt64(void* Pt): Val(0){ 01235 TConv_Pt64Ints32 Conv(Pt); Val=Conv.GetUInt64();} 01236 operator uint64() const {return Val;} 01237 explicit TUInt64(TSIn& SIn){SIn.Load(Val);} 01238 void Load(TSIn& SIn){SIn.Load(Val);} 01239 void Save(TSOut& SOut) const {SOut.Save(Val);} 01240 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm); 01241 void SaveXml(TSOut& SOut, const TStr& Nm) const; 01242 01243 TUInt64& operator=(const TUInt64& Int){Val=Int.Val; return *this;} 01244 TUInt64& operator+=(const TUInt64& Int){Val+=Int.Val; return *this;} 01245 TUInt64& operator-=(const TUInt64& Int){Val-=Int.Val; return *this;} 01246 TUInt64 operator++(int){Val++; return *this;} 01247 TUInt64 operator--(int){Val--; return *this;} 01248 int GetMemUsed() const {return sizeof(TUInt64);} 01249 01250 int GetPrimHashCd() const { return (int)GetMsVal() + (int)GetLsVal(); } //TODO: to check 01251 int GetSecHashCd() const { return ((int)GetMsVal() + (int)GetLsVal()) / 0x10; } //TODO: to check 01252 01253 uint GetMsVal() const { 01254 return (uint)(Val >> 32);} 01255 uint GetLsVal() const { 01256 return (uint)(Val & 0xffffffff);} 01257 01258 //TStr GetStr() const {return TStr::Fmt("%Lu", Val);} 01259 //static TStr GetStr(const TUInt64& Int){return TStr::Fmt("%Lu", Int.Val);} 01260 //static TStr GetHexStr(const TUInt64& Int){return TStr::Fmt("%LX", Int.Val);} 01261 #ifdef GLib_WIN 01262 TStr GetStr() const {return TStr::Fmt("%I64u", Val);} 01263 static TStr GetStr(const TUInt64& Int){return TStr::Fmt("%I64u", Int.Val);} 01264 static TStr GetHexStr(const TUInt64& Int){return TStr::Fmt("%I64X", Int.Val);} 01265 #else 01266 TStr GetStr() const {return TStr::Fmt("%llu", Val);} 01267 static TStr GetStr(const TUInt64& Int){return TStr::Fmt("%llu", Int.Val);} 01268 static TStr GetHexStr(const TUInt64& Int){return TStr::Fmt("%llX", Int.Val);} 01269 #endif 01270 01271 static TStr GetKiloStr(const uint64& Val){ 01272 if (Val>100*1000){return GetStr(Val/1000)+"K";} 01273 else if (Val>1000){return GetStr(Val/1000)+"."+GetStr((Val%1000)/100)+"K";} 01274 else {return GetStr(Val);}} 01275 static TStr GetMegaStr(const uint64& Val){ 01276 if (Val>100*1000000){return GetStr(Val/1000000)+"M";} 01277 else if (Val>1000000){ 01278 return GetStr(Val/1000000)+"."+GetStr((Val%1000000)/100000)+"M";} 01279 else {return GetKiloStr(Val);}} 01280 /*static TStr GetGigaStr(const uint64& Val){ 01281 if (Val>100*1000000000){return GetStr(Val/1000000000)+"G";} 01282 else if (Val>1000000000){ 01283 return GetStr(Val/1000000000)+"."+GetStr((Val%1000000000)/100000000)+"G";} 01284 else {return GetMegaStr(Val);}}*/ 01285 }; 01286 01288 // Float 01289 class TFlt{ 01290 public: 01291 double Val; 01292 public: 01293 static const double Mn; 01294 static const double Mx; 01295 static const double NInf; 01296 static const double PInf; 01297 static const double Eps; 01298 static const double EpsHalf; 01299 static TRnd Rnd; 01300 01301 TFlt(): Val(0){} 01302 TFlt(const double& _Val): Val(_Val){} 01303 operator double() const {return Val;} 01304 explicit TFlt(TSIn& SIn){SIn.Load(Val);} 01305 void Save(TSOut& SOut) const {SOut.Save(Val);} 01306 explicit TFlt(TSIn& SIn, const bool& IsTxt){ 01307 if (IsTxt){TStr Str(SIn, true); Val=Str.GetFlt(0);} else {SIn.Load(Val);}} 01308 void Load(TSIn& SIn){SIn.Load(Val);} 01309 void Save(TSOut& SOut, const bool& IsTxt) const { 01310 if (IsTxt){GetStr(Val).Save(SOut, true);} else {SOut.Save(Val);}} 01311 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm); 01312 void SaveXml(TSOut& SOut, const TStr& Nm) const; 01313 01314 TFlt& operator=(const TFlt& Flt){Val=Flt.Val; return *this;} 01315 TFlt& operator=(const double& Flt){Val=Flt; return *this;} 01316 bool operator==(const TFlt& Flt) const _CMPWARN {return Val==Flt.Val;} 01317 bool operator==(const double& Flt) const _CMPWARN {return Val==Flt;} 01318 bool operator!=(const double& Flt) const _CMPWARN {return Val!=Flt;} 01319 double operator()() const {return Val;} 01320 TFlt& operator+=(const double& Flt){Val+=Flt; return *this;} 01321 TFlt& operator-=(const double& Flt){Val-=Flt; return *this;} 01322 TFlt& operator*=(const double& Flt){Val*=Flt; return *this;} 01323 TFlt& operator/=(const double& Flt){Val/=Flt; return *this;} 01324 TFlt operator++(int){Val++; return *this;} 01325 TFlt operator--(int){Val--; return *this;} 01326 int GetMemUsed() const {return sizeof(TFlt);} 01327 01328 int GetPrimHashCd() const { 01329 int Expn; return int((frexp(Val, &Expn)-0.5)*double(TInt::Mx));} 01330 int GetSecHashCd() const { 01331 int Expn; frexp(Val, &Expn); return Expn;} 01332 01333 static double Abs(const double& Flt){return Flt<0?-Flt:Flt;} 01334 static int Sign(const double& Flt){return Flt<0?-1:(Flt>0?1:0);} 01335 static int Round(const double& Flt){return int(floor(Flt+0.5));} 01336 static double GetRnd(){return Rnd.GetUniDev();} 01337 static bool Eq6(const double& LFlt, const double& RFlt){ 01338 return fabs(LFlt-RFlt)<0.000001;} 01339 01340 static double GetMn(const double& Flt1, const double& Flt2){ 01341 return Flt1<Flt2?Flt1:Flt2;} 01342 static double GetMn(const double& Flt1, const double& Flt2, const double& Flt3){ 01343 return GetMn(GetMn(Flt1, Flt2), Flt3); } 01344 static double GetMn(const double& Flt1, const double& Flt2, const double& Flt3, const double& Flt4){ 01345 return GetMn(GetMn(Flt1, Flt2), GetMn(Flt3, Flt4)); } 01346 01347 static double GetMx(const double& Flt1, const double& Flt2){ 01348 return Flt1>Flt2?Flt1:Flt2;} 01349 static double GetMx(const double& Flt1, const double& Flt2, const double Flt3){ 01350 return GetMx(GetMx(Flt1, Flt2), Flt3); } 01351 static double GetMx(const double& Flt1, const double& Flt2, const double Flt3, const double& Flt4){ 01352 return GetMx(GetMx(Flt1, Flt2), GetMx(Flt3, Flt4)); } 01353 01354 static double GetInRng(const double& Val, const double& Mn, const double& Mx){ 01355 IAssert(Mn<=Mx); return Val<Mn?Mn:(Val>Mx?Mx:Val);} 01356 01357 static bool IsNum(const double& Val){ 01358 return (Mn<=Val)&&(Val<=Mx);} 01359 static bool IsNan(const double& Val){ 01360 return (Val!=Val);} 01361 01362 bool IsNum() const { return IsNum(Val); } 01363 bool IsNan() const { return IsNan(Val); } 01364 01365 TStr GetStr() const {return TFlt::GetStr(Val);} 01366 static TStr GetStr(const double& Val, const int& Width=-1, const int& Prec=-1); 01367 static TStr GetStr(const TFlt& Flt, const int& Width=-1, const int& Prec=-1){ 01368 return GetStr(Flt.Val, Width, Prec);} 01369 static TStr GetStr(const double& Val, const char* FmtStr); 01370 static TStr GetStr(const double& Val, const TStr& FmtStr){ 01371 return GetStr(Val, FmtStr.CStr());} 01372 static TStr GetPrcStr(const double& RelVal, const double& FullVal){ 01373 return GetStr(100*RelVal/FullVal, "%3.0f%%");} 01374 01375 static TStr GetKiloStr(const double& Val){ 01376 if (fabs(Val)>100*1000){return TStr::Fmt("%.0fK", Val/1000);} 01377 else if (fabs(Val)>1000){return TStr::Fmt("%.1fK", Val/1000);} 01378 else {return TStr::Fmt("%.0f", Val);}} 01379 static TStr GetMegaStr(const double& Val){ 01380 if (fabs(Val)>100*1000000){return TStr::Fmt("%.0fM", Val/1000000);} 01381 else if (fabs(Val)>1000000){return TStr::Fmt("%.1fM", Val/1000000);} 01382 else {return GetKiloStr(Val);}} 01383 static TStr GetGigaStr(const double& Val){ 01384 if (fabs(Val)>100*1000000000.0){return TStr::Fmt("%.0fG", Val/1000000000.0);} 01385 else if (fabs(Val)>1000000000.0){return TStr::Fmt("%.1fG", Val/1000000000.0);} 01386 else {return GetMegaStr(Val);}} 01387 }; 01388 01390 // Ascii-Float 01391 class TAscFlt: public TFlt{ 01392 public: 01393 TAscFlt(): TFlt(){} 01394 TAscFlt(const double& Val): TFlt(Val){} 01395 explicit TAscFlt(TSIn& SIn): TFlt(SIn, true){} 01396 void Save(TSOut& SOut) const {TFlt::Save(SOut, true);} 01397 }; 01398 01400 // Short-Float 01401 class TSFlt{ 01402 public: 01403 sdouble Val; 01404 public: 01405 static const sdouble Mn; 01406 static const sdouble Mx; 01407 01408 TSFlt(): Val(0){} 01409 TSFlt(const sdouble& _Val): Val(sdouble(_Val)){} 01410 //TSFlt(const double& _Val): Val(sdouble(_Val)){} 01411 operator sdouble() const {return Val;} 01412 //operator double() const {return Val;} 01413 explicit TSFlt(TSIn& SIn){SIn.Load(Val);} 01414 void Save(TSOut& SOut) const {SOut.Save(Val);} 01415 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm); 01416 void SaveXml(TSOut& SOut, const TStr& Nm) const; 01417 01418 TSFlt& operator=(const TSFlt& SFlt){Val=SFlt.Val; return *this;} 01419 bool operator==(const TSFlt& SFlt) const _CMPWARN {return Val==SFlt.Val;} 01420 bool operator==(const double& Flt) const _CMPWARN {return Val==Flt;} 01421 bool operator!=(const double& Flt) const _CMPWARN {return Val!=Flt;} 01422 bool operator<(const TSFlt& SFlt) const {return Val<SFlt.Val;} 01423 sdouble operator()() const {return Val;} 01424 TSFlt& operator+=(const double& SFlt){Val+=sdouble(SFlt); return *this;} 01425 TSFlt& operator-=(const double& SFlt){Val-=sdouble(SFlt); return *this;} 01426 TSFlt& operator*=(const double& SFlt){Val*=sdouble(SFlt); return *this;} 01427 TSFlt& operator/=(const double& SFlt){Val/=sdouble(SFlt); return *this;} 01428 TSFlt operator++(int){Val++; return *this;} 01429 TSFlt operator--(int){Val--; return *this;} 01430 int GetMemUsed() const {return sizeof(TSFlt);} 01431 01432 int GetPrimHashCd() const { 01433 int Expn; return int((frexp(Val, &Expn)-0.5)*double(TInt::Mx));} 01434 int GetSecHashCd() const { 01435 int Expn; frexp(Val, &Expn); return Expn;} 01436 }; 01437 01439 // Long-Float 01440 class TLFlt{ 01441 public: 01442 ldouble Val; 01443 public: 01444 static const ldouble Mn; 01445 static const ldouble Mx; 01446 01447 TLFlt(): Val(0){} 01448 TLFlt(const ldouble& _Val): Val(_Val){} 01449 operator ldouble() const {return Val;} 01450 explicit TLFlt(TSIn& SIn){SIn.Load(Val);} 01451 void Save(TSOut& SOut) const {SOut.Save(Val);} 01452 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm); 01453 void SaveXml(TSOut& SOut, const TStr& Nm) const; 01454 01455 TLFlt& operator=(const TLFlt& LFlt){Val=LFlt.Val; return *this;} 01456 bool operator==(const TLFlt& LFlt) const _CMPWARN {return Val==LFlt.Val;} 01457 bool operator==(const ldouble& LFlt) const _CMPWARN {return Val==LFlt;} 01458 bool operator!=(const ldouble& LFlt) const _CMPWARN {return Val!=LFlt;} 01459 bool operator<(const TLFlt& LFlt) const {return Val<LFlt.Val;} 01460 ldouble operator()() const {return Val;} 01461 TLFlt& operator+=(const ldouble& LFlt){Val+=LFlt; return *this;} 01462 TLFlt& operator-=(const ldouble& LFlt){Val-=LFlt; return *this;} 01463 int GetMemUsed() const {return sizeof(TLFlt);} 01464 01465 int GetPrimHashCd() const {Fail; return 0;} 01466 int GetSecHashCd() const {Fail; return 0;} 01467 01468 static TStr GetStr(const ldouble& Val, const int& Width=-1, const int& Prec=-1); 01469 static TStr GetStr(const TLFlt& LFlt, const int& Width=-1, const int& Prec=-1){ 01470 return GetStr(LFlt.Val, Width, Prec);} 01471 static TStr GetStr(const ldouble& Val, const char* FmtStr); 01472 static TStr GetStr(const ldouble& Val, const TStr& FmtStr){ 01473 return GetStr(Val, FmtStr.CStr());} 01474 }; 01475 01477 // Float-Rectangle 01478 class TFltRect{ 01479 public: 01480 TFlt MnX, MnY, MxX, MxY; 01481 public: 01482 TFltRect(): 01483 MnX(), MnY(), MxX(), MxY(){} 01484 TFltRect(const TFltRect& FltRect): 01485 MnX(FltRect.MnX), MnY(FltRect.MnY), MxX(FltRect.MxX), MxY(FltRect.MxY){} 01486 TFltRect( 01487 const double& _MnX, const double& _MnY, 01488 const double& _MxX, const double& _MxY): 01489 MnX(_MnX), MnY(_MnY), MxX(_MxX), MxY(_MxY){} 01490 TFltRect(TSIn& SIn): 01491 MnX(SIn), MnY(SIn), MxX(SIn), MxY(SIn){} 01492 void Save(TSOut& SOut) const { 01493 MnX.Save(SOut); MnY.Save(SOut); MxX.Save(SOut); MxY.Save(SOut);} 01494 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm); 01495 void SaveXml(TSOut& SOut, const TStr& Nm) const; 01496 01497 TFltRect& operator=(const TFltRect& FltRect){ 01498 MnX=FltRect.MnX; MnY=FltRect.MnY; MxX=FltRect.MxX; MxY=FltRect.MxY; 01499 return *this;} 01500 01501 // get coordinates 01502 double GetMnX() const {return MnX;} 01503 double GetMnY() const {return MnY;} 01504 double GetMxX() const {return MxX;} 01505 double GetMxY() const {return MxY;} 01506 01507 // get lengths 01508 double GetXLen() const {return MxX-MnX;} 01509 double GetYLen() const {return MxY-MnY;} 01510 01511 // get centers 01512 double GetXCenter() const {return MnX+(MxX-MnX)/2;} 01513 double GetYCenter() const {return MnY+(MxY-MnY)/2;} 01514 01515 // tests 01516 bool IsXYIn(const double& X, const double& Y) const { 01517 return (MnX<=X)&&(X<=MxX)&&(MnY<=Y)&&(Y<=MxY);} 01518 static bool Intersection(const TFltRect& Rect1, const TFltRect& Rect2); 01519 01520 // string 01521 TStr GetStr() const; 01522 }; 01523