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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
ds.h
Go to the documentation of this file.
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 };