|
SNAP Library 2.1, User Reference
2013-09-12 18:08:55
SNAP, a general purpose, high performance system for analysis and manipulation of large networks
|
00001 00002 // Address-Pointer 00003 template <class TRec> 00004 class TAPt{ 00005 private: 00006 TRec* Addr; 00007 public: 00008 TAPt(): Addr(NULL){} 00009 TAPt(const TAPt& Pt): Addr(Pt.Addr){} 00010 TAPt(TRec* _Addr): Addr(_Addr){} 00011 TAPt(TSIn&){Fail;} 00012 void Save(TSOut&) const {Fail;} 00013 00014 TAPt& operator=(const TAPt& Pt){Addr=Pt.Addr; return *this;} 00015 TAPt& operator=(TRec* _Addr){Addr=_Addr; return *this;} 00016 bool operator==(const TAPt& Pt) const {return *Addr==*Pt.Addr;} 00017 bool operator!=(const TAPt& Pt) const {return *Addr!=*Pt.Addr;} 00018 bool operator<(const TAPt& Pt) const {return *Addr<*Pt.Addr;} 00019 00020 TRec* operator->() const {Assert(Addr!=NULL); return Addr;} 00021 TRec& operator*() const {Assert(Addr!=NULL); return *Addr;} 00022 TRec& operator[](const int& RecN) const { 00023 Assert(Addr!=NULL); return Addr[RecN];} 00024 TRec* operator()() const {return Addr;} 00025 00026 bool Empty() const {return Addr==NULL;} 00027 }; 00028 00030 // Pair 00031 template <class TVal1, class TVal2> 00032 class TPair{ 00033 public: 00034 TVal1 Val1; 00035 TVal2 Val2; 00036 public: 00037 TPair(): Val1(), Val2(){} 00038 TPair(const TPair& Pair): Val1(Pair.Val1), Val2(Pair.Val2){} 00039 TPair(const TVal1& _Val1, const TVal2& _Val2): Val1(_Val1), Val2(_Val2){} 00040 explicit TPair(TSIn& SIn): Val1(SIn), Val2(SIn){} 00041 void Save(TSOut& SOut) const { 00042 Val1.Save(SOut); Val2.Save(SOut);} 00043 void Load(TSIn& SIn) {Val1.Load(SIn); Val2.Load(SIn);} 00044 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm=""); 00045 void SaveXml(TSOut& SOut, const TStr& Nm) const; 00046 00047 TPair& operator=(const TPair& Pair){ 00048 if (this!=&Pair){Val1=Pair.Val1; Val2=Pair.Val2;} return *this;} 00049 bool operator==(const TPair& Pair) const { 00050 return (Val1==Pair.Val1)&&(Val2==Pair.Val2);} 00051 bool operator<(const TPair& Pair) const { 00052 return (Val1<Pair.Val1)||((Val1==Pair.Val1)&&(Val2<Pair.Val2));} 00053 00054 int GetMemUsed() const {return Val1.GetMemUsed()+Val2.GetMemUsed();} 00055 00056 int GetPrimHashCd() const {return TPairHashImpl::GetHashCd(Val1.GetPrimHashCd(), Val2.GetPrimHashCd()); } 00057 int GetSecHashCd() const {return TPairHashImpl::GetHashCd(Val2.GetSecHashCd(), Val1.GetSecHashCd()); } 00058 00059 void GetVal(TVal1& _Val1, TVal2& _Val2) const {_Val1=Val1; _Val2=Val2;} 00060 const TVal1& GetVal1() const { return Val1;} 00061 const TVal2& GetVal2() const { return Val2;} 00062 TStr GetStr() const { 00063 return TStr("Pair(")+Val1.GetStr()+", "+Val2.GetStr()+")";} 00064 }; 00065 00066 template <class TVal1, class TVal2, class TSizeTy> 00067 void GetSwitchedPrV(const TVec<TPair<TVal1, TVal2>, TSizeTy>& SrcPrV, TVec<TPair<TVal2, TVal1>, TSizeTy>& DstPrV){ 00068 const TSizeTy Prs = SrcPrV.Len(); 00069 DstPrV.Gen(Prs, 0); 00070 for (TSizeTy PrN=0; PrN<Prs; PrN++){ 00071 const TPair<TVal1, TVal2>& SrcPr=SrcPrV[PrN]; 00072 DstPrV.Add(TPair<TVal2, TVal1>(SrcPr.Val2, SrcPr.Val1)); 00073 } 00074 } 00075 00076 typedef TPair<TBool, TCh> TBoolChPr; 00077 typedef TPair<TBool, TFlt> TBoolFltPr; 00078 typedef TPair<TUCh, TInt> TUChIntPr; 00079 typedef TPair<TUCh, TUInt64> TUChUInt64Pr; 00080 typedef TPair<TUCh, TStr> TUChStrPr; 00081 typedef TPair<TInt, TBool> TIntBoolPr; 00082 typedef TPair<TInt, TCh> TIntChPr; 00083 typedef TPair<TInt, TInt> TIntPr; 00084 typedef TPair<TInt, TUInt64> TIntUInt64Pr; 00085 typedef TPair<TInt, TIntPr> TIntIntPrPr; 00086 typedef TPair<TInt, TVec<TInt, int> > TIntIntVPr; 00087 typedef TPair<TInt, TFlt> TIntFltPr; 00088 typedef TPair<TInt, TStr> TIntStrPr; 00089 typedef TPair<TInt, TStrV> TIntStrVPr; 00090 typedef TPair<TIntPr, TInt> TIntPrIntPr; 00091 typedef TPair<TUInt, TUInt> TUIntUIntPr; 00092 typedef TPair<TUInt, TInt> TUIntIntPr; 00093 typedef TPair<TUInt64, TInt> TUInt64IntPr; 00094 typedef TPair<TUInt64, TUInt64> TUInt64Pr; 00095 typedef TPair<TUInt64, TFlt> TUInt64FltPr; 00096 typedef TPair<TUInt64, TStr> TUInt64StrPr; 00097 typedef TPair<TFlt, TInt> TFltIntPr; 00098 typedef TPair<TFlt, TUInt64> TFltUInt64Pr; 00099 typedef TPair<TFlt, TFlt> TFltPr; 00100 typedef TPair<TFlt, TStr> TFltStrPr; 00101 typedef TPair<TAscFlt, TInt> TAscFltIntPr; 00102 typedef TPair<TAscFlt, TAscFlt> TAscFltPr; 00103 typedef TPair<TFlt, TStr> TFltStrPr; 00104 typedef TPair<TAscFlt, TStr> TAscFltStrPr; 00105 typedef TPair<TStr, TInt> TStrIntPr; 00106 typedef TPair<TStr, TFlt> TStrFltPr; 00107 typedef TPair<TStr, TStr> TStrPr; 00108 typedef TPair<TStr, TStrV> TStrStrVPr; 00109 typedef TPair<TStrV, TInt> TStrVIntPr; 00110 typedef TPair<TInt, TIntPr> TIntIntPrPr; 00111 typedef TPair<TInt, TStrPr> TIntStrPrPr; 00112 typedef TPair<TFlt, TStrPr> TFltStrPrPr; 00113 00115 template <class TVal1, class TVal2> 00116 class TCmpPairByVal2 { 00117 private: 00118 bool IsAsc; 00119 public: 00120 TCmpPairByVal2(const bool& AscSort=true) : IsAsc(AscSort) { } 00121 bool operator () (const TPair<TVal1, TVal2>& P1, const TPair<TVal1, TVal2>& P2) const { 00122 if (IsAsc) { return P1.Val2 < P2.Val2; } else { return P2.Val2 < P1.Val2; } 00123 } 00124 }; 00125 00127 // Triple 00128 template <class TVal1, class TVal2, class TVal3> 00129 class TTriple{ 00130 public: 00131 TVal1 Val1; 00132 TVal2 Val2; 00133 TVal3 Val3; 00134 public: 00135 TTriple(): Val1(), Val2(), Val3(){} 00136 TTriple(const TTriple& Triple): 00137 Val1(Triple.Val1), Val2(Triple.Val2), Val3(Triple.Val3){} 00138 TTriple(const TVal1& _Val1, const TVal2& _Val2, const TVal3& _Val3): 00139 Val1(_Val1), Val2(_Val2), Val3(_Val3){} 00140 explicit TTriple(TSIn& SIn): Val1(SIn), Val2(SIn), Val3(SIn){} 00141 void Save(TSOut& SOut) const { 00142 Val1.Save(SOut); Val2.Save(SOut); Val3.Save(SOut);} 00143 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm=""); 00144 void SaveXml(TSOut& SOut, const TStr& Nm) const; 00145 00146 TTriple& operator=(const TTriple& Triple){ 00147 if (this!=&Triple){Val1=Triple.Val1; Val2=Triple.Val2; Val3=Triple.Val3;} 00148 return *this;} 00149 bool operator==(const TTriple& Triple) const { 00150 return (Val1==Triple.Val1)&&(Val2==Triple.Val2)&&(Val3==Triple.Val3);} 00151 bool operator<(const TTriple& Triple) const { 00152 return (Val1<Triple.Val1)||((Val1==Triple.Val1)&&(Val2<Triple.Val2))|| 00153 ((Val1==Triple.Val1)&&(Val2==Triple.Val2)&&(Val3<Triple.Val3));} 00154 00155 int GetPrimHashCd() const {return TPairHashImpl::GetHashCd(TPairHashImpl::GetHashCd(Val1.GetPrimHashCd(), Val2.GetPrimHashCd()), Val3.GetPrimHashCd()); } 00156 int GetSecHashCd() const {return TPairHashImpl::GetHashCd(TPairHashImpl::GetHashCd(Val2.GetSecHashCd(), Val3.GetSecHashCd()), Val1.GetSecHashCd()); } 00157 int GetMemUsed() const {return Val1.GetMemUsed()+Val2.GetMemUsed()+Val3.GetMemUsed();} 00158 00159 void GetVal(TVal1& _Val1, TVal2& _Val2, TVal3& _Val3) const { 00160 _Val1=Val1; _Val2=Val2; _Val3=Val3;} 00161 }; 00162 00163 typedef TTriple<TCh, TCh, TCh> TChTr; 00164 typedef TTriple<TCh, TInt, TInt> TChIntIntTr; 00165 typedef TTriple<TUCh, TInt, TInt> TUChIntIntTr; 00166 typedef TTriple<TInt, TInt, TInt> TIntTr; 00167 typedef TTriple<TUInt64, TUInt64, TUInt64> TUInt64Tr; 00168 typedef TTriple<TInt, TStr, TInt> TIntStrIntTr; 00169 typedef TTriple<TInt, TInt, TStr> TIntIntStrTr; 00170 typedef TTriple<TInt, TInt, TFlt> TIntIntFltTr; 00171 typedef TTriple<TInt, TFlt, TInt> TIntFltIntTr; 00172 typedef TTriple<TInt, TFlt, TFlt> TIntFltFltTr; 00173 typedef TTriple<TInt, TVec<TInt, int>, TInt> TIntIntVIntTr; 00174 typedef TTriple<TInt, TInt, TVec<TInt, int> > TIntIntIntVTr; 00175 typedef TTriple<TFlt, TFlt, TFlt> TFltTr; 00176 typedef TTriple<TFlt, TInt, TInt> TFltIntIntTr; 00177 typedef TTriple<TFlt, TFlt, TInt> TFltFltIntTr; 00178 typedef TTriple<TFlt, TFlt, TStr> TFltFltStrTr; 00179 typedef TTriple<TChA, TChA, TChA> TChATr; 00180 typedef TTriple<TStr, TStr, TStr> TStrTr; 00181 typedef TTriple<TStr, TInt, TInt> TStrIntIntTr; 00182 typedef TTriple<TStr, TFlt, TFlt> TStrFltFltTr; 00183 typedef TTriple<TStr, TStr, TInt> TStrStrIntTr; 00184 typedef TTriple<TStr, TInt, TStrV> TStrIntStrVTr; 00185 00187 template <class TVal1, class TVal2, class TVal3> 00188 class TCmpTripleByVal2 { 00189 private: 00190 bool IsAsc; 00191 public: 00192 TCmpTripleByVal2(const bool& AscSort=true) : IsAsc(AscSort) { } 00193 bool operator () (const TTriple<TVal1, TVal2, TVal3>& T1, const TTriple<TVal1, TVal2, TVal3>& T2) const { 00194 if (IsAsc) { return T1.Val2 < T2.Val2; } else { return T2.Val2 < T1.Val2; } 00195 } 00196 }; 00197 00199 template <class TVal1, class TVal2, class TVal3> 00200 class TCmpTripleByVal3 { 00201 private: 00202 bool IsAsc; 00203 public: 00204 TCmpTripleByVal3(const bool& AscSort=true) : IsAsc(AscSort) { } 00205 bool operator () (const TTriple<TVal1, TVal2, TVal3>& T1, const TTriple<TVal1, TVal2, TVal3>& T2) const { 00206 if (IsAsc) { return T1.Val3 < T2.Val3; } else { return T2.Val3 < T1.Val3; } 00207 } 00208 }; 00209 00211 // Quad 00212 template <class TVal1, class TVal2, class TVal3, class TVal4> 00213 class TQuad{ 00214 public: 00215 TVal1 Val1; 00216 TVal2 Val2; 00217 TVal3 Val3; 00218 TVal4 Val4; 00219 public: 00220 TQuad(): 00221 Val1(), Val2(), Val3(), Val4(){} 00222 TQuad(const TQuad& Quad): 00223 Val1(Quad.Val1), Val2(Quad.Val2), Val3(Quad.Val3), Val4(Quad.Val4){} 00224 TQuad(const TVal1& _Val1, const TVal2& _Val2, const TVal3& _Val3, const TVal4& _Val4): 00225 Val1(_Val1), Val2(_Val2), Val3(_Val3), Val4(_Val4){} 00226 explicit TQuad(TSIn& SIn): 00227 Val1(SIn), Val2(SIn), Val3(SIn), Val4(SIn){} 00228 void Save(TSOut& SOut) const { 00229 Val1.Save(SOut); Val2.Save(SOut); Val3.Save(SOut); Val4.Save(SOut);} 00230 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm=""); 00231 void SaveXml(TSOut& SOut, const TStr& Nm) const; 00232 00233 TQuad& operator=(const TQuad& Quad){ 00234 if (this!=&Quad){ 00235 Val1=Quad.Val1; Val2=Quad.Val2; Val3=Quad.Val3; Val4=Quad.Val4;} 00236 return *this;} 00237 bool operator==(const TQuad& Quad) const { 00238 return (Val1==Quad.Val1)&&(Val2==Quad.Val2)&&(Val3==Quad.Val3)&&(Val4==Quad.Val4);} 00239 bool operator<(const TQuad& Quad) const { 00240 return (Val1<Quad.Val1)||((Val1==Quad.Val1)&&(Val2<Quad.Val2))|| 00241 ((Val1==Quad.Val1)&&(Val2==Quad.Val2)&&(Val3<Quad.Val3))|| 00242 ((Val1==Quad.Val1)&&(Val2==Quad.Val2)&&(Val3==Quad.Val3)&&(Val4<Quad.Val4));} 00243 00244 int GetPrimHashCd() const {return TPairHashImpl::GetHashCd(TPairHashImpl::GetHashCd(Val1.GetPrimHashCd(), Val2.GetPrimHashCd()), TPairHashImpl::GetHashCd(Val3.GetPrimHashCd(), Val4.GetPrimHashCd())); } 00245 int GetSecHashCd() const {return TPairHashImpl::GetHashCd(TPairHashImpl::GetHashCd(Val2.GetSecHashCd(), Val3.GetSecHashCd()), TPairHashImpl::GetHashCd(Val4.GetSecHashCd(), Val1.GetSecHashCd())); } 00246 00247 void GetVal(TVal1& _Val1, TVal2& _Val2, TVal3& _Val3, TVal4& _Val4) const { 00248 _Val1=Val1; _Val2=Val2; _Val3=Val3; _Val4=Val4;} 00249 }; 00250 00251 typedef TQuad<TStr, TStr, TInt, TInt> TStrStrIntIntQu; 00252 typedef TQuad<TStr, TStr, TStr, TStr> TStrQu; 00253 typedef TQuad<TInt, TInt, TInt, TInt> TIntQu; 00254 typedef TQuad<TFlt, TFlt, TFlt, TFlt> TFltQu; 00255 typedef TQuad<TFlt, TInt, TInt, TInt> TFltIntIntIntQu; 00256 typedef TQuad<TInt, TStr, TInt, TInt> TIntStrIntIntQu; 00257 typedef TQuad<TInt, TInt, TFlt, TFlt> TIntIntFltFltQu; 00258 00260 // Tuple 00261 template<class TVal, int NVals> 00262 class TTuple { 00263 private: 00264 TVal ValV [NVals]; 00265 public: 00266 TTuple(){} 00267 TTuple(const TVal& InitVal) { for (int i=0; i<Len(); i++) ValV[i]=InitVal; } 00268 TTuple(const TTuple& Tup) { for (int i=0; i<Len(); i++) ValV[i]=Tup[i]; } 00269 TTuple(TSIn& SIn) { for (int i=0; i<Len(); i++) ValV[i].Load(SIn); } 00270 void Save(TSOut& SOut) const { for (int i=0; i<Len(); i++) ValV[i].Save(SOut); } 00271 void Load(TSIn& SIn) { for (int i=0; i<Len(); i++) ValV[i].Load(SIn); } 00272 00273 int Len() const { return NVals; } 00274 TVal& operator[] (const int& ValN) { return ValV[ValN]; } 00275 const TVal& operator[] (const int& ValN) const { return ValV[ValN]; } 00276 TTuple& operator = (const TTuple& Tup) { if (this != & Tup) { 00277 for (int i=0; i<Len(); i++) ValV[i]=Tup[i]; } return *this; } 00278 bool operator == (const TTuple& Tup) const { 00279 if (Len()!=Tup.Len()) { return false; } if (&Tup==this) { return true; } 00280 for (int i=0; i<Len(); i++) if(ValV[i]!=Tup[i]){return false;} return true; } 00281 bool operator < (const TTuple& Tup) const { 00282 if (Len() == Tup.Len()) { for (int i=0; i<Len(); i++) { 00283 if(ValV[i]<Tup[i]){return true;} else if(ValV[i]>Tup[i]){return false;} } return false; } 00284 else { return Len() < Tup.Len(); } } 00285 void Sort(const bool& Asc=true); 00286 int FindMx() const; 00287 int FindMn() const; 00288 int GetPrimHashCd() const { int hc = 0; 00289 for (int i = 0; i < NVals; i++) { hc = TPairHashImpl::GetHashCd(hc, ValV[i].GetPrimHashCd()); } 00290 return hc; } 00291 int GetSecHashCd() const { int hc = 0; 00292 for (int i = 1; i < NVals; i++) { hc = TPairHashImpl::GetHashCd(hc, ValV[i].GetSecHashCd()); } 00293 if (NVals > 0) { hc = TPairHashImpl::GetHashCd(hc, ValV[0].GetSecHashCd()); } 00294 return hc; } 00295 00296 TStr GetStr() const { TChA ValsStr; 00297 for (int i=0; i<Len(); i++) { ValsStr+=" "+ValV[i].GetStr(); } 00298 return TStr::Fmt("Tuple(%d):", Len())+ValsStr; } 00299 }; 00300 00301 template<class TVal, int NVals> 00302 void TTuple<TVal, NVals>::Sort(const bool& Asc) { 00303 TVec<TVal, int> V(NVals); 00304 for (int i=0; i<NVals; i++) { V.Add(ValV[i]); } 00305 V.Sort(Asc); 00306 for (int i=0; i<NVals; i++) { ValV[i] = V[i]; } 00307 } 00308 00309 template<class TVal, int NVals> 00310 int TTuple<TVal, NVals>::FindMx() const { 00311 TVal MxVal = ValV[0]; 00312 int ValN = 0; 00313 for (int i = 1; i < NVals; i++) { 00314 if (MxVal<ValV[i]) { 00315 MxVal=ValV[i]; ValN=i; 00316 } 00317 } 00318 return ValN; 00319 } 00320 00321 template<class TVal, int NVals> 00322 int TTuple<TVal, NVals>::FindMn() const { 00323 TVal MnVal = ValV[0]; 00324 int ValN = 0; 00325 for (int i = 1; i < NVals; i++) { 00326 if (MnVal>ValV[i]) { 00327 MnVal=ValV[i]; ValN=i; 00328 } 00329 } 00330 return ValN; 00331 } 00332 00334 // Key-Data 00335 template <class TKey, class TDat> 00336 class TKeyDat{ 00337 public: 00338 TKey Key; 00339 TDat Dat; 00340 public: 00341 TKeyDat(): Key(), Dat(){} 00342 TKeyDat(const TKeyDat& KeyDat): Key(KeyDat.Key), Dat(KeyDat.Dat){} 00343 explicit TKeyDat(const TKey& _Key): Key(_Key), Dat(){} 00344 TKeyDat(const TKey& _Key, const TDat& _Dat): Key(_Key), Dat(_Dat){} 00345 explicit TKeyDat(TSIn& SIn): Key(SIn), Dat(SIn){} 00346 void Save(TSOut& SOut) const {Key.Save(SOut); Dat.Save(SOut);} 00347 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm=""); 00348 void SaveXml(TSOut& SOut, const TStr& Nm) const; 00349 00350 TKeyDat& operator=(const TKeyDat& KeyDat){ 00351 if (this!=&KeyDat){Key=KeyDat.Key; Dat=KeyDat.Dat;} return *this;} 00352 bool operator==(const TKeyDat& KeyDat) const {return Key==KeyDat.Key;} 00353 bool operator<(const TKeyDat& KeyDat) const {return Key<KeyDat.Key;} 00354 00355 int GetPrimHashCd() const {return Key.GetPrimHashCd();} 00356 int GetSecHashCd() const {return Key.GetSecHashCd();} 00357 }; 00358 00359 template <class TKey, class TDat> 00360 void GetSwitchedKdV(const TVec<TKeyDat<TKey, TDat>, int>& SrcKdV, TVec<TKeyDat<TDat, TKey>, int>& DstKdV){ 00361 const int Kds=SrcKdV.Len(); 00362 DstKdV.Gen(Kds, 0); 00363 for (int KdN=0; KdN<Kds; KdN++){ 00364 const TKeyDat<TKey, TDat>& SrcKd=SrcKdV[KdN]; 00365 DstKdV.Add(TKeyDat<TDat, TKey>(SrcKd.Dat, SrcKd.Key)); 00366 } 00367 } 00368 00369 typedef TKeyDat<TInt, TInt> TIntKd; 00370 typedef TKeyDat<TInt, TUInt64> TIntUInt64Kd; 00371 typedef TKeyDat<TInt, TFlt> TIntFltKd; 00372 typedef TKeyDat<TIntPr, TFlt> TIntPrFltKd; 00373 typedef TKeyDat<TInt, TFltPr> TIntFltPrKd; 00374 typedef TKeyDat<TInt, TSFlt> TIntSFltKd; 00375 typedef TKeyDat<TInt, TStr> TIntStrKd; 00376 typedef TKeyDat<TUInt, TInt> TUIntIntKd; 00377 typedef TKeyDat<TUInt, TUInt> TUIntKd; 00378 typedef TKeyDat<TUInt64, TInt> TUInt64IntKd; 00379 typedef TKeyDat<TUInt64, TFlt> TUInt64FltKd; 00380 typedef TKeyDat<TUInt64, TStr> TUInt64StrKd; 00381 typedef TKeyDat<TFlt, TBool> TFltBoolKd; 00382 typedef TKeyDat<TFlt, TInt> TFltIntKd; 00383 typedef TKeyDat<TFlt, TUInt64> TFltUInt64Kd; 00384 typedef TKeyDat<TFlt, TIntPr> TFltIntPrKd; 00385 typedef TKeyDat<TFlt, TUInt> TFltUIntKd; 00386 typedef TKeyDat<TFlt, TFlt> TFltKd; 00387 typedef TKeyDat<TFlt, TStr> TFltStrKd; 00388 typedef TKeyDat<TFlt, TBool> TFltBoolKd; 00389 typedef TKeyDat<TFlt, TIntBoolPr> TFltIntBoolPrKd; 00390 typedef TKeyDat<TAscFlt, TInt> TAscFltIntKd; 00391 typedef TKeyDat<TStr, TBool> TStrBoolKd; 00392 typedef TKeyDat<TStr, TInt> TStrIntKd; 00393 typedef TKeyDat<TStr, TFlt> TStrFltKd; 00394 typedef TKeyDat<TStr, TAscFlt> TStrAscFltKd; 00395 typedef TKeyDat<TStr, TStr> TStrKd; 00396 00397 // Key-Data comparator 00398 00399 template <class TVal1, class TVal2> 00400 class TCmpKeyDatByDat { 00401 private: 00402 bool IsAsc; 00403 public: 00404 TCmpKeyDatByDat(const bool& AscSort=true) : IsAsc(AscSort) { } 00405 bool operator () (const TKeyDat<TVal1, TVal2>& P1, const TKeyDat<TVal1, TVal2>& P2) const { 00406 if (IsAsc) { return P1.Dat < P2.Dat; } else { return P2.Dat < P1.Dat; } 00407 } 00408 }; 00409 00410 //#////////////////////////////////////////////// 00412 00419 template <class TVal, class TSizeTy = int> 00420 class TVec{ 00421 public: 00422 typedef TVal* TIter; 00423 protected: 00424 TSizeTy MxVals; 00425 TSizeTy Vals; 00426 TVal* ValT; 00427 00428 void Resize(const TSizeTy& _MxVals=-1); 00430 TStr GetXOutOfBoundsErrMsg(const TSizeTy& ValN) const; 00431 public: 00432 TVec(): MxVals(0), Vals(0), ValT(NULL){} 00433 TVec(const TVec<TVal, TSizeTy>& Vec); 00435 explicit TVec(const TSizeTy& _Vals){ 00436 IAssert(0<=_Vals); MxVals=Vals=_Vals; 00437 if (_Vals==0){ValT=NULL;} else {ValT=new TVal[_Vals];}} 00439 TVec(const TSizeTy& _MxVals, const TSizeTy& _Vals){ 00440 IAssert((0<=_Vals)&&(_Vals<=_MxVals)); MxVals=_MxVals; Vals=_Vals; 00441 if (_MxVals==0){ValT=NULL;} else {ValT=new TVal[_MxVals];}} 00443 00446 explicit TVec(TVal *_ValT, const TSizeTy& _Vals): 00447 MxVals(-1), Vals(_Vals), ValT(_ValT){} 00448 ~TVec(){if ((ValT!=NULL) && (MxVals!=-1)){delete[] ValT;}} 00449 explicit TVec(TSIn& SIn): MxVals(0), Vals(0), ValT(NULL){Load(SIn);} 00450 void Load(TSIn& SIn); 00451 void Save(TSOut& SOut) const; 00452 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm=""); 00453 void SaveXml(TSOut& SOut, const TStr& Nm) const; 00454 00456 TVec<TVal, TSizeTy>& operator=(const TVec<TVal, TSizeTy>& Vec); 00458 TVec<TVal, TSizeTy>& operator+(const TVal& Val){Add(Val); return *this;} 00460 bool operator==(const TVec<TVal, TSizeTy>& Vec) const; 00462 00464 bool operator<(const TVec<TVal, TSizeTy>& Vec) const; 00466 const TVal& operator[](const TSizeTy& ValN) const { 00467 AssertR((0<=ValN)&&(ValN<Vals), GetXOutOfBoundsErrMsg(ValN)); 00468 return ValT[ValN];} 00470 TVal& operator[](const TSizeTy& ValN){ 00471 AssertR((0<=ValN)&&(ValN<Vals), GetXOutOfBoundsErrMsg(ValN)); 00472 return ValT[ValN];} 00474 TSizeTy GetMemUsed() const { 00475 return TSizeTy(2*sizeof(TSizeTy)+sizeof(TVal*)+MxVals*sizeof(TVal));} 00477 TSizeTy GetMemSize() const { 00478 return TSizeTy(2*sizeof(TVal)+sizeof(TSizeTy)*Vals);} 00479 00481 int GetPrimHashCd() const; 00483 int GetSecHashCd() const; 00484 00486 void Gen(const TSizeTy& _Vals){ IAssert(0<=_Vals); 00487 if (ValT!=NULL && MxVals!=-1){delete[] ValT;} MxVals=Vals=_Vals; 00488 if (MxVals==0){ValT=NULL;} else {ValT=new TVal[MxVals];}} 00490 void Gen(const TSizeTy& _MxVals, const TSizeTy& _Vals){ IAssert((0<=_Vals)&&(_Vals<=_MxVals)); 00491 if (ValT!=NULL && MxVals!=-1){delete[] ValT;} MxVals=_MxVals; Vals=_Vals; 00492 if (_MxVals==0){ValT=NULL;} else {ValT=new TVal[_MxVals];}} 00494 00497 void GenExt(TVal *_ValT, const TSizeTy& _Vals){ 00498 if (ValT!=NULL && MxVals!=-1){delete[] ValT;} 00499 MxVals=-1; Vals=_Vals; ValT=_ValT;} 00501 00504 bool IsExt() const {return MxVals==-1;} 00506 void Reserve(const TSizeTy& _MxVals){Resize(_MxVals);} 00508 void Reserve(const TSizeTy& _MxVals, const TSizeTy& _Vals){ IAssert((0<=_Vals)&&(_Vals<=_MxVals)); Resize(_MxVals); Vals=_Vals;} 00510 00513 void Clr(const bool& DoDel=true, const TSizeTy& NoDelLim=-1); 00515 00517 void Trunc(const TSizeTy& _Vals=-1); 00519 void Pack(); 00521 00523 void MoveFrom(TVec<TVal, TSizeTy>& Vec); 00525 void Swap(TVec<TVal, TSizeTy>& Vec); 00526 00528 00530 bool Empty() const {return Vals==0;} 00532 00535 TSizeTy Len() const {return Vals;} 00537 TSizeTy Reserved() const {return MxVals;} 00539 const TVal& Last() const {return GetVal(Len()-1);} 00541 TVal& Last(){return GetVal(Len()-1);} 00543 TSizeTy LastValN() const {return Len()-1;} 00545 const TVal& LastLast() const { AssertR(1<Vals, GetXOutOfBoundsErrMsg(Vals-2)); return ValT[Vals-2];} 00547 TVal& LastLast(){ AssertR(1<Vals, GetXOutOfBoundsErrMsg(Vals-2)); return ValT[Vals-2];} 00548 00550 TIter BegI() const {return ValT;} 00552 TIter EndI() const {return ValT+Vals;} 00554 TIter GetI(const TSizeTy& ValN) const {return ValT+ValN;} 00555 00557 00559 TSizeTy Add(){ AssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 00560 if (Vals==MxVals){Resize();} return Vals++;} 00562 00564 TSizeTy Add(const TVal& Val){ AssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 00565 if (Vals==MxVals){Resize();} ValT[Vals]=Val; return Vals++;} 00566 TSizeTy Add(TVal& Val){ AssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 00567 if (Vals==MxVals){Resize();} ValT[Vals]=Val; return Vals++;} 00569 TSizeTy Add(const TVal& Val, const TSizeTy& ResizeLen){ AssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 00570 if (Vals==MxVals){Resize(MxVals+ResizeLen);} ValT[Vals]=Val; return Vals++;} 00572 TSizeTy AddV(const TVec<TVal, TSizeTy>& ValV); 00574 00576 TSizeTy AddSorted(const TVal& Val, const bool& Asc=true, const TSizeTy& _MxVals=-1); 00578 00580 TSizeTy AddBackSorted(const TVal& Val, const bool& Asc); 00582 00584 TSizeTy AddMerged(const TVal& Val); 00586 00588 TSizeTy AddVMerged(const TVec<TVal, TSizeTy>& ValV); 00590 00593 TSizeTy AddUnique(const TVal& Val); 00595 const TVal& GetVal(const TSizeTy& ValN) const {return operator[](ValN);} 00597 TVal& GetVal(const TSizeTy& ValN){return operator[](ValN);} 00599 void GetSubValV(const TSizeTy& BValN, const TSizeTy& EValN, TVec<TVal, TSizeTy>& ValV) const; 00601 void Ins(const TSizeTy& ValN, const TVal& Val); 00603 void Del(const TSizeTy& ValN); 00605 void Del(const TSizeTy& MnValN, const TSizeTy& MxValN); 00607 void DelLast(){Del(Len()-1);} 00609 bool DelIfIn(const TVal& Val); 00611 void DelAll(const TVal& Val); 00613 void PutAll(const TVal& Val); 00614 00616 void Swap(const TSizeTy& ValN1, const TSizeTy& ValN2){ const TVal Val=ValT[ValN1]; ValT[ValN1]=ValT[ValN2]; ValT[ValN2]=Val;} 00618 static void SwapI(TIter LVal, TIter RVal){ const TVal Val=*LVal; *LVal=*RVal; *RVal=Val;} 00619 00621 00625 bool NextPerm(); 00627 00629 bool PrevPerm(); 00630 00631 // Sorting functions 00633 TSizeTy GetPivotValN(const TSizeTy& LValN, const TSizeTy& RValN) const; 00635 00637 void BSort(const TSizeTy& MnLValN, const TSizeTy& MxRValN, const bool& Asc); 00639 00641 void ISort(const TSizeTy& MnLValN, const TSizeTy& MxRValN, const bool& Asc); 00643 00646 TSizeTy Partition(const TSizeTy& MnLValN, const TSizeTy& MxRValN, const bool& Asc); 00648 00651 void QSort(const TSizeTy& MnLValN, const TSizeTy& MxRValN, const bool& Asc); 00653 00656 void Sort(const bool& Asc=true); 00658 bool IsSorted(const bool& Asc=true) const; 00660 void Shuffle(TRnd& Rnd); 00662 void Reverse(); 00664 void Reverse(TSizeTy LValN, TSizeTy RValN){ Assert(LValN>=0 && RValN<Len()); while (LValN < RValN){Swap(LValN++, RValN--);} } 00666 void Merge(); 00667 00669 template <class TCmp> 00670 static TIter GetPivotValNCmp(const TIter& BI, const TIter& EI, const TCmp& Cmp) { 00671 TSizeTy SubVals=TSizeTy(EI-BI); if (SubVals > TInt::Mx-1) { SubVals = TInt::Mx-1; } 00672 const TSizeTy ValN1=TInt::GetRnd(SubVals), ValN2=TInt::GetRnd(SubVals), ValN3=TInt::GetRnd(SubVals); 00673 const TVal& Val1 = *(BI+ValN1); const TVal& Val2 = *(BI+ValN2); const TVal& Val3 = *(BI+ValN3); 00674 if (Cmp(Val1, Val2)) { 00675 if (Cmp(Val2, Val3)) return BI+ValN2; 00676 else if (Cmp(Val3, Val1)) return BI+ValN1; 00677 else return BI+ValN3; 00678 } else { 00679 if (Cmp(Val1, Val3)) return BI+ValN1; 00680 else if (Cmp(Val3, Val2)) return BI+ValN2; 00681 else return BI+ValN3; } } 00683 template <class TCmp> 00684 static TIter PartitionCmp(TIter BI, TIter EI, const TVal Pivot, const TCmp& Cmp) { 00685 forever { 00686 while (Cmp(*BI, Pivot)){++BI;} --EI; 00687 while (Cmp(Pivot, *EI)){--EI;} 00688 if (!(BI<EI)){return BI;} SwapI(BI, EI); ++BI; } } 00690 template <class TCmp> 00691 static void BSortCmp(TIter BI, TIter EI, const TCmp& Cmp) { 00692 for (TIter i = BI; i != EI; ++i) { 00693 for (TIter j = EI-1; j != i; --j) { 00694 if (Cmp(*j, *(j-1))) { SwapI(j, j-1); } } } } 00696 template <class TCmp> 00697 static void ISortCmp(TIter BI, TIter EI, const TCmp& Cmp) { 00698 if (BI + 1 < EI) { 00699 for (TIter i = BI, j; i != EI; ++i) { TVal Tmp=*i; j=i; 00700 while (j > BI && Cmp(Tmp, *(j-1))) { *j = *(j-1); --j; } *j=Tmp; } } } 00702 template <class TCmp> 00703 static void QSortCmp(TIter BI, TIter EI, const TCmp& Cmp) { 00704 if (BI + 1 < EI) { 00705 if (EI - BI < 20) { ISortCmp(BI, EI, Cmp); } 00706 else { const TVal Val = *GetPivotValNCmp(BI, EI, Cmp); 00707 TIter Split = PartitionCmp(BI, EI, Val, Cmp); 00708 QSortCmp(BI, Split, Cmp); QSortCmp(Split, EI, Cmp); } } } 00710 template <class TCmp> 00711 void SortCmp(const TCmp& Cmp){ QSortCmp(BegI(), EndI(), Cmp);} 00713 template <class TCmp> 00714 bool IsSortedCmp(const TCmp& Cmp) const { 00715 if (EndI() == BegI()) return true; 00716 for (TIter i = BegI(); i != EndI()-1; ++i) { 00717 if (Cmp(*(i+1), *i)){return false;} } return true; } 00718 00720 00722 void Intrs(const TVec<TVal, TSizeTy>& ValV); 00724 00726 void Union(const TVec<TVal, TSizeTy>& ValV); 00728 00731 void Diff(const TVec<TVal, TSizeTy>& ValV); 00733 00735 void Intrs(const TVec<TVal, TSizeTy>& ValV, TVec<TVal, TSizeTy>& DstValV) const; 00737 00739 void Union(const TVec<TVal, TSizeTy>& ValV, TVec<TVal, TSizeTy>& DstValV) const; 00741 00744 void Diff(const TVec<TVal, TSizeTy>& ValV, TVec<TVal, TSizeTy>& DstValV) const; 00746 00748 TSizeTy IntrsLen(const TVec<TVal, TSizeTy>& ValV) const; 00750 00752 TSizeTy UnionLen(const TVec<TVal, TSizeTy>& ValV) const; 00753 00755 TSizeTy Count(const TVal& Val) const; 00757 00760 TSizeTy SearchBin(const TVal& Val) const; 00762 00764 TSizeTy SearchBin(const TVal& Val, TSizeTy& InsValN) const; 00766 00769 TSizeTy SearchForw(const TVal& Val, const TSizeTy& BValN=0) const; 00771 00773 TSizeTy SearchBack(const TVal& Val) const; 00775 00777 TSizeTy SearchVForw(const TVec<TVal, TSizeTy>& ValV, const TSizeTy& BValN=0) const; 00778 00780 bool IsIn(const TVal& Val) const {return SearchForw(Val)!=-1;} 00782 00784 bool IsIn(const TVal& Val, TSizeTy& ValN) const { ValN=SearchForw(Val); return ValN!=-1;} 00786 00788 bool IsInBin(const TVal& Val) const {return SearchBin(Val)!=-1;} 00790 const TVal& GetDat(const TVal& Val) const { return GetVal(SearchForw(Val));} 00792 00794 TVal& GetAddDat(const TVal& Val){ AssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 00795 const TSizeTy ValN=SearchForw(Val); if (ValN==-1){Add(Val); return Last();} else {return GetVal(ValN);}} 00797 TSizeTy GetMxValN() const; 00798 00800 static TVec<TVal, TSizeTy> GetV(const TVal& Val1){ 00801 TVec<TVal, TSizeTy> V(1, 0); V.Add(Val1); return V;} 00803 static TVec<TVal, TSizeTy> GetV(const TVal& Val1, const TVal& Val2){ 00804 TVec<TVal, TSizeTy> V(2, 0); V.Add(Val1); V.Add(Val2); return V;} 00806 static TVec<TVal, TSizeTy> GetV(const TVal& Val1, const TVal& Val2, const TVal& Val3){ 00807 TVec<TVal, TSizeTy> V(3, 0); V.Add(Val1); V.Add(Val2); V.Add(Val3); return V;} 00809 static TVec<TVal, TSizeTy> GetV(const TVal& Val1, const TVal& Val2, const TVal& Val3, const TVal& Val4){ 00810 TVec<TVal, TSizeTy> V(4, 0); V.Add(Val1); V.Add(Val2); V.Add(Val3); V.Add(Val4); return V;} 00812 static TVec<TVal, TSizeTy> GetV(const TVal& Val1, const TVal& Val2, const TVal& Val3, const TVal& Val4, const TVal& Val5){ 00813 TVec<TVal, TSizeTy> V(5, 0); V.Add(Val1); V.Add(Val2); V.Add(Val3); V.Add(Val4); V.Add(Val5); return V;} 00815 static TVec<TVal, TSizeTy> GetV(const TVal& Val1, const TVal& Val2, const TVal& Val3, const TVal& Val4, const TVal& Val5, const TVal& Val6){ 00816 TVec<TVal, TSizeTy> V(6, 0); V.Add(Val1); V.Add(Val2); V.Add(Val3); V.Add(Val4); V.Add(Val5); V.Add(Val6); return V;} 00818 static TVec<TVal, TSizeTy> GetV(const TVal& Val1, const TVal& Val2, const TVal& Val3, const TVal& Val4, const TVal& Val5, const TVal& Val6, const TVal& Val7){ 00819 TVec<TVal, TSizeTy> V(7, 0); V.Add(Val1); V.Add(Val2); V.Add(Val3); V.Add(Val4); V.Add(Val5); V.Add(Val6); V.Add(Val7); return V;} 00821 static TVec<TVal, TSizeTy> GetV(const TVal& Val1, const TVal& Val2, const TVal& Val3, const TVal& Val4, const TVal& Val5, const TVal& Val6, const TVal& Val7, const TVal& Val8){ 00822 TVec<TVal, TSizeTy> V(8, 0); V.Add(Val1); V.Add(Val2); V.Add(Val3); V.Add(Val4); V.Add(Val5); V.Add(Val6); V.Add(Val7); V.Add(Val8); return V;} 00824 static TVec<TVal, TSizeTy> GetV(const TVal& Val1, const TVal& Val2, const TVal& Val3, const TVal& Val4, const TVal& Val5, const TVal& Val6, const TVal& Val7, const TVal& Val8, const TVal& Val9){ 00825 TVec<TVal, TSizeTy> V(9, 0); V.Add(Val1); V.Add(Val2); V.Add(Val3); V.Add(Val4); V.Add(Val5); V.Add(Val6); V.Add(Val7); V.Add(Val8); V.Add(Val9); return V;} 00826 }; 00827 00828 template <class TVal, class TSizeTy> 00829 void TVec<TVal, TSizeTy>::Resize(const TSizeTy& _MxVals){ 00830 IAssertR(MxVals!=-1, TStr::Fmt("Can not increase the capacity of the vector. %s. [Program failed to allocate more memory. Solution: Get a bigger machine and a 64-bit compiler.]", GetTypeNm(*this).CStr()).CStr()); 00831 if (_MxVals==-1){ 00832 if (Vals==0){MxVals=16;} else {MxVals*=2;} 00833 } else { 00834 if (_MxVals<=MxVals){return;} else {MxVals=_MxVals;} 00835 } 00836 if (ValT==NULL){ 00837 try {ValT=new TVal[MxVals];} 00838 catch (std::exception Ex){ 00839 FailR(TStr::Fmt("TVec::Resize: %s, Length:%s, Capacity:%s, New capacity:%s, Type:%s [Program failed to allocate more memory. Solution: Get a bigger machine and a 64-bit compiler.]", 00840 Ex.what(), TInt::GetStr(Vals).CStr(), TInt::GetStr(MxVals).CStr(), TInt::GetStr(_MxVals).CStr(), GetTypeNm(*this).CStr()).CStr());} 00841 } else { 00842 TVal* NewValT = NULL; 00843 try { 00844 NewValT=new TVal[MxVals];} 00845 catch (std::exception Ex){ 00846 FailR(TStr::Fmt("TVec::Resize: %s, Length:%s, Capacity:%s, New capacity:%s, Type:%s [Program failed to allocate more memory. Solution: Get a bigger machine and a 64-bit compiler.]", 00847 Ex.what(), TInt::GetStr(Vals).CStr(), TInt::GetStr(MxVals).CStr(), TInt::GetStr(_MxVals).CStr(), GetTypeNm(*this).CStr()).CStr());} 00848 IAssert(NewValT!=NULL); 00849 for (TSizeTy ValN=0; ValN<Vals; ValN++){NewValT[ValN]=ValT[ValN];} 00850 delete[] ValT; ValT=NewValT; 00851 } 00852 } 00853 00854 template <class TVal, class TSizeTy> 00855 TStr TVec<TVal, TSizeTy>::GetXOutOfBoundsErrMsg(const TSizeTy& ValN) const { 00856 return TStr()+ 00857 "Index:"+TInt::GetStr(ValN)+ 00858 " Vals:"+TInt::GetStr(Vals)+ 00859 " MxVals:"+TInt::GetStr(MxVals)+ 00860 " Type:"+GetTypeNm(*this); 00861 } 00862 00863 template <class TVal, class TSizeTy> 00864 TVec<TVal, TSizeTy>::TVec(const TVec<TVal, TSizeTy>& Vec){ 00865 MxVals=Vec.MxVals; Vals=Vec.Vals; 00866 if (MxVals==0){ValT=NULL;} else {ValT=new TVal[MxVals];} 00867 for (TSizeTy ValN=0; ValN<Vec.Vals; ValN++){ValT[ValN]=Vec.ValT[ValN];} 00868 } 00869 00870 template <class TVal, class TSizeTy> 00871 void TVec<TVal, TSizeTy>::Load(TSIn& SIn){ 00872 if ((ValT!=NULL)&&(MxVals!=-1)){delete[] ValT;} 00873 SIn.Load(MxVals); SIn.Load(Vals); MxVals=Vals; 00874 if (MxVals==0){ValT=NULL;} else {ValT=new TVal[MxVals];} 00875 for (TSizeTy ValN=0; ValN<Vals; ValN++){ValT[ValN]=TVal(SIn);} 00876 } 00877 00878 template <class TVal, class TSizeTy> 00879 void TVec<TVal, TSizeTy>::Save(TSOut& SOut) const { 00880 if (MxVals!=-1){SOut.Save(MxVals);} else {SOut.Save(Vals);} 00881 SOut.Save(Vals); 00882 for (TSizeTy ValN=0; ValN<Vals; ValN++){ValT[ValN].Save(SOut);} 00883 } 00884 00885 template <class TVal, class TSizeTy> 00886 TVec<TVal, TSizeTy>& TVec<TVal, TSizeTy>::operator=(const TVec<TVal, TSizeTy>& Vec){ 00887 if (this!=&Vec){ 00888 if ((ValT!=NULL)&&(MxVals!=-1)){delete[] ValT;} 00889 MxVals=Vals=Vec.Vals; 00890 if (MxVals==0){ValT=NULL;} else {ValT=new TVal[MxVals];} 00891 for (TSizeTy ValN=0; ValN<Vec.Vals; ValN++){ValT[ValN]=Vec.ValT[ValN];} 00892 } 00893 return *this; 00894 } 00895 00896 template <class TVal, class TSizeTy> 00897 bool TVec<TVal, TSizeTy>::operator==(const TVec<TVal, TSizeTy>& Vec) const { 00898 if (this==&Vec){return true;} 00899 if (Len()!=Vec.Len()){return false;} 00900 for (TSizeTy ValN=0; ValN<Vals; ValN++){ 00901 if (ValT[ValN]!=Vec.ValT[ValN]){return false;}} 00902 return true; 00903 } 00904 00905 template <class TVal, class TSizeTy> 00906 bool TVec<TVal, TSizeTy>::operator<(const TVec<TVal, TSizeTy>& Vec) const { 00907 if (this==&Vec){return false;} 00908 if (Len()==Vec.Len()){ 00909 for (TSizeTy ValN=0; ValN<Vals; ValN++){ 00910 if (ValT[ValN]<Vec.ValT[ValN]){return true;} 00911 else if (ValT[ValN]>Vec.ValT[ValN]){return false;} 00912 else {} 00913 } 00914 return false; 00915 } else { 00916 return Len()<Vec.Len(); 00917 } 00918 } 00919 00920 // Improved hashing of vectors (Jure Apr 20 2013) 00921 // This change makes binary representation of vectors incompatible with previous code. 00922 // Previous hash functions are available for compatibility in class TVecHashF_OldGLib 00923 template <class TVal, class TSizeTy> 00924 int TVec<TVal, TSizeTy>::GetPrimHashCd() const { 00925 int hc = 0; 00926 for (TSizeTy i=0; i<Vals; i++){ 00927 hc = TPairHashImpl::GetHashCd(hc, ValT[i].GetPrimHashCd()); 00928 } 00929 return hc; 00930 } 00931 00932 // Improved hashing of vectors (Jure Apr 20 2013) 00933 // This change makes binary representation of vectors incompatible with previous code. 00934 // Previous hash functions are available for compatibility in class TVecHashF_OldGLib 00935 template <class TVal, class TSizeTy> 00936 int TVec<TVal, TSizeTy>::GetSecHashCd() const { 00937 int hc = 0; 00938 for (TSizeTy i=0; i<Vals; i++){ 00939 hc = TPairHashImpl::GetHashCd(hc, ValT[i].GetSecHashCd()); 00940 } 00941 if (Vals > 0) { 00942 hc = TPairHashImpl::GetHashCd(hc, ValT[0].GetSecHashCd()); } 00943 return hc; 00944 } 00945 00946 template <class TVal, class TSizeTy> 00947 void TVec<TVal, TSizeTy>::Clr(const bool& DoDel, const TSizeTy& NoDelLim){ 00948 if ((DoDel)||((!DoDel)&&(NoDelLim!=-1)&&(MxVals>NoDelLim))){ 00949 if ((ValT!=NULL)&&(MxVals!=-1)){delete[] ValT;} 00950 MxVals=Vals=0; ValT=NULL; 00951 } else { 00952 IAssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 00953 Vals=0; 00954 } 00955 } 00956 00957 template <class TVal, class TSizeTy> 00958 void TVec<TVal, TSizeTy>::Trunc(const TSizeTy& _Vals){ 00959 IAssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 00960 IAssert((_Vals==-1)||(_Vals>=0)); 00961 if ((_Vals!=-1)&&(_Vals>=Vals)){ 00962 return; 00963 } else 00964 if (((_Vals==-1)&&(Vals==0))||(_Vals==0)){ 00965 if (ValT!=NULL){delete[] ValT;} 00966 MxVals=Vals=0; ValT=NULL; 00967 } else { 00968 if (_Vals==-1){ 00969 if (MxVals==Vals){return;} else {MxVals=Vals;} 00970 } else { 00971 MxVals=Vals=_Vals; 00972 } 00973 TVal* NewValT=new TVal[MxVals]; 00974 IAssert(NewValT!=NULL); 00975 for (TSizeTy ValN=0; ValN<Vals; ValN++){NewValT[ValN]=ValT[ValN];} 00976 delete[] ValT; ValT=NewValT; 00977 } 00978 } 00979 00980 template <class TVal, class TSizeTy> 00981 void TVec<TVal, TSizeTy>::Pack(){ 00982 IAssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 00983 if (Vals==0){ 00984 if (ValT!=NULL){delete[] ValT;} ValT=NULL; 00985 } else 00986 if (Vals<MxVals){ 00987 MxVals=Vals; 00988 TVal* NewValT=new TVal[MxVals]; 00989 IAssert(NewValT!=NULL); 00990 for (TSizeTy ValN=0; ValN<Vals; ValN++){NewValT[ValN]=ValT[ValN];} 00991 delete[] ValT; ValT=NewValT; 00992 } 00993 } 00994 00995 template <class TVal, class TSizeTy> 00996 void TVec<TVal, TSizeTy>::MoveFrom(TVec<TVal, TSizeTy>& Vec){ 00997 if (this!=&Vec){ 00998 if (ValT!=NULL && MxVals!=-1){delete[] ValT;} 00999 MxVals=Vec.MxVals; Vals=Vec.Vals; ValT=Vec.ValT; 01000 Vec.MxVals=0; Vec.Vals=0; Vec.ValT=NULL; 01001 } 01002 } 01003 01004 template <class TVal, class TSizeTy> 01005 void TVec<TVal, TSizeTy>::Swap(TVec<TVal, TSizeTy>& Vec){ 01006 if (this!=&Vec){ 01007 ::Swap(MxVals, Vec.MxVals); 01008 ::Swap(Vals, Vec.Vals); 01009 ::Swap(ValT, Vec.ValT); 01010 } 01011 } 01012 01013 template <class TVal, class TSizeTy> 01014 TSizeTy TVec<TVal, TSizeTy>::AddV(const TVec<TVal, TSizeTy>& ValV){ 01015 AssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 01016 for (TSizeTy ValN=0; ValN<ValV.Vals; ValN++){Add(ValV[ValN]);} 01017 return Len(); 01018 } 01019 01020 template <class TVal, class TSizeTy> 01021 TSizeTy TVec<TVal, TSizeTy>::AddSorted(const TVal& Val, const bool& Asc, const TSizeTy& _MxVals){ 01022 AssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 01023 TSizeTy ValN=Add(Val); 01024 if (Asc){ 01025 while ((ValN>0)&&(ValT[ValN]<ValT[ValN-1])){ 01026 Swap(ValN, ValN-1); ValN--;} 01027 } else { 01028 while ((ValN>0)&&(ValT[ValN]>ValT[ValN-1])){ 01029 Swap(ValN, ValN-1); ValN--;} 01030 } 01031 if ((_MxVals!=-1)&&(Len()>_MxVals)){Del(_MxVals, Len()-1);} 01032 return ValN; 01033 } 01034 01035 template <class TVal, class TSizeTy> 01036 TSizeTy TVec<TVal, TSizeTy>::AddBackSorted(const TVal& Val, const bool& Asc){ 01037 AssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 01038 Add(); 01039 TSizeTy ValN=Vals-2; 01040 while ((ValN>=0)&&((Asc&&(Val<ValT[ValN]))||(!Asc&&(Val>ValT[ValN])))){ 01041 ValT[ValN+1]=ValT[ValN]; ValN--;} 01042 ValT[ValN+1]=Val; 01043 return ValN+1; 01044 } 01045 01046 template <class TVal, class TSizeTy> 01047 TSizeTy TVec<TVal, TSizeTy>::AddMerged(const TVal& Val){ 01048 AssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 01049 TSizeTy ValN=SearchBin(Val); 01050 if (ValN==-1){return AddSorted(Val);} 01051 else {GetVal(ValN)=Val; return -1;} 01052 } 01053 01054 template <class TVal, class TSizeTy> 01055 TSizeTy TVec<TVal, TSizeTy>::AddVMerged(const TVec<TVal, TSizeTy>& ValV){ 01056 AssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 01057 for (TSizeTy ValN=0; ValN<ValV.Vals; ValN++){AddMerged(ValV[ValN]);} 01058 return Len(); 01059 } 01060 01061 template <class TVal, class TSizeTy> 01062 TSizeTy TVec<TVal, TSizeTy>::AddUnique(const TVal& Val){ 01063 AssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 01064 TSizeTy ValN=SearchForw(Val); 01065 if (ValN==-1){return Add(Val);} 01066 else {GetVal(ValN)=Val; return -1;} 01067 } 01068 01069 template <class TVal, class TSizeTy> 01070 void TVec<TVal, TSizeTy>::GetSubValV(const TSizeTy& _BValN, const TSizeTy& _EValN, TVec<TVal, TSizeTy>& SubValV) const { 01071 const TSizeTy BValN=TInt::GetInRng(_BValN, 0, Len()-1); 01072 const TSizeTy EValN=TInt::GetInRng(_EValN, 0, Len()-1); 01073 const TSizeTy SubVals=TInt::GetMx(0, EValN-BValN+1); 01074 SubValV.Gen(SubVals, 0); 01075 for (TSizeTy ValN=BValN; ValN<=EValN; ValN++){ 01076 SubValV.Add(GetVal(ValN));} 01077 } 01078 01079 template <class TVal, class TSizeTy> 01080 void TVec<TVal, TSizeTy>::Ins(const TSizeTy& ValN, const TVal& Val){ 01081 AssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 01082 Add(); Assert((0<=ValN)&&(ValN<Vals)); 01083 for (TSizeTy MValN=Vals-2; MValN>=ValN; MValN--){ValT[MValN+1]=ValT[MValN];} 01084 ValT[ValN]=Val; 01085 } 01086 01087 template <class TVal, class TSizeTy> 01088 void TVec<TVal, TSizeTy>::Del(const TSizeTy& ValN){ 01089 AssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 01090 Assert((0<=ValN)&&(ValN<Vals)); 01091 for (TSizeTy MValN=ValN+1; MValN<Vals; MValN++){ 01092 ValT[MValN-1]=ValT[MValN];} 01093 ValT[--Vals]=TVal(); 01094 } 01095 01096 template <class TVal, class TSizeTy> 01097 void TVec<TVal, TSizeTy>::Del(const TSizeTy& MnValN, const TSizeTy& MxValN){ 01098 AssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 01099 Assert((0<=MnValN)&&(MnValN<Vals)&&(0<=MxValN)&&(MxValN<Vals)); 01100 Assert(MnValN<=MxValN); 01101 for (TSizeTy ValN=MxValN+1; ValN<Vals; ValN++){ 01102 ValT[MnValN+ValN-MxValN-1]=ValT[ValN];} 01103 for (TSizeTy ValN=Vals-MxValN+MnValN-1; ValN<Vals; ValN++){ 01104 ValT[ValN]=TVal();} 01105 Vals-=MxValN-MnValN+1; 01106 } 01107 01108 template <class TVal, class TSizeTy> 01109 bool TVec<TVal, TSizeTy>::DelIfIn(const TVal& Val){ 01110 AssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 01111 TSizeTy ValN=SearchForw(Val); 01112 if (ValN!=-1){Del(ValN); return true;} 01113 else {return false;} 01114 } 01115 01116 template <class TVal, class TSizeTy> 01117 void TVec<TVal, TSizeTy>::DelAll(const TVal& Val){ 01118 AssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 01119 TSizeTy ValN; 01120 while ((ValN=SearchForw(Val))!=-1){Del(ValN);} 01121 } 01122 01123 template <class TVal, class TSizeTy> 01124 void TVec<TVal, TSizeTy>::PutAll(const TVal& Val){ 01125 for (TSizeTy ValN=0; ValN<Vals; ValN++){ValT[ValN]=Val;} 01126 } 01127 01128 template <class TVal, class TSizeTy> 01129 void TVec<TVal, TSizeTy>::BSort(const TSizeTy& MnLValN, const TSizeTy& MxRValN, const bool& Asc){ 01130 for (TSizeTy ValN1=MnLValN; ValN1<=MxRValN; ValN1++){ 01131 for (TSizeTy ValN2=MxRValN; ValN2>ValN1; ValN2--){ 01132 if (Asc){ 01133 if (ValT[ValN2]<ValT[ValN2-1]){Swap(ValN2, ValN2-1);} 01134 } else { 01135 if (ValT[ValN2]>ValT[ValN2-1]){Swap(ValN2, ValN2-1);} 01136 } 01137 } 01138 } 01139 } 01140 01141 template <class TVal, class TSizeTy> 01142 void TVec<TVal, TSizeTy>::ISort(const TSizeTy& MnLValN, const TSizeTy& MxRValN, const bool& Asc){ 01143 if (MnLValN<MxRValN){ 01144 for (TSizeTy ValN1=MnLValN+1; ValN1<=MxRValN; ValN1++){ 01145 TVal Val=ValT[ValN1]; TSizeTy ValN2=ValN1; 01146 if (Asc){ 01147 while ((ValN2>MnLValN)&&(ValT[ValN2-1]>Val)){ 01148 ValT[ValN2]=ValT[ValN2-1]; ValN2--;} 01149 } else { 01150 while ((ValN2>MnLValN)&&(ValT[ValN2-1]<Val)){ 01151 ValT[ValN2]=ValT[ValN2-1]; ValN2--;} 01152 } 01153 ValT[ValN2]=Val; 01154 } 01155 } 01156 } 01157 01158 template <class TVal, class TSizeTy> 01159 TSizeTy TVec<TVal, TSizeTy>::GetPivotValN(const TSizeTy& LValN, const TSizeTy& RValN) const { 01160 TSizeTy SubVals=RValN-LValN+1; 01161 if (SubVals > TInt::Mx-1) { SubVals = TInt::Mx-1; } 01162 const TSizeTy ValN1=LValN+TInt::GetRnd(int(SubVals)); 01163 const TSizeTy ValN2=LValN+TInt::GetRnd(int(SubVals)); 01164 const TSizeTy ValN3=LValN+TInt::GetRnd(int(SubVals)); 01165 const TVal& Val1=ValT[ValN1]; 01166 const TVal& Val2=ValT[ValN2]; 01167 const TVal& Val3=ValT[ValN3]; 01168 if (Val1<Val2){ 01169 if (Val2<Val3){return ValN2;} 01170 else if (Val3<Val1){return ValN1;} 01171 else {return ValN3;} 01172 } else { 01173 if (Val1<Val3){return ValN1;} 01174 else if (Val3<Val2){return ValN2;} 01175 else {return ValN3;} 01176 } 01177 } 01178 01179 template <class TVal, class TSizeTy> 01180 TSizeTy TVec<TVal, TSizeTy>::Partition(const TSizeTy& MnLValN, const TSizeTy& MxRValN, const bool& Asc){ 01181 TSizeTy PivotValN=GetPivotValN(MnLValN, MxRValN); 01182 Swap(PivotValN, MnLValN); 01183 TVal PivotVal=ValT[MnLValN]; 01184 TSizeTy LValN=MnLValN-1; TSizeTy RValN=MxRValN+1; 01185 forever { 01186 if (Asc){ 01187 do {RValN--;} while (ValT[RValN]>PivotVal); 01188 do {LValN++;} while (ValT[LValN]<PivotVal); 01189 } else { 01190 do {RValN--;} while (ValT[RValN]<PivotVal); 01191 do {LValN++;} while (ValT[LValN]>PivotVal); 01192 } 01193 if (LValN<RValN){Swap(LValN, RValN);} 01194 else {return RValN;} 01195 }; 01196 } 01197 01198 template <class TVal, class TSizeTy> 01199 void TVec<TVal, TSizeTy>::QSort(const TSizeTy& MnLValN, const TSizeTy& MxRValN, const bool& Asc){ 01200 if (MnLValN<MxRValN){ 01201 if (MxRValN-MnLValN<20){ 01202 ISort(MnLValN, MxRValN, Asc); 01203 } else { 01204 TSizeTy SplitValN=Partition(MnLValN, MxRValN, Asc); 01205 QSort(MnLValN, SplitValN, Asc); 01206 QSort(SplitValN+1, MxRValN, Asc); 01207 } 01208 } 01209 } 01210 01211 template <class TVal, class TSizeTy> 01212 void TVec<TVal, TSizeTy>::Sort(const bool& Asc){ 01213 QSort(0, Len()-1, Asc); 01214 } 01215 01216 template <class TVal, class TSizeTy> 01217 bool TVec<TVal, TSizeTy>::IsSorted(const bool& Asc) const { 01218 if (Asc){ 01219 for (TSizeTy ValN=0; ValN<Vals-1; ValN++){ 01220 if (ValT[ValN]>ValT[ValN+1]){return false;}} 01221 } else { 01222 for (TSizeTy ValN=0; ValN<Vals-1; ValN++){ 01223 if (ValT[ValN]<ValT[ValN+1]){return false;}} 01224 } 01225 return true; 01226 } 01227 01228 template <class TVal, class TSizeTy> 01229 void TVec<TVal, TSizeTy>::Shuffle(TRnd& Rnd){ 01230 if (Len() < TInt::Mx) { 01231 for (TSizeTy ValN=0; ValN<Vals-1; ValN++){ 01232 const int Range = int(Vals-ValN); 01233 Swap(ValN, ValN+Rnd.GetUniDevInt(Range)); 01234 } 01235 } else { 01236 for (TSizeTy ValN=0; ValN<Vals-1; ValN++){ 01237 const TSizeTy Range = Vals-ValN; 01238 Swap(ValN, TSizeTy(ValN+Rnd.GetUniDevInt64(Range))); 01239 } 01240 } 01241 } 01242 01243 template <class TVal, class TSizeTy> 01244 void TVec<TVal, TSizeTy>::Reverse(){ 01245 for (TSizeTy ValN=0; ValN<Vals/2; ValN++){ 01246 Swap(ValN, Vals-ValN-1);} 01247 } 01248 01249 template <class TVal, class TSizeTy> 01250 void TVec<TVal, TSizeTy>::Merge(){ 01251 AssertR(MxVals!=-1, "This vector was obtained from TVecPool. Such vectors cannot change its size!"); 01252 TVec<TVal, TSizeTy> SortedVec(*this); SortedVec.Sort(); 01253 Clr(); 01254 for (TSizeTy ValN=0; ValN<SortedVec.Len(); ValN++){ 01255 if ((ValN==0)||(SortedVec[ValN-1]!=SortedVec[ValN])){ 01256 Add(SortedVec[ValN]);} 01257 } 01258 } 01259 01260 template <class TVal, class TSizeTy> 01261 bool TVec<TVal, TSizeTy>::NextPerm() { 01262 // start with a sorted sequence to obtain all permutations 01263 TSizeTy First = 0, Last = Len(), Next = Len()-1; 01264 if (Last < 2) return false; 01265 for(; ; ) { 01266 // find rightmost element smaller than successor 01267 TSizeTy Next1 = Next; 01268 if (GetVal(--Next) < GetVal(Next1)) { // swap with rightmost element that's smaller, flip suffix 01269 TSizeTy Mid = Last; 01270 for (; GetVal(Next) >= GetVal(--Mid); ) { } 01271 Swap(Next, Mid); 01272 Reverse(Next1, Last-1); 01273 return true; 01274 } 01275 if (Next == First) { // pure descending, flip all 01276 Reverse(); 01277 return false; 01278 } 01279 } 01280 } 01281 01282 template <class TVal, class TSizeTy> 01283 bool TVec<TVal, TSizeTy>::PrevPerm() { 01284 TSizeTy First = 0, Last = Len(), Next = Len()-1; 01285 if (Last < 2) return false; 01286 for(; ; ) { 01287 // find rightmost element not smaller than successor 01288 TSizeTy Next1 = Next; 01289 if (GetVal(--Next) >= GetVal(Next1)) { // swap with rightmost element that's not smaller, flip suffix 01290 TSizeTy Mid = Last; 01291 for (; GetVal(Next) < GetVal(--Mid); ) { } 01292 Swap(Next, Mid); 01293 Reverse(Next1, Last); 01294 return true; 01295 } 01296 if (Next == First) { // pure descending, flip all 01297 Reverse(); 01298 return false; 01299 } 01300 } 01301 } 01302 01303 template <class TVal, class TSizeTy> 01304 void TVec<TVal, TSizeTy>::Intrs(const TVec<TVal, TSizeTy>& ValV){ 01305 TVec<TVal, TSizeTy> IntrsVec; 01306 Intrs(ValV, IntrsVec); 01307 MoveFrom(IntrsVec); 01308 } 01309 01310 template <class TVal, class TSizeTy> 01311 void TVec<TVal, TSizeTy>::Union(const TVec<TVal, TSizeTy>& ValV){ 01312 TVec<TVal, TSizeTy> UnionVec; 01313 Union(ValV, UnionVec); 01314 MoveFrom(UnionVec); 01315 } 01316 01317 template <class TVal, class TSizeTy> 01318 void TVec<TVal, TSizeTy>::Diff(const TVec<TVal, TSizeTy>& ValV){ 01319 TVec<TVal, TSizeTy> DiffVec; 01320 Diff(ValV, DiffVec); 01321 MoveFrom(DiffVec); 01322 } 01323 01324 template <class TVal, class TSizeTy> 01325 void TVec<TVal, TSizeTy>::Intrs(const TVec<TVal, TSizeTy>& ValV, TVec<TVal, TSizeTy>& DstValV) const { 01326 DstValV.Clr(); 01327 TSizeTy ValN1=0, ValN2=0; 01328 while ((ValN1<Len())&&(ValN2<ValV.Len())){ 01329 const TVal& Val1=GetVal(ValN1); 01330 while ((ValN2<ValV.Len())&&(Val1>ValV.GetVal(ValN2))){ 01331 ValN2++;} 01332 if ((ValN2<ValV.Len())&&(Val1==ValV.GetVal(ValN2))){ 01333 DstValV.Add(Val1); ValN2++;} 01334 ValN1++; 01335 } 01336 } 01337 01338 template <class TVal, class TSizeTy> 01339 void TVec<TVal, TSizeTy>::Union(const TVec<TVal, TSizeTy>& ValV, TVec<TVal, TSizeTy>& DstValV) const { 01340 DstValV.Gen(TInt::GetMx(Len(), ValV.Len()), 0); 01341 TSizeTy ValN1=0, ValN2=0; 01342 while ((ValN1<Len())&&(ValN2<ValV.Len())){ 01343 const TVal& Val1=GetVal(ValN1); 01344 const TVal& Val2=ValV.GetVal(ValN2); 01345 if (Val1<Val2){DstValV.Add(Val1); ValN1++;} 01346 else if (Val1>Val2){DstValV.Add(Val2); ValN2++;} 01347 else {DstValV.Add(Val1); ValN1++; ValN2++;} 01348 } 01349 for (TSizeTy RestValN1=ValN1; RestValN1<Len(); RestValN1++){ 01350 DstValV.Add(GetVal(RestValN1));} 01351 for (TSizeTy RestValN2=ValN2; RestValN2<ValV.Len(); RestValN2++){ 01352 DstValV.Add(ValV.GetVal(RestValN2));} 01353 } 01354 01355 template <class TVal, class TSizeTy> 01356 void TVec<TVal, TSizeTy>::Diff(const TVec<TVal, TSizeTy>& ValV, TVec<TVal, TSizeTy>& DstValV) const { 01357 DstValV.Clr(); 01358 TSizeTy ValN1=0, ValN2=0; 01359 while (ValN1<Len() && ValN2<ValV.Len()) { 01360 const TVal& Val1 = GetVal(ValN1); 01361 while (ValN2<ValV.Len() && Val1>ValV.GetVal(ValN2)) ValN2++; 01362 if (ValN2<ValV.Len()) { 01363 if (Val1!=ValV.GetVal(ValN2)) { DstValV.Add(Val1); } 01364 ValN1++; 01365 } 01366 } 01367 for (TSizeTy RestValN1=ValN1; RestValN1<Len(); RestValN1++){ 01368 DstValV.Add(GetVal(RestValN1));} 01369 } 01370 01371 template <class TVal, class TSizeTy> 01372 TSizeTy TVec<TVal, TSizeTy>::IntrsLen(const TVec<TVal, TSizeTy>& ValV) const { 01373 TSizeTy Cnt=0, ValN1=0, ValN2=0; 01374 while ((ValN1<Len())&&(ValN2<ValV.Len())){ 01375 const TVal& Val1=GetVal(ValN1); 01376 while ((ValN2<ValV.Len())&&(Val1>ValV.GetVal(ValN2))){ 01377 ValN2++;} 01378 if ((ValN2<ValV.Len())&&(Val1==ValV.GetVal(ValN2))){ 01379 ValN2++; Cnt++;} 01380 ValN1++; 01381 } 01382 return Cnt; 01383 } 01384 01385 template <class TVal, class TSizeTy> 01386 TSizeTy TVec<TVal, TSizeTy>::UnionLen(const TVec<TVal, TSizeTy>& ValV) const { 01387 TSizeTy Cnt = 0, ValN1 = 0, ValN2 = 0; 01388 while ((ValN1 < Len()) && (ValN2 < ValV.Len())) { 01389 const TVal& Val1 = GetVal(ValN1); 01390 const TVal& Val2 = ValV.GetVal(ValN2); 01391 if (Val1 < Val2) { 01392 Cnt++; ValN1++; 01393 } else if (Val1 > Val2) { 01394 Cnt++; ValN2++; 01395 } else { 01396 Cnt++; ValN1++; ValN2++; 01397 } 01398 } 01399 Cnt += (Len() - ValN1) + (ValV.Len() - ValN2); 01400 return Cnt; 01401 } 01402 01403 template <class TVal, class TSizeTy> 01404 TSizeTy TVec<TVal, TSizeTy>::Count(const TVal& Val) const { 01405 TSizeTy Count = 0; 01406 for (TSizeTy i = 0; i < Len(); i++){ 01407 if (Val == ValT[i]){Count++;}} 01408 return Count; 01409 } 01410 01411 template <class TVal, class TSizeTy> 01412 TSizeTy TVec<TVal, TSizeTy>::SearchBin(const TVal& Val) const { 01413 TSizeTy LValN=0, RValN=Len()-1; 01414 while (RValN>=LValN){ 01415 TSizeTy ValN=(LValN+RValN)/2; 01416 if (Val==ValT[ValN]){return ValN;} 01417 if (Val<ValT[ValN]){RValN=ValN-1;} else {LValN=ValN+1;} 01418 } 01419 return -1; 01420 } 01421 01422 template <class TVal, class TSizeTy> 01423 TSizeTy TVec<TVal, TSizeTy>::SearchBin(const TVal& Val, TSizeTy& InsValN) const { 01424 TSizeTy LValN=0, RValN=Len()-1; 01425 while (RValN>=LValN){ 01426 TSizeTy ValN=(LValN+RValN)/2; 01427 if (Val==ValT[ValN]){InsValN=ValN; return ValN;} 01428 if (Val<ValT[ValN]){RValN=ValN-1;} else {LValN=ValN+1;} 01429 } 01430 InsValN=LValN; return -1; 01431 } 01432 01433 template <class TVal, class TSizeTy> 01434 TSizeTy TVec<TVal, TSizeTy>::SearchForw(const TVal& Val, const TSizeTy& BValN) const { 01435 for (TSizeTy ValN=BValN; ValN<Vals; ValN++){ 01436 if (Val==ValT[ValN]){return ValN;}} 01437 return -1; 01438 } 01439 01440 template <class TVal, class TSizeTy> 01441 TSizeTy TVec<TVal, TSizeTy>::SearchBack(const TVal& Val) const { 01442 for (TSizeTy ValN=Vals-1; ValN>=0; ValN--){ 01443 if (Val==ValT[ValN]){return ValN;}} 01444 return -1; 01445 } 01446 01447 template <class TVal, class TSizeTy> 01448 TSizeTy TVec<TVal, TSizeTy>::SearchVForw(const TVec<TVal, TSizeTy>& ValV, const TSizeTy& BValN) const { 01449 TSizeTy ValVLen=ValV.Len(); 01450 for (TSizeTy ValN=BValN; ValN<Vals-ValVLen+1; ValN++){ 01451 bool Found=true; 01452 for (TSizeTy SubValN=0; SubValN<ValVLen; SubValN++){ 01453 if (ValV[SubValN]!=GetVal(ValN+SubValN)){Found=false; break;} 01454 } 01455 if (Found){return ValN;} 01456 } 01457 return -1; 01458 } 01459 01460 template <class TVal, class TSizeTy> 01461 TSizeTy TVec<TVal, TSizeTy>::GetMxValN() const { 01462 if (Vals==0){return -1;} 01463 TSizeTy MxValN=0; 01464 for (TSizeTy ValN=1; ValN<Vals; ValN++){ 01465 if (ValT[ValN]>ValT[MxValN]){MxValN=ValN;} 01466 } 01467 return MxValN; 01468 } 01469 01471 // Vector 01472 namespace TGLib_OLD { 01473 01474 template <class TVal> 01475 class TVec{ 01476 public: 01477 typedef TVal* TIter; 01478 protected: 01479 int MxVals; // if MxVals==-1, then ValT is not owned by us, we don't free it! 01480 int Vals; 01481 TVal* ValT; 01482 void Resize(const int& _MxVals=-1); 01483 TStr GetXOutOfBoundsErrMsg(const int& ValN) const; 01484 public: 01485 TVec(): MxVals(0), Vals(0), ValT(NULL){} 01486 TVec(const TVec& Vec); 01487 explicit TVec(const int& _Vals){ 01488 IAssert(0<=_Vals); MxVals=Vals=_Vals; 01489 if (_Vals==0){ValT=NULL;} else {ValT=new TVal[_Vals];}} 01490 TVec(const int& _MxVals, const int& _Vals){ 01491 IAssert((0<=_Vals)&&(_Vals<=_MxVals)); MxVals=_MxVals; Vals=_Vals; 01492 if (_MxVals==0){ValT=NULL;} else {ValT=new TVal[_MxVals];}} 01493 explicit TVec(TVal *_ValT, const int& _Vals): 01494 MxVals(-1), Vals(_Vals), ValT(_ValT){} 01495 ~TVec(){if ((ValT!=NULL) && (MxVals!=-1)){delete[] ValT;}} 01496 explicit TVec(TSIn& SIn): MxVals(0), Vals(0), ValT(NULL){Load(SIn);} 01497 void Load(TSIn& SIn); 01498 void Save(TSOut& SOut) const; 01499 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm=""); 01500 void SaveXml(TSOut& SOut, const TStr& Nm) const; 01501 01502 TVec<TVal>& operator=(const TVec<TVal>& Vec); 01503 TVec<TVal>& operator+(const TVal& Val){Add(Val); return *this;} 01504 bool operator==(const TVec<TVal>& Vec) const; 01505 bool operator<(const TVec<TVal>& Vec) const; 01506 const TVal& operator[](const int& ValN) const { 01507 AssertR((0<=ValN)&&(ValN<Vals), GetXOutOfBoundsErrMsg(ValN)); 01508 return ValT[ValN];} 01509 TVal& operator[](const int& ValN){ 01510 AssertR((0<=ValN)&&(ValN<Vals), GetXOutOfBoundsErrMsg(ValN)); 01511 return ValT[ValN];} 01512 int GetMemUsed() const { 01513 return int(2*sizeof(int)+sizeof(TVal*)+MxVals*sizeof(TVal));} 01514 01515 int GetPrimHashCd() const; 01516 int GetSecHashCd() const; 01517 01518 void Gen(const int& _Vals){ 01519 IAssert(0<=_Vals); 01520 if (ValT!=NULL && MxVals!=-1){delete[] ValT;} MxVals=Vals=_Vals; 01521 if (MxVals==0){ValT=NULL;} else {ValT=new TVal[MxVals];}} 01522 void Gen(const int& _MxVals, const int& _Vals){ 01523 IAssert((0<=_Vals)&&(_Vals<=_MxVals)); 01524 if (ValT!=NULL && MxVals!=-1){delete[] ValT;} MxVals=_MxVals; Vals=_Vals; 01525 if (_MxVals==0){ValT=NULL;} else {ValT=new TVal[_MxVals];}} 01526 void GenExt(TVal *_ValT, const int& _Vals){ 01527 if (ValT!=NULL && MxVals!=-1){delete[] ValT;} 01528 MxVals=-1; Vals=_Vals; ValT=_ValT;} 01529 bool IsExt() const {return MxVals==-1;} 01530 void Reserve(const int& _MxVals){Resize(_MxVals);} 01531 void Reserve(const int& _MxVals, const int& _Vals){ 01532 IAssert((0<=_Vals)&&(_Vals<=_MxVals)); 01533 Resize(_MxVals); Vals=_Vals;} 01534 void Clr(const bool& DoDel=true, const int& NoDelLim=-1); 01535 void Trunc(const int& _Vals=-1); 01536 void Pack(); 01537 void MoveFrom(TVec<TVal>& Vec); 01538 void Swap(TVec<TVal>& Vec); 01539 01540 bool Empty() const {return Vals==0;} 01541 int Len() const {return Vals;} 01542 int Reserved() const {return MxVals;} 01543 const TVal& Last() const {return GetVal(Len()-1);} 01544 TVal& Last(){return GetVal(Len()-1);} 01545 int LastValN() const {return Len()-1;} 01546 const TVal& LastLast() const { 01547 AssertR(1<Vals, GetXOutOfBoundsErrMsg(Vals-2)); 01548 return ValT[Vals-2];} 01549 TVal& LastLast(){ 01550 AssertR(1<Vals, GetXOutOfBoundsErrMsg(Vals-2)); 01551 return ValT[Vals-2];} 01552 01553 TIter BegI() const {return ValT;} 01554 TIter EndI() const {return ValT+Vals;} 01555 TIter GetI(const int& ValN) const {return ValT+ValN;} 01556 01557 int Add(){ 01558 Assert(MxVals!=-1); if (Vals==MxVals){Resize();} return Vals++;} 01559 int Add(const TVal& Val){ 01560 Assert(MxVals!=-1); if (Vals==MxVals){Resize();} ValT[Vals]=Val; return Vals++;} 01561 int Add(const TVal& Val, const int& ResizeLen){ 01562 Assert(MxVals!=-1); if (Vals==MxVals){Resize(MxVals+ResizeLen);} ValT[Vals]=Val; return Vals++;} 01563 int AddV(const TVec<TVal>& ValV); 01564 int AddSorted(const TVal& Val, const bool& Asc=true, const int& _MxVals=-1); 01565 int AddBackSorted(const TVal& Val, const bool& Asc); 01566 int AddMerged(const TVal& Val); 01567 int AddVMerged(const TVec<TVal>& ValV); 01568 int AddUnique(const TVal& Val); 01569 const TVal& GetVal(const int& ValN) const {return operator[](ValN);} 01570 TVal& GetVal(const int& ValN){return operator[](ValN);} 01571 void GetSubValV(const int& BValN, const int& EValN, TVec<TVal>& ValV) const; 01572 void Ins(const int& ValN, const TVal& Val); 01573 void Del(const int& ValN); 01574 void Del(const int& MnValN, const int& MxValN); 01575 void DelLast(){Del(Len()-1);} 01576 bool DelIfIn(const TVal& Val); 01577 void DelAll(const TVal& Val); 01578 void PutAll(const TVal& Val); 01579 01580 void Swap(const int& ValN1, const int& ValN2){ 01581 TVal Val=ValT[ValN1]; ValT[ValN1]=ValT[ValN2]; ValT[ValN2]=Val;} 01582 static void SwapI(TIter LVal, TIter RVal){ 01583 TVal Val=*LVal; *LVal=*RVal; *RVal=Val;} 01584 01585 int GetPivotValN(const int& LValN, const int& RValN) const; 01586 void BSort(const int& MnLValN, const int& MxRValN, const bool& Asc); 01587 void ISort(const int& MnLValN, const int& MxRValN, const bool& Asc); 01588 int Partition(const int& MnLValN, const int& MxRValN, const bool& Asc); 01589 void QSort(const int& MnLValN, const int& MxRValN, const bool& Asc); 01590 void Sort(const bool& Asc=true); 01591 bool IsSorted(const bool& Asc=true) const; 01592 void Shuffle(TRnd& Rnd); 01593 void Reverse(); 01594 void Reverse(int First, int Last){ 01595 Last--; while (First < Last){Swap(First++, Last--);}} 01596 void Merge(); 01597 // permutations 01598 bool NextPerm(); 01599 bool PrevPerm(); 01600 01601 // binary heap //J: 01602 void MakeHeap() { MakeHeap(TLss<TVal>()); } // build a heap 01603 void PushHeap(const TVal& Val) { PushHeap(Val, TLss<TVal>()); } // add element to the heap 01604 const TVal& TopHeap() const { return ValT[0]; } // get largest element 01605 TVal PopHeap() { return PopHeap(TLss<TVal>()); } // remove largest element 01606 template <class TCmp> void MakeHeap(const TCmp& Cmp) { MakeHeap(0, Len(), Cmp); } 01607 template <class TCmp> void PushHeap(const TVal& Val, const TCmp& Cmp) { Add(Val); PushHeap(0, Len()-1, 0, Val, Cmp); } 01608 template <class TCmp> TVal PopHeap(const TCmp& Cmp) { IAssert(! Empty()); const TVal Top=ValT[0]; 01609 ValT[0]=Last(); DelLast(); if (! Empty()) { AdjustHeap(0, 0, Len(), ValT[0], Cmp); } return Top; } 01610 // heap helper functions 01611 template <class TCmp> 01612 void PushHeap(const int& First, int HoleIdx, const int& Top, TVal Val, const TCmp& Cmp) { 01613 int Parent = (HoleIdx-1)/2; 01614 while (HoleIdx > Top && Cmp(ValT[First+Parent], Val)) { 01615 ValT[First+HoleIdx] = ValT[First+Parent]; 01616 HoleIdx = Parent; Parent = (HoleIdx-1)/2; } 01617 ValT[First+HoleIdx] = Val; 01618 } 01619 template <class TCmp> 01620 void AdjustHeap(const int& First, int HoleIdx, const int& Len, TVal Val, const TCmp& Cmp) { 01621 const int Top = HoleIdx; 01622 int Right = 2*HoleIdx+2; 01623 while (Right < Len) { 01624 if (Cmp(ValT[First+Right], ValT[First+Right-1])) { Right--; } 01625 ValT[First+HoleIdx] = ValT[First+Right]; 01626 HoleIdx = Right; Right = 2*(Right+1); } 01627 if (Right == Len) { 01628 ValT[First+HoleIdx] = ValT[First+Right-1]; 01629 HoleIdx = Right-1; } 01630 PushHeap(First, HoleIdx, Top, Val, Cmp); 01631 } 01632 template <class TCmp> 01633 void MakeHeap(const int& First, const int& Len, const TCmp& Cmp) { 01634 if (Len < 2) { return; } 01635 int Parent = (Len-2)/2; 01636 while (true) { 01637 AdjustHeap(First, Parent, Len, ValT[First+Parent], Cmp); 01638 if (Parent == 0) { return; } Parent--; } 01639 } 01640 01641 template <class TCmp> 01642 static TIter GetPivotValNCmp(const TIter& BI, const TIter& EI, const TCmp& Cmp) { 01643 const int SubVals=int(EI-BI); 01644 const int ValN1=TInt::GetRnd(SubVals); 01645 const int ValN2=TInt::GetRnd(SubVals); 01646 const int ValN3=TInt::GetRnd(SubVals); 01647 const TVal& Val1 = *(BI+ValN1); 01648 const TVal& Val2 = *(BI+ValN2); 01649 const TVal& Val3 = *(BI+ValN3); 01650 if (Cmp(Val1, Val2)) { 01651 if (Cmp(Val2, Val3)) return BI+ValN2; 01652 else if (Cmp(Val3, Val1)) return BI+ValN1; 01653 else return BI+ValN3; 01654 } else { 01655 if (Cmp(Val1, Val3)) return BI+ValN1; 01656 else if (Cmp(Val3, Val2)) return BI+ValN2; 01657 else return BI+ValN3; 01658 } 01659 } 01660 01661 template <class TCmp> 01662 static TIter PartitionCmp(TIter BI, TIter EI, const TVal Pivot, const TCmp& Cmp) { 01663 forever { 01664 while (Cmp(*BI, Pivot)) ++BI; 01665 --EI; 01666 while (Cmp(Pivot, *EI)) --EI; 01667 if (!(BI < EI)) return BI; 01668 SwapI(BI, EI); 01669 ++BI; 01670 } 01671 } 01672 01673 template <class TCmp> 01674 static void BSortCmp(TIter BI, TIter EI, const TCmp& Cmp) { 01675 for (TIter i = BI; i != EI; ++i) { 01676 for (TIter j = EI-1; j != i; --j) { 01677 if (Cmp(*j, *(j-1))) SwapI(j, j-1); } 01678 } 01679 } 01680 01681 template <class TCmp> 01682 static void ISortCmp(TIter BI, TIter EI, const TCmp& Cmp) { 01683 if (BI + 1 < EI) { 01684 for (TIter i = BI, j; i != EI; ++i) { 01685 TVal Tmp = *i; j = i; 01686 while (j > BI && Cmp(Tmp, *(j-1))) { *j = *(j-1); --j; } 01687 *j = Tmp; 01688 } 01689 } 01690 } 01691 01692 template <class TCmp> 01693 static void QSortCmp(TIter BI, TIter EI, const TCmp& Cmp) { 01694 if (BI + 1 < EI) { 01695 if (EI - BI < 20) { 01696 ISortCmp(BI, EI, Cmp); } 01697 else { 01698 const TVal Val = *GetPivotValNCmp(BI, EI, Cmp); 01699 TIter Split = PartitionCmp(BI, EI, Val, Cmp); 01700 QSortCmp(BI, Split, Cmp); 01701 QSortCmp(Split, EI, Cmp); 01702 } 01703 } 01704 } 01705 01706 // void Sort(const bool& Asc = true) { 01707 // if (Asc){QSortCmp(Beg(), End(), TLss<TVal>());} 01708 // else {QSortCmp(Beg(), End(), TGtr<TVal>());}} 01709 01710 template <class TCmp> 01711 void SortCmp(const TCmp& Cmp){ 01712 QSortCmp(BegI(), EndI(), Cmp);} 01713 01714 // bool IsSorted(const bool& Asc = true) const { 01715 // if (Asc){return IsSortedCmp(TLss<TVal>());} 01716 // else {return IsSortedCmp(TGtr<TVal>());}} 01717 01718 template <class TCmp> 01719 bool IsSortedCmp(const TCmp& Cmp) const { 01720 if (EndI() == BegI()) return true; 01721 for (TIter i = BegI(); i != EndI()-1; ++i) { 01722 if (Cmp(*(i+1), *i)){return false;}} 01723 return true; 01724 } 01725 01726 void Intrs(const TVec<TVal>& ValV); 01727 void Union(const TVec<TVal>& ValV); 01728 void Diff(const TVec<TVal>& ValV); // union without intersection 01729 void Minus(const TVec<TVal>& ValV); // this without intersection 01730 void Intrs(const TVec<TVal>& ValV, TVec<TVal>& DstValV) const; 01731 void Union(const TVec<TVal>& ValV, TVec<TVal>& DstValV) const; 01732 void Diff(const TVec<TVal>& ValV, TVec<TVal>& DstValV) const; 01734 int IntrsLen(const TVec<TVal>& ValV) const; 01736 int UnionLen(const TVec<TVal>& ValV) const; 01737 void Minus(const TVec<TVal>& ValV, TVec<TVal>& DstValV) const; 01738 01739 int Count(const TVal& Val) const; 01740 int SearchBin(const TVal& Val) const; 01741 int SearchBin(const TVal& Val, int& InsValN) const; 01742 int SearchForw(const TVal& Val, const int& BValN=0) const; 01743 int SearchBack(const TVal& Val) const; 01744 int SearchVForw(const TVec<TVal>& ValV, const int& BValN=0) const; 01745 bool IsIn(const TVal& Val) const {return SearchForw(Val)!=-1;} 01746 bool IsIn(const TVal& Val, int& ValN) const { 01747 ValN=SearchForw(Val); return ValN!=-1;} 01748 bool IsInBin(const TVal& Val) const {return SearchBin(Val)!=-1;} 01749 int GetMxValN() const; 01750 TVal& GetDat(const TVal& Val) const { 01751 int ValN=SearchForw(Val); 01752 return operator[](ValN);} 01753 TVal& GetAddDat(const TVal& Val){ 01754 Assert(MxVals!=-1); 01755 int ValN=SearchForw(Val); 01756 if (ValN==-1){Add(Val); return Last();} 01757 else {return operator[](ValN);}} 01758 01759 // short vectors 01760 static TVec<TVal> GetV(const TVal& Val1){ 01761 TVec<TVal> V(1, 0); V.Add(Val1); return V;} 01762 static TVec<TVal> GetV(const TVal& Val1, const TVal& Val2){ 01763 TVec<TVal> V(2, 0); V.Add(Val1); V.Add(Val2); return V;} 01764 static TVec<TVal> GetV(const TVal& Val1, const TVal& Val2, const TVal& Val3){ 01765 TVec<TVal> V(3, 0); V.Add(Val1); V.Add(Val2); V.Add(Val3); return V;} 01766 static TVec<TVal> GetV(const TVal& Val1, const TVal& Val2, const TVal& Val3, const TVal& Val4){ 01767 TVec<TVal> V(4, 0); V.Add(Val1); V.Add(Val2); V.Add(Val3); V.Add(Val4); return V;} 01768 static TVec<TVal> GetV(const TVal& Val1, const TVal& Val2, const TVal& Val3, const TVal& Val4, const TVal& Val5){ 01769 TVec<TVal> V(5, 0); V.Add(Val1); V.Add(Val2); V.Add(Val3); V.Add(Val4); V.Add(Val5); return V;} 01770 static TVec<TVal> GetV(const TVal& Val1, const TVal& Val2, const TVal& Val3, const TVal& Val4, const TVal& Val5, const TVal& Val6){ 01771 TVec<TVal> V(6, 0); V.Add(Val1); V.Add(Val2); V.Add(Val3); V.Add(Val4); V.Add(Val5); V.Add(Val6); return V;} 01772 static TVec<TVal> GetV(const TVal& Val1, const TVal& Val2, const TVal& Val3, const TVal& Val4, const TVal& Val5, const TVal& Val6, const TVal& Val7){ 01773 TVec<TVal> V(7, 0); V.Add(Val1); V.Add(Val2); V.Add(Val3); V.Add(Val4); V.Add(Val5); V.Add(Val6); V.Add(Val7); return V;} 01774 static TVec<TVal> GetV(const TVal& Val1, const TVal& Val2, const TVal& Val3, const TVal& Val4, const TVal& Val5, const TVal& Val6, const TVal& Val7, const TVal& Val8){ 01775 TVec<TVal> V(8, 0); V.Add(Val1); V.Add(Val2); V.Add(Val3); V.Add(Val4); V.Add(Val5); V.Add(Val6); V.Add(Val7); V.Add(Val8); return V;} 01776 static TVec<TVal> GetV(const TVal& Val1, const TVal& Val2, const TVal& Val3, const TVal& Val4, const TVal& Val5, const TVal& Val6, const TVal& Val7, const TVal& Val8, const TVal& Val9){ 01777 TVec<TVal> V(9, 0); V.Add(Val1); V.Add(Val2); V.Add(Val3); V.Add(Val4); V.Add(Val5); V.Add(Val6); V.Add(Val7); V.Add(Val8); V.Add(Val9); return V;} 01778 //static TVec<TVal> GetV(const TVal* ValPt, const TVal& EndVal){ 01779 // TVec<TVal> V; while(*ValPt!=EndVal){V.Add(*ValPt); ValPt++;} return V;} 01780 }; 01781 01782 template <class TVal> 01783 void TVec<TVal>::Resize(const int& _MxVals){ 01784 IAssertR(MxVals!=-1, TStr::Fmt("Can not resize buffer. %s. [Program failed to allocate more memory. Solution: Get a bigger machine and a 64-bit compiler.]", GetTypeNm(*this).CStr()).CStr()); 01785 if (_MxVals==-1){ 01786 if (Vals==0){MxVals=16;} else {MxVals*=2;} 01787 } else { 01788 if (_MxVals<=MxVals){return;} else {MxVals=_MxVals;} 01789 } 01790 if (ValT==NULL){ 01791 try {ValT=new TVal[MxVals];} 01792 catch (std::exception Ex){ 01793 FailR(TStr::Fmt("TVec::Resize 1: %s, Vals:%d, MxVals:%d, _MxVals:%d, Type:%s [Program failed to allocate more memory. Solution: Get a bigger machine and a 64-bit compiler.]", 01794 Ex.what(), Vals, MxVals, _MxVals, GetTypeNm(*this).CStr()).CStr());} 01795 } else { 01796 //if (Vals > 1000000) { 01797 // printf("%s resize %d -> %d\n", GetTypeNm(*this).CStr(), Vals, MxVals); } 01798 TVal* NewValT = NULL; 01799 try { 01800 NewValT=new TVal[MxVals];} 01801 catch (std::exception Ex){ 01802 FailR(TStr::Fmt("TVec::Resize 2: %s, Vals:%d, MxVals:%d, _MxVals:%d, Type:%s [Program failed to allocate more memory. Solution: Get a bigger machine and a 64-bit compiler.]", 01803 Ex.what(), Vals, MxVals, _MxVals, GetTypeNm(*this).CStr()).CStr());} 01804 Assert(NewValT!=NULL); 01805 for (int ValN=0; ValN<Vals; ValN++){NewValT[ValN]=ValT[ValN];} 01806 delete[] ValT; ValT=NewValT; 01807 } 01808 } 01809 01810 template <class TVal> 01811 TStr TVec<TVal>::GetXOutOfBoundsErrMsg(const int& ValN) const { 01812 return TStr()+ 01813 "Index:"+TInt::GetStr(ValN)+ 01814 " Vals:"+TInt::GetStr(Vals)+ 01815 " MxVals:"+TInt::GetStr(MxVals)+ 01816 " Type:"+GetTypeNm(*this); 01817 } 01818 01819 template <class TVal> 01820 TVec<TVal>::TVec(const TVec<TVal>& Vec){ 01821 MxVals=Vec.MxVals; Vals=Vec.Vals; 01822 if (MxVals==0){ValT=NULL;} else {ValT=new TVal[MxVals];} 01823 for (int ValN=0; ValN<Vec.Vals; ValN++){ValT[ValN]=Vec.ValT[ValN];} 01824 } 01825 01826 template <class TVal> 01827 void TVec<TVal>::Load(TSIn& SIn){ 01828 if ((ValT!=NULL)&&(MxVals!=-1)){delete[] ValT;} 01829 SIn.Load(MxVals); SIn.Load(Vals); MxVals=Vals; 01830 if (MxVals==0){ValT=NULL;} else {ValT=new TVal[MxVals];} 01831 for (int ValN=0; ValN<Vals; ValN++){ 01832 ValT[ValN]=TVal(SIn);} 01833 } 01834 01835 template <class TVal> 01836 void TVec<TVal>::Save(TSOut& SOut) const { 01837 if (MxVals!=-1){SOut.Save(MxVals);} else {SOut.Save(Vals);} 01838 SOut.Save(Vals); 01839 for (int ValN=0; ValN<Vals; ValN++){ValT[ValN].Save(SOut);} 01840 } 01841 01842 template <class TVal> 01843 TVec<TVal>& TVec<TVal>::operator=(const TVec<TVal>& Vec){ 01844 if (this!=&Vec){ 01845 if ((ValT!=NULL)&&(MxVals!=-1)){delete[] ValT;} 01846 MxVals=Vals=Vec.Vals; 01847 if (MxVals==0){ValT=NULL;} else {ValT=new TVal[MxVals];} 01848 for (int ValN=0; ValN<Vec.Vals; ValN++){ValT[ValN]=Vec.ValT[ValN];} 01849 } 01850 return *this; 01851 } 01852 01853 template <class TVal> 01854 bool TVec<TVal>::operator==(const TVec<TVal>& Vec) const { 01855 if (this==&Vec){return true;} 01856 if (Len()!=Vec.Len()){return false;} 01857 for (int ValN=0; ValN<Vals; ValN++){ 01858 if (ValT[ValN]!=Vec.ValT[ValN]){return false;}} 01859 return true; 01860 } 01861 01862 template <class TVal> 01863 bool TVec<TVal>::operator<(const TVec<TVal>& Vec) const { 01864 if (this==&Vec){return false;} 01865 if (Len()==Vec.Len()){ 01866 for (int ValN=0; ValN<Vals; ValN++){ 01867 if (ValT[ValN]<Vec.ValT[ValN]){return true;} 01868 else if (ValT[ValN]>Vec.ValT[ValN]){return false;} 01869 else {} 01870 } 01871 return false; 01872 } else { 01873 return Len()<Vec.Len(); 01874 } 01875 } 01876 01877 template <class TVal> 01878 int TVec<TVal>::GetPrimHashCd() const { 01879 int HashCd=0; 01880 for (int ValN=0; ValN<Vals; ValN++){ 01881 HashCd+=ValT[ValN].GetPrimHashCd();} 01882 return abs(HashCd); 01883 } 01884 01885 template <class TVal> 01886 int TVec<TVal>::GetSecHashCd() const { 01887 int HashCd=0; 01888 for (int ValN=0; ValN<Vals; ValN++){ 01889 HashCd+=ValT[ValN].GetSecHashCd();} 01890 return abs(HashCd); 01891 } 01892 01893 template <class TVal> 01894 void TVec<TVal>::Clr(const bool& DoDel, const int& NoDelLim){ 01895 if ((DoDel)||((!DoDel)&&(NoDelLim!=-1)&&(MxVals>NoDelLim))){ 01896 if ((ValT!=NULL)&&(MxVals!=-1)){delete[] ValT;} 01897 MxVals=Vals=0; ValT=NULL; 01898 } else { 01899 IAssert(MxVals!=-1); Vals=0; 01900 } 01901 } 01902 01903 template <class TVal> 01904 void TVec<TVal>::Trunc(const int& _Vals){ 01905 IAssert(MxVals!=-1); 01906 IAssert((_Vals==-1)||(_Vals>=0)); 01907 if ((_Vals!=-1)&&(_Vals>=Vals)){ 01908 return; 01909 } else 01910 if (((_Vals==-1)&&(Vals==0))||(_Vals==0)){ 01911 if (ValT!=NULL){delete[] ValT;} 01912 MxVals=Vals=0; ValT=NULL; 01913 } else { 01914 if (_Vals==-1){ 01915 if (MxVals==Vals){return;} else {MxVals=Vals;} 01916 } else { 01917 MxVals=Vals=_Vals; 01918 } 01919 TVal* NewValT=new TVal[MxVals]; 01920 IAssert(NewValT!=NULL); 01921 for (int ValN=0; ValN<Vals; ValN++){NewValT[ValN]=ValT[ValN];} 01922 delete[] ValT; ValT=NewValT; 01923 } 01924 } 01925 01926 template <class TVal> 01927 void TVec<TVal>::Pack(){ 01928 IAssert(MxVals!=-1); 01929 if (Vals==0){ 01930 if (ValT!=NULL){delete[] ValT;} ValT=NULL; 01931 } else 01932 if (Vals<MxVals){ 01933 MxVals=Vals; 01934 TVal* NewValT=new TVal[MxVals]; 01935 IAssert(NewValT!=NULL); 01936 for (int ValN=0; ValN<Vals; ValN++){NewValT[ValN]=ValT[ValN];} 01937 delete[] ValT; ValT=NewValT; 01938 } 01939 } 01940 01941 template <class TVal> 01942 void TVec<TVal>::MoveFrom(TVec<TVal>& Vec){ 01943 if (this!=&Vec){ 01944 if (ValT!=NULL && MxVals!=-1){delete[] ValT;} 01945 MxVals=Vec.MxVals; Vals=Vec.Vals; ValT=Vec.ValT; 01946 Vec.MxVals=0; Vec.Vals=0; Vec.ValT=NULL; 01947 } 01948 } 01949 01950 template <class TVal> 01951 void TVec<TVal>::Swap(TVec<TVal>& Vec){ 01952 if (this!=&Vec){ 01953 ::Swap(MxVals, Vec.MxVals); 01954 ::Swap(Vals, Vec.Vals); 01955 ::Swap(ValT, Vec.ValT); 01956 } 01957 } 01958 01959 template <class TVal> 01960 int TVec<TVal>::AddV(const TVec<TVal>& ValV){ 01961 Assert(MxVals!=-1); 01962 for (int ValN=0; ValN<ValV.Vals; ValN++){Add(ValV[ValN]);} 01963 return Len(); 01964 } 01965 01966 template <class TVal> 01967 int TVec<TVal>::AddSorted(const TVal& Val, const bool& Asc, const int& _MxVals){ 01968 Assert(MxVals!=-1); 01969 int ValN=Add(Val); 01970 if (Asc){ 01971 while ((ValN>0)&&(ValT[ValN]<ValT[ValN-1])){ 01972 Swap(ValN, ValN-1); ValN--;} 01973 } else { 01974 while ((ValN>0)&&(ValT[ValN]>ValT[ValN-1])){ 01975 Swap(ValN, ValN-1); ValN--;} 01976 } 01977 if ((_MxVals!=-1)&&(Len()>_MxVals)){Del(_MxVals, Len()-1);} 01978 return ValN; 01979 } 01980 01981 template <class TVal> 01982 int TVec<TVal>::AddBackSorted(const TVal& Val, const bool& Asc){ 01983 Assert(MxVals!=-1); 01984 Add(); 01985 int ValN=Vals-2; 01986 while ((ValN>=0)&&((Asc&&(Val<ValT[ValN]))||(!Asc&&(Val>ValT[ValN])))){ 01987 ValT[ValN+1]=ValT[ValN]; ValN--;} 01988 ValT[ValN+1]=Val; 01989 return ValN+1; 01990 } 01991 01992 template <class TVal> 01993 int TVec<TVal>::AddMerged(const TVal& Val){ 01994 Assert(MxVals!=-1); 01995 int ValN=SearchBin(Val); 01996 if (ValN==-1){return AddSorted(Val);} 01997 else {GetVal(ValN)=Val; return -1;} 01998 } 01999 02000 template <class TVal> 02001 int TVec<TVal>::AddVMerged(const TVec<TVal>& ValV){ 02002 Assert(MxVals!=-1); 02003 for (int ValN=0; ValN<ValV.Vals; ValN++){AddMerged(ValV[ValN]);} 02004 return Len(); 02005 } 02006 02007 template <class TVal> 02008 int TVec<TVal>::AddUnique(const TVal& Val){ 02009 Assert(MxVals!=-1); 02010 int ValN=SearchForw(Val); 02011 if (ValN==-1){return Add(Val);} 02012 else {GetVal(ValN)=Val; return -1;} 02013 } 02014 02015 template <class TVal> 02016 void TVec<TVal>::GetSubValV( 02017 const int& _BValN, const int& _EValN, TVec<TVal>& SubValV) const { 02018 int BValN=TInt::GetInRng(_BValN, 0, Len()-1); 02019 int EValN=TInt::GetInRng(_EValN, 0, Len()-1); 02020 int SubVals=TInt::GetMx(0, EValN-BValN+1); 02021 SubValV.Gen(SubVals, 0); 02022 for (int ValN=BValN; ValN<=EValN; ValN++){ 02023 SubValV.Add(GetVal(ValN));} 02024 } 02025 02026 template <class TVal> 02027 void TVec<TVal>::Ins(const int& ValN, const TVal& Val){ 02028 Assert(MxVals!=-1); 02029 Add(); Assert((0<=ValN)&&(ValN<Vals)); 02030 for (int MValN=Vals-2; MValN>=ValN; MValN--){ValT[MValN+1]=ValT[MValN];} 02031 ValT[ValN]=Val; 02032 } 02033 02034 template <class TVal> 02035 void TVec<TVal>::Del(const int& ValN){ 02036 Assert(MxVals!=-1); 02037 Assert((0<=ValN)&&(ValN<Vals)); 02038 for (int MValN=ValN+1; MValN<Vals; MValN++){ 02039 ValT[MValN-1]=ValT[MValN];} 02040 ValT[--Vals]=TVal(); 02041 } 02042 02043 template <class TVal> 02044 void TVec<TVal>::Del(const int& MnValN, const int& MxValN){ 02045 Assert(MxVals!=-1); 02046 Assert((0<=MnValN)&&(MnValN<Vals)&&(0<=MxValN)&&(MxValN<Vals)); 02047 Assert(MnValN<=MxValN); 02048 for (int ValN=MxValN+1; ValN<Vals; ValN++){ 02049 ValT[MnValN+ValN-MxValN-1]=ValT[ValN];} 02050 for (int ValN=Vals-MxValN+MnValN-1; ValN<Vals; ValN++){ 02051 ValT[ValN]=TVal();} 02052 Vals-=MxValN-MnValN+1; 02053 } 02054 02055 template <class TVal> 02056 bool TVec<TVal>::DelIfIn(const TVal& Val){ 02057 Assert(MxVals!=-1); 02058 int ValN=SearchForw(Val); 02059 if (ValN!=-1){Del(ValN); return true;} 02060 else {return false;} 02061 } 02062 02063 template <class TVal> 02064 void TVec<TVal>::DelAll(const TVal& Val){ 02065 Assert(MxVals!=-1); 02066 int ValN; 02067 while ((ValN=SearchForw(Val))!=-1){ 02068 Del(ValN);} 02069 } 02070 02071 template <class TVal> 02072 void TVec<TVal>::PutAll(const TVal& Val){ 02073 for (int ValN=0; ValN<Vals; ValN++){ValT[ValN]=Val;} 02074 } 02075 02076 template <class TVal> 02077 void TVec<TVal>::BSort( 02078 const int& MnLValN, const int& MxRValN, const bool& Asc){ 02079 for (int ValN1=MnLValN; ValN1<=MxRValN; ValN1++){ 02080 for (int ValN2=MxRValN; ValN2>ValN1; ValN2--){ 02081 if (Asc){ 02082 if (ValT[ValN2]<ValT[ValN2-1]){Swap(ValN2, ValN2-1);} 02083 } else { 02084 if (ValT[ValN2]>ValT[ValN2-1]){Swap(ValN2, ValN2-1);} 02085 } 02086 } 02087 } 02088 } 02089 02090 template <class TVal> 02091 void TVec<TVal>::ISort( 02092 const int& MnLValN, const int& MxRValN, const bool& Asc){ 02093 if (MnLValN<MxRValN){ 02094 for (int ValN1=MnLValN+1; ValN1<=MxRValN; ValN1++){ 02095 TVal Val=ValT[ValN1]; int ValN2=ValN1; 02096 if (Asc){ 02097 while ((ValN2>MnLValN)&&(ValT[ValN2-1]>Val)){ 02098 ValT[ValN2]=ValT[ValN2-1]; ValN2--;} 02099 } else { 02100 while ((ValN2>MnLValN)&&(ValT[ValN2-1]<Val)){ 02101 ValT[ValN2]=ValT[ValN2-1]; ValN2--;} 02102 } 02103 ValT[ValN2]=Val; 02104 } 02105 } 02106 } 02107 02108 template <class TVal> 02109 int TVec<TVal>::GetPivotValN(const int& LValN, const int& RValN) const { 02110 int SubVals=RValN-LValN+1; 02111 int ValN1=LValN+TInt::GetRnd(SubVals); 02112 int ValN2=LValN+TInt::GetRnd(SubVals); 02113 int ValN3=LValN+TInt::GetRnd(SubVals); 02114 const TVal& Val1=ValT[ValN1]; 02115 const TVal& Val2=ValT[ValN2]; 02116 const TVal& Val3=ValT[ValN3]; 02117 if (Val1<Val2){ 02118 if (Val2<Val3){return ValN2;} 02119 else if (Val3<Val1){return ValN1;} 02120 else {return ValN3;} 02121 } else { 02122 if (Val1<Val3){return ValN1;} 02123 else if (Val3<Val2){return ValN2;} 02124 else {return ValN3;} 02125 } 02126 } 02127 02128 template <class TVal> 02129 int TVec<TVal>::Partition( 02130 const int& MnLValN, const int& MxRValN, const bool& Asc){ 02131 int PivotValN=GetPivotValN(MnLValN, MxRValN); 02132 Swap(PivotValN, MnLValN); 02133 TVal PivotVal=ValT[MnLValN]; 02134 int LValN=MnLValN-1; int RValN=MxRValN+1; 02135 forever { 02136 if (Asc){ 02137 do {RValN--;} while (ValT[RValN]>PivotVal); 02138 do {LValN++;} while (ValT[LValN]<PivotVal); 02139 } else { 02140 do {RValN--;} while (ValT[RValN]<PivotVal); 02141 do {LValN++;} while (ValT[LValN]>PivotVal); 02142 } 02143 if (LValN<RValN){Swap(LValN, RValN);} 02144 else {return RValN;} 02145 }; 02146 } 02147 02148 template <class TVal> 02149 void TVec<TVal>::QSort( 02150 const int& MnLValN, const int& MxRValN, const bool& Asc){ 02151 if (MnLValN<MxRValN){ 02152 if (MxRValN-MnLValN<20){ 02153 ISort(MnLValN, MxRValN, Asc); 02154 } else { 02155 int SplitValN=Partition(MnLValN, MxRValN, Asc); 02156 QSort(MnLValN, SplitValN, Asc); 02157 QSort(SplitValN+1, MxRValN, Asc); 02158 } 02159 } 02160 } 02161 02162 template <class TVal> 02163 void TVec<TVal>::Sort(const bool& Asc){ 02164 QSort(0, Len()-1, Asc); 02165 } 02166 02167 template <class TVal> 02168 bool TVec<TVal>::IsSorted(const bool& Asc) const { 02169 if (Asc){ 02170 for (int ValN=0; ValN<Vals-1; ValN++){ 02171 if (ValT[ValN]>ValT[ValN+1]){return false;}} 02172 } else { 02173 for (int ValN=0; ValN<Vals-1; ValN++){ 02174 if (ValT[ValN]<ValT[ValN+1]){return false;}} 02175 } 02176 return true; 02177 } 02178 02179 template <class TVal> 02180 void TVec<TVal>::Shuffle(TRnd& Rnd){ 02181 for (int ValN=0; ValN<Vals-1; ValN++){ 02182 Swap(ValN, ValN+Rnd.GetUniDevInt(Vals-ValN));} 02183 } 02184 02185 template <class TVal> 02186 void TVec<TVal>::Reverse(){ 02187 for (int ValN=0; ValN<Vals/2; ValN++){ 02188 Swap(ValN, Vals-ValN-1);} 02189 } 02190 02191 template <class TVal> 02192 void TVec<TVal>::Merge(){ 02193 Assert(MxVals!=-1); 02194 TVec<TVal> SortedVec(*this); SortedVec.Sort(); 02195 Clr(); 02196 for (int ValN=0; ValN<SortedVec.Len(); ValN++){ 02197 if ((ValN==0)||(SortedVec[ValN-1]!=SortedVec[ValN])){ 02198 Add(SortedVec[ValN]);} 02199 } 02200 } 02201 02202 template <class TVal> 02203 bool TVec<TVal>::NextPerm() { 02204 // start with a sorted sequence to obtain all permutations 02205 int First = 0, Last = Len(), Next = Len()-1; 02206 if (Last < 2) return false; 02207 for(; ; ) { 02208 // find rightmost element smaller than successor 02209 int Next1 = Next; 02210 if (GetVal(--Next) < GetVal(Next1)) { // swap with rightmost element that's smaller, flip suffix 02211 int Mid = Last; 02212 for (; GetVal(Next) >= GetVal(--Mid); ) { } 02213 Swap(Next, Mid); 02214 Reverse(Next1, Last); 02215 return true; 02216 } 02217 if (Next == First) { // pure descending, flip all 02218 Reverse(); 02219 return false; 02220 } 02221 } 02222 } 02223 02224 template <class TVal> 02225 bool TVec<TVal>::PrevPerm() { 02226 int First = 0, Last = Len(), Next = Len()-1; 02227 if (Last < 2) return false; 02228 for(; ; ) { 02229 // find rightmost element not smaller than successor 02230 int Next1 = Next; 02231 if (GetVal(--Next) >= GetVal(Next1)) { // swap with rightmost element that's not smaller, flip suffix 02232 int Mid = Last; 02233 for (; GetVal(Next) < GetVal(--Mid); ) { } 02234 Swap(Next, Mid); 02235 Reverse(Next1, Last); 02236 return true; 02237 } 02238 if (Next == First) { // pure descending, flip all 02239 Reverse(); 02240 return false; 02241 } 02242 } 02243 } 02244 02245 template <class TVal> 02246 void TVec<TVal>::Intrs(const TVec<TVal>& ValV){ 02247 TVec<TVal> IntrsVec; 02248 Intrs(ValV, IntrsVec); 02249 MoveFrom(IntrsVec); 02250 } 02251 02252 template <class TVal> 02253 void TVec<TVal>::Union(const TVec<TVal>& ValV){ 02254 TVec<TVal> UnionVec; 02255 Union(ValV, UnionVec); 02256 MoveFrom(UnionVec); 02257 } 02258 02259 template <class TVal> 02260 void TVec<TVal>::Diff(const TVec<TVal>& ValV){ 02261 TVec<TVal> DiffVec; 02262 Diff(ValV, DiffVec); 02263 MoveFrom(DiffVec); 02264 } 02265 02266 template <class TVal> 02267 void TVec<TVal>::Minus(const TVec<TVal>& ValV){ 02268 TVec<TVal> MinusVec; 02269 Minus(ValV, MinusVec); 02270 MoveFrom(MinusVec); 02271 } 02272 02273 template <class TVal> 02274 void TVec<TVal>::Intrs(const TVec<TVal>& ValV, TVec<TVal>& DstValV) const { 02275 DstValV.Clr(); 02276 int ValN1=0; int ValN2=0; 02277 while ((ValN1<Len())&&(ValN2<ValV.Len())){ 02278 const TVal& Val1=GetVal(ValN1); 02279 while ((ValN2<ValV.Len())&&(Val1>ValV.GetVal(ValN2))){ 02280 ValN2++;} 02281 if ((ValN2<ValV.Len())&&(Val1==ValV.GetVal(ValN2))){ 02282 DstValV.Add(Val1); ValN2++;} 02283 ValN1++; 02284 } 02285 } 02286 02287 template <class TVal> 02288 void TVec<TVal>::Union(const TVec<TVal>& ValV, TVec<TVal>& DstValV) const { 02289 DstValV.Gen(TInt::GetMx(Len(), ValV.Len()), 0); 02290 int ValN1=0; int ValN2=0; 02291 while ((ValN1<Len())&&(ValN2<ValV.Len())){ 02292 const TVal& Val1=GetVal(ValN1); 02293 const TVal& Val2=ValV.GetVal(ValN2); 02294 if (Val1<Val2){DstValV.Add(Val1); ValN1++;} 02295 else if (Val1>Val2){DstValV.Add(Val2); ValN2++;} 02296 else {DstValV.Add(Val1); ValN1++; ValN2++;} 02297 } 02298 for (int RestValN1=ValN1; RestValN1<Len(); RestValN1++){ 02299 DstValV.Add(GetVal(RestValN1));} 02300 for (int RestValN2=ValN2; RestValN2<ValV.Len(); RestValN2++){ 02301 DstValV.Add(ValV.GetVal(RestValN2));} 02302 } 02303 02304 /* 02305 template <class TVal> 02306 void TVec<TVal>::Union(const TVec<TVal>& ValV, TVec<TVal>& DstValV){ 02307 DstValV.Clr(); 02308 int ValN1=0; int ValN2=0; 02309 while ((ValN1<Len())&&(ValN2<ValV.Len())){ 02310 const TVal& Val1=GetVal(ValN1); 02311 const TVal& Val2=ValV.GetVal(ValN2); 02312 if (DstValV.Len()==0){ 02313 if (Val1<Val2){DstValV.Add(Val1);} else {DstValV.Add(Val2);} 02314 } else { 02315 if (Val1<Val2){ 02316 if (DstValV.Last()<Val1){DstValV.Add(Val1);} ValN1++; 02317 } else { 02318 if (DstValV.Last()<Val2){DstValV.Add(Val2);} ValN2++; 02319 } 02320 } 02321 } 02322 for (int RestValN1=ValN1; RestValN1<Len(); RestValN1++){ 02323 const TVal& Val1=GetVal(RestValN1); 02324 if (DstValV.Len()==0){DstValV.Add(Val1);} 02325 else {if (DstValV.Last()<Val1){DstValV.Add(Val1);}} 02326 } 02327 for (int RestValN2=ValN2; RestValN2<ValV.Len(); RestValN2++){ 02328 const TVal& Val2=ValV.GetVal(RestValN2); 02329 if (DstValV.Len()==0){DstValV.Add(Val2);} 02330 else {if (DstValV.Last()<Val2){DstValV.Add(Val2);}} 02331 } 02332 } 02333 */ 02334 02335 template <class TVal> 02336 void TVec<TVal>::Diff(const TVec<TVal>& ValV, TVec<TVal>& DstValV) const { 02337 DstValV.Clr(); 02338 int ValN1=0; int ValN2=0; 02339 while (ValN1<Len() && ValN2<ValV.Len()) { 02340 const TVal& Val1 = GetVal(ValN1); 02341 while (ValN2<ValV.Len() && Val1>ValV.GetVal(ValN2)) ValN2++; 02342 if (ValN2<ValV.Len()) { 02343 if (Val1!=ValV.GetVal(ValN2)) { DstValV.Add(Val1); } 02344 ValN1++; 02345 } 02346 } 02347 for (int RestValN1=ValN1; RestValN1<Len(); RestValN1++){ 02348 DstValV.Add(GetVal(RestValN1));} 02349 } 02350 02351 template <class TVal> 02352 int TVec<TVal>::IntrsLen(const TVec<TVal>& ValV) const { 02353 int Cnt=0, ValN1=0; int ValN2=0; 02354 while ((ValN1<Len())&&(ValN2<ValV.Len())){ 02355 const TVal& Val1=GetVal(ValN1); 02356 while ((ValN2<ValV.Len())&&(Val1>ValV.GetVal(ValN2))){ 02357 ValN2++;} 02358 if ((ValN2<ValV.Len())&&(Val1==ValV.GetVal(ValN2))){ 02359 ValN2++; Cnt++;} 02360 ValN1++; 02361 } 02362 return Cnt; 02363 } 02364 02365 template <class TVal> 02366 int TVec<TVal>::UnionLen(const TVec<TVal>& ValV) const { 02367 int Cnt = 0, ValN1 = 0, ValN2 = 0; 02368 while ((ValN1 < Len()) && (ValN2 < ValV.Len())) { 02369 const TVal& Val1 = GetVal(ValN1); 02370 const TVal& Val2 = ValV.GetVal(ValN2); 02371 if (Val1 < Val2) { 02372 Cnt++; ValN1++; 02373 } else if (Val1 > Val2) { 02374 Cnt++; ValN2++; 02375 } else { 02376 Cnt++; ValN1++; ValN2++; 02377 } 02378 } 02379 Cnt += (Len() - ValN1) + (ValV.Len() - ValN2); 02380 return Cnt; 02381 } 02382 02383 template <class TVal> 02384 void TVec<TVal>::Minus(const TVec<TVal>& ValV, TVec<TVal>& DstValV) const { 02385 Diff(ValV, DstValV); 02386 } 02387 02388 template <class TVal> 02389 int TVec<TVal>::Count(const TVal& Val) const { 02390 int Count = 0; 02391 for (int i = 0; i < Len(); i++){ 02392 if (Val == ValT[i]){Count++;}} 02393 return Count; 02394 } 02395 02396 template <class TVal> 02397 int TVec<TVal>::SearchBin(const TVal& Val) const { 02398 int LValN=0; int RValN=Len()-1; 02399 while (RValN>=LValN){ 02400 int ValN=(LValN+RValN)/2; 02401 if (Val==ValT[ValN]){return ValN;} 02402 if (Val<ValT[ValN]){RValN=ValN-1;} else {LValN=ValN+1;} 02403 } 02404 return -1; 02405 } 02406 02407 template <class TVal> 02408 int TVec<TVal>::SearchBin(const TVal& Val, int& InsValN) const { 02409 int LValN=0; int RValN=Len()-1; 02410 while (RValN>=LValN){ 02411 int ValN=(LValN+RValN)/2; 02412 if (Val==ValT[ValN]){InsValN=ValN; return ValN;} 02413 if (Val<ValT[ValN]){RValN=ValN-1;} else {LValN=ValN+1;} 02414 } 02415 InsValN=LValN; return -1; 02416 } 02417 02418 template <class TVal> 02419 int TVec<TVal>::SearchForw(const TVal& Val, const int& BValN) const { 02420 for (int ValN=BValN; ValN<Vals; ValN++){ 02421 if (Val==ValT[ValN]){return ValN;}} 02422 return -1; 02423 } 02424 02425 template <class TVal> 02426 int TVec<TVal>::SearchBack(const TVal& Val) const { 02427 for (int ValN=Vals-1; ValN>=0; ValN--){ 02428 if (Val==ValT[ValN]){return ValN;}} 02429 return -1; 02430 } 02431 02432 template <class TVal> 02433 int TVec<TVal>::SearchVForw(const TVec<TVal>& ValV, const int& BValN) const { 02434 int ValVLen=ValV.Len(); 02435 for (int ValN=BValN; ValN<Vals-ValVLen+1; ValN++){ 02436 bool Found=true; 02437 for (int SubValN=0; SubValN<ValVLen; SubValN++){ 02438 if (ValV[SubValN]!=GetVal(ValN+SubValN)){Found=false; break;} 02439 } 02440 if (Found){return ValN;} 02441 } 02442 return -1; 02443 } 02444 02445 template <class TVal> 02446 int TVec<TVal>::GetMxValN() const { 02447 if (Vals==0){return -1;} 02448 int MxValN=0; 02449 for (int ValN=1; ValN<Vals; ValN++){ 02450 if (ValT[ValN]>ValT[MxValN]){MxValN=ValN;} 02451 } 02452 return MxValN; 02453 } 02454 02455 }; // namespace TGLib_OLD 02456 02458 // Common-Vector-Types 02459 typedef TVec<TBool> TBoolV; 02460 typedef TVec<TCh> TChV; 02461 typedef TVec<TUCh> TUChV; 02462 typedef TVec<TUInt> TUIntV; 02463 typedef TVec<TInt> TIntV; 02464 typedef TVec<TUInt64> TUInt64V; 02465 typedef TVec<TFlt> TFltV; 02466 typedef TVec<TSFlt> TSFltV; 02467 typedef TVec<TAscFlt> TAscFltV; 02468 typedef TVec<TStr> TStrV; 02469 typedef TVec<TChA> TChAV; 02470 typedef TVec<TIntPr> TIntPrV; 02471 typedef TVec<TIntTr> TIntTrV; 02472 typedef TVec<TIntQu> TIntQuV; 02473 typedef TVec<TFltPr> TFltPrV; 02474 typedef TVec<TFltTr> TFltTrV; 02475 typedef TVec<TIntKd> TIntKdV; 02476 typedef TVec<TUChIntPr> TUChIntPrV; 02477 typedef TVec<TUChUInt64Pr> TUChUInt64PrV; 02478 typedef TVec<TIntUInt64Pr> TIntUInt64PrV; 02479 typedef TVec<TIntUInt64Kd> TIntUInt64KdV; 02480 typedef TVec<TIntFltPr> TIntFltPrV; 02481 typedef TVec<TIntFltPrKd> TIntFltPrKdV; 02482 typedef TVec<TFltIntPr> TFltIntPrV; 02483 typedef TVec<TFltUInt64Pr> TFltUInt64PrV; 02484 typedef TVec<TFltStrPr> TFltStrPrV; 02485 typedef TVec<TAscFltStrPr> TAscFltStrPrV; 02486 typedef TVec<TIntStrPr> TIntStrPrV; 02487 typedef TVec<TIntIntStrTr> TIntIntStrTrV; 02488 typedef TVec<TIntIntFltTr> TIntIntFltTrV; 02489 typedef TVec<TIntFltIntTr> TIntFltIntTrV; 02490 typedef TVec<TIntStrIntTr> TIntStrIntTrV; 02491 typedef TVec<TIntKd> TIntKdV; 02492 typedef TVec<TUIntIntKd> TUIntIntKdV; 02493 typedef TVec<TIntFltKd> TIntFltKdV; 02494 typedef TVec<TIntPrFltKd> TIntPrFltKdV; 02495 typedef TVec<TIntStrKd> TIntStrKdV; 02496 typedef TVec<TIntStrPrPr> TIntStrPrPrV; 02497 typedef TVec<TIntStrVPr> TIntStrVPrV; 02498 typedef TVec<TIntIntVIntTr> TIntIntVIntTrV; 02499 typedef TVec<TIntIntIntVTr> TIntIntIntVTrV; 02500 typedef TVec<TUInt64IntPr> TUInt64IntPrV; 02501 typedef TVec<TUInt64FltPr> TUInt64FltPrV; 02502 typedef TVec<TUInt64StrPr> TUInt64StrPrV; 02503 typedef TVec<TUInt64IntKd> TUInt64IntKdV; 02504 typedef TVec<TUInt64FltKd> TUInt64FltKdV; 02505 typedef TVec<TUInt64StrKd> TUInt64StrKdV; 02506 typedef TVec<TFltBoolKd> TFltBoolKdV; 02507 typedef TVec<TFltIntKd> TFltIntKdV; 02508 typedef TVec<TFltUInt64Kd> TFltUInt64KdV; 02509 typedef TVec<TFltIntPrKd> TFltIntPrKdV; 02510 typedef TVec<TFltKd> TFltKdV; 02511 typedef TVec<TFltStrKd> TFltStrKdV; 02512 typedef TVec<TFltStrPrPr> TFltStrPrPrV; 02513 typedef TVec<TFltIntIntTr> TFltIntIntTrV; 02514 typedef TVec<TFltFltStrTr> TFltFltStrTrV; 02515 typedef TVec<TAscFltIntPr> TAscFltIntPrV; 02516 typedef TVec<TAscFltIntKd> TAscFltIntKdV; 02517 typedef TVec<TStrPr> TStrPrV; 02518 typedef TVec<TStrIntPr> TStrIntPrV; 02519 typedef TVec<TStrFltPr> TStrFltPrV; 02520 typedef TVec<TStrIntKd> TStrIntKdV; 02521 typedef TVec<TStrFltKd> TStrFltKdV; 02522 typedef TVec<TStrAscFltKd> TStrAscFltKdV; 02523 typedef TVec<TStrTr> TStrTrV; 02524 typedef TVec<TStrQu> TStrQuV; 02525 typedef TVec<TStrFltFltTr> TStrFltFltTrV; 02526 typedef TVec<TStrStrIntTr> TStrStrIntTrV; 02527 typedef TVec<TStrKd> TStrKdV; 02528 typedef TVec<TStrStrVPr> TStrStrVPrV; 02529 typedef TVec<TStrVIntPr> TStrVIntPrV; 02530 typedef TVec<TFltIntIntIntQu> TFltIntIntIntQuV; 02531 typedef TVec<TIntStrIntIntQu> TIntStrIntIntQuV; 02532 typedef TVec<TIntIntPrPr> TIntIntPrPrV; 02533 02534 //#////////////////////////////////////////////// 02536 02539 template <class TVal, class TSizeTy=int> 02540 class TVecPool { 02541 public: 02542 typedef TPt<TVecPool<TVal, TSizeTy> > PVecPool; 02543 typedef TVec<TVal, TSizeTy> TValV; 02544 private: 02545 TCRef CRef; 02546 TBool FastCopy; 02547 TSize GrowBy, MxVals, Vals; 02548 TVal EmptyVal; // Empty value/vector 02549 TVal *ValBf; // Buffer for storing all the values 02550 TVec<uint64, int> IdToOffV; // Id to one past last (Vector starts at [id-1]). Vector length is IdToOff[id]-IdToOff[id-1] 02551 private: 02552 void Resize(const TSize& _MxVals); 02553 public: 02555 02560 TVecPool(const TSize& ExpectVals=0, const TSize& _GrowBy=1000000, const bool& _FastCopy=false, const TVal& _EmptyVal=TVal()); 02561 TVecPool(const TVecPool<TVal, TSizeTy>& Pool); 02562 TVecPool(TSIn& SIn); 02563 ~TVecPool() { if (ValBf != NULL) { delete [] ValBf; } ValBf=NULL; } 02564 static PVecPool New(const TSize& ExpectVals=0, const TSize& GrowBy=1000000, const bool& FastCopy=false) { 02565 return new TVecPool(ExpectVals, GrowBy, FastCopy); } 02566 static PVecPool Load(TSIn& SIn) { return new TVecPool(SIn); } 02567 static PVecPool Load(const TStr& FNm) { TFIn FIn(FNm); return Load(FIn); } 02568 void Save(TSOut& SOut) const; 02569 TVecPool& operator = (const TVecPool& Pool); 02570 02572 int GetVecs() const { return IdToOffV.Len(); } 02574 TSize GetVals() const { return Vals; } 02576 bool IsVId(const int& VId) const { return (0 <= VId) && (VId < IdToOffV.Len()); } 02578 uint64 Reserved() const { return MxVals; } 02580 void Reserve(const TSize& MxVals) { Resize(MxVals); } 02582 const TVal& GetEmptyVal() const { return EmptyVal; } 02584 void SetEmptyVal(const TVal& _EmptyVal) { EmptyVal = _EmptyVal; } 02586 uint64 GetMemUsed() const { 02587 return sizeof(TCRef)+sizeof(TBool)+3*sizeof(TSize)+sizeof(TVal*)+MxVals*sizeof(TVal);} 02588 02590 int AddV(const TValV& ValV); 02592 02594 int AddEmptyV(const int& ValVLen); 02596 int GetVLen(const int& VId) const { if (VId==0){return 0;} else {return int(IdToOffV[VId]-IdToOffV[VId-1]);}} 02598 TVal* GetValVPt(const int& VId) const { 02599 if (GetVLen(VId)==0){return (TVal*)&EmptyVal;} 02600 else {return ValBf+IdToOffV[VId-1];}} 02602 02604 void GetV(const int& VId, TValV& ValV) const { 02605 if (GetVLen(VId)==0){ValV.Clr();} 02606 else { ValV.GenExt(GetValVPt(VId), GetVLen(VId)); } } 02608 void PutV(const int& VId, const TValV& ValV) { 02609 IAssert(IsVId(VId) && GetVLen(VId) == ValV.Len()); 02610 if (FastCopy) { 02611 memcpy(GetValVPt(VId), ValV.BegI(), sizeof(TVal)*ValV.Len()); } 02612 else { TVal* ValPt = GetValVPt(VId); 02613 for (::TSize ValN=0; ValN < ::TSize(ValV.Len()); ValN++, ValPt++) { *ValPt=ValV[ValN]; } 02614 } } 02616 02618 void CompactPool(const TVal& DelVal); 02620 02622 void ShuffleAll(TRnd& Rnd=TInt::Rnd); 02623 02625 02627 void Clr(bool DoDel = true) { 02628 IdToOffV.Clr(DoDel); MxVals=0; Vals=0; 02629 if (DoDel && ValBf!=NULL) { delete [] ValBf; ValBf=NULL;} 02630 if (! DoDel) { PutAll(EmptyVal); } } 02632 void PutAll(const TVal& Val) { 02633 for (TSize ValN = 0; ValN < MxVals; ValN++) { ValBf[ValN]=Val; } } 02634 friend class TPt<TVecPool<TVal> >; 02635 }; 02636 02637 template <class TVal, class TSizeTy> 02638 void TVecPool<TVal, TSizeTy>::Resize(const TSize& _MxVals){ 02639 if (_MxVals <= MxVals){ return; } else { MxVals = _MxVals; } 02640 if (ValBf == NULL) { 02641 try { ValBf = new TVal [MxVals]; } 02642 catch (std::exception Ex) { 02643 FailR(TStr::Fmt("TVecPool::Resize 1: %s, MxVals: %s. [Program failed to allocate more memory. Solution: Get a bigger machine and a 64-bit compiler.]", Ex.what(), TInt::GetStr(uint64(_MxVals)).CStr()).CStr()); } 02644 IAssert(ValBf != NULL); 02645 if (EmptyVal != TVal()) { PutAll(EmptyVal); } 02646 } else { 02647 // printf("*** Resize vector pool: %llu -> %llu\n", uint64(Vals), uint64(MxVals)); 02648 TVal* NewValBf = NULL; 02649 try { NewValBf = new TVal [MxVals]; } 02650 catch (std::exception Ex) { 02651 FailR(TStr::Fmt("TVecPool::Resize 1: %s, MxVals: %s. [Program failed to allocate more memory. Solution: Get a bigger machine and a 64-bit compiler.]", Ex.what(), TInt::GetStr(uint64(_MxVals)).CStr()).CStr()); } 02652 IAssert(NewValBf != NULL); 02653 if (FastCopy) { 02654 memcpy(NewValBf, ValBf, Vals*sizeof(TVal)); } 02655 else { 02656 for (TSize ValN = 0; ValN < Vals; ValN++){ NewValBf[ValN] = ValBf[ValN]; } } 02657 if (EmptyVal != TVal()) { // init empty values 02658 for (TSize ValN = Vals; ValN < MxVals; ValN++) { NewValBf[ValN] = EmptyVal; } 02659 } 02660 delete [] ValBf; 02661 ValBf = NewValBf; 02662 } 02663 } 02664 02665 template <class TVal, class TSizeTy> 02666 TVecPool<TVal, TSizeTy>::TVecPool(const TSize& ExpectVals, const TSize& _GrowBy, const bool& _FastCopy, const TVal& _EmptyVal) : GrowBy(_GrowBy), MxVals(0), Vals(0), EmptyVal(_EmptyVal), ValBf(NULL) { 02667 IdToOffV.Add(0); 02668 Resize(ExpectVals); 02669 } 02670 02671 template <class TVal, class TSizeTy> 02672 TVecPool<TVal, TSizeTy>::TVecPool(const TVecPool& Pool) : FastCopy(Pool.FastCopy), GrowBy(Pool.GrowBy), MxVals(Pool.MxVals), Vals(Pool.Vals), EmptyVal(Pool.EmptyVal), IdToOffV(Pool.IdToOffV) { 02673 try { 02674 ValBf = new TVal [MxVals]; } 02675 catch (std::exception Ex) { 02676 FailR(TStr::Fmt("TVecPool::TVecPool: %s, MxVals: %s. [Program failed to allocate memory. Solution: Get a bigger machine and a 64-bit compiler.]", Ex.what(), TInt::GetStr(uint64(MxVals)).CStr()).CStr()); } 02677 IAssert(ValBf != NULL); 02678 if (FastCopy) { 02679 memcpy(ValBf, Pool.ValBf, MxVals*sizeof(TVal)); } 02680 else { 02681 for (TSize ValN = 0; ValN < MxVals; ValN++){ ValBf[ValN] = Pool.ValBf[ValN]; } } 02682 } 02683 02684 template <class TVal, class TSizeTy> 02685 TVecPool<TVal, TSizeTy>::TVecPool(TSIn& SIn) : FastCopy(SIn) { 02686 uint64 _GrowBy, _MxVals, _Vals; 02687 SIn.Load(_GrowBy); SIn.Load(_MxVals); SIn.Load(_Vals); 02688 IAssertR(_GrowBy<TSizeMx && _MxVals<TSizeMx && _Vals<TSizeMx, "This is a 64-bit vector pool. Use a 64-bit compiler."); 02689 GrowBy=TSize(_GrowBy); MxVals=TSize(_Vals); Vals=TSize(_Vals); //note MxVals==Vals 02690 EmptyVal = TVal(SIn); 02691 if (MxVals==0) { ValBf = NULL; } else { ValBf = new TVal [MxVals]; } 02692 for (TSize ValN = 0; ValN < Vals; ValN++) { ValBf[ValN] = TVal(SIn); } 02693 { TInt MxVals(SIn), Vals(SIn); 02694 IdToOffV.Gen(Vals); 02695 for (int ValN = 0; ValN < Vals; ValN++) { 02696 uint64 Offset; SIn.Load(Offset); IAssert(Offset < TSizeMx); 02697 IdToOffV[ValN]=TSize(Offset); 02698 } } 02699 } 02700 02701 template <class TVal, class TSizeTy> 02702 void TVecPool<TVal, TSizeTy>::Save(TSOut& SOut) const { 02703 SOut.Save(FastCopy); 02704 uint64 _GrowBy=GrowBy, _MxVals=MxVals, _Vals=Vals; 02705 SOut.Save(_GrowBy); SOut.Save(_MxVals); SOut.Save(_Vals); 02706 SOut.Save(EmptyVal); 02707 for (TSize ValN = 0; ValN < Vals; ValN++) { ValBf[ValN].Save(SOut); } 02708 { SOut.Save(IdToOffV.Len()); SOut.Save(IdToOffV.Len()); 02709 for (int ValN = 0; ValN < IdToOffV.Len(); ValN++) { 02710 const uint64 Offset=IdToOffV[ValN]; SOut.Save(Offset); 02711 } } 02712 } 02713 02714 template <class TVal, class TSizeTy> 02715 TVecPool<TVal, TSizeTy>& TVecPool<TVal, TSizeTy>::operator = (const TVecPool& Pool) { 02716 if (this!=&Pool) { 02717 FastCopy = Pool.FastCopy; 02718 GrowBy = Pool.GrowBy; 02719 MxVals = Pool.MxVals; 02720 Vals = Pool.Vals; 02721 EmptyVal = Pool.EmptyVal; 02722 IdToOffV=Pool.IdToOffV; 02723 try { 02724 ValBf = new TVal [MxVals]; } 02725 catch (std::exception Ex) { 02726 FailR(TStr::Fmt("TVecPool::operator=: %s, MxVals: %s. [Program failed to allocate memory. Solution: Get a bigger machine and a 64-bit compiler.]", Ex.what(), TInt::GetStr(uint64(MxVals)).CStr()).CStr()); } 02727 IAssert(ValBf != NULL); 02728 if (FastCopy) { 02729 memcpy(ValBf, Pool.ValBf, Vals*sizeof(TVal)); } 02730 else { 02731 for (TSize ValN = 0; ValN < Vals; ValN++){ ValBf[ValN] = Pool.ValBf[ValN]; } } 02732 } 02733 return *this; 02734 } 02735 02736 template <class TVal, class TSizeTy> 02737 int TVecPool<TVal, TSizeTy>::AddV(const TValV& ValV) { 02738 const TSizeTy ValVLen = ValV.Len(); 02739 if (ValVLen == 0) { return 0; } 02740 if (MxVals < Vals+ValVLen) { Resize(Vals+max(ValVLen, GrowBy)); } 02741 if (FastCopy) { memcpy(ValBf+Vals, ValV.BegI(), sizeof(TVal)*ValV.Len()); } 02742 else { for (uint ValN=0; ValN < ValVLen; ValN++) { ValBf[Vals+ValN]=ValV[ValN]; } } 02743 Vals+=ValVLen; IdToOffV.Add(Vals); 02744 return IdToOffV.Len()-1; 02745 } 02746 02747 template <class TVal, class TSizeTy> 02748 int TVecPool<TVal, TSizeTy>::AddEmptyV(const int& ValVLen) { 02749 if (ValVLen==0){return 0;} 02750 if (MxVals < Vals+ValVLen){Resize(Vals+max(TSize(ValVLen), GrowBy)); } 02751 Vals+=ValVLen; IdToOffV.Add(Vals); 02752 return IdToOffV.Len()-1; 02753 } 02754 02755 // Delete all elements of value DelVal from all vectors. Empty space is left at the end of the pool. 02756 template <class TVal, class TSizeTy> 02757 void TVecPool<TVal, TSizeTy>::CompactPool(const TVal& DelVal) { 02758 ::TSize TotalDel=0, NDel=0; 02759 // printf("Compacting %d vectors\n", IdToOffV.Len()); 02760 for (int vid = 1; vid < IdToOffV.Len(); vid++) { 02761 // if (vid % 10000000 == 0) { printf(" %dm", vid/1000000); fflush(stdout); } 02762 const uint Len = GetVLen(vid); 02763 TVal* ValV = GetValVPt(vid); 02764 if (TotalDel > 0) { IdToOffV[vid-1] -= TotalDel; } // update end of vector 02765 if (Len == 0) { continue; } 02766 NDel = 0; 02767 for (TVal* v = ValV; v < ValV+Len-NDel; v++) { 02768 if (*v == DelVal) { 02769 TVal* Beg = v; 02770 while (*v == DelVal && v < ValV+Len) { v++; NDel++; } 02771 memcpy(Beg, v, sizeof(TVal)*int(Len - ::TSize(v - ValV))); 02772 v -= NDel; 02773 } 02774 } 02775 memcpy(ValV-TotalDel, ValV, sizeof(TVal)*Len); // move data 02776 TotalDel += NDel; 02777 } 02778 IdToOffV.Last() -= TotalDel; 02779 for (::TSize i = Vals-TotalDel; i < Vals; i++) { ValBf[i] = EmptyVal; } 02780 Vals -= TotalDel; 02781 // printf(" deleted %llu elements from the pool\n", TotalDel); 02782 } 02783 02784 // shuffles all the order of elements in the pool (does not respect vector boundaries) 02785 template <class TVal, class TSizeTy> 02786 void TVecPool<TVal, TSizeTy>::ShuffleAll(TRnd& Rnd) { 02787 for (::TSize n = Vals-1; n > 0; n--) { 02788 const ::TSize k = ::TSize(((uint64(Rnd.GetUniDevInt())<<32) | uint64(Rnd.GetUniDevInt())) % (n+1)); 02789 const TVal Tmp = ValBf[n]; 02790 ValBf[n] = ValBf[k]; 02791 ValBf[k] = Tmp; 02792 } 02793 } 02794 02795 02797 // Below are old 32-bit implementations of TVec and other classes. 02798 // Old TVec takes at most 2G elements. 02799 // The new vector class supports 64-bits for the number of elements, 02800 // but also allows 32-bits for backward compatibility. 02801 // by Jure (Jan 2013) 02802 namespace TGLib_OLD { 02804 // Vector Pool 02805 template<class TVal> 02806 class TVecPool { 02807 public: 02808 typedef TPt<TVecPool<TVal> > PVecPool; 02809 typedef TVec<TVal> TValV; 02810 private: 02811 TCRef CRef; 02812 TBool FastCopy; 02813 ::TSize GrowBy, MxVals, Vals; 02814 TVal EmptyVal; // empty vector 02815 TVal *ValBf; // buffer storing all the values 02816 TVec< ::TSize> IdToOffV; // id to one past last (vector starts at [id-1]) 02817 private: 02818 void Resize(const ::TSize& _MxVals); 02819 public: 02820 TVecPool(const ::TSize& ExpectVals=0, const ::TSize& _GrowBy=1000000, const bool& _FastCopy=false, const TVal& _EmptyVal=TVal()); 02821 TVecPool(const TVecPool& Pool); 02822 TVecPool(TSIn& SIn); 02823 ~TVecPool() { if (ValBf != NULL) { delete [] ValBf; } ValBf=NULL; } 02824 static PVecPool New(const ::TSize& ExpectVals=0, const ::TSize& GrowBy=1000000, const bool& FastCopy=false) { 02825 return new TVecPool(ExpectVals, GrowBy, FastCopy); } 02826 static PVecPool Load(TSIn& SIn) { return new TVecPool(SIn); } 02827 static PVecPool Load(const TStr& FNm) { TFIn FIn(FNm); return Load(FIn); } 02828 void Save(TSOut& SOut) const; 02829 02830 TVecPool& operator = (const TVecPool& Pool); 02831 02832 ::TSize GetVals() const { return Vals; } 02833 ::TSize GetVecs() const { return IdToOffV.Len(); } 02834 bool IsVId(const int& VId) const { return (0 <= VId) && (VId < IdToOffV.Len()); } 02835 ::TSize Reserved() const { return MxVals; } 02836 void Reserve(const ::TSize& MxVals) { Resize(MxVals); } 02837 const TVal& GetEmptyVal() const { return EmptyVal; } 02838 void SetEmptyVal(const TVal& _EmptyVal) { EmptyVal = _EmptyVal; } 02839 ::TSize GetMemUsed() const { 02840 return sizeof(TCRef)+sizeof(TBool)+3*sizeof(TSize)+sizeof(TVal*)+MxVals*sizeof(TVal);} 02841 02842 int AddV(const TValV& ValV); 02843 int AddEmptyV(const int& ValVLen); 02844 uint GetVLen(const int& VId) const { 02845 if (VId==0){return 0;} 02846 else {return uint(IdToOffV[VId]-IdToOffV[VId-1]);}} 02847 TVal* GetValVPt(const int& VId) const { 02848 if (GetVLen(VId)==0){return (TVal*)&EmptyVal;} 02849 else {return ValBf+IdToOffV[VId-1];}} 02850 void GetV(const int& VId, TValV& ValV) const { 02851 if (GetVLen(VId)==0){ValV.Clr();} 02852 else { ValV.GenExt(GetValVPt(VId), GetVLen(VId)); } } 02853 void PutV(const int& VId, const TValV& ValV) { 02854 IAssert(IsVId(VId) && GetVLen(VId) == ValV.Len()); 02855 if (FastCopy) { 02856 memcpy(GetValVPt(VId), ValV.BegI(), sizeof(TVal)*ValV.Len()); } 02857 else { TVal* ValPt = GetValVPt(VId); 02858 for (uint ValN=0; ValN < uint(ValV.Len()); ValN++, ValPt++) { *ValPt=ValV[ValN]; } 02859 } 02860 } 02861 void CompactPool(const TVal& DelVal); // delete all elements of value DelVal from all vectors 02862 void ShuffleAll(TRnd& Rnd=TInt::Rnd); // shuffles all the order of elements in the Pool (does not respect vector boundaries) 02863 02864 //bool HasIdMap() const { return ! IdToOffV.Empty(); } 02865 //void ClrIdMap() { IdToOffV.Clr(true); } 02866 void Clr(bool DoDel = true) { 02867 IdToOffV.Clr(DoDel); MxVals=0; Vals=0; 02868 if (DoDel && ValBf!=NULL) { delete [] ValBf; ValBf=NULL;} 02869 if (! DoDel) { PutAll(EmptyVal); } 02870 } 02871 void PutAll(const TVal& Val) { 02872 for (TSize ValN = 0; ValN < MxVals; ValN++) { ValBf[ValN]=Val; } } 02873 02874 friend class TPt<TVecPool<TVal> >; 02875 }; 02876 02877 template <class TVal> 02878 void TVecPool<TVal>::Resize(const ::TSize& _MxVals){ 02879 if (_MxVals <= MxVals){ return; } else { MxVals = _MxVals; } 02880 if (ValBf == NULL) { 02881 try { ValBf = new TVal [MxVals]; } 02882 catch (std::exception Ex) { 02883 FailR(TStr::Fmt("TVecPool::Resize 1: %s, MxVals: %d. [Program failed to allocate more memory. Solution: Get a bigger machine and a 64-bit compiler.]", Ex.what(), _MxVals).CStr()); } 02884 IAssert(ValBf != NULL); 02885 if (EmptyVal != TVal()) { PutAll(EmptyVal); } 02886 } else { 02887 // printf("*** Resize vector pool: %llu -> %llu\n", uint64(Vals), uint64(MxVals)); 02888 TVal* NewValBf = NULL; 02889 try { NewValBf = new TVal [MxVals]; } 02890 catch (std::exception Ex) { FailR(TStr::Fmt("TVecPool::Resize 2: %s, MxVals: %d. [Program failed to allocate more memory. Solution: Get a bigger machine and a 64-bit compiler.]", Ex.what(), _MxVals).CStr()); } 02891 IAssert(NewValBf != NULL); 02892 if (FastCopy) { 02893 memcpy(NewValBf, ValBf, Vals*sizeof(TVal)); } 02894 else { 02895 for (TSize ValN = 0; ValN < Vals; ValN++){ NewValBf[ValN] = ValBf[ValN]; } } 02896 if (EmptyVal != TVal()) { // init empty values 02897 for (TSize ValN = Vals; ValN < MxVals; ValN++) { NewValBf[ValN] = EmptyVal; } 02898 } 02899 delete [] ValBf; 02900 ValBf = NewValBf; 02901 } 02902 } 02903 02904 template <class TVal> 02905 TVecPool<TVal>::TVecPool(const ::TSize& ExpectVals, const ::TSize& _GrowBy, const bool& _FastCopy, const TVal& _EmptyVal) : 02906 GrowBy(_GrowBy), MxVals(0), Vals(0), EmptyVal(_EmptyVal), ValBf(NULL) { 02907 IdToOffV.Add(0); 02908 Resize(ExpectVals); 02909 } 02910 02911 template <class TVal> 02912 TVecPool<TVal>::TVecPool(const TVecPool& Pool): 02913 FastCopy(Pool.FastCopy), GrowBy(Pool.GrowBy), 02914 MxVals(Pool.MxVals), Vals(Pool.Vals), EmptyVal(Pool.EmptyVal), IdToOffV(Pool.IdToOffV) { 02915 try { ValBf = new TVal [MxVals]; } 02916 catch (std::exception Ex) { FailR(TStr::Fmt("TVecPool::TVecPool: %s, MxVals: %d", Ex.what(), MxVals).CStr()); } 02917 IAssert(ValBf != NULL); 02918 if (FastCopy) { 02919 memcpy(ValBf, Pool.ValBf, MxVals*sizeof(TVal)); } 02920 else { 02921 for (TSize ValN = 0; ValN < MxVals; ValN++){ ValBf[ValN] = Pool.ValBf[ValN]; } } 02922 } 02923 02924 template <class TVal> 02925 TVecPool<TVal>::TVecPool(TSIn& SIn): 02926 FastCopy(SIn) { 02927 uint64 _GrowBy, _MxVals, _Vals; 02928 SIn.Load(_GrowBy); SIn.Load(_MxVals); SIn.Load(_Vals); 02929 IAssert(_GrowBy<TSizeMx && _MxVals<TSizeMx && _Vals<TSizeMx); 02930 GrowBy=TSize(_GrowBy); MxVals=TSize(_Vals); Vals=TSize(_Vals); //note MxVals==Vals 02931 EmptyVal = TVal(SIn); 02932 if (MxVals==0) { ValBf = NULL; } else { ValBf = new TVal [MxVals]; } 02933 for (TSize ValN = 0; ValN < Vals; ValN++) { ValBf[ValN] = TVal(SIn); } 02934 { TInt MxVals(SIn), Vals(SIn); 02935 IdToOffV.Gen(Vals); 02936 for (int ValN = 0; ValN < Vals; ValN++) { 02937 uint64 Offset; SIn.Load(Offset); IAssert(Offset < TSizeMx); 02938 IdToOffV[ValN]=TSize(Offset); 02939 } } 02940 } 02941 02942 template <class TVal> 02943 void TVecPool<TVal>::Save(TSOut& SOut) const { 02944 SOut.Save(FastCopy); 02945 uint64 _GrowBy=GrowBy, _MxVals=MxVals, _Vals=Vals; 02946 SOut.Save(_GrowBy); SOut.Save(_MxVals); SOut.Save(_Vals); 02947 SOut.Save(EmptyVal); 02948 for (TSize ValN = 0; ValN < Vals; ValN++) { ValBf[ValN].Save(SOut); } 02949 { SOut.Save(IdToOffV.Len()); SOut.Save(IdToOffV.Len()); 02950 for (int ValN = 0; ValN < IdToOffV.Len(); ValN++) { 02951 const uint64 Offset=IdToOffV[ValN]; SOut.Save(Offset); 02952 } } 02953 } 02954 02955 template <class TVal> 02956 TVecPool<TVal>& TVecPool<TVal>::operator = (const TVecPool& Pool) { 02957 if (this!=&Pool) { 02958 FastCopy = Pool.FastCopy; 02959 GrowBy = Pool.GrowBy; 02960 MxVals = Pool.MxVals; 02961 Vals = Pool.Vals; 02962 EmptyVal = Pool.EmptyVal; 02963 IdToOffV=Pool.IdToOffV; 02964 try { ValBf = new TVal [MxVals]; } 02965 catch (std::exception Ex) { FailR(TStr::Fmt("TVec::operator= : %s, MxVals: %d", Ex.what(), MxVals).CStr()); } 02966 IAssert(ValBf != NULL); 02967 if (FastCopy) { 02968 memcpy(ValBf, Pool.ValBf, Vals*sizeof(TVal)); } 02969 else { 02970 for (uint64 ValN = 0; ValN < Vals; ValN++){ ValBf[ValN] = Pool.ValBf[ValN]; } } 02971 } 02972 return *this; 02973 } 02974 02975 template<class TVal> 02976 int TVecPool<TVal>::AddV(const TValV& ValV) { 02977 const ::TSize ValVLen = ValV.Len(); 02978 if (ValVLen == 0) { return 0; } 02979 if (MxVals < Vals+ValVLen) { Resize(Vals+max(ValVLen, GrowBy)); } 02980 if (FastCopy) { memcpy(ValBf+Vals, ValV.BegI(), sizeof(TVal)*ValV.Len()); } 02981 else { for (uint ValN=0; ValN < ValVLen; ValN++) { ValBf[Vals+ValN]=ValV[ValN]; } } 02982 Vals+=ValVLen; IdToOffV.Add(Vals); 02983 return IdToOffV.Len()-1; 02984 } 02985 02986 template<class TVal> 02987 int TVecPool<TVal>::AddEmptyV(const int& ValVLen) { 02988 if (ValVLen==0){return 0;} 02989 if (MxVals < Vals+ValVLen){Resize(Vals+max(TSize(ValVLen), GrowBy)); } 02990 Vals+=ValVLen; IdToOffV.Add(Vals); 02991 return IdToOffV.Len()-1; 02992 } 02993 02994 // delete all elements of value DelVal from all vectors 02995 // empty space is left at the end of the pool 02996 template<class TVal> 02997 void TVecPool<TVal>::CompactPool(const TVal& DelVal) { 02998 ::TSize TotalDel=0, NDel=0; 02999 // printf("Compacting %d vectors\n", IdToOffV.Len()); 03000 for (int vid = 1; vid < IdToOffV.Len(); vid++) { 03001 // if (vid % 10000000 == 0) { printf(" %dm", vid/1000000); fflush(stdout); } 03002 const uint Len = GetVLen(vid); 03003 TVal* ValV = GetValVPt(vid); 03004 if (TotalDel > 0) { IdToOffV[vid-1] -= TotalDel; } // update end of vector 03005 if (Len == 0) { continue; } 03006 NDel = 0; 03007 for (TVal* v = ValV; v < ValV+Len-NDel; v++) { 03008 if (*v == DelVal) { 03009 TVal* Beg = v; 03010 while (*v == DelVal && v < ValV+Len) { v++; NDel++; } 03011 memcpy(Beg, v, sizeof(TVal)*int(Len - ::TSize(v - ValV))); 03012 v -= NDel; 03013 } 03014 } 03015 memcpy(ValV-TotalDel, ValV, sizeof(TVal)*Len); // move data 03016 TotalDel += NDel; 03017 } 03018 IdToOffV.Last() -= TotalDel; 03019 for (::TSize i = Vals-TotalDel; i < Vals; i++) { ValBf[i] = EmptyVal; } 03020 Vals -= TotalDel; 03021 // printf(" deleted %llu elements from the pool\n", TotalDel); 03022 } 03023 03024 // shuffles all the order of elements in the pool (does not respect vector boundaries) 03025 template<class TVal> 03026 void TVecPool<TVal>::ShuffleAll(TRnd& Rnd) { 03027 for (::TSize n = Vals-1; n > 0; n--) { 03028 const ::TSize k = ::TSize(((uint64(Rnd.GetUniDevInt())<<32) | uint64(Rnd.GetUniDevInt())) % (n+1)); 03029 const TVal Tmp = ValBf[n]; 03030 ValBf[n] = ValBf[k]; 03031 ValBf[k] = Tmp; 03032 } 03033 } 03034 03035 }; // namespace TGLib_OLD 03036 03037 typedef TVecPool<TInt> TIntVecPool; 03038 typedef TPt<TIntVecPool> PIntVecPool; 03039 03041 // Vector-Pointer 03042 template <class TVal> 03043 class PVec{ 03044 private: 03045 TCRef CRef; 03046 public: 03047 TVec<TVal> V; 03048 public: 03049 PVec<TVal>(): V(){} 03050 PVec<TVal>(const PVec<TVal>& Vec): V(Vec.V){} 03051 static TPt<PVec<TVal> > New(){ 03052 return new PVec<TVal>();} 03053 PVec<TVal>(const int& MxVals, const int& Vals): V(MxVals, Vals){} 03054 static TPt<PVec<TVal> > New(const int& MxVals, const int& Vals){ 03055 return new PVec<TVal>(MxVals, Vals);} 03056 PVec<TVal>(const TVec<TVal>& _V): V(_V){} 03057 static TPt<PVec<TVal> > New(const TVec<TVal>& V){ 03058 return new PVec<TVal>(V);} 03059 explicit PVec<TVal>(TSIn& SIn): V(SIn){} 03060 static TPt<PVec<TVal> > Load(TSIn& SIn){return new PVec<TVal>(SIn);} 03061 void Save(TSOut& SOut) const {V.Save(SOut);} 03062 03063 PVec<TVal>& operator=(const PVec<TVal>& Vec){ 03064 if (this!=&Vec){V=Vec.V;} return *this;} 03065 bool operator==(const PVec<TVal>& Vec) const {return V==Vec.V;} 03066 bool operator<(const PVec<TVal>& Vec) const {return V<Vec.V;} 03067 TVal& operator[](const int& ValN) const {return V[ValN];} 03068 03069 bool Empty() const {return V.Empty();} 03070 int Len() const {return V.Len();} 03071 TVal GetVal(const int& ValN) const {return V[ValN];} 03072 03073 int Add(const TVal& Val){return V.Add(Val);} 03074 03075 friend class TPt<PVec<TVal> >; 03076 }; 03077 03079 // Common-Vector-Pointer-Types 03080 typedef PVec<TFlt> TFltVP; 03081 typedef TPt<TFltVP> PFltV; 03082 typedef PVec<TAscFlt> TAscFltVP; 03083 typedef TPt<TAscFltVP> PAscFltV; 03084 typedef PVec<TStr> TStrVP; 03085 typedef TPt<TStrVP> PStrV; 03086 03088 // 2D-Vector 03089 template <class TVal> 03090 class TVVec{ 03091 private: 03092 TInt XDim, YDim; 03093 TVec<TVal> ValV; 03094 public: 03095 TVVec(): XDim(), YDim(), ValV(){} 03096 TVVec(const TVVec& Vec): 03097 XDim(Vec.XDim), YDim(Vec.YDim), ValV(Vec.ValV){} 03098 TVVec(const int& _XDim, const int& _YDim): 03099 XDim(), YDim(), ValV(){Gen(_XDim, _YDim);} 03100 explicit TVVec(const TVec<TVal>& _ValV, const int& _XDim, const int& _YDim): 03101 XDim(_XDim), YDim(_YDim), ValV(_ValV){ IAssert(ValV.Len()==XDim*YDim); } 03102 explicit TVVec(TSIn& SIn) {Load(SIn);} 03103 void Load(TSIn& SIn){XDim.Load(SIn); YDim.Load(SIn); ValV.Load(SIn);} 03104 void Save(TSOut& SOut) const { 03105 XDim.Save(SOut); YDim.Save(SOut); ValV.Save(SOut);} 03106 03107 TVVec<TVal>& operator=(const TVVec<TVal>& Vec){ 03108 if (this!=&Vec){XDim=Vec.XDim; YDim=Vec.YDim; ValV=Vec.ValV;} return *this;} 03109 bool operator==(const TVVec& Vec) const { 03110 return (XDim==Vec.XDim)&&(YDim==Vec.YDim)&&(ValV==Vec.ValV);} 03111 03112 bool Empty() const {return ValV.Len()==0;} 03113 void Clr(){XDim=0; YDim=0; ValV.Clr();} 03114 void Gen(const int& _XDim, const int& _YDim){ 03115 Assert((_XDim>=0)&&(_YDim>=0)); 03116 XDim=_XDim; YDim=_YDim; ValV.Gen(XDim*YDim);} 03117 int GetXDim() const {return XDim;} 03118 int GetYDim() const {return YDim;} 03119 int GetRows() const {return XDim;} 03120 int GetCols() const {return YDim;} 03121 TVec<TVal>& Get1DVec(){return ValV;} 03122 03123 const TVal& At(const int& X, const int& Y) const { 03124 Assert((0<=X)&&(X<int(XDim))&&(0<=Y)&&(Y<int(YDim))); 03125 return ValV[X*YDim+Y];} 03126 TVal& At(const int& X, const int& Y){ 03127 Assert((0<=X)&&(X<int(XDim))&&(0<=Y)&&(Y<int(YDim))); 03128 return ValV[X*YDim+Y];} 03129 TVal& operator()(const int& X, const int& Y){ 03130 return At(X, Y);} 03131 const TVal& operator()(const int& X, const int& Y) const { 03132 return At(X, Y);} 03133 03134 void PutXY(const int& X, const int& Y, const TVal& Val){At(X, Y)=Val;} 03135 void PutAll(const TVal& Val){ValV.PutAll(Val);} 03136 void PutX(const int& X, const TVal& Val){ 03137 for (int Y=0; Y<int(YDim); Y++){At(X, Y)=Val;}} 03138 void PutY(const int& Y, const TVal& Val){ 03139 for (int X=0; X<int(XDim); X++){At(X, Y)=Val;}} 03140 TVal GetXY(const int& X, const int& Y) const { 03141 Assert((0<=X)&&(X<int(XDim))&&(0<=Y)&&(Y<int(YDim))); 03142 return ValV[X*YDim+Y];} 03143 void GetRow(const int& RowN, TVec<TVal>& Vec) const; 03144 void GetCol(const int& ColN, TVec<TVal>& Vec) const; 03145 03146 void SwapX(const int& X1, const int& X2); 03147 void SwapY(const int& Y1, const int& Y2); 03148 void Swap(TVVec<TVal>& Vec); 03149 03150 void ShuffleX(TRnd& Rnd); 03151 void ShuffleY(TRnd& Rnd); 03152 void GetMxValXY(int& X, int& Y) const; 03153 03154 void CopyFrom(const TVVec<TVal>& VVec); 03155 void AddXDim(); 03156 void AddYDim(); 03157 void DelX(const int& X); 03158 void DelY(const int& Y); 03159 }; 03160 03161 template <class TVal> 03162 void TVVec<TVal>::SwapX(const int& X1, const int& X2){ 03163 for (int Y=0; Y<int(YDim); Y++){ 03164 TVal Val=At(X1, Y); At(X1, Y)=At(X2, Y); At(X2, Y)=Val;} 03165 } 03166 03167 template <class TVal> 03168 void TVVec<TVal>::SwapY(const int& Y1, const int& Y2){ 03169 for (int X=0; X<int(XDim); X++){ 03170 TVal Val=At(X, Y1); At(X, Y1)=At(X, Y2); At(X, Y2)=Val;} 03171 } 03172 03173 template <class TVal> 03174 void TVVec<TVal>::Swap(TVVec<TVal>& Vec){ //J: 03175 if (this!=&Vec){ 03176 ::Swap(XDim, Vec.XDim); 03177 ::Swap(YDim, Vec.YDim); 03178 ValV.Swap(Vec.ValV); 03179 } 03180 } 03181 03182 template <class TVal> 03183 void TVVec<TVal>::ShuffleX(TRnd& Rnd){ 03184 for (int X=0; X<XDim-1; X++){SwapX(X, X+Rnd.GetUniDevInt(XDim-X));} 03185 } 03186 03187 template <class TVal> 03188 void TVVec<TVal>::ShuffleY(TRnd& Rnd){ 03189 for (int Y=0; Y<YDim-1; Y++){SwapY(Y, Y+Rnd.GetUniDevInt(YDim-Y));} 03190 } 03191 03192 template <class TVal> 03193 void TVVec<TVal>::GetMxValXY(int& X, int& Y) const { 03194 int MxValN=ValV.GetMxValN(); 03195 Y=MxValN%YDim; 03196 X=MxValN/YDim; 03197 } 03198 03199 template <class TVal> 03200 void TVVec<TVal>::CopyFrom(const TVVec<TVal>& VVec){ 03201 int CopyXDim=TInt::GetMn(GetXDim(), VVec.GetXDim()); 03202 int CopyYDim=TInt::GetMn(GetYDim(), VVec.GetYDim()); 03203 for (int X=0; X<CopyXDim; X++){ 03204 for (int Y=0; Y<CopyYDim; Y++){ 03205 At(X, Y)=VVec.At(X, Y); 03206 } 03207 } 03208 } 03209 03210 template <class TVal> 03211 void TVVec<TVal>::AddXDim(){ 03212 TVVec<TVal> NewVVec(XDim+1, YDim); 03213 NewVVec.CopyFrom(*this); 03214 *this=NewVVec; 03215 } 03216 03217 template <class TVal> 03218 void TVVec<TVal>::AddYDim(){ 03219 TVVec<TVal> NewVVec(XDim, YDim+1); 03220 NewVVec.CopyFrom(*this); 03221 *this=NewVVec; 03222 } 03223 03224 template <class TVal> 03225 void TVVec<TVal>::DelX(const int& X){ 03226 TVVec<TVal> NewVVec(XDim-1, YDim); 03227 for (int Y=0; Y<YDim; Y++){ 03228 for (int LX=0; LX<X; LX++){ 03229 NewVVec.At(LX, Y)=At(LX, Y);} 03230 for (int RX=X+1; RX<XDim; RX++){ 03231 NewVVec.At(RX-1, Y)=At(RX, Y);} 03232 } 03233 *this=NewVVec; 03234 } 03235 03236 template <class TVal> 03237 void TVVec<TVal>::DelY(const int& Y){ 03238 TVVec<TVal> NewVVec(XDim, YDim-1); 03239 for (int X=0; X<XDim; X++){ 03240 for (int LY=0; LY<Y; LY++){ 03241 NewVVec.At(X, LY)=At(X, LY);} 03242 for (int RY=Y+1; RY<YDim; RY++){ 03243 NewVVec.At(X, RY-1)=At(X, RY);} 03244 } 03245 *this=NewVVec; 03246 } 03247 03248 template <class TVal> 03249 void TVVec<TVal>::GetRow(const int& RowN, TVec<TVal>& Vec) const { 03250 Vec.Gen(GetCols(), 0); 03251 for (int col = 0; col < GetCols(); col++) { 03252 Vec.Add(At(RowN, col)); 03253 } 03254 } 03255 03256 template <class TVal> 03257 void TVVec<TVal>::GetCol(const int& ColN, TVec<TVal>& Vec) const { 03258 Vec.Gen(GetRows(), 0); 03259 for (int row = 0; row < GetRows(); row++) { 03260 Vec.Add(At(row, ColN)); 03261 } 03262 } 03263 03265 // Common-2D-Vector-Types 03266 typedef TVVec<TBool> TBoolVV; 03267 typedef TVVec<TCh> TChVV; 03268 typedef TVVec<TInt> TIntVV; 03269 typedef TVVec<TSFlt> TSFltVV; 03270 typedef TVVec<TFlt> TFltVV; 03271 typedef TVVec<TStr> TStrVV; 03272 typedef TVVec<TIntPr> TIntPrVV; 03273 03275 // 3D-Vector 03276 template <class TVal> 03277 class TVVVec{ 03278 private: 03279 TInt XDim, YDim, ZDim; 03280 TVec<TVal> ValV; 03281 public: 03282 TVVVec(): XDim(), YDim(), ZDim(), ValV(){} 03283 TVVVec(const TVVVec& Vec): 03284 XDim(Vec.XDim), YDim(Vec.YDim), ZDim(Vec.ZDim), ValV(Vec.ValV){} 03285 TVVVec(const int& _XDim, const int& _YDim, const int& _ZDim): 03286 XDim(), YDim(), ZDim(), ValV(){Gen(_XDim, _YDim, _ZDim);} 03287 explicit TVVVec(TSIn& SIn): 03288 XDim(SIn), YDim(SIn), ZDim(SIn), ValV(SIn){} 03289 void Save(TSOut& SOut) const { 03290 XDim.Save(SOut); YDim.Save(SOut); ZDim.Save(SOut); ValV.Save(SOut);} 03291 03292 TVVVec<TVal>& operator=(const TVVVec<TVal>& Vec){ 03293 XDim=Vec.XDim; YDim=Vec.YDim; ZDim=Vec.ZDim; ValV=Vec.ValV; 03294 return *this; 03295 } 03296 bool operator==(const TVVVec& Vec) const { 03297 return (XDim==Vec.XDim)&&(YDim==Vec.YDim)&&(ZDim==Vec.ZDim)&& 03298 (ValV==Vec.ValV);} 03299 03300 bool Empty() const {return ValV.Len()==0;} 03301 void Clr(){XDim=0; YDim=0; ZDim=0; ValV.Clr();} 03302 void Gen(const int& _XDim, const int& _YDim, const int& _ZDim){ 03303 Assert((_XDim>=0)&&(_YDim>=0)&&(_ZDim>=0)); 03304 XDim=_XDim; YDim=_YDim; ZDim=_ZDim; ValV.Gen(XDim*YDim*ZDim);} 03305 TVal& At(const int& X, const int& Y, const int& Z){ 03306 Assert((0<=X)&&(X<int(XDim))&&(0<=Y)&&(Y<int(YDim))&&(0<=Z)&&(Z<int(ZDim))); 03307 return ValV[X*YDim*ZDim+Y*ZDim+Z];} 03308 const TVal& At(const int& X, const int& Y, const int& Z) const { 03309 Assert((0<=X)&&(X<int(XDim))&&(0<=Y)&&(Y<int(YDim))&&(0<=Z)&&(Z<int(ZDim))); 03310 return ValV[X*YDim*ZDim+Y*ZDim+Z];} 03311 TVal& operator()(const int& X, const int& Y, const int& Z){ 03312 return At(X, Y, Z);} 03313 const TVal& operator()(const int& X, const int& Y, const int& Z) const { 03314 return At(X, Y, Z);} 03315 int GetXDim() const {return XDim;} 03316 int GetYDim() const {return YDim;} 03317 int GetZDim() const {return ZDim;} 03318 }; 03319 03321 // Common-3D-Vector-Types 03322 typedef TVVVec<TInt> TIntVVV; 03323 typedef TVVVec<TFlt> TFltVVV; 03324 03326 // Tree 03327 template <class TVal> 03328 class TTree{ 03329 private: 03330 TVec<TTriple<TInt, TIntV, TVal> > NodeV; // (ParentNodeId, ChildNodeIdV, NodeVal) 03331 public: 03332 TTree(): NodeV(){} 03333 TTree(const TTree& Tree): NodeV(Tree.NodeV){} 03334 explicit TTree(TSIn& SIn): NodeV(SIn){} 03335 void Save(TSOut& SOut) const {NodeV.Save(SOut);} 03336 void LoadXml(const PXmlTok& XmlTok, const TStr& Nm=""); 03337 void SaveXml(TSOut& SOut, const TStr& Nm) const; 03338 03339 TTree& operator=(const TTree& Tree){if (this!=&Tree){NodeV=Tree.NodeV;} return *this;} 03340 bool operator==(const TTree& Tree) const {return NodeV==Tree.NodeV;} 03341 bool operator<(const TTree& Tree) const {return false;} 03342 03343 int GetPrimHashCd() const {return NodeV.GetPrimHashCd();} 03344 int GetSecHashCd() const {return NodeV.GetSecHashCd();} 03345 03346 int GetMemUsed() const {return NodeV.GetMemUsed();} 03347 03348 void Clr(){NodeV.Clr();} 03349 03350 int AddNode(const int& ParentNodeId, const TVal& NodeVal=TVal()){ 03351 IAssert(((ParentNodeId==-1)&&(NodeV.Len()==0))||(NodeV.Len()>0)); 03352 if (ParentNodeId!=-1){NodeV[ParentNodeId].Val2.Add(NodeV.Len());} 03353 return NodeV.Add(TTriple<TInt, TIntV, TVal>(ParentNodeId, TIntV(), NodeVal));} 03354 int AddRoot(const TVal& NodeVal=TVal()){ 03355 return AddNode(-1, NodeVal);} 03356 03357 int GetNodes() const {return NodeV.Len();} 03358 void GetNodeIdV(TIntV& NodeIdV, const int& NodeId=0); 03359 int GetParentNodeId(const int& NodeId) const {return NodeV[NodeId].Val1;} 03360 int GetChildren(const int& NodeId) const {return NodeV[NodeId].Val2.Len();} 03361 int GetChildNodeId(const int& NodeId, const int& ChildN) const {return NodeV[NodeId].Val2[ChildN];} 03362 TVal& GetNodeVal(const int& NodeId){return NodeV[NodeId].Val3;} 03363 03364 void GenRandomTree(const int& Nodes, TRnd& Rnd); 03365 03366 void DelNode(const int& NodeId); 03367 void CopyTree(const int& SrcNodeId, TTree& DstTree, const int& DstParentNodeId=-1); 03368 03369 void WrTree(const int& NodeId=0, const int& Lev=0); 03370 }; 03371 03372 template <class TVal> 03373 void TTree<TVal>::GetNodeIdV(TIntV& NodeIdV, const int& NodeId){ 03374 if (NodeId==0){NodeIdV.Clr(); if (GetNodes()==0){return;}} 03375 else if (GetParentNodeId(NodeId)==-1){return;} 03376 NodeIdV.Add(NodeId); 03377 for (int ChildN=0; ChildN<GetChildren(NodeId); ChildN++){ 03378 int ChildNodeId=GetChildNodeId(NodeId, ChildN); 03379 if (ChildNodeId!=-1){ 03380 GetNodeIdV(NodeIdV, ChildNodeId); 03381 } 03382 } 03383 } 03384 03385 template <class TVal> 03386 void TTree<TVal>::GenRandomTree(const int& Nodes, TRnd& Rnd){ 03387 Clr(); 03388 if (Nodes>0){ 03389 AddRoot(TVal()); 03390 for (int NodeN=1; NodeN<Nodes; NodeN++){ 03391 int ParentNodeId=Rnd.GetUniDevInt(0, GetNodes()-1); 03392 AddNode(ParentNodeId, TVal()); 03393 } 03394 } 03395 } 03396 03397 template <class TVal> 03398 void TTree<TVal>::DelNode(const int& NodeId){ 03399 if (NodeId==0){ 03400 Clr(); 03401 } else { 03402 TIntV& ChildNodeIdV=NodeV[GetParentNodeId(NodeId)].Val2; 03403 int ChildNodeIdN=ChildNodeIdV.SearchForw(NodeId); 03404 ChildNodeIdV[ChildNodeIdN]=-1; 03405 } 03406 } 03407 03408 template <class TVal> 03409 void TTree<TVal>::CopyTree(const int& SrcNodeId, TTree& DstTree, const int& DstParentNodeId){ 03410 int DstNodeId=DstTree.AddNode(DstParentNodeId, GetNodeVal(SrcNodeId)); 03411 for (int ChildN=0; ChildN<GetChildren(SrcNodeId); ChildN++){ 03412 int ChildNodeId=GetChildNodeId(SrcNodeId, ChildN); 03413 if (ChildNodeId!=-1){ 03414 CopyTree(ChildNodeId, DstTree, DstNodeId); 03415 } 03416 } 03417 } 03418 03419 template <class TVal> 03420 void TTree<TVal>::WrTree(const int& NodeId, const int& Lev){ 03421 for (int LevN=0; LevN<Lev; LevN++){printf("| ");} 03422 printf("%d (%d)\n", NodeId, GetChildren(NodeId)); 03423 for (int ChildN=0; ChildN<GetChildren(NodeId); ChildN++){ 03424 int ChildNodeId=GetChildNodeId(NodeId, ChildN); 03425 if (ChildNodeId!=-1){ 03426 WrTree(ChildNodeId, Lev+1); 03427 } 03428 } 03429 } 03430 03432 // Common-Tree-Types 03433 typedef TTree<TInt> TIntTree; 03434 typedef TTree<TFlt> TFltTree; 03435 typedef TTree<TStr> TStrTree; 03436 typedef TTree<TStrIntPr> TStrIntPrTree; 03437 typedef TTree<TStrIntStrVTr> TStrIntStrVTrTree; 03438 03440 // Stack 03441 template <class TVal> 03442 class TSStack{ 03443 private: 03444 TVec<TVal> ValV; 03445 public: 03446 TSStack(): ValV(){} 03447 TSStack(const int& MxVals): ValV(MxVals, 0){} 03448 TSStack(const TSStack& Stack): ValV(Stack.ValV){} 03449 explicit TSStack(TSIn& SIn): ValV(SIn){} 03450 void Save(TSOut& SOut) const {ValV.Save(SOut);} 03451 03452 TSStack& operator=(const TSStack& Stack){ 03453 if (this!=&Stack){ValV=Stack.ValV;} return *this;} 03454 bool operator==(const TSStack& Stack) const {return this==&Stack;} 03455 const TVal& operator[](const int& ValN) const {return ValV[ValV.Len()-ValN-1];} 03456 TVal& operator[](const int& ValN) {return ValV[ValV.Len()-ValN-1];} 03457 03458 bool Empty(){return ValV.Len()==0;} 03459 void Clr(const bool& DoDel=false) {ValV.Clr(DoDel);} 03460 bool IsIn(const TVal& Val) const {return ValV.IsIn(Val);} 03461 int Len(){return ValV.Len();} 03462 TVal& Top(){Assert(0<ValV.Len()); return ValV.Last();} 03463 const TVal& Top() const {Assert(0<ValV.Len()); return ValV.Last();} 03464 void Push(){ValV.Add();} 03465 void Push(const TVal& Val){ValV.Add(Val);} 03466 void Pop(){Assert(0<ValV.Len()); ValV.DelLast();} 03467 }; 03468 03470 // Common-Stack-Types 03471 typedef TSStack<TInt> TIntS; 03472 typedef TSStack<TBoolChPr> TBoolChS; 03473 03475 // Queue 03476 template <class TVal> 03477 class TQQueue{ 03478 private: 03479 TInt MxLast, MxLen; 03480 TInt First, Last; 03481 TVec<TVal> ValV; 03482 public: 03483 TQQueue(const int& _MxLast=64, const int& _MxLen=-1): 03484 MxLast(_MxLast), MxLen(_MxLen), First(0), Last(0), ValV(){ 03485 Assert(int(MxLast)>0); Assert((MxLen==-1)||(int(MxLen)>0));} 03486 TQQueue(const TQQueue& Queue): 03487 MxLast(Queue.MxLast), MxLen(Queue.MxLen), 03488 First(Queue.First), Last(Queue.Last), ValV(Queue.ValV){} 03489 explicit TQQueue(TSIn& SIn): 03490 MxLast(SIn), MxLen(SIn), First(SIn), Last(SIn), ValV(SIn){} 03491 void Save(TSOut& SOut) const { 03492 MxLast.Save(SOut); MxLen.Save(SOut); 03493 First.Save(SOut); Last.Save(SOut); ValV.Save(SOut);} 03494 03495 TQQueue& operator=(const TQQueue& Queue){ 03496 if (this!=&Queue){MxLast=Queue.MxLast; MxLen=Queue.MxLen; 03497 First=Queue.First; Last=Queue.Last; ValV=Queue.ValV;} 03498 return *this;} 03499 const TVal& operator[](const int& ValN) const {Assert((0<=ValN)&&(ValN<Len())); 03500 return ValV[Last+ValN];} 03501 03502 void Clr(const bool& DoDel=true){ValV.Clr(DoDel); First=Last=0;} 03503 void Gen(const int& _MxLast=64, const int& _MxLen=-1){ 03504 MxLast=_MxLast; MxLen=_MxLen; First=0; Last=0; ValV.Clr();} 03505 void GetSubValV(const int& _BValN, const int& _EValN, TVec<TVal>& SubValV) const { 03506 int BValN=TInt::GetMx(0, _BValN); 03507 int EValN=TInt::GetMn(Len()-1, _EValN); 03508 SubValV.Gen(EValN-BValN+1); 03509 for (int ValN=BValN; ValN<=EValN; ValN++){ 03510 SubValV[ValN-BValN]=ValV[Last+ValN];} 03511 } 03512 03513 bool Empty() const {return First==Last;} 03514 int Len() const {return First-Last;} 03515 const TVal& Top() const { 03516 Assert(First!=Last); return ValV[Last];} 03517 void Pop(){ 03518 IAssert(First!=Last); Last++; 03519 if (First==Last){ValV.Clr(); First=Last=0;}} 03520 void Push(const TVal& Val){ 03521 if (Last>MxLast){ValV.Del(0, Last-1); First-=Last; Last=0;} 03522 if ((MxLen!=-1)&&(MxLen==Len())){Pop();} 03523 First++; ValV.Add(Val);} 03524 03525 void Shuffle(TRnd& Rnd){ 03526 TVec<TVal> ValV(Len(), 0); while (!Empty()){ValV.Add(Top()); Pop();} 03527 ValV.Shuffle(Rnd); Clr(); 03528 for (int ValN=0; ValN<ValV.Len(); ValN++){Push(ValV[ValN]);}} 03529 }; 03530 03532 // Common-Queue-Types 03533 typedef TQQueue<TInt> TIntQ; 03534 typedef TQQueue<TFlt> TFltQ; 03535 typedef TQQueue<TStr> TStrQ; 03536 typedef TQQueue<TIntPr> TIntPrQ; 03537 typedef TQQueue<TIntStrPr> TIntStrPrQ; 03538 typedef TQQueue<TFltV> TFltVQ; 03539 typedef TQQueue<TAscFltV> TAscFltVQ; 03540 typedef TVec<TQQueue<TInt> > TIntQV; 03541 03543 // List-Node 03544 template <class TVal> 03545 class TLstNd{ 03546 public: 03547 TLstNd* PrevNd; 03548 TLstNd* NextNd; 03549 TVal Val; 03550 public: 03551 TLstNd(): PrevNd(NULL), NextNd(NULL), Val(){} 03552 TLstNd(const TLstNd&); 03553 TLstNd(TLstNd* _PrevNd, TLstNd* _NextNd, const TVal& _Val): 03554 PrevNd(_PrevNd), NextNd(_NextNd), Val(_Val){} 03555 03556 TLstNd& operator=(const TLstNd&); 03557 03558 bool IsPrev() const {return (PrevNd != NULL); } 03559 bool IsNext() const {return (NextNd != NULL); } 03560 TLstNd* Prev() const {Assert(this!=NULL); return PrevNd;} 03561 TLstNd* Next() const {Assert(this!=NULL); return NextNd;} 03562 TVal& GetVal(){Assert(this!=NULL); return Val;} 03563 const TVal& GetVal() const {Assert(this!=NULL); return Val;} 03564 }; 03565 03567 // List 03568 template <class TVal> 03569 class TLst{ 03570 public: 03571 typedef TLstNd<TVal>* PLstNd; 03572 private: 03573 int Nds; 03574 PLstNd FirstNd; 03575 PLstNd LastNd; 03576 public: 03577 TLst(): Nds(0), FirstNd(NULL), LastNd(NULL){} 03578 TLst(const TLst&); 03579 ~TLst(){Clr();} 03580 explicit TLst(TSIn& SIn); 03581 void Save(TSOut& SOut) const; 03582 03583 TLst& operator=(const TLst&); 03584 03585 void Clr(){ 03586 PLstNd Nd=FirstNd; 03587 while (Nd!=NULL){PLstNd NextNd=Nd->NextNd; delete Nd; Nd=NextNd;} 03588 Nds=0; FirstNd=NULL; LastNd=NULL;} 03589 03590 bool Empty() const {return Nds==0;} 03591 int Len() const {return Nds;} 03592 PLstNd First() const {return FirstNd;} 03593 PLstNd Last() const {return LastNd;} 03594 TVal& FirstVal() const {return FirstNd->GetVal();} 03595 TVal& LastVal() const {return LastNd->GetVal();} 03596 03597 PLstNd AddFront(const TVal& Val); 03598 PLstNd AddBack(const TVal& Val); 03599 PLstNd AddFrontSorted(const TVal& Val, const bool& Asc=true); 03600 PLstNd AddBackSorted(const TVal& Val, const bool& Asc=true); 03601 void PutFront(const PLstNd& Nd); 03602 void PutBack(const PLstNd& Nd); 03603 PLstNd Ins(const PLstNd& Nd, const TVal& Val); 03604 void Del(const TVal& Val); 03605 void Del(const PLstNd& Nd); 03606 void DelFirst() { PLstNd DelNd = FirstNd; Del(DelNd); } 03607 void DelLast() { PLstNd DelNd = LastNd; Del(DelNd); } 03608 03609 PLstNd SearchForw(const TVal& Val); 03610 PLstNd SearchBack(const TVal& Val); 03611 03612 friend class TLstNd<TVal>; 03613 }; 03614 03615 template <class TVal> 03616 TLst<TVal>::TLst(TSIn& SIn): 03617 Nds(0), FirstNd(NULL), LastNd(NULL){ 03618 int CheckNds=0; SIn.Load(CheckNds); 03619 for (int NdN=0; NdN<CheckNds; NdN++){AddBack(TVal(SIn));} 03620 Assert(Nds==CheckNds); 03621 } 03622 03623 template <class TVal> 03624 void TLst<TVal>::Save(TSOut& SOut) const { 03625 SOut.Save(Nds); 03626 PLstNd Nd=FirstNd; int CheckNds=0; 03627 while (Nd!=NULL){ 03628 Nd->Val.Save(SOut); Nd=Nd->NextNd; CheckNds++;} 03629 IAssert(Nds==CheckNds); 03630 } 03631 03632 template <class TVal> 03633 TLstNd<TVal>* TLst<TVal>::AddFront(const TVal& Val){ 03634 PLstNd Nd=new TLstNd<TVal>(NULL, FirstNd, Val); 03635 if (FirstNd!=NULL){FirstNd->PrevNd=Nd; FirstNd=Nd;} 03636 else {FirstNd=Nd; LastNd=Nd;} 03637 Nds++; return Nd; 03638 } 03639 03640 template <class TVal> 03641 TLstNd<TVal>* TLst<TVal>::AddBack(const TVal& Val){ 03642 PLstNd Nd=new TLstNd<TVal>(LastNd, NULL, Val); 03643 if (LastNd!=NULL){LastNd->NextNd=Nd; LastNd=Nd;} 03644 else {FirstNd=Nd; LastNd=Nd;} 03645 Nds++; return Nd; 03646 } 03647 03648 template <class TVal> 03649 TLstNd<TVal>* TLst<TVal>::AddFrontSorted(const TVal& Val, const bool& Asc){ 03650 PLstNd Nd=First(); 03651 if (Nd==NULL){ 03652 return Ins(Nd, Val); 03653 } else { 03654 while ((Nd!=NULL)&&((Asc&&(Val>Nd()))||(!Asc&&(Val<Nd())))){ 03655 Nd=Nd->Next();} 03656 if (Nd==NULL){return Ins(Nd->Last(), Val);} 03657 else {return Ins(Nd->Prev(), Val);} 03658 } 03659 } 03660 03661 template <class TVal> 03662 TLstNd<TVal>* TLst<TVal>::AddBackSorted(const TVal& Val, const bool& Asc){ 03663 PLstNd Nd=Last(); 03664 while ((Nd!=NULL)&&((Asc&&(Val<Nd->Val))||(!Asc&&(Val>Nd->Val)))){ 03665 Nd=Nd->Prev();} 03666 return Ins(Nd, Val); 03667 } 03668 03669 template <class TVal> 03670 void TLst<TVal>::PutFront(const PLstNd& Nd){ 03671 Assert(Nd!=NULL); 03672 // unchain 03673 if (Nd->PrevNd==NULL){FirstNd=Nd->NextNd;} 03674 else {Nd->PrevNd->NextNd=Nd->NextNd;} 03675 if (Nd->NextNd==NULL){LastNd=Nd->PrevNd;} 03676 else {Nd->NextNd->PrevNd=Nd->PrevNd;} 03677 // add to front 03678 Nd->PrevNd=NULL; Nd->NextNd=FirstNd; 03679 if (FirstNd!=NULL){FirstNd->PrevNd=Nd; FirstNd=Nd;} 03680 else {FirstNd=Nd; LastNd=Nd;} 03681 } 03682 03683 template <class TVal> 03684 void TLst<TVal>::PutBack(const PLstNd& Nd){ 03685 Assert(Nd!=NULL); 03686 // unchain 03687 if (Nd->PrevNd==NULL){FirstNd=Nd->NextNd;} 03688 else {Nd->PrevNd->NextNd=Nd->NextNd;} 03689 if (Nd->NextNd==NULL){LastNd=Nd->PrevNd;} 03690 else {Nd->NextNd->PrevNd=Nd->PrevNd;} 03691 // add to back 03692 Nd->PrevNd=LastNd; Nd->NextNd=NULL; 03693 if (LastNd!=NULL){LastNd->NextNd=Nd; LastNd=Nd;} 03694 else {FirstNd=Nd; LastNd=Nd;} 03695 } 03696 03697 template <class TVal> 03698 TLstNd<TVal>* TLst<TVal>::Ins(const PLstNd& Nd, const TVal& Val){ 03699 if (Nd==NULL){return AddFront(Val);} 03700 else if (Nd->NextNd==NULL){return AddBack(Val);} 03701 else { 03702 PLstNd NewNd=new TLstNd<TVal>(Nd, Nd->NextNd, Val); 03703 Nd->NextNd=NewNd; NewNd->NextNd->PrevNd=Nd; 03704 Nds++; return Nd; 03705 } 03706 } 03707 03708 template <class TVal> 03709 void TLst<TVal>::Del(const TVal& Val){ 03710 PLstNd Nd=SearchForw(Val); 03711 if (Nd!=NULL){Del(Nd);} 03712 } 03713 03714 template <class TVal> 03715 void TLst<TVal>::Del(const PLstNd& Nd){ 03716 Assert(Nd!=NULL); 03717 if (Nd->PrevNd==NULL){FirstNd=Nd->NextNd;} 03718 else {Nd->PrevNd->NextNd=Nd->NextNd;} 03719 if (Nd->NextNd==NULL){LastNd=Nd->PrevNd;} 03720 else {Nd->NextNd->PrevNd=Nd->PrevNd;} 03721 Nds--; delete Nd; 03722 } 03723 03724 template <class TVal> 03725 TLstNd<TVal>* TLst<TVal>::SearchForw(const TVal& Val){ 03726 PLstNd Nd=First(); 03727 while (Nd!=NULL){ 03728 if (Nd->GetVal()==Val){return Nd;} 03729 Nd=Nd->Next(); 03730 } 03731 return NULL; 03732 } 03733 03734 template <class TVal> 03735 TLstNd<TVal>* TLst<TVal>::SearchBack(const TVal& Val){ 03736 PLstNd Nd=Last(); 03737 while (Nd!=NULL){ 03738 if (Nd->GetVal()==Val){return Nd;} 03739 Nd=Nd->Prev(); 03740 } 03741 return NULL; 03742 } 03743 03745 // Common-List-Types 03746 typedef TLst<TInt> TIntL; 03747 typedef TLstNd<TInt>* PIntLN; 03748 typedef TLst<TIntKd> TIntKdL; 03749 typedef TLstNd<TIntKd>* PIntKdLN; 03750 typedef TLst<TFlt> TFltL; 03751 typedef TLstNd<TFlt>* PFltLN; 03752 typedef TLst<TFltIntKd> TFltIntKdL; 03753 typedef TLstNd<TFltIntKd>* PFltIntKdLN; 03754 typedef TLst<TAscFltIntKd> TAscFltIntKdL; 03755 typedef TLstNd<TAscFltIntKd>* PAscFltIntKdLN; 03756 typedef TLst<TStr> TStrL; 03757 typedef TLstNd<TStr>* PStrLN; 03758 03760 // Record-File 03761 template <class THd, class TRec> 03762 class TFRec{ 03763 private: 03764 PFRnd FRnd; 03765 public: 03766 TFRec(const TStr& FNm, const TFAccess& FAccess, const bool& CreateIfNo): 03767 FRnd(PFRnd(new TFRnd(FNm, FAccess, CreateIfNo, sizeof(THd), sizeof(TRec)))){} 03768 TFRec(const TFRec&); 03769 03770 TFRec& operator=(const TFRec&); 03771 03772 void SetRecN(const int& RecN){FRnd->SetRecN(RecN);} 03773 int GetRecN(){return FRnd->GetRecN();} 03774 int GetRecs(){return FRnd->GetRecs();} 03775 03776 void GetHd(THd& Hd){FRnd->GetHd(&Hd);} 03777 void PutHd(const THd& Hd){FRnd->PutHd(&Hd);} 03778 void GetRec(TRec& Rec, const int& RecN=-1){FRnd->GetRec(&Rec, RecN);} 03779 void PutRec(const TRec& Rec, const int& RecN=-1){FRnd->PutRec(&Rec, RecN);} 03780 }; 03781 03783 // Function 03784 template <class TFuncPt> 03785 class TFunc{ 03786 private: 03787 TFuncPt FuncPt; 03788 public: 03789 TFunc(): FuncPt(NULL){} 03790 TFunc(const TFunc& Func): FuncPt(Func.FuncPt){} 03791 TFunc(const TFuncPt& _FuncPt): FuncPt(_FuncPt){} 03792 TFunc(TSIn&){Fail;} 03793 void Save(TSOut&) const {Fail;} 03794 03795 TFunc& operator=(const TFunc& Func){ 03796 if (this!=&Func){FuncPt=Func.FuncPt;} return *this;} 03797 bool operator==(const TFunc& Func) const { 03798 return FuncPt==Func.FuncPt;} 03799 bool operator<(const TFunc&) const { 03800 Fail; return false;} 03801 TFuncPt operator()() const {return FuncPt;} 03802 };