SNAP Library, Developer Reference  2012-10-02 12:56:23
SNAP, a general purpose network analysis and graph mining library
 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 Val1.GetPrimHashCd()+Val2.GetPrimHashCd();} //J: terrible hash function!
00057   //int GetSecHashCd() const {return Val1.GetSecHashCd()+Val2.GetSecHashCd();}    //J: terrible hash function!
00058   int GetPrimHashCd() const {return 12289*Val1.GetPrimHashCd() ^ Val2.GetPrimHashCd();} //J: multiply by prime and xor
00059   int GetSecHashCd() const {return Val1.GetSecHashCd() ^ 24593*Val2.GetSecHashCd();}    //J: multiply by prime and xor
00060 
00061   void GetVal(TVal1& _Val1, TVal2& _Val2) const {_Val1=Val1; _Val2=Val2;}
00062   TStr GetStr() const {
00063     return TStr("Pair(")+Val1.GetStr()+", "+Val2.GetStr()+")";}
00064 };
00065 
00066 template <class TVal1, class TVal2>
00067 void GetSwitchedPrV(
00068  const TVec<TPair<TVal1, TVal2> >& SrcPrV,
00069  TVec<TPair<TVal2, TVal1> >& DstPrV){
00070   int Prs=SrcPrV.Len();
00071   DstPrV.Gen(Prs, 0);
00072   for (int PrN=0; PrN<Prs; PrN++){
00073     const TPair<TVal1, TVal2>& SrcPr=SrcPrV[PrN];
00074     DstPrV.Add(TPair<TVal2, TVal1>(SrcPr.Val2, SrcPr.Val1));
00075   }
00076 }
00077 
00078 typedef TPair<TBool, TCh> TBoolChPr;
00079 typedef TPair<TBool, TFlt> TBoolFltPr;
00080 typedef TPair<TUCh, TInt> TUChIntPr;
00081 typedef TPair<TUCh, TUInt64> TUChUInt64Pr;
00082 typedef TPair<TUCh, TStr> TUChStrPr;
00083 typedef TPair<TInt, TBool> TIntBoolPr;
00084 typedef TPair<TInt, TCh> TIntChPr;
00085 typedef TPair<TInt, TInt> TIntPr;
00086 typedef TPair<TInt, TUInt64> TIntUInt64Pr;
00087 typedef TPair<TInt, TIntPr> TIntIntPrPr;
00088 typedef TPair<TInt, TVec<TInt> > TIntIntVPr;
00089 typedef TPair<TInt, TFlt> TIntFltPr;
00090 typedef TPair<TInt, TStr> TIntStrPr;
00091 typedef TPair<TInt, TStrV> TIntStrVPr;
00092 typedef TPair<TIntPr, TInt> TIntPrIntPr;
00093 typedef TPair<TUInt, TUInt> TUIntUIntPr;
00094 typedef TPair<TUInt, TInt> TUIntIntPr;
00095 typedef TPair<TUInt64, TInt> TUInt64IntPr;
00096 typedef TPair<TUInt64, TUInt64> TUInt64Pr;
00097 typedef TPair<TUInt64, TFlt> TUInt64FltPr;
00098 typedef TPair<TUInt64, TStr> TUInt64StrPr;
00099 typedef TPair<TFlt, TInt> TFltIntPr;
00100 typedef TPair<TFlt, TUInt64> TFltUInt64Pr;
00101 typedef TPair<TFlt, TFlt> TFltPr;
00102 typedef TPair<TFlt, TStr> TFltStrPr;
00103 typedef TPair<TAscFlt, TInt> TAscFltIntPr;
00104 typedef TPair<TAscFlt, TAscFlt> TAscFltPr;
00105 typedef TPair<TFlt, TStr> TFltStrPr;
00106 typedef TPair<TAscFlt, TStr> TAscFltStrPr;
00107 typedef TPair<TStr, TInt> TStrIntPr;
00108 typedef TPair<TStr, TFlt> TStrFltPr;
00109 typedef TPair<TStr, TStr> TStrPr;
00110 typedef TPair<TStr, TStrV> TStrStrVPr;
00111 typedef TPair<TStrV, TInt> TStrVIntPr;
00112 typedef TPair<TInt, TIntPr> TIntIntPrPr;
00113 typedef TPair<TInt, TStrPr> TIntStrPrPr;
00114 typedef TPair<TFlt, TStrPr> TFltStrPrPr;
00115 
00116 // Pair comparator
00117 template <class TVal1, class TVal2>
00118 class TCmpPairByVal2 {
00119 private:
00120   bool IsAsc;
00121 public:
00122   TCmpPairByVal2(const bool& AscSort=true) : IsAsc(AscSort) { }
00123   bool operator () (const TPair<TVal1, TVal2>& P1, const TPair<TVal1, TVal2>& P2) const {
00124     if (IsAsc) { return P1.Val2 < P2.Val2; } else { return P2.Val2 < P1.Val2; }
00125   }
00126 };
00127 
00129 // Triple
00130 template <class TVal1, class TVal2, class TVal3>
00131 class TTriple{
00132 public:
00133   TVal1 Val1;
00134   TVal2 Val2;
00135   TVal3 Val3;
00136 public:
00137   TTriple(): Val1(), Val2(), Val3(){}
00138   TTriple(const TTriple& Triple):
00139     Val1(Triple.Val1), Val2(Triple.Val2), Val3(Triple.Val3){}
00140   TTriple(const TVal1& _Val1, const TVal2& _Val2, const TVal3& _Val3):
00141     Val1(_Val1), Val2(_Val2), Val3(_Val3){}
00142   explicit TTriple(TSIn& SIn): Val1(SIn), Val2(SIn), Val3(SIn){}
00143   void Save(TSOut& SOut) const {
00144     Val1.Save(SOut); Val2.Save(SOut); Val3.Save(SOut);}
00145   void LoadXml(const PXmlTok& XmlTok, const TStr& Nm="");
00146   void SaveXml(TSOut& SOut, const TStr& Nm) const;
00147 
00148   TTriple& operator=(const TTriple& Triple){
00149     if (this!=&Triple){Val1=Triple.Val1; Val2=Triple.Val2; Val3=Triple.Val3;}
00150     return *this;}
00151   bool operator==(const TTriple& Triple) const {
00152     return (Val1==Triple.Val1)&&(Val2==Triple.Val2)&&(Val3==Triple.Val3);}
00153   bool operator<(const TTriple& Triple) const {
00154     return (Val1<Triple.Val1)||((Val1==Triple.Val1)&&(Val2<Triple.Val2))||
00155      ((Val1==Triple.Val1)&&(Val2==Triple.Val2)&&(Val3<Triple.Val3));}
00156 
00157   int GetPrimHashCd() const {
00158     return Val1.GetPrimHashCd()+Val2.GetPrimHashCd()+Val3.GetPrimHashCd();}
00159   int GetSecHashCd() const {
00160     return Val1.GetSecHashCd()+Val2.GetSecHashCd()+Val3.GetSecHashCd();}
00161   //int GetPrimHashCd() const {return 193*Val1.GetPrimHashCd() ^ 24593 * Val2.GetPrimHashCd() ^ ; } //J: multiply by prime and xor
00162   //int GetSecHashCd() const {return Val1.GetSecHashCd() ^ 24593*Val2.GetSecHashCd();}    //J: multiply by prime and xor
00163   int GetMemUsed() const {return Val1.GetMemUsed()+Val2.GetMemUsed()+Val3.GetMemUsed();}
00164 
00165   void GetVal(TVal1& _Val1, TVal2& _Val2, TVal3& _Val3) const {
00166     _Val1=Val1; _Val2=Val2; _Val3=Val3;}
00167 };
00168 
00169 typedef TTriple<TCh, TCh, TCh> TChTr;
00170 typedef TTriple<TCh, TInt, TInt> TChIntIntTr;
00171 typedef TTriple<TUCh, TInt, TInt> TUChIntIntTr;
00172 typedef TTriple<TInt, TInt, TInt> TIntTr;
00173 typedef TTriple<TUInt64, TUInt64, TUInt64> TUInt64Tr;
00174 typedef TTriple<TInt, TStr, TInt> TIntStrIntTr;
00175 typedef TTriple<TInt, TInt, TStr> TIntIntStrTr;
00176 typedef TTriple<TInt, TInt, TFlt> TIntIntFltTr;
00177 typedef TTriple<TInt, TFlt, TInt> TIntFltIntTr;
00178 typedef TTriple<TInt, TFlt, TFlt> TIntFltFltTr;
00179 typedef TTriple<TInt, TVec<TInt>, TInt> TIntIntVIntTr;
00180 typedef TTriple<TInt, TInt, TVec<TInt> > TIntIntIntVTr;
00181 typedef TTriple<TFlt, TFlt, TFlt> TFltTr;
00182 typedef TTriple<TFlt, TInt, TInt> TFltIntIntTr;
00183 typedef TTriple<TFlt, TFlt, TInt> TFltFltIntTr;
00184 typedef TTriple<TFlt, TFlt, TStr> TFltFltStrTr;
00185 typedef TTriple<TChA, TChA, TChA> TChATr;
00186 typedef TTriple<TStr, TStr, TStr> TStrTr;
00187 typedef TTriple<TStr, TInt, TInt> TStrIntIntTr;
00188 typedef TTriple<TStr, TFlt, TFlt> TStrFltFltTr;
00189 typedef TTriple<TStr, TStr, TInt> TStrStrIntTr;
00190 typedef TTriple<TStr, TInt, TStrV> TStrIntStrVTr;
00191 
00193 // Quad
00194 template <class TVal1, class TVal2, class TVal3, class TVal4>
00195 class TQuad{
00196 public:
00197   TVal1 Val1;
00198   TVal2 Val2;
00199   TVal3 Val3;
00200   TVal4 Val4;
00201 public:
00202   TQuad():
00203     Val1(), Val2(), Val3(), Val4(){}
00204   TQuad(const TQuad& Quad):
00205     Val1(Quad.Val1), Val2(Quad.Val2), Val3(Quad.Val3), Val4(Quad.Val4){}
00206   TQuad(const TVal1& _Val1, const TVal2& _Val2, const TVal3& _Val3, const TVal4& _Val4):
00207     Val1(_Val1), Val2(_Val2), Val3(_Val3), Val4(_Val4){}
00208   explicit TQuad(TSIn& SIn):
00209     Val1(SIn), Val2(SIn), Val3(SIn), Val4(SIn){}
00210   void Save(TSOut& SOut) const {
00211     Val1.Save(SOut); Val2.Save(SOut); Val3.Save(SOut); Val4.Save(SOut);}
00212   void LoadXml(const PXmlTok& XmlTok, const TStr& Nm="");
00213   void SaveXml(TSOut& SOut, const TStr& Nm) const;
00214 
00215   TQuad& operator=(const TQuad& Quad){
00216     if (this!=&Quad){
00217       Val1=Quad.Val1; Val2=Quad.Val2; Val3=Quad.Val3; Val4=Quad.Val4;}
00218     return *this;}
00219   bool operator==(const TQuad& Quad) const {
00220     return (Val1==Quad.Val1)&&(Val2==Quad.Val2)&&(Val3==Quad.Val3)&&(Val4==Quad.Val4);}
00221   bool operator<(const TQuad& Quad) const {
00222     return (Val1<Quad.Val1)||((Val1==Quad.Val1)&&(Val2<Quad.Val2))||
00223      ((Val1==Quad.Val1)&&(Val2==Quad.Val2)&&(Val3<Quad.Val3))||
00224      ((Val1==Quad.Val1)&&(Val2==Quad.Val2)&&(Val3==Quad.Val3)&&(Val4<Quad.Val4));}
00225 
00226   int GetPrimHashCd() const {
00227     return Val1.GetPrimHashCd()+Val2.GetPrimHashCd()+Val3.GetPrimHashCd()+Val4.GetPrimHashCd();}
00228   int GetSecHashCd() const {
00229     return Val1.GetSecHashCd()+Val2.GetSecHashCd()+Val3.GetSecHashCd()+Val4.GetSecHashCd();}
00230 
00231   void GetVal(TVal1& _Val1, TVal2& _Val2, TVal3& _Val3, TVal4& _Val4) const {
00232     _Val1=Val1; _Val2=Val2; _Val3=Val3; _Val4=Val4;}
00233 };
00234 
00235 typedef TQuad<TStr, TStr, TInt, TInt> TStrStrIntIntQu;
00236 typedef TQuad<TStr, TStr, TStr, TStr> TStrQu;
00237 typedef TQuad<TInt, TInt, TInt, TInt> TIntQu;
00238 typedef TQuad<TFlt, TFlt, TFlt, TFlt> TFltQu;
00239 typedef TQuad<TFlt, TInt, TInt, TInt> TFltIntIntIntQu;
00240 typedef TQuad<TInt, TStr, TInt, TInt> TIntStrIntIntQu;
00241 typedef TQuad<TInt, TInt, TFlt, TFlt> TIntIntFltFltQu;
00242 
00244 // Tuple
00245 template<class TVal, int NVals>
00246 class TTuple {
00247 private:
00248   TVal ValV [NVals];
00249 public:
00250   TTuple(){}
00251   TTuple(const TVal& InitVal) { for (int i=0; i<Len(); i++) ValV[i]=InitVal; }
00252   TTuple(const TTuple& Tup) { for (int i=0; i<Len(); i++) ValV[i]=Tup[i]; }
00253   TTuple(TSIn& SIn) { for (int i=0; i<Len(); i++) ValV[i].Load(SIn); }
00254   void Save(TSOut& SOut) const { for (int i=0; i<Len(); i++) ValV[i].Save(SOut); }
00255   void Load(TSIn& SIn) { for (int i=0; i<Len(); i++) ValV[i].Load(SIn); }
00256 
00257   int Len() const { return NVals; }
00258   TVal& operator[] (const int& ValN) { return ValV[ValN]; }
00259   const TVal& operator[] (const int& ValN) const { return ValV[ValN]; }
00260   TTuple& operator = (const TTuple& Tup) { if (this != & Tup) {
00261     for (int i=0; i<Len(); i++) ValV[i]=Tup[i]; } return *this; }
00262   bool operator == (const TTuple& Tup) const {
00263     if (Len()!=Tup.Len()) { return false; }  if (&Tup==this) { return true; }
00264     for (int i=0; i<Len(); i++) if(ValV[i]!=Tup[i]){return false;} return true; }
00265   bool operator < (const TTuple& Tup) const {
00266     if (Len() == Tup.Len()) { for (int i=0; i<Len(); i++) {
00267       if(ValV[i]<Tup[i]){return true;} else if(ValV[i]>Tup[i]){return false;} } return false; }
00268     else { return Len() < Tup.Len(); } }
00269   void Sort(const bool& Asc=true);
00270   int FindMx() const;
00271   int FindMn() const;
00272   //int GetPrimHashCd() const { int HashCd=0;
00273   //  for (int i=0; i<Len(); i++) { HashCd += ValV[i].GetPrimHashCd(); } return HashCd; }
00274   //int GetSecHashCd() const { int HashCd=0;
00275   //  for (int i=0; i<Len(); i++) { HashCd += ValV[i].GetSecHashCd(); } return HashCd; }
00276   int GetPrimHashCd() const { uint HashCd = 5381;
00277     for (int i=0; i<Len(); i++) { HashCd = ((HashCd << 13) + HashCd) + ValV[i].GetPrimHashCd(); } return int(HashCd&0x7fffffff); }
00278   int GetSecHashCd() const { uint HashCd = 5381;
00279     for (int i=0; i<Len(); i++) { HashCd = ((HashCd << 19) + HashCd) + ValV[i].GetSecHashCd(); } return int(HashCd&0x7fffffff); }
00280   TStr GetStr() const { TChA ValsStr;
00281     for (int i=0; i<Len(); i++) { ValsStr+=" "+ValV[i].GetStr(); }
00282     return TStr::Fmt("Tuple(%d):", Len())+ValsStr; }
00283 };
00284 
00285 template<class TVal, int NVals>
00286 void TTuple<TVal, NVals>::Sort(const bool& Asc) {
00287   TVec<TVal> V(NVals);
00288   for (int i=0; i<NVals; i++) { V.Add(ValV[i]); }
00289   V.Sort(Asc);
00290   for (int i=0; i<NVals; i++) { ValV[i] = V[i]; }
00291 }
00292 
00293 template<class TVal, int NVals>
00294 int TTuple<TVal, NVals>::FindMx() const {
00295   TVal MxVal = ValV[0];
00296   int ValN = 0;
00297   for (int i = 1; i < NVals; i++) {
00298     if (MxVal<ValV[i]) {
00299       MxVal=ValV[i]; ValN=i;
00300     }
00301   }
00302   return ValN;
00303 }
00304 
00305 template<class TVal, int NVals>
00306 int TTuple<TVal, NVals>::FindMn() const {
00307   TVal MnVal = ValV[0];
00308   int ValN = 0;
00309   for (int i = 1; i < NVals; i++) {
00310     if (MnVal>ValV[i]) {
00311       MnVal=ValV[i]; ValN=i;
00312     }
00313   }
00314   return ValN;
00315 }
00316 
00318 // Key-Data
00319 template <class TKey, class TDat>
00320 class TKeyDat{
00321 public:
00322   TKey Key;
00323   TDat Dat;
00324 public:
00325   TKeyDat(): Key(), Dat(){}
00326   TKeyDat(const TKeyDat& KeyDat): Key(KeyDat.Key), Dat(KeyDat.Dat){}
00327   explicit TKeyDat(const TKey& _Key): Key(_Key), Dat(){}
00328   TKeyDat(const TKey& _Key, const TDat& _Dat): Key(_Key), Dat(_Dat){}
00329   explicit TKeyDat(TSIn& SIn): Key(SIn), Dat(SIn){}
00330   void Save(TSOut& SOut) const {Key.Save(SOut); Dat.Save(SOut);}
00331   void LoadXml(const PXmlTok& XmlTok, const TStr& Nm="");
00332   void SaveXml(TSOut& SOut, const TStr& Nm) const;
00333 
00334   TKeyDat& operator=(const TKeyDat& KeyDat){
00335     if (this!=&KeyDat){Key=KeyDat.Key; Dat=KeyDat.Dat;} return *this;}
00336   bool operator==(const TKeyDat& KeyDat) const {return Key==KeyDat.Key;}
00337   bool operator<(const TKeyDat& KeyDat) const {return Key<KeyDat.Key;}
00338 
00339   int GetPrimHashCd() const {return Key.GetPrimHashCd();}
00340   int GetSecHashCd() const {return Key.GetSecHashCd();}
00341 };
00342 
00343 template <class TKey, class TDat>
00344 void GetSwitchedKdV(
00345  const TVec<TKeyDat<TKey, TDat> >& SrcKdV,
00346  TVec<TKeyDat<TDat, TKey> >& DstKdV){
00347   int Kds=SrcKdV.Len();
00348   DstKdV.Gen(Kds, 0);
00349   for (int KdN=0; KdN<Kds; KdN++){
00350     const TKeyDat<TKey, TDat>& SrcKd=SrcKdV[KdN];
00351     DstKdV.Add(TKeyDat<TDat, TKey>(SrcKd.Dat, SrcKd.Key));
00352   }
00353 }
00354 
00355 typedef TKeyDat<TInt, TInt> TIntKd;
00356 typedef TKeyDat<TInt, TUInt64> TIntUInt64Kd;
00357 typedef TKeyDat<TInt, TFlt> TIntFltKd;
00358 typedef TKeyDat<TIntPr, TFlt> TIntPrFltKd;
00359 typedef TKeyDat<TInt, TFltPr> TIntFltPrKd;
00360 typedef TKeyDat<TInt, TSFlt> TIntSFltKd;
00361 typedef TKeyDat<TInt, TStr> TIntStrKd;
00362 typedef TKeyDat<TUInt, TInt> TUIntIntKd;
00363 typedef TKeyDat<TUInt, TUInt> TUIntKd;
00364 typedef TKeyDat<TUInt64, TInt> TUInt64IntKd;
00365 typedef TKeyDat<TUInt64, TFlt> TUInt64FltKd;
00366 typedef TKeyDat<TUInt64, TStr> TUInt64StrKd;
00367 typedef TKeyDat<TFlt, TBool> TFltBoolKd;
00368 typedef TKeyDat<TFlt, TInt> TFltIntKd;
00369 typedef TKeyDat<TFlt, TUInt64> TFltUInt64Kd;
00370 typedef TKeyDat<TFlt, TIntPr> TFltIntPrKd;
00371 typedef TKeyDat<TFlt, TUInt> TFltUIntKd;
00372 typedef TKeyDat<TFlt, TFlt> TFltKd;
00373 typedef TKeyDat<TFlt, TStr> TFltStrKd;
00374 typedef TKeyDat<TFlt, TBool> TFltBoolKd;
00375 typedef TKeyDat<TFlt, TIntBoolPr> TFltIntBoolPrKd;
00376 typedef TKeyDat<TAscFlt, TInt> TAscFltIntKd;
00377 typedef TKeyDat<TStr, TBool> TStrBoolKd;
00378 typedef TKeyDat<TStr, TInt> TStrIntKd;
00379 typedef TKeyDat<TStr, TFlt> TStrFltKd;
00380 typedef TKeyDat<TStr, TAscFlt> TStrAscFltKd;
00381 typedef TKeyDat<TStr, TStr> TStrKd;
00382 
00383 // Key-Data comparator
00384 
00385 template <class TVal1, class TVal2>
00386 class TCmpKeyDatByDat {
00387 private:
00388   bool IsAsc;
00389 public:
00390   TCmpKeyDatByDat(const bool& AscSort=true) : IsAsc(AscSort) { }
00391   bool operator () (const TKeyDat<TVal1, TVal2>& P1, const TKeyDat<TVal1, TVal2>& P2) const {
00392     if (IsAsc) { return P1.Dat < P2.Dat; } else { return P2.Dat < P1.Dat; }
00393   }
00394 };
00395 
00397 // Vector
00398 template <class TVal>
00399 class TVec{
00400 public:
00401   typedef TVal* TIter;
00402 protected:
00403   int MxVals; // if MxVals==-1, then ValT is not owned by us, we don't free it!
00404   int Vals;
00405   TVal* ValT;
00406   void Resize(const int& _MxVals=-1);
00407   TStr GetXOutOfBoundsErrMsg(const int& ValN) const;
00408 public:
00409   TVec(): MxVals(0), Vals(0), ValT(NULL){}
00410   TVec(const TVec& Vec);
00411   explicit TVec(const int& _Vals){
00412     IAssert(0<=_Vals); MxVals=Vals=_Vals;
00413     if (_Vals==0){ValT=NULL;} else {ValT=new TVal[_Vals];}}
00414   TVec(const int& _MxVals, const int& _Vals){
00415     IAssert((0<=_Vals)&&(_Vals<=_MxVals)); MxVals=_MxVals; Vals=_Vals;
00416     if (_MxVals==0){ValT=NULL;} else {ValT=new TVal[_MxVals];}}
00417   explicit TVec(TVal *_ValT, const int& _Vals):
00418     MxVals(-1), Vals(_Vals), ValT(_ValT){}
00419   ~TVec(){if ((ValT!=NULL) && (MxVals!=-1)){delete[] ValT;}}
00420   explicit TVec(TSIn& SIn): MxVals(0), Vals(0), ValT(NULL){Load(SIn);}
00421   void Load(TSIn& SIn);
00422   void Save(TSOut& SOut) const;
00423   void LoadXml(const PXmlTok& XmlTok, const TStr& Nm="");
00424   void SaveXml(TSOut& SOut, const TStr& Nm) const;
00425 
00426   TVec<TVal>& operator=(const TVec<TVal>& Vec);
00427   TVec<TVal>& operator+(const TVal& Val){Add(Val); return *this;}
00428   bool operator==(const TVec<TVal>& Vec) const;
00429   bool operator<(const TVec<TVal>& Vec) const;
00430   const TVal& operator[](const int& ValN) const {
00431     AssertR((0<=ValN)&&(ValN<Vals), GetXOutOfBoundsErrMsg(ValN));
00432     return ValT[ValN];}
00433   TVal& operator[](const int& ValN){
00434     AssertR((0<=ValN)&&(ValN<Vals), GetXOutOfBoundsErrMsg(ValN));
00435     return ValT[ValN];}
00436   int GetMemUsed() const {
00437     return 2*sizeof(int)+sizeof(TVal*)+MxVals*sizeof(TVal);}
00438 
00439   int GetPrimHashCd() const;
00440   int GetSecHashCd() const;
00441 
00442   void Gen(const int& _Vals){
00443     IAssert(0<=_Vals);
00444     if (ValT!=NULL && MxVals!=-1){delete[] ValT;} MxVals=Vals=_Vals;
00445     if (MxVals==0){ValT=NULL;} else {ValT=new TVal[MxVals];}}
00446   void Gen(const int& _MxVals, const int& _Vals){
00447     IAssert((0<=_Vals)&&(_Vals<=_MxVals));
00448     if (ValT!=NULL  && MxVals!=-1){delete[] ValT;} MxVals=_MxVals; Vals=_Vals;
00449     if (_MxVals==0){ValT=NULL;} else {ValT=new TVal[_MxVals];}}
00450   void GenExt(TVal *_ValT, const int& _Vals){
00451     if (ValT!=NULL && MxVals!=-1){delete[] ValT;}
00452     MxVals=-1; Vals=_Vals; ValT=_ValT;}
00453   bool IsExt() const {return MxVals==-1;}
00454   void Reserve(const int& _MxVals){Resize(_MxVals);}
00455   void Reserve(const int& _MxVals, const int& _Vals){
00456     IAssert((0<=_Vals)&&(_Vals<=_MxVals));
00457     Resize(_MxVals); Vals=_Vals;}
00458   void Clr(const bool& DoDel=true, const int& NoDelLim=-1);
00459   void Trunc(const int& _Vals=-1);
00460   void Pack();
00461   void MoveFrom(TVec<TVal>& Vec);
00462   void Swap(TVec<TVal>& Vec);
00463 
00464   bool Empty() const {return Vals==0;}
00465   int Len() const {return Vals;}
00466   int Reserved() const {return MxVals;}
00467   const TVal& Last() const {return GetVal(Len()-1);}
00468   TVal& Last(){return GetVal(Len()-1);}
00469   int LastValN() const {return Len()-1;}
00470   const TVal& LastLast() const {
00471     AssertR(1<Vals, GetXOutOfBoundsErrMsg(Vals-2));
00472     return ValT[Vals-2];}
00473   TVal& LastLast(){
00474     AssertR(1<Vals, GetXOutOfBoundsErrMsg(Vals-2));
00475     return ValT[Vals-2];}
00476 
00477   TIter BegI() const {return ValT;}
00478   TIter EndI() const {return ValT+Vals;}
00479   TIter GetI(const int& ValN) const {return ValT+ValN;}
00480 
00481   int Add(){
00482     Assert(MxVals!=-1); if (Vals==MxVals){Resize();} return Vals++;}
00483   int Add(const TVal& Val){
00484     Assert(MxVals!=-1); if (Vals==MxVals){Resize();} ValT[Vals]=Val; return Vals++;}
00485   int Add(const TVal& Val, const int& ResizeLen){
00486     Assert(MxVals!=-1); if (Vals==MxVals){Resize(MxVals+ResizeLen);} ValT[Vals]=Val; return Vals++;}
00487   int AddV(const TVec<TVal>& ValV);
00488   int AddSorted(const TVal& Val, const bool& Asc=true, const int& _MxVals=-1);
00489   int AddBackSorted(const TVal& Val, const bool& Asc);
00490   int AddMerged(const TVal& Val);
00491   int AddVMerged(const TVec<TVal>& ValV);
00492   int AddUnique(const TVal& Val);
00493   const TVal& GetVal(const int& ValN) const {return operator[](ValN);}
00494   TVal& GetVal(const int& ValN){return operator[](ValN);}
00495   void GetSubValV(const int& BValN, const int& EValN, TVec<TVal>& ValV) const;
00496   void Ins(const int& ValN, const TVal& Val);
00497   void Del(const int& ValN);
00498   void Del(const int& MnValN, const int& MxValN);
00499   void DelLast(){Del(Len()-1);}
00500   bool DelIfIn(const TVal& Val);
00501   void DelAll(const TVal& Val);
00502   void PutAll(const TVal& Val);
00503 
00504   void Swap(const int& ValN1, const int& ValN2){
00505     TVal Val=ValT[ValN1]; ValT[ValN1]=ValT[ValN2]; ValT[ValN2]=Val;}
00506   static void SwapI(TIter LVal, TIter RVal){
00507     TVal Val=*LVal; *LVal=*RVal; *RVal=Val;}
00508 
00509   int GetPivotValN(const int& LValN, const int& RValN) const;
00510   void BSort(const int& MnLValN, const int& MxRValN, const bool& Asc);
00511   void ISort(const int& MnLValN, const int& MxRValN, const bool& Asc);
00512   int Partition(const int& MnLValN, const int& MxRValN, const bool& Asc);
00513   void QSort(const int& MnLValN, const int& MxRValN, const bool& Asc);
00514   void Sort(const bool& Asc=true);
00515   bool IsSorted(const bool& Asc=true) const;
00516   void Shuffle(TRnd& Rnd);
00517   void Reverse();
00518   void Reverse(int First, int Last){
00519     Last--; while (First < Last){Swap(First++, Last--);}}
00520   void Merge();
00521   // permutations
00522   bool NextPerm();
00523   bool PrevPerm();
00524 
00525   // binary heap //J:
00526   void MakeHeap() { MakeHeap(TLss<TVal>()); }                     // build a heap
00527   void PushHeap(const TVal& Val) { PushHeap(Val, TLss<TVal>()); } // add element to the heap
00528   const TVal& TopHeap() const { return ValT[0]; }                 // get largest element
00529   TVal PopHeap() { return PopHeap(TLss<TVal>()); }                // remove largest element
00530   template <class TCmp> void MakeHeap(const TCmp& Cmp) { MakeHeap(0, Len(), Cmp); }
00531   template <class TCmp> void PushHeap(const TVal& Val, const TCmp& Cmp) { Add(Val); PushHeap(0, Len()-1, 0, Val, Cmp); }
00532   template <class TCmp> TVal PopHeap(const TCmp& Cmp) { IAssert(! Empty()); const TVal Top=ValT[0];
00533     ValT[0]=Last(); DelLast(); if (! Empty()) { AdjustHeap(0, 0, Len(), ValT[0], Cmp); } return Top; }
00534   // heap helper functions
00535   template <class TCmp>
00536   void PushHeap(const int& First, int HoleIdx, const int& Top, TVal Val, const TCmp& Cmp) {
00537     int Parent = (HoleIdx-1)/2;
00538     while (HoleIdx > Top && Cmp(ValT[First+Parent], Val)) {
00539       ValT[First+HoleIdx] = ValT[First+Parent];
00540       HoleIdx = Parent;  Parent = (HoleIdx-1)/2; }
00541     ValT[First+HoleIdx] = Val;
00542   }
00543   template <class TCmp>
00544   void AdjustHeap(const int& First, int HoleIdx, const int& Len, TVal Val, const TCmp& Cmp) {
00545     const int Top = HoleIdx;
00546     int Right = 2*HoleIdx+2;
00547     while (Right < Len) {
00548       if (Cmp(ValT[First+Right], ValT[First+Right-1])) { Right--; }
00549       ValT[First+HoleIdx] = ValT[First+Right];
00550       HoleIdx = Right;  Right = 2*(Right+1); }
00551     if (Right == Len) {
00552       ValT[First+HoleIdx] = ValT[First+Right-1];
00553       HoleIdx = Right-1; }
00554     PushHeap(First, HoleIdx, Top, Val, Cmp);
00555   }
00556   template <class TCmp>
00557   void MakeHeap(const int& First, const int& Len, const TCmp& Cmp) {
00558     if (Len < 2) { return; }
00559     int Parent = (Len-2)/2;
00560     while (true) {
00561       AdjustHeap(First, Parent, Len, ValT[First+Parent], Cmp);
00562       if (Parent == 0) { return; }  Parent--; }
00563   }
00564 
00565   template <class TCmp>
00566   static TIter GetPivotValNCmp(const TIter& BI, const TIter& EI, const TCmp& Cmp) {
00567     const int SubVals=int(EI-BI);
00568     const int ValN1=TInt::GetRnd(SubVals);
00569     const int ValN2=TInt::GetRnd(SubVals);
00570     const int ValN3=TInt::GetRnd(SubVals);
00571     const TVal& Val1 = *(BI+ValN1);
00572     const TVal& Val2 = *(BI+ValN2);
00573     const TVal& Val3 = *(BI+ValN3);
00574     if (Cmp(Val1, Val2)) {
00575       if (Cmp(Val2, Val3)) return BI+ValN2;
00576       else if (Cmp(Val3, Val1)) return BI+ValN1;
00577       else return BI+ValN3;
00578     } else {
00579       if (Cmp(Val1, Val3)) return BI+ValN1;
00580       else if (Cmp(Val3, Val2)) return BI+ValN2;
00581       else return BI+ValN3;
00582     }
00583   }
00584 
00585   template <class TCmp>
00586   static TIter PartitionCmp(TIter BI, TIter EI, const TVal Pivot, const TCmp& Cmp) {
00587     forever {
00588       while (Cmp(*BI, Pivot)) ++BI;
00589       --EI;
00590       while (Cmp(Pivot, *EI)) --EI;
00591       if (!(BI < EI)) return BI;
00592       SwapI(BI, EI);
00593       ++BI;
00594     }
00595   }
00596 
00597   template <class TCmp>
00598   static void BSortCmp(TIter BI, TIter EI, const TCmp& Cmp) {
00599     for (TIter i = BI; i != EI; ++i) {
00600       for (TIter j = EI-1; j != i; --j) {
00601         if (Cmp(*j, *(j-1))) SwapI(j, j-1); }
00602     }
00603   }
00604 
00605   template <class TCmp>
00606   static void ISortCmp(TIter BI, TIter EI, const TCmp& Cmp) {
00607     if (BI + 1 < EI) {
00608       for (TIter i = BI, j; i != EI; ++i) {
00609         TVal Tmp = *i; j = i;
00610         while (j > BI && Cmp(Tmp, *(j-1))) { *j = *(j-1); --j; }
00611         *j = Tmp;
00612       }
00613     }
00614   }
00615 
00616   template <class TCmp>
00617   static void QSortCmp(TIter BI, TIter EI, const TCmp& Cmp) {
00618     if (BI + 1 < EI) {
00619       if (EI - BI < 20) {
00620         ISortCmp(BI, EI, Cmp); }
00621       else {
00622         const TVal Val = *GetPivotValNCmp(BI, EI, Cmp);
00623         TIter Split = PartitionCmp(BI, EI, Val, Cmp);
00624         QSortCmp(BI, Split, Cmp);
00625         QSortCmp(Split, EI, Cmp);
00626       }
00627     }
00628   }
00629 
00630   //  void Sort(const bool& Asc = true) {
00631   //    if (Asc){QSortCmp(Beg(), End(), TLss<TVal>());}
00632   //    else {QSortCmp(Beg(), End(), TGtr<TVal>());}}
00633 
00634   template <class TCmp>
00635   void SortCmp(const TCmp& Cmp){
00636     QSortCmp(BegI(), EndI(), Cmp);}
00637 
00638   //  bool IsSorted(const bool& Asc = true) const {
00639   //    if (Asc){return IsSortedCmp(TLss<TVal>());}
00640   //    else {return IsSortedCmp(TGtr<TVal>());}}
00641 
00642   template <class TCmp>
00643   bool IsSortedCmp(const TCmp& Cmp) const {
00644     if (EndI() == BegI()) return true;
00645     for (TIter i = BegI(); i != EndI()-1; ++i) {
00646       if (Cmp(*(i+1), *i)){return false;}}
00647     return true;
00648   }
00649 
00650   void Intrs(const TVec<TVal>& ValV);
00651   void Union(const TVec<TVal>& ValV);
00652   void Diff(const TVec<TVal>& ValV); // union without intersection
00653   void Minus(const TVec<TVal>& ValV); // this without intersection
00654   void Intrs(const TVec<TVal>& ValV, TVec<TVal>& DstValV) const;
00655   void Union(const TVec<TVal>& ValV, TVec<TVal>& DstValV) const;
00656   void Diff(const TVec<TVal>& ValV, TVec<TVal>& DstValV) const;
00658   int IntrsLen(const TVec<TVal>& ValV) const;
00659   void Minus(const TVec<TVal>& ValV, TVec<TVal>& DstValV) const;
00660 
00661   int Count(const TVal& Val) const;
00662   int SearchBin(const TVal& Val) const;
00663   int SearchBin(const TVal& Val, int& InsValN) const;
00664   int SearchForw(const TVal& Val, const int& BValN=0) const;
00665   int SearchBack(const TVal& Val) const;
00666   int SearchVForw(const TVec<TVal>& ValV, const int& BValN=0) const;
00667   bool IsIn(const TVal& Val) const {return SearchForw(Val)!=-1;}
00668   bool IsIn(const TVal& Val, int& ValN) const {
00669     ValN=SearchForw(Val); return ValN!=-1;}
00670   bool IsInBin(const TVal& Val) const {return SearchBin(Val)!=-1;}
00671   int GetMxValN() const;
00672   TVal& GetDat(const TVal& Val) const {
00673     int ValN=SearchForw(Val);
00674     return operator[](ValN);}
00675   TVal& GetAddDat(const TVal& Val){
00676     Assert(MxVals!=-1);
00677     int ValN=SearchForw(Val);
00678     if (ValN==-1){Add(Val); return Last();}
00679     else {return operator[](ValN);}}
00680 
00681   // short vectors
00682   static TVec<TVal> GetV(const TVal& Val1){
00683     TVec<TVal> V(1, 0); V.Add(Val1); return V;}
00684   static TVec<TVal> GetV(const TVal& Val1, const TVal& Val2){
00685     TVec<TVal> V(2, 0); V.Add(Val1); V.Add(Val2); return V;}
00686   static TVec<TVal> GetV(const TVal& Val1, const TVal& Val2, const TVal& Val3){
00687     TVec<TVal> V(3, 0); V.Add(Val1); V.Add(Val2); V.Add(Val3); return V;}
00688   static TVec<TVal> GetV(const TVal& Val1, const TVal& Val2, const TVal& Val3, const TVal& Val4){
00689     TVec<TVal> V(4, 0); V.Add(Val1); V.Add(Val2); V.Add(Val3); V.Add(Val4); return V;}
00690   static TVec<TVal> GetV(const TVal& Val1, const TVal& Val2, const TVal& Val3, const TVal& Val4, const TVal& Val5){
00691     TVec<TVal> V(5, 0); V.Add(Val1); V.Add(Val2); V.Add(Val3); V.Add(Val4); V.Add(Val5); return V;}
00692   static TVec<TVal> GetV(const TVal& Val1, const TVal& Val2, const TVal& Val3, const TVal& Val4, const TVal& Val5, const TVal& Val6){
00693     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;}
00694   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){
00695     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;}
00696   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){
00697     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;}
00698   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){
00699     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;}
00700   //static TVec<TVal> GetV(const TVal* ValPt, const TVal& EndVal){
00701   //  TVec<TVal> V; while(*ValPt!=EndVal){V.Add(*ValPt); ValPt++;} return V;}
00702 };
00703 
00704 template <class TVal>
00705 void TVec<TVal>::Resize(const int& _MxVals){
00706   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());
00707   if (_MxVals==-1){
00708     if (Vals==0){MxVals=16;} else {MxVals*=2;}
00709   } else {
00710     if (_MxVals<=MxVals){return;} else {MxVals=_MxVals;}
00711   }
00712   if (ValT==NULL){
00713     try {ValT=new TVal[MxVals];}
00714     catch (std::exception Ex){
00715       EFailR(TStr::Fmt("TVec::Resize: %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.]",
00716        Ex.what(), Vals, MxVals, _MxVals, GetTypeNm(*this).CStr()));}
00717   } else {
00718     //if (Vals > 1000000) {
00719     //  printf("%s resize %d -> %d\n", GetTypeNm(*this).CStr(), Vals, MxVals); }
00720     TVal* NewValT = NULL;
00721     try {
00722       NewValT=new TVal[MxVals];}
00723     catch (std::exception Ex){
00724       EFailR(TStr::Fmt("TVec::Resize: %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.]",
00725        Ex.what(), Vals, MxVals, _MxVals, GetTypeNm(*this).CStr()));}
00726     Assert(NewValT!=NULL);
00727     for (int ValN=0; ValN<Vals; ValN++){NewValT[ValN]=ValT[ValN];}
00728     delete[] ValT; ValT=NewValT;
00729   }
00730 }
00731 
00732 template <class TVal>
00733 TStr TVec<TVal>::GetXOutOfBoundsErrMsg(const int& ValN) const {
00734   return TStr()+
00735     "Index:"+TInt::GetStr(ValN)+
00736     " Vals:"+TInt::GetStr(Vals)+
00737     " MxVals:"+TInt::GetStr(MxVals)+
00738     " Type:"+GetTypeNm(*this);
00739 }
00740 
00741 template <class TVal>
00742 TVec<TVal>::TVec(const TVec<TVal>& Vec){
00743   MxVals=Vec.MxVals; Vals=Vec.Vals;
00744   if (MxVals==0){ValT=NULL;} else {ValT=new TVal[MxVals];}
00745   for (int ValN=0; ValN<Vec.Vals; ValN++){ValT[ValN]=Vec.ValT[ValN];}
00746 }
00747 
00748 template <class TVal>
00749 void TVec<TVal>::Load(TSIn& SIn){
00750   if ((ValT!=NULL)&&(MxVals!=-1)){delete[] ValT;}
00751   SIn.Load(MxVals); SIn.Load(Vals); MxVals=Vals;
00752   if (MxVals==0){ValT=NULL;} else {ValT=new TVal[MxVals];}
00753   for (int ValN=0; ValN<Vals; ValN++){
00754     ValT[ValN]=TVal(SIn);}
00755 }
00756 
00757 template <class TVal>
00758 void TVec<TVal>::Save(TSOut& SOut) const {
00759   if (MxVals!=-1){SOut.Save(MxVals);} else {SOut.Save(Vals);}
00760   SOut.Save(Vals);
00761   for (int ValN=0; ValN<Vals; ValN++){ValT[ValN].Save(SOut);}
00762 }
00763 
00764 template <class TVal>
00765 TVec<TVal>& TVec<TVal>::operator=(const TVec<TVal>& Vec){
00766   if (this!=&Vec){
00767     if ((ValT!=NULL)&&(MxVals!=-1)){delete[] ValT;}
00768     MxVals=Vals=Vec.Vals;
00769     if (MxVals==0){ValT=NULL;} else {ValT=new TVal[MxVals];}
00770     for (int ValN=0; ValN<Vec.Vals; ValN++){ValT[ValN]=Vec.ValT[ValN];}
00771   }
00772   return *this;
00773 }
00774 
00775 template <class TVal>
00776 bool TVec<TVal>::operator==(const TVec<TVal>& Vec) const {
00777   if (this==&Vec){return true;}
00778   if (Len()!=Vec.Len()){return false;}
00779   for (int ValN=0; ValN<Vals; ValN++){
00780     if (ValT[ValN]!=Vec.ValT[ValN]){return false;}}
00781   return true;
00782 }
00783 
00784 template <class TVal>
00785 bool TVec<TVal>::operator<(const TVec<TVal>& Vec) const {
00786   if (this==&Vec){return false;}
00787   if (Len()==Vec.Len()){
00788     for (int ValN=0; ValN<Vals; ValN++){
00789       if (ValT[ValN]<Vec.ValT[ValN]){return true;}
00790       else if (ValT[ValN]>Vec.ValT[ValN]){return false;}
00791       else {}
00792     }
00793     return false;
00794   } else {
00795     return Len()<Vec.Len();
00796   }
00797 }
00798 
00799 template <class TVal>
00800 int TVec<TVal>::GetPrimHashCd() const {
00801   int HashCd=0;
00802   for (int ValN=0; ValN<Vals; ValN++){
00803     HashCd+=ValT[ValN].GetPrimHashCd();}
00804   return abs(HashCd);
00805 }
00806 
00807 template <class TVal>
00808 int TVec<TVal>::GetSecHashCd() const {
00809   int HashCd=0;
00810   for (int ValN=0; ValN<Vals; ValN++){
00811     HashCd+=ValT[ValN].GetSecHashCd();}
00812   return abs(HashCd);
00813 }
00814 
00815 template <class TVal>
00816 void TVec<TVal>::Clr(const bool& DoDel, const int& NoDelLim){
00817   if ((DoDel)||((!DoDel)&&(NoDelLim!=-1)&&(MxVals>NoDelLim))){
00818     if ((ValT!=NULL)&&(MxVals!=-1)){delete[] ValT;}
00819     MxVals=Vals=0; ValT=NULL;
00820   } else {
00821     IAssert(MxVals!=-1); Vals=0;
00822   }
00823 }
00824 
00825 template <class TVal>
00826 void TVec<TVal>::Trunc(const int& _Vals){
00827   IAssert(MxVals!=-1);
00828   IAssert((_Vals==-1)||(_Vals>=0));
00829   if ((_Vals!=-1)&&(_Vals>=Vals)){
00830     return;
00831   } else
00832   if (((_Vals==-1)&&(Vals==0))||(_Vals==0)){
00833     if (ValT!=NULL){delete[] ValT;}
00834     MxVals=Vals=0; ValT=NULL;
00835   } else {
00836     if (_Vals==-1){
00837       if (MxVals==Vals){return;} else {MxVals=Vals;}
00838     } else {
00839       MxVals=Vals=_Vals;
00840     }
00841     TVal* NewValT=new TVal[MxVals];
00842     IAssert(NewValT!=NULL);
00843     for (int ValN=0; ValN<Vals; ValN++){NewValT[ValN]=ValT[ValN];}
00844     delete[] ValT; ValT=NewValT;
00845   }
00846 }
00847 
00848 template <class TVal>
00849 void TVec<TVal>::Pack(){
00850   IAssert(MxVals!=-1);
00851   if (Vals==0){
00852     if (ValT!=NULL){delete[] ValT;} ValT=NULL;
00853   } else
00854   if (Vals<MxVals){
00855     MxVals=Vals;
00856     TVal* NewValT=new TVal[MxVals];
00857     IAssert(NewValT!=NULL);
00858     for (int ValN=0; ValN<Vals; ValN++){NewValT[ValN]=ValT[ValN];}
00859     delete[] ValT; ValT=NewValT;
00860   }
00861 }
00862 
00863 template <class TVal>
00864 void TVec<TVal>::MoveFrom(TVec<TVal>& Vec){
00865   if (this!=&Vec){
00866     if (ValT!=NULL && MxVals!=-1){delete[] ValT;}
00867     MxVals=Vec.MxVals; Vals=Vec.Vals; ValT=Vec.ValT;
00868     Vec.MxVals=0; Vec.Vals=0; Vec.ValT=NULL;
00869   }
00870 }
00871 
00872 template <class TVal>
00873 void TVec<TVal>::Swap(TVec<TVal>& Vec){
00874   if (this!=&Vec){
00875     ::Swap(MxVals, Vec.MxVals);
00876     ::Swap(Vals, Vec.Vals);
00877     ::Swap(ValT, Vec.ValT);
00878   }
00879 }
00880 
00881 template <class TVal>
00882 int TVec<TVal>::AddV(const TVec<TVal>& ValV){
00883   Assert(MxVals!=-1);
00884   for (int ValN=0; ValN<ValV.Vals; ValN++){Add(ValV[ValN]);}
00885   return Len();
00886 }
00887 
00888 template <class TVal>
00889 int TVec<TVal>::AddSorted(const TVal& Val, const bool& Asc, const int& _MxVals){
00890   Assert(MxVals!=-1);
00891   int ValN=Add(Val);
00892   if (Asc){
00893     while ((ValN>0)&&(ValT[ValN]<ValT[ValN-1])){
00894       Swap(ValN, ValN-1); ValN--;}
00895   } else {
00896     while ((ValN>0)&&(ValT[ValN]>ValT[ValN-1])){
00897       Swap(ValN, ValN-1); ValN--;}
00898   }
00899   if ((_MxVals!=-1)&&(Len()>_MxVals)){Del(_MxVals, Len()-1);}
00900   return ValN;
00901 }
00902 
00903 template <class TVal>
00904 int TVec<TVal>::AddBackSorted(const TVal& Val, const bool& Asc){
00905   Assert(MxVals!=-1);
00906   Add();
00907   int ValN=Vals-2;
00908   while ((ValN>=0)&&((Asc&&(Val<ValT[ValN]))||(!Asc&&(Val>ValT[ValN])))){
00909     ValT[ValN+1]=ValT[ValN]; ValN--;}
00910   ValT[ValN+1]=Val;
00911   return ValN+1;
00912 }
00913 
00914 template <class TVal>
00915 int TVec<TVal>::AddMerged(const TVal& Val){
00916   Assert(MxVals!=-1);
00917   int ValN=SearchBin(Val);
00918   if (ValN==-1){return AddSorted(Val);}
00919   else {GetVal(ValN)=Val; return -1;}
00920 }
00921 
00922 template <class TVal>
00923 int TVec<TVal>::AddVMerged(const TVec<TVal>& ValV){
00924   Assert(MxVals!=-1);
00925   for (int ValN=0; ValN<ValV.Vals; ValN++){AddMerged(ValV[ValN]);}
00926   return Len();
00927 }
00928 
00929 template <class TVal>
00930 int TVec<TVal>::AddUnique(const TVal& Val){
00931   Assert(MxVals!=-1);
00932   int ValN=SearchForw(Val);
00933   if (ValN==-1){return Add(Val);}
00934   else {GetVal(ValN)=Val; return -1;}
00935 }
00936 
00937 template <class TVal>
00938 void TVec<TVal>::GetSubValV(
00939  const int& _BValN, const int& _EValN, TVec<TVal>& SubValV) const {
00940   int BValN=TInt::GetInRng(_BValN, 0, Len()-1);
00941   int EValN=TInt::GetInRng(_EValN, 0, Len()-1);
00942   int SubVals=TInt::GetMx(0, EValN-BValN+1);
00943   SubValV.Gen(SubVals, 0);
00944   for (int ValN=BValN; ValN<=EValN; ValN++){
00945     SubValV.Add(GetVal(ValN));}
00946 }
00947 
00948 template <class TVal>
00949 void TVec<TVal>::Ins(const int& ValN, const TVal& Val){
00950   Assert(MxVals!=-1);
00951   Add(); Assert((0<=ValN)&&(ValN<Vals));
00952   for (int MValN=Vals-2; MValN>=ValN; MValN--){ValT[MValN+1]=ValT[MValN];}
00953   ValT[ValN]=Val;
00954 }
00955 
00956 template <class TVal>
00957 void TVec<TVal>::Del(const int& ValN){
00958   Assert(MxVals!=-1);
00959   Assert((0<=ValN)&&(ValN<Vals));
00960   for (int MValN=ValN+1; MValN<Vals; MValN++){
00961     ValT[MValN-1]=ValT[MValN];}
00962   ValT[--Vals]=TVal();
00963 }
00964 
00965 template <class TVal>
00966 void TVec<TVal>::Del(const int& MnValN, const int& MxValN){
00967   Assert(MxVals!=-1);
00968   Assert((0<=MnValN)&&(MnValN<Vals)&&(0<=MxValN)&&(MxValN<Vals));
00969   Assert(MnValN<=MxValN);
00970   for (int ValN=MxValN+1; ValN<Vals; ValN++){
00971     ValT[MnValN+ValN-MxValN-1]=ValT[ValN];}
00972   for (int ValN=Vals-MxValN+MnValN-1; ValN<Vals; ValN++){
00973     ValT[ValN]=TVal();}
00974   Vals-=MxValN-MnValN+1;
00975 }
00976 
00977 template <class TVal>
00978 bool TVec<TVal>::DelIfIn(const TVal& Val){
00979   Assert(MxVals!=-1);
00980   int ValN=SearchForw(Val);
00981   if (ValN!=-1){Del(ValN); return true;}
00982   else {return false;}
00983 }
00984 
00985 template <class TVal>
00986 void TVec<TVal>::DelAll(const TVal& Val){
00987   Assert(MxVals!=-1);
00988   int ValN;
00989   while ((ValN=SearchForw(Val))!=-1){
00990     Del(ValN);}
00991 }
00992 
00993 template <class TVal>
00994 void TVec<TVal>::PutAll(const TVal& Val){
00995   for (int ValN=0; ValN<Vals; ValN++){ValT[ValN]=Val;}
00996 }
00997 
00998 template <class TVal>
00999 void TVec<TVal>::BSort(
01000  const int& MnLValN, const int& MxRValN, const bool& Asc){
01001   for (int ValN1=MnLValN; ValN1<=MxRValN; ValN1++){
01002     for (int ValN2=MxRValN; ValN2>ValN1; ValN2--){
01003       if (Asc){
01004         if (ValT[ValN2]<ValT[ValN2-1]){Swap(ValN2, ValN2-1);}
01005       } else {
01006         if (ValT[ValN2]>ValT[ValN2-1]){Swap(ValN2, ValN2-1);}
01007       }
01008     }
01009   }
01010 }
01011 
01012 template <class TVal>
01013 void TVec<TVal>::ISort(
01014  const int& MnLValN, const int& MxRValN, const bool& Asc){
01015   if (MnLValN<MxRValN){
01016     for (int ValN1=MnLValN+1; ValN1<=MxRValN; ValN1++){
01017       TVal Val=ValT[ValN1]; int ValN2=ValN1;
01018       if (Asc){
01019         while ((ValN2>MnLValN)&&(ValT[ValN2-1]>Val)){
01020           ValT[ValN2]=ValT[ValN2-1]; ValN2--;}
01021       } else {
01022         while ((ValN2>MnLValN)&&(ValT[ValN2-1]<Val)){
01023           ValT[ValN2]=ValT[ValN2-1]; ValN2--;}
01024       }
01025       ValT[ValN2]=Val;
01026     }
01027   }
01028 }
01029 
01030 template <class TVal>
01031 int TVec<TVal>::GetPivotValN(const int& LValN, const int& RValN) const {
01032   int SubVals=RValN-LValN+1;
01033   int ValN1=LValN+TInt::GetRnd(SubVals);
01034   int ValN2=LValN+TInt::GetRnd(SubVals);
01035   int ValN3=LValN+TInt::GetRnd(SubVals);
01036   const TVal& Val1=ValT[ValN1];
01037   const TVal& Val2=ValT[ValN2];
01038   const TVal& Val3=ValT[ValN3];
01039   if (Val1<Val2){
01040     if (Val2<Val3){return ValN2;}
01041     else if (Val3<Val1){return ValN1;}
01042     else {return ValN3;}
01043   } else {
01044     if (Val1<Val3){return ValN1;}
01045     else if (Val3<Val2){return ValN2;}
01046     else {return ValN3;}
01047   }
01048 }
01049 
01050 template <class TVal>
01051 int TVec<TVal>::Partition(
01052  const int& MnLValN, const int& MxRValN, const bool& Asc){
01053   int PivotValN=GetPivotValN(MnLValN, MxRValN);
01054   Swap(PivotValN, MnLValN);
01055   TVal PivotVal=ValT[MnLValN];
01056   int LValN=MnLValN-1; int RValN=MxRValN+1;
01057   forever {
01058     if (Asc){
01059       do {RValN--;} while (ValT[RValN]>PivotVal);
01060       do {LValN++;} while (ValT[LValN]<PivotVal);
01061     } else {
01062       do {RValN--;} while (ValT[RValN]<PivotVal);
01063       do {LValN++;} while (ValT[LValN]>PivotVal);
01064     }
01065     if (LValN<RValN){Swap(LValN, RValN);}
01066     else {return RValN;}
01067   };
01068 }
01069 
01070 template <class TVal>
01071 void TVec<TVal>::QSort(
01072  const int& MnLValN, const int& MxRValN, const bool& Asc){
01073   if (MnLValN<MxRValN){
01074     if (MxRValN-MnLValN<20){
01075       ISort(MnLValN, MxRValN, Asc);
01076     } else {
01077       int SplitValN=Partition(MnLValN, MxRValN, Asc);
01078       QSort(MnLValN, SplitValN, Asc);
01079       QSort(SplitValN+1, MxRValN, Asc);
01080     }
01081   }
01082 }
01083 
01084 template <class TVal>
01085 void TVec<TVal>::Sort(const bool& Asc){
01086   QSort(0, Len()-1, Asc);
01087 }
01088 
01089 template <class TVal>
01090 bool TVec<TVal>::IsSorted(const bool& Asc) const {
01091   if (Asc){
01092     for (int ValN=0; ValN<Vals-1; ValN++){
01093       if (ValT[ValN]>ValT[ValN+1]){return false;}}
01094   } else {
01095     for (int ValN=0; ValN<Vals-1; ValN++){
01096       if (ValT[ValN]<ValT[ValN+1]){return false;}}
01097   }
01098   return true;
01099 }
01100 
01101 template <class TVal>
01102 void TVec<TVal>::Shuffle(TRnd& Rnd){
01103   for (int ValN=0; ValN<Vals-1; ValN++){
01104     Swap(ValN, ValN+Rnd.GetUniDevInt(Vals-ValN));}
01105 }
01106 
01107 template <class TVal>
01108 void TVec<TVal>::Reverse(){
01109   for (int ValN=0; ValN<Vals/2; ValN++){
01110     Swap(ValN, Vals-ValN-1);}
01111 }
01112 
01113 template <class TVal>
01114 void TVec<TVal>::Merge(){
01115   Assert(MxVals!=-1);
01116   TVec<TVal> SortedVec(*this); SortedVec.Sort();
01117   Clr();
01118   for (int ValN=0; ValN<SortedVec.Len(); ValN++){
01119     if ((ValN==0)||(SortedVec[ValN-1]!=SortedVec[ValN])){
01120       Add(SortedVec[ValN]);}
01121   }
01122 }
01123 
01124 template <class TVal>
01125 bool TVec<TVal>::NextPerm() {
01126   // start with a sorted sequence to obtain all permutations
01127   int First = 0, Last = Len(), Next = Len()-1;
01128   if (Last < 2) return false;
01129   for(; ; ) {
01130     // find rightmost element smaller than successor
01131     int Next1 = Next;
01132     if (GetVal(--Next) < GetVal(Next1)) { // swap with rightmost element that's smaller, flip suffix
01133       int Mid = Last;
01134       for (; GetVal(Next) >= GetVal(--Mid); ) { }
01135       Swap(Next, Mid);
01136       Reverse(Next1, Last);
01137       return true;
01138     }
01139     if (Next == First) { // pure descending, flip all
01140       Reverse();
01141       return false;
01142     }
01143   }
01144 }
01145 
01146 template <class TVal>
01147 bool TVec<TVal>::PrevPerm() {
01148   int First = 0, Last = Len(), Next = Len()-1;
01149   if (Last < 2) return false;
01150   for(; ; ) {
01151     // find rightmost element not smaller than successor
01152     int Next1 = Next;
01153     if (GetVal(--Next) >= GetVal(Next1)) { // swap with rightmost element that's not smaller, flip suffix
01154       int Mid = Last;
01155       for (; GetVal(Next) < GetVal(--Mid); ) { }
01156       Swap(Next, Mid);
01157       Reverse(Next1, Last);
01158       return true;
01159     }
01160     if (Next == First) { // pure descending, flip all
01161       Reverse();
01162       return false;
01163     }
01164   }
01165 }
01166 
01167 template <class TVal>
01168 void TVec<TVal>::Intrs(const TVec<TVal>& ValV){
01169   TVec<TVal> IntrsVec;
01170   Intrs(ValV, IntrsVec);
01171   MoveFrom(IntrsVec);
01172 }
01173 
01174 template <class TVal>
01175 void TVec<TVal>::Union(const TVec<TVal>& ValV){
01176   TVec<TVal> UnionVec;
01177   Union(ValV, UnionVec);
01178   MoveFrom(UnionVec);
01179 }
01180 
01181 template <class TVal>
01182 void TVec<TVal>::Diff(const TVec<TVal>& ValV){
01183   TVec<TVal> DiffVec;
01184   Diff(ValV, DiffVec);
01185   MoveFrom(DiffVec);
01186 }
01187 
01188 template <class TVal>
01189 void TVec<TVal>::Minus(const TVec<TVal>& ValV){
01190   TVec<TVal> MinusVec;
01191   Minus(ValV, MinusVec);
01192   MoveFrom(MinusVec);
01193 }
01194 
01195 template <class TVal>
01196 void TVec<TVal>::Intrs(const TVec<TVal>& ValV, TVec<TVal>& DstValV) const {
01197   DstValV.Clr();
01198   int ValN1=0; int ValN2=0;
01199   while ((ValN1<Len())&&(ValN2<ValV.Len())){
01200     const TVal& Val1=GetVal(ValN1);
01201     while ((ValN2<ValV.Len())&&(Val1>ValV.GetVal(ValN2))){
01202       ValN2++;}
01203     if ((ValN2<ValV.Len())&&(Val1==ValV.GetVal(ValN2))){
01204       DstValV.Add(Val1); ValN2++;}
01205     ValN1++;
01206   }
01207 }
01208 
01209 template <class TVal>
01210 void TVec<TVal>::Union(const TVec<TVal>& ValV, TVec<TVal>& DstValV) const {
01211   DstValV.Gen(TInt::GetMx(Len(), ValV.Len()), 0);
01212   int ValN1=0; int ValN2=0;
01213   while ((ValN1<Len())&&(ValN2<ValV.Len())){
01214     const TVal& Val1=GetVal(ValN1);
01215     const TVal& Val2=ValV.GetVal(ValN2);
01216     if (Val1<Val2){DstValV.Add(Val1); ValN1++;}
01217     else if (Val1>Val2){DstValV.Add(Val2); ValN2++;}
01218     else {DstValV.Add(Val1); ValN1++; ValN2++;}
01219   }
01220   for (int RestValN1=ValN1; RestValN1<Len(); RestValN1++){
01221     DstValV.Add(GetVal(RestValN1));}
01222   for (int RestValN2=ValN2; RestValN2<ValV.Len(); RestValN2++){
01223     DstValV.Add(ValV.GetVal(RestValN2));}
01224 }
01225 
01226 /*
01227 template <class TVal>
01228 void TVec<TVal>::Union(const TVec<TVal>& ValV, TVec<TVal>& DstValV){
01229   DstValV.Clr();
01230   int ValN1=0; int ValN2=0;
01231   while ((ValN1<Len())&&(ValN2<ValV.Len())){
01232     const TVal& Val1=GetVal(ValN1);
01233     const TVal& Val2=ValV.GetVal(ValN2);
01234     if (DstValV.Len()==0){
01235       if (Val1<Val2){DstValV.Add(Val1);} else {DstValV.Add(Val2);}
01236     } else {
01237       if (Val1<Val2){
01238         if (DstValV.Last()<Val1){DstValV.Add(Val1);} ValN1++;
01239       } else {
01240         if (DstValV.Last()<Val2){DstValV.Add(Val2);} ValN2++;
01241       }
01242     }
01243   }
01244   for (int RestValN1=ValN1; RestValN1<Len(); RestValN1++){
01245     const TVal& Val1=GetVal(RestValN1);
01246     if (DstValV.Len()==0){DstValV.Add(Val1);}
01247     else {if (DstValV.Last()<Val1){DstValV.Add(Val1);}}
01248   }
01249   for (int RestValN2=ValN2; RestValN2<ValV.Len(); RestValN2++){
01250     const TVal& Val2=ValV.GetVal(RestValN2);
01251     if (DstValV.Len()==0){DstValV.Add(Val2);}
01252     else {if (DstValV.Last()<Val2){DstValV.Add(Val2);}}
01253   }
01254 }
01255 */
01256 
01257 template <class TVal>
01258 void TVec<TVal>::Diff(const TVec<TVal>& ValV, TVec<TVal>& DstValV) const {
01259   DstValV.Clr();
01260   int ValN1=0; int ValN2=0;
01261   while (ValN1<Len() && ValN2<ValV.Len()) {
01262     const TVal& Val1 = GetVal(ValN1);
01263     while (ValN2<ValV.Len() && Val1>ValV.GetVal(ValN2)) ValN2++;
01264     if (ValN2<ValV.Len()) {
01265       if (Val1!=ValV.GetVal(ValN2)) { DstValV.Add(Val1); }
01266       ValN1++;
01267     }
01268   }
01269   for (int RestValN1=ValN1; RestValN1<Len(); RestValN1++){
01270     DstValV.Add(GetVal(RestValN1));}
01271 }
01272 
01273 template <class TVal>
01274 int TVec<TVal>::IntrsLen(const TVec<TVal>& ValV) const {
01275   int Cnt=0, ValN1=0; int ValN2=0;
01276   while ((ValN1<Len())&&(ValN2<ValV.Len())){
01277     const TVal& Val1=GetVal(ValN1);
01278     while ((ValN2<ValV.Len())&&(Val1>ValV.GetVal(ValN2))){
01279       ValN2++;}
01280     if ((ValN2<ValV.Len())&&(Val1==ValV.GetVal(ValN2))){
01281       ValN2++; Cnt++;}
01282     ValN1++;
01283   }
01284   return Cnt;
01285 }
01286 
01287 template <class TVal>
01288 void TVec<TVal>::Minus(const TVec<TVal>& ValV, TVec<TVal>& DstValV) const {
01289   Diff(ValV, DstValV);
01290 }
01291 
01292 template <class TVal>
01293 int TVec<TVal>::Count(const TVal& Val) const {
01294   int Count = 0;
01295   for (int i = 0; i < Len(); i++){
01296     if (Val == ValT[i]){Count++;}}
01297   return Count;
01298 }
01299 
01300 template <class TVal>
01301 int TVec<TVal>::SearchBin(const TVal& Val) const {
01302   int LValN=0; int RValN=Len()-1;
01303   while (RValN>=LValN){
01304     int ValN=(LValN+RValN)/2;
01305     if (Val==ValT[ValN]){return ValN;}
01306     if (Val<ValT[ValN]){RValN=ValN-1;} else {LValN=ValN+1;}
01307   }
01308   return -1;
01309 }
01310 
01311 template <class TVal>
01312 int TVec<TVal>::SearchBin(const TVal& Val, int& InsValN) const {
01313   int LValN=0; int RValN=Len()-1;
01314   while (RValN>=LValN){
01315     int ValN=(LValN+RValN)/2;
01316     if (Val==ValT[ValN]){InsValN=ValN; return ValN;}
01317     if (Val<ValT[ValN]){RValN=ValN-1;} else {LValN=ValN+1;}
01318   }
01319   InsValN=LValN; return -1;
01320 }
01321 
01322 template <class TVal>
01323 int TVec<TVal>::SearchForw(const TVal& Val, const int& BValN) const {
01324   for (int ValN=BValN; ValN<Vals; ValN++){
01325     if (Val==ValT[ValN]){return ValN;}}
01326   return -1;
01327 }
01328 
01329 template <class TVal>
01330 int TVec<TVal>::SearchBack(const TVal& Val) const {
01331   for (int ValN=Vals-1; ValN>=0; ValN--){
01332     if (Val==ValT[ValN]){return ValN;}}
01333   return -1;
01334 }
01335 
01336 template <class TVal>
01337 int TVec<TVal>::SearchVForw(const TVec<TVal>& ValV, const int& BValN) const {
01338   int ValVLen=ValV.Len();
01339   for (int ValN=BValN; ValN<Vals-ValVLen+1; ValN++){
01340     bool Found=true;
01341     for (int SubValN=0; SubValN<ValVLen; SubValN++){
01342       if (ValV[SubValN]!=GetVal(ValN+SubValN)){Found=false; break;}
01343     }
01344     if (Found){return ValN;}
01345   }
01346   return -1;
01347 }
01348 
01349 template <class TVal>
01350 int TVec<TVal>::GetMxValN() const {
01351   if (Vals==0){return -1;}
01352   int MxValN=0;
01353   for (int ValN=1; ValN<Vals; ValN++){
01354     if (ValT[ValN]>ValT[MxValN]){MxValN=ValN;}
01355   }
01356   return MxValN;
01357 }
01358 
01360 // Common-Vector-Types
01361 typedef TVec<TBool> TBoolV;
01362 typedef TVec<TCh> TChV;
01363 typedef TVec<TUCh> TUChV;
01364 typedef TVec<TUInt> TUIntV;
01365 typedef TVec<TInt> TIntV;
01366 typedef TVec<TUInt64> TUInt64V;
01367 typedef TVec<TFlt> TFltV;
01368 typedef TVec<TSFlt> TSFltV;
01369 typedef TVec<TAscFlt> TAscFltV;
01370 typedef TVec<TStr> TStrV;
01371 typedef TVec<TChA> TChAV;
01372 typedef TVec<TIntPr> TIntPrV;
01373 typedef TVec<TIntTr> TIntTrV;
01374 typedef TVec<TIntQu> TIntQuV;
01375 typedef TVec<TFltPr> TFltPrV;
01376 typedef TVec<TFltTr> TFltTrV;
01377 typedef TVec<TIntKd> TIntKdV;
01378 typedef TVec<TUChIntPr> TUChIntPrV;
01379 typedef TVec<TUChUInt64Pr> TUChUInt64PrV;
01380 typedef TVec<TIntUInt64Pr> TIntUInt64PrV;
01381 typedef TVec<TIntUInt64Kd> TIntUInt64KdV;
01382 typedef TVec<TIntFltPr> TIntFltPrV;
01383 typedef TVec<TIntFltPrKd> TIntFltPrKdV;
01384 typedef TVec<TFltIntPr> TFltIntPrV;
01385 typedef TVec<TFltUInt64Pr> TFltUInt64PrV;
01386 typedef TVec<TFltStrPr> TFltStrPrV;
01387 typedef TVec<TAscFltStrPr> TAscFltStrPrV;
01388 typedef TVec<TIntStrPr> TIntStrPrV;
01389 typedef TVec<TIntIntStrTr> TIntIntStrTrV;
01390 typedef TVec<TIntIntFltTr> TIntIntFltTrV;
01391 typedef TVec<TIntFltIntTr> TIntFltIntTrV;
01392 typedef TVec<TIntStrIntTr> TIntStrIntTrV;
01393 typedef TVec<TIntKd> TIntKdV;
01394 typedef TVec<TUIntIntKd> TUIntIntKdV;
01395 typedef TVec<TIntFltKd> TIntFltKdV;
01396 typedef TVec<TIntPrFltKd> TIntPrFltKdV;
01397 typedef TVec<TIntStrKd> TIntStrKdV;
01398 typedef TVec<TIntStrPrPr> TIntStrPrPrV;
01399 typedef TVec<TIntStrVPr> TIntStrVPrV;
01400 typedef TVec<TIntIntVIntTr> TIntIntVIntTrV;
01401 typedef TVec<TIntIntIntVTr> TIntIntIntVTrV;
01402 typedef TVec<TUInt64IntPr> TUInt64IntPrV;
01403 typedef TVec<TUInt64FltPr> TUInt64FltPrV;
01404 typedef TVec<TUInt64StrPr> TUInt64StrPrV;
01405 typedef TVec<TUInt64IntKd> TUInt64IntKdV;
01406 typedef TVec<TUInt64FltKd> TUInt64FltKdV;
01407 typedef TVec<TUInt64StrKd> TUInt64StrKdV;
01408 typedef TVec<TFltBoolKd> TFltBoolKdV;
01409 typedef TVec<TFltIntKd> TFltIntKdV;
01410 typedef TVec<TFltUInt64Kd> TFltUInt64KdV;
01411 typedef TVec<TFltIntPrKd> TFltIntPrKdV;
01412 typedef TVec<TFltKd> TFltKdV;
01413 typedef TVec<TFltStrKd> TFltStrKdV;
01414 typedef TVec<TFltStrPrPr> TFltStrPrPrV;
01415 typedef TVec<TFltIntIntTr> TFltIntIntTrV;
01416 typedef TVec<TFltFltStrTr> TFltFltStrTrV;
01417 typedef TVec<TAscFltIntPr> TAscFltIntPrV;
01418 typedef TVec<TAscFltIntKd> TAscFltIntKdV;
01419 typedef TVec<TStrPr> TStrPrV;
01420 typedef TVec<TStrIntPr> TStrIntPrV;
01421 typedef TVec<TStrFltPr> TStrFltPrV;
01422 typedef TVec<TStrIntKd> TStrIntKdV;
01423 typedef TVec<TStrFltKd> TStrFltKdV;
01424 typedef TVec<TStrAscFltKd> TStrAscFltKdV;
01425 typedef TVec<TStrTr> TStrTrV;
01426 typedef TVec<TStrQu> TStrQuV;
01427 typedef TVec<TStrFltFltTr> TStrFltFltTrV;
01428 typedef TVec<TStrStrIntTr> TStrStrIntTrV;
01429 typedef TVec<TStrKd> TStrKdV;
01430 typedef TVec<TStrStrVPr> TStrStrVPrV;
01431 typedef TVec<TStrVIntPr> TStrVIntPrV;
01432 typedef TVec<TFltIntIntIntQu> TFltIntIntIntQuV;
01433 typedef TVec<TIntStrIntIntQu> TIntStrIntIntQuV;
01434 typedef TVec<TIntIntPrPr> TIntIntPrPrV;
01435 
01437 // Vector Pool
01438 template<class TVal>
01439 class TVecPool {
01440 public:
01441   typedef TPt<TVecPool<TVal> > PVecPool;
01442   typedef TVec<TVal> TValV;
01443 private:
01444   TCRef CRef;
01445   TBool FastCopy;
01446   ::TSize GrowBy, MxVals, Vals;
01447   TVal EmptyVal;           // empty vector
01448   TVal *ValBf;             // buffer storing all the values
01449   TVec< ::TSize> IdToOffV; // id to one past last (vector starts at [id-1])
01450 private:
01451   void Resize(const ::TSize& _MxVals);
01452 public:
01453   TVecPool(const ::TSize& ExpectVals=0, const ::TSize& _GrowBy=1000000, const bool& _FastCopy=false, const TVal& _EmptyVal=TVal());
01454   TVecPool(const TVecPool& Pool);
01455   TVecPool(TSIn& SIn);
01456   ~TVecPool() { if (ValBf != NULL) { delete [] ValBf; } ValBf=NULL; }
01457   static PVecPool New(const ::TSize& ExpectVals=0, const ::TSize& GrowBy=1000000, const bool& FastCopy=false) {
01458     return new TVecPool(ExpectVals, GrowBy, FastCopy); }
01459   static PVecPool Load(TSIn& SIn) { return new TVecPool(SIn); }
01460   static PVecPool Load(const TStr& FNm) { TFIn FIn(FNm); return Load(FIn); }
01461   void Save(TSOut& SOut) const;
01462 
01463   TVecPool& operator = (const TVecPool& Pool);
01464 
01465   ::TSize GetVals() const { return Vals; }
01466   ::TSize GetVecs() const { return IdToOffV.Len(); }
01467   bool IsVId(const int& VId) const { return (0 <= VId) && (VId < IdToOffV.Len()); }
01468   ::TSize Reserved() const { return MxVals; }
01469   void Reserve(const ::TSize& MxVals) { Resize(MxVals); }
01470   const TVal& GetEmptyVal() const { return EmptyVal; }
01471   void SetEmptyVal(const TVal& _EmptyVal) { EmptyVal = _EmptyVal; }
01472   ::TSize GetMemUsed() const {
01473     return sizeof(TCRef)+sizeof(TBool)+3*sizeof(TSize)+sizeof(TVal*)+MxVals*sizeof(TVal);}
01474 
01475   int AddV(const TValV& ValV);
01476   int AddEmptyV(const int& ValVLen);
01477   uint GetVLen(const int& VId) const {
01478     if (VId==0){return 0;}
01479     else {return uint(IdToOffV[VId]-IdToOffV[VId-1]);}}
01480   TVal* GetValVPt(const int& VId) const {
01481     if (GetVLen(VId)==0){return (TVal*)&EmptyVal;}
01482     else {return ValBf+IdToOffV[VId-1];}}
01483   void GetV(const int& VId, TValV& ValV) const {
01484     if (GetVLen(VId)==0){ValV.Clr();}
01485     else { ValV.GenExt(GetValVPt(VId), GetVLen(VId)); } }
01486   void PutV(const int& VId, const TValV& ValV) {
01487     IAssert(IsVId(VId) && GetVLen(VId) == ValV.Len());
01488     if (FastCopy) {
01489       memcpy(GetValVPt(VId), ValV.BegI(), sizeof(TVal)*ValV.Len()); }
01490     else { TVal* ValPt = GetValVPt(VId);
01491       for (uint ValN=0; ValN < uint(ValV.Len()); ValN++, ValPt++) { *ValPt=ValV[ValN]; }
01492     }
01493   }
01494   void CompactPool(const TVal& DelVal); // delete all elements of value DelVal from all vectors
01495   void ShuffleAll(TRnd& Rnd=TInt::Rnd); // shuffles all the order of elements in the Pool (does not respect vector boundaries)
01496 
01497   //bool HasIdMap() const { return ! IdToOffV.Empty(); }
01498   //void ClrIdMap() { IdToOffV.Clr(true); }
01499   void Clr(bool DoDel = true) {
01500     IdToOffV.Clr(DoDel);  MxVals=0;  Vals=0;
01501     if (DoDel && ValBf!=NULL) { delete [] ValBf; ValBf=NULL;}
01502     if (! DoDel) { PutAll(EmptyVal); }
01503   }
01504   void PutAll(const TVal& Val) {
01505     for (TSize ValN = 0; ValN < MxVals; ValN++) { ValBf[ValN]=Val; } }
01506 
01507   friend class TPt<TVecPool<TVal> >;
01508 };
01509 
01510 template <class TVal>
01511 void TVecPool<TVal>::Resize(const ::TSize& _MxVals){
01512   if (_MxVals <= MxVals){ return; } else { MxVals = _MxVals; }
01513   if (ValBf == NULL) {
01514     try { ValBf = new TVal [MxVals]; }
01515     catch (std::exception Ex) {
01516       EFailR(TStr::Fmt("TVecPool::Resize: %s, MxVals: %d. [Program failed to allocate more memory. Solution: Get a bigger machine and a 64-bit compiler.]", Ex.what(), _MxVals)); }
01517     IAssert(ValBf != NULL);
01518     if (EmptyVal != TVal()) { PutAll(EmptyVal); }
01519   } else {
01520     // printf("*** Resize vector pool: %llu -> %llu\n", uint64(Vals), uint64(MxVals));
01521     TVal* NewValBf = NULL;
01522     try { NewValBf = new TVal [MxVals]; }
01523     catch (std::exception Ex) { EFailR(TStr::Fmt("TVecPool::Resize: %s, MxVals: %d. [Program failed to allocate more memory. Solution: Get a bigger machine and a 64-bit compiler.]", Ex.what(), _MxVals)); }
01524     IAssert(NewValBf != NULL);
01525     if (FastCopy) {
01526       memcpy(NewValBf, ValBf, Vals*sizeof(TVal)); }
01527     else {
01528       for (TSize ValN = 0; ValN < Vals; ValN++){ NewValBf[ValN] = ValBf[ValN]; } }
01529     if (EmptyVal != TVal()) { // init empty values
01530       for (TSize ValN = Vals; ValN < MxVals; ValN++) { NewValBf[ValN] = EmptyVal; }
01531     }
01532     delete [] ValBf;
01533     ValBf = NewValBf;
01534   }
01535 }
01536 
01537 template <class TVal>
01538 TVecPool<TVal>::TVecPool(const ::TSize& ExpectVals, const ::TSize& _GrowBy, const bool& _FastCopy, const TVal& _EmptyVal) :
01539   GrowBy(_GrowBy), MxVals(0), Vals(0), EmptyVal(_EmptyVal), ValBf(NULL) {
01540   IdToOffV.Add(0);
01541   Resize(ExpectVals);
01542 }
01543 
01544 template <class TVal>
01545 TVecPool<TVal>::TVecPool(const TVecPool& Pool):
01546   FastCopy(Pool.FastCopy), GrowBy(Pool.GrowBy),
01547   MxVals(Pool.MxVals), Vals(Pool.Vals), EmptyVal(Pool.EmptyVal), IdToOffV(Pool.IdToOffV) {
01548   try { ValBf = new TVal [MxVals]; }
01549   catch (std::exception Ex) { EFailR(TStr::Fmt("TVecPool::TVecPool: %s, MxVals: %d", Ex.what(), MxVals)); }
01550   IAssert(ValBf != NULL);
01551   if (FastCopy) {
01552     memcpy(ValBf, Pool.ValBf, MxVals*sizeof(TVal)); }
01553   else {
01554     for (TSize ValN = 0; ValN < MxVals; ValN++){ ValBf[ValN] = Pool.ValBf[ValN]; } }
01555 }
01556 
01557 template <class TVal>
01558 TVecPool<TVal>::TVecPool(TSIn& SIn):
01559   FastCopy(SIn) {
01560   uint64 _GrowBy, _MxVals, _Vals;
01561   SIn.Load(_GrowBy); SIn.Load(_MxVals);  SIn.Load(_Vals);
01562   IAssert(_GrowBy<TSizeMx && _MxVals<TSizeMx && _Vals<TSizeMx);
01563   GrowBy=TSize(_GrowBy);  MxVals=TSize(_Vals);  Vals=TSize(_Vals); //note MxVals==Vals
01564   EmptyVal = TVal(SIn);
01565   if (MxVals==0) { ValBf = NULL; } else { ValBf = new TVal [MxVals]; }
01566   for (TSize ValN = 0; ValN < Vals; ValN++) { ValBf[ValN] = TVal(SIn); }
01567   { TInt MxVals(SIn), Vals(SIn);
01568   IdToOffV.Gen(Vals);
01569   for (int ValN = 0; ValN < Vals; ValN++) {
01570     uint64 Offset;  SIn.Load(Offset);  IAssert(Offset < TSizeMx);
01571     IdToOffV[ValN]=TSize(Offset);
01572   } }
01573 }
01574 
01575 template <class TVal>
01576 void TVecPool<TVal>::Save(TSOut& SOut) const {
01577   SOut.Save(FastCopy);
01578   uint64 _GrowBy=GrowBy, _MxVals=MxVals, _Vals=Vals;
01579   SOut.Save(_GrowBy); SOut.Save(_MxVals);  SOut.Save(_Vals);
01580   SOut.Save(EmptyVal);
01581   for (TSize ValN = 0; ValN < Vals; ValN++) { ValBf[ValN].Save(SOut); }
01582   { SOut.Save(IdToOffV.Len());  SOut.Save(IdToOffV.Len());
01583   for (int ValN = 0; ValN < IdToOffV.Len(); ValN++) {
01584     const uint64 Offset=IdToOffV[ValN];  SOut.Save(Offset);
01585   } }
01586 }
01587 
01588 template <class TVal>
01589 TVecPool<TVal>& TVecPool<TVal>::operator = (const TVecPool& Pool) {
01590   if (this!=&Pool) {
01591     FastCopy = Pool.FastCopy;
01592     GrowBy = Pool.GrowBy;
01593     MxVals = Pool.MxVals;
01594     Vals = Pool.Vals;
01595     EmptyVal = Pool.EmptyVal;
01596     IdToOffV=Pool.IdToOffV;
01597     try { ValBf = new TVal [MxVals]; }
01598     catch (std::exception Ex) { EFailR(TStr::Fmt("TVec::operator= : %s, MxVals: %d", Ex.what(), MxVals)); }
01599     IAssert(ValBf != NULL);
01600     if (FastCopy) {
01601       memcpy(ValBf, Pool.ValBf, Vals*sizeof(TVal)); }
01602     else {
01603       for (uint64 ValN = 0; ValN < Vals; ValN++){ ValBf[ValN] = Pool.ValBf[ValN]; } }
01604   }
01605   return *this;
01606 }
01607 
01608 template<class TVal>
01609 int TVecPool<TVal>::AddV(const TValV& ValV) {
01610   const ::TSize ValVLen = ValV.Len();
01611   if (ValVLen == 0) { return 0; }
01612   if (MxVals < Vals+ValVLen) { Resize(Vals+max(ValVLen, GrowBy)); }
01613   if (FastCopy) { memcpy(ValBf+Vals, ValV.BegI(), sizeof(TVal)*ValV.Len()); }
01614   else { for (uint ValN=0; ValN < ValVLen; ValN++) { ValBf[Vals+ValN]=ValV[ValN]; } }
01615   Vals+=ValVLen;  IdToOffV.Add(Vals);
01616   return IdToOffV.Len()-1;
01617 }
01618 
01619 template<class TVal>
01620 int TVecPool<TVal>::AddEmptyV(const int& ValVLen) {
01621   if (ValVLen==0){return 0;}
01622   if (MxVals < Vals+ValVLen){Resize(Vals+max(TSize(ValVLen), GrowBy)); }
01623   Vals+=ValVLen; IdToOffV.Add(Vals);
01624   return IdToOffV.Len()-1;
01625 }
01626 
01627 // delete all elements of value DelVal from all vectors
01628 // empty space is left at the end of the pool
01629 template<class TVal>
01630 void TVecPool<TVal>::CompactPool(const TVal& DelVal) {
01631   ::TSize TotalDel=0, NDel=0;
01632   // printf("Compacting %d vectors\n", IdToOffV.Len());
01633   for (int vid = 1; vid < IdToOffV.Len(); vid++) {
01634     // if (vid % 10000000 == 0) { printf(" %dm", vid/1000000);  fflush(stdout); }
01635     const uint Len = GetVLen(vid);
01636     TVal* ValV = GetValVPt(vid);
01637     if (TotalDel > 0) { IdToOffV[vid-1] -= TotalDel; } // update end of vector
01638     if (Len == 0) { continue; }
01639     NDel = 0;
01640     for (TVal* v = ValV; v < ValV+Len-NDel; v++) {
01641       if (*v == DelVal) {
01642         TVal* Beg = v;
01643         while (*v == DelVal && v < ValV+Len) { v++; NDel++; }
01644         memcpy(Beg, v, sizeof(TVal)*int(Len - ::TSize(v - ValV)));
01645         v -= NDel;
01646       }
01647     }
01648     memcpy(ValV-TotalDel, ValV, sizeof(TVal)*Len);  // move data
01649     TotalDel += NDel;
01650   }
01651   IdToOffV.Last() -= TotalDel;
01652   for (::TSize i = Vals-TotalDel; i < Vals; i++) { ValBf[i] = EmptyVal; }
01653   Vals -= TotalDel;
01654   // printf("  deleted %llu elements from the pool\n", TotalDel);
01655 }
01656 
01657 // shuffles all the order of elements in the pool (does not respect vector boundaries)
01658 template<class TVal>
01659 void TVecPool<TVal>::ShuffleAll(TRnd& Rnd) {
01660   for (::TSize n = Vals-1; n > 0; n--) {
01661     const ::TSize k = ::TSize(((uint64(Rnd.GetUniDevInt())<<32) | uint64(Rnd.GetUniDevInt())) % (n+1));
01662     const TVal Tmp = ValBf[n];
01663     ValBf[n] = ValBf[k];
01664     ValBf[k] = Tmp;
01665   }
01666 }
01667 
01668 typedef TVecPool<TInt> TIntVecPool;
01669 typedef TPt<TIntVecPool> PIntVecPool;
01670 
01672 // Vector-Pointer
01673 template <class TVal>
01674 class PVec{
01675 private:
01676   TCRef CRef;
01677 public:
01678   TVec<TVal> V;
01679 public:
01680   PVec<TVal>(): V(){}
01681   PVec<TVal>(const PVec<TVal>& Vec): V(Vec.V){}
01682   static TPt<PVec<TVal> > New(){
01683     return new PVec<TVal>();}
01684   PVec<TVal>(const int& MxVals, const int& Vals): V(MxVals, Vals){}
01685   static TPt<PVec<TVal> > New(const int& MxVals, const int& Vals){
01686     return new PVec<TVal>(MxVals, Vals);}
01687   PVec<TVal>(const TVec<TVal>& _V): V(_V){}
01688   static TPt<PVec<TVal> > New(const TVec<TVal>& V){
01689     return new PVec<TVal>(V);}
01690   explicit PVec<TVal>(TSIn& SIn): V(SIn){}
01691   static TPt<PVec<TVal> > Load(TSIn& SIn){return new PVec<TVal>(SIn);}
01692   void Save(TSOut& SOut) const {V.Save(SOut);}
01693 
01694   PVec<TVal>& operator=(const PVec<TVal>& Vec){
01695     if (this!=&Vec){V=Vec.V;} return *this;}
01696   bool operator==(const PVec<TVal>& Vec) const {return V==Vec.V;}
01697   bool operator<(const PVec<TVal>& Vec) const {return V<Vec.V;}
01698   TVal& operator[](const int& ValN) const {return V[ValN];}
01699 
01700   bool Empty() const {return V.Empty();}
01701   int Len() const {return V.Len();}
01702   TVal GetVal(const int& ValN) const {return V[ValN];}
01703 
01704   int Add(const TVal& Val){return V.Add(Val);}
01705 
01706   friend class TPt<PVec<TVal> >;
01707 };
01708 
01710 // Common-Vector-Pointer-Types
01711 typedef PVec<TFlt> TFltVP;
01712 typedef TPt<TFltVP> PFltV;
01713 typedef PVec<TAscFlt> TAscFltVP;
01714 typedef TPt<TAscFltVP> PAscFltV;
01715 typedef PVec<TStr> TStrVP;
01716 typedef TPt<TStrVP> PStrV;
01717 
01719 // 2D-Vector
01720 template <class TVal>
01721 class TVVec{
01722 private:
01723   TInt XDim, YDim;
01724   TVec<TVal> ValV;
01725 public:
01726   TVVec(): XDim(), YDim(), ValV(){}
01727   TVVec(const TVVec& Vec):
01728     XDim(Vec.XDim), YDim(Vec.YDim), ValV(Vec.ValV){}
01729   TVVec(const int& _XDim, const int& _YDim):
01730     XDim(), YDim(), ValV(){Gen(_XDim, _YDim);}
01731   explicit TVVec(const TVec<TVal>& _ValV, const int& _XDim, const int& _YDim):
01732     XDim(_XDim), YDim(_YDim), ValV(_ValV){ IAssert(ValV.Len()==XDim*YDim); }
01733   explicit TVVec(TSIn& SIn) {Load(SIn);}
01734   void Load(TSIn& SIn){XDim.Load(SIn); YDim.Load(SIn); ValV.Load(SIn);}
01735   void Save(TSOut& SOut) const {
01736     XDim.Save(SOut); YDim.Save(SOut); ValV.Save(SOut);}
01737 
01738   TVVec<TVal>& operator=(const TVVec<TVal>& Vec){
01739     if (this!=&Vec){XDim=Vec.XDim; YDim=Vec.YDim; ValV=Vec.ValV;} return *this;}
01740   bool operator==(const TVVec& Vec) const {
01741     return (XDim==Vec.XDim)&&(YDim==Vec.YDim)&&(ValV==Vec.ValV);}
01742 
01743   bool Empty() const {return ValV.Len()==0;}
01744   void Clr(){XDim=0; YDim=0; ValV.Clr();}
01745   void Gen(const int& _XDim, const int& _YDim){
01746     Assert((_XDim>=0)&&(_YDim>=0));
01747     XDim=_XDim; YDim=_YDim; ValV.Gen(XDim*YDim);}
01748   int GetXDim() const {return XDim;}
01749   int GetYDim() const {return YDim;}
01750   int GetRows() const {return XDim;}
01751   int GetCols() const {return YDim;}
01752   TVec<TVal>& Get1DVec(){return ValV;}
01753 
01754   const TVal& At(const int& X, const int& Y) const {
01755     Assert((0<=X)&&(X<int(XDim))&&(0<=Y)&&(Y<int(YDim)));
01756     return ValV[X*YDim+Y];}
01757   TVal& At(const int& X, const int& Y){
01758     Assert((0<=X)&&(X<int(XDim))&&(0<=Y)&&(Y<int(YDim)));
01759     return ValV[X*YDim+Y];}
01760   TVal& operator()(const int& X, const int& Y){
01761     return At(X, Y);}
01762   const TVal& operator()(const int& X, const int& Y) const {
01763     return At(X, Y);}
01764 
01765   void PutXY(const int& X, const int& Y, const TVal& Val){At(X, Y)=Val;}
01766   void PutAll(const TVal& Val){ValV.PutAll(Val);}
01767   void PutX(const int& X, const TVal& Val){
01768     for (int Y=0; Y<int(YDim); Y++){At(X, Y)=Val;}}
01769   void PutY(const int& Y, const TVal& Val){
01770     for (int X=0; X<int(XDim); X++){At(X, Y)=Val;}}
01771   TVal GetXY(const int& X, const int& Y) const {
01772     Assert((0<=X)&&(X<int(XDim))&&(0<=Y)&&(Y<int(YDim)));
01773     return ValV[X*YDim+Y];}
01774   void GetRow(const int& RowN, TVec<TVal>& Vec) const;
01775   void GetCol(const int& ColN, TVec<TVal>& Vec) const;
01776 
01777   void SwapX(const int& X1, const int& X2);
01778   void SwapY(const int& Y1, const int& Y2);
01779   void Swap(TVVec<TVal>& Vec);
01780 
01781   void ShuffleX(TRnd& Rnd);
01782   void ShuffleY(TRnd& Rnd);
01783   void GetMxValXY(int& X, int& Y) const;
01784 
01785   void CopyFrom(const TVVec<TVal>& VVec);
01786   void AddXDim();
01787   void AddYDim();
01788   void DelX(const int& X);
01789   void DelY(const int& Y);
01790 };
01791 
01792 template <class TVal>
01793 void TVVec<TVal>::SwapX(const int& X1, const int& X2){
01794   for (int Y=0; Y<int(YDim); Y++){
01795     TVal Val=At(X1, Y); At(X1, Y)=At(X2, Y); At(X2, Y)=Val;}
01796 }
01797 
01798 template <class TVal>
01799 void TVVec<TVal>::SwapY(const int& Y1, const int& Y2){
01800   for (int X=0; X<int(XDim); X++){
01801     TVal Val=At(X, Y1); At(X, Y1)=At(X, Y2); At(X, Y2)=Val;}
01802 }
01803 
01804 template <class TVal>
01805 void TVVec<TVal>::Swap(TVVec<TVal>& Vec){  //J:
01806   if (this!=&Vec){
01807     ::Swap(XDim, Vec.XDim);
01808     ::Swap(YDim, Vec.YDim);
01809     ValV.Swap(Vec.ValV);
01810   }
01811 }
01812 
01813 template <class TVal>
01814 void TVVec<TVal>::ShuffleX(TRnd& Rnd){
01815   for (int X=0; X<XDim-1; X++){SwapX(X, X+Rnd.GetUniDevInt(XDim-X));}
01816 }
01817 
01818 template <class TVal>
01819 void TVVec<TVal>::ShuffleY(TRnd& Rnd){
01820   for (int Y=0; Y<YDim-1; Y++){SwapY(Y, Y+Rnd.GetUniDevInt(YDim-Y));}
01821 }
01822 
01823 template <class TVal>
01824 void TVVec<TVal>::GetMxValXY(int& X, int& Y) const {
01825   int MxValN=ValV.GetMxValN();
01826   Y=MxValN%YDim;
01827   X=MxValN/YDim;
01828 }
01829 
01830 template <class TVal>
01831 void TVVec<TVal>::CopyFrom(const TVVec<TVal>& VVec){
01832   int CopyXDim=TInt::GetMn(GetXDim(), VVec.GetXDim());
01833   int CopyYDim=TInt::GetMn(GetYDim(), VVec.GetYDim());
01834   for (int X=0; X<CopyXDim; X++){
01835     for (int Y=0; Y<CopyYDim; Y++){
01836       At(X, Y)=VVec.At(X, Y);
01837     }
01838   }
01839 }
01840 
01841 template <class TVal>
01842 void TVVec<TVal>::AddXDim(){
01843   TVVec<TVal> NewVVec(XDim+1, YDim);
01844   NewVVec.CopyFrom(*this);
01845   *this=NewVVec;
01846 }
01847 
01848 template <class TVal>
01849 void TVVec<TVal>::AddYDim(){
01850   TVVec<TVal> NewVVec(XDim, YDim+1);
01851   NewVVec.CopyFrom(*this);
01852   *this=NewVVec;
01853 }
01854 
01855 template <class TVal>
01856 void TVVec<TVal>::DelX(const int& X){
01857   TVVec<TVal> NewVVec(XDim-1, YDim);
01858   for (int Y=0; Y<YDim; Y++){
01859     for (int LX=0; LX<X; LX++){
01860       NewVVec.At(LX, Y)=At(LX, Y);}
01861     for (int RX=X+1; RX<XDim; RX++){
01862       NewVVec.At(RX-1, Y)=At(RX, Y);}
01863   }
01864   *this=NewVVec;
01865 }
01866 
01867 template <class TVal>
01868 void TVVec<TVal>::DelY(const int& Y){
01869   TVVec<TVal> NewVVec(XDim, YDim-1);
01870   for (int X=0; X<XDim; X++){
01871     for (int LY=0; LY<Y; LY++){
01872       NewVVec.At(X, LY)=At(X, LY);}
01873     for (int RY=Y+1; RY<YDim; RY++){
01874       NewVVec.At(X, RY-1)=At(X, RY);}
01875   }
01876   *this=NewVVec;
01877 }
01878 
01879 template <class TVal>
01880 void TVVec<TVal>::GetRow(const int& RowN, TVec<TVal>& Vec) const {
01881   Vec.Gen(GetCols(), 0);
01882   for (int col = 0; col < GetCols(); col++) {
01883     Vec.Add(At(RowN, col));
01884   }
01885 }
01886 
01887 template <class TVal>
01888 void TVVec<TVal>::GetCol(const int& ColN, TVec<TVal>& Vec) const {
01889   Vec.Gen(GetRows(), 0);
01890   for (int row = 0; row < GetRows(); row++) {
01891     Vec.Add(At(row, ColN));
01892   }
01893 }
01894 
01896 // Common-2D-Vector-Types
01897 typedef TVVec<TBool> TBoolVV;
01898 typedef TVVec<TCh> TChVV;
01899 typedef TVVec<TInt> TIntVV;
01900 typedef TVVec<TSFlt> TSFltVV;
01901 typedef TVVec<TFlt> TFltVV;
01902 typedef TVVec<TStr> TStrVV;
01903 typedef TVVec<TIntPr> TIntPrVV;
01904 
01906 // 3D-Vector
01907 template <class TVal>
01908 class TVVVec{
01909 private:
01910   TInt XDim, YDim, ZDim;
01911   TVec<TVal> ValV;
01912 public:
01913   TVVVec(): XDim(), YDim(), ZDim(), ValV(){}
01914   TVVVec(const TVVVec& Vec):
01915     XDim(Vec.XDim), YDim(Vec.YDim), ZDim(Vec.ZDim), ValV(Vec.ValV){}
01916   TVVVec(const int& _XDim, const int& _YDim, const int& _ZDim):
01917     XDim(), YDim(), ZDim(), ValV(){Gen(_XDim, _YDim, _ZDim);}
01918   explicit TVVVec(TSIn& SIn):
01919     XDim(SIn), YDim(SIn), ZDim(SIn), ValV(SIn){}
01920   void Save(TSOut& SOut) const {
01921     XDim.Save(SOut); YDim.Save(SOut); ZDim.Save(SOut); ValV.Save(SOut);}
01922 
01923   TVVVec<TVal>& operator=(const TVVVec<TVal>& Vec){
01924           XDim=Vec.XDim; YDim=Vec.YDim; ZDim=Vec.ZDim; ValV=Vec.ValV;
01925           return *this;
01926   }
01927   bool operator==(const TVVVec& Vec) const {
01928     return (XDim==Vec.XDim)&&(YDim==Vec.YDim)&&(ZDim==Vec.ZDim)&&
01929      (ValV==Vec.ValV);}
01930 
01931   bool Empty() const {return ValV.Len()==0;}
01932   void Clr(){XDim=0; YDim=0; ZDim=0; ValV.Clr();}
01933   void Gen(const int& _XDim, const int& _YDim, const int& _ZDim){
01934     Assert((_XDim>=0)&&(_YDim>=0)&&(_ZDim>=0));
01935     XDim=_XDim; YDim=_YDim; ZDim=_ZDim; ValV.Gen(XDim*YDim*ZDim);}
01936   TVal& At(const int& X, const int& Y, const int& Z){
01937     Assert((0<=X)&&(X<int(XDim))&&(0<=Y)&&(Y<int(YDim))&&(0<=Z)&&(Z<int(ZDim)));
01938     return ValV[X*YDim*ZDim+Y*ZDim+Z];}
01939   const TVal& At(const int& X, const int& Y, const int& Z) const {
01940     Assert((0<=X)&&(X<int(XDim))&&(0<=Y)&&(Y<int(YDim))&&(0<=Z)&&(Z<int(ZDim)));
01941     return ValV[X*YDim*ZDim+Y*ZDim+Z];}
01942   TVal& operator()(const int& X, const int& Y, const int& Z){
01943     return At(X, Y, Z);}
01944   const TVal& operator()(const int& X, const int& Y, const int& Z) const {
01945     return At(X, Y, Z);}
01946   int GetXDim() const {return XDim;}
01947   int GetYDim() const {return YDim;}
01948   int GetZDim() const {return ZDim;}
01949 };
01950 
01952 // Common-3D-Vector-Types
01953 typedef TVVVec<TInt> TIntVVV;
01954 typedef TVVVec<TFlt> TFltVVV;
01955 
01957 // Tree
01958 template <class TVal>
01959 class TTree{
01960 private:
01961   TVec<TTriple<TInt, TIntV, TVal> > NodeV; // (ParentNodeId, ChildNodeIdV, NodeVal)
01962 public:
01963   TTree(): NodeV(){}
01964   TTree(const TTree& Tree): NodeV(Tree.NodeV){}
01965   explicit TTree(TSIn& SIn): NodeV(SIn){}
01966   void Save(TSOut& SOut) const {NodeV.Save(SOut);}
01967   void LoadXml(const PXmlTok& XmlTok, const TStr& Nm="");
01968   void SaveXml(TSOut& SOut, const TStr& Nm) const;
01969 
01970   TTree& operator=(const TTree& Tree){if (this!=&Tree){NodeV=Tree.NodeV;} return *this;}
01971   bool operator==(const TTree& Tree) const {return NodeV==Tree.NodeV;}
01972   bool operator<(const TTree& Tree) const {return false;}
01973 
01974   int GetPrimHashCd() const {return NodeV.GetPrimHashCd();}
01975   int GetSecHashCd() const {return NodeV.GetSecHashCd();}
01976 
01977   int GetMemUsed() const {return NodeV.GetMemUsed();}
01978 
01979   void Clr(){NodeV.Clr();}
01980 
01981   int AddNode(const int& ParentNodeId, const TVal& NodeVal=TVal()){
01982     IAssert(((ParentNodeId==-1)&&(NodeV.Len()==0))||(NodeV.Len()>0));
01983     if (ParentNodeId!=-1){NodeV[ParentNodeId].Val2.Add(NodeV.Len());}
01984     return NodeV.Add(TTriple<TInt, TIntV, TVal>(ParentNodeId, TIntV(), NodeVal));}
01985   int AddRoot(const TVal& NodeVal=TVal()){
01986     return AddNode(-1, NodeVal);}
01987  
01988   int GetNodes() const {return NodeV.Len();}
01989   void GetNodeIdV(TIntV& NodeIdV, const int& NodeId=0);
01990   int GetParentNodeId(const int& NodeId) const {return NodeV[NodeId].Val1;} 
01991   int GetChildren(const int& NodeId) const {return NodeV[NodeId].Val2.Len();}
01992   int GetChildNodeId(const int& NodeId, const int& ChildN) const {return NodeV[NodeId].Val2[ChildN];}
01993   TVal& GetNodeVal(const int& NodeId){return NodeV[NodeId].Val3;}
01994 
01995   void GenRandomTree(const int& Nodes, TRnd& Rnd=TRnd());
01996 
01997   void DelNode(const int& NodeId);
01998   void CopyTree(const int& SrcNodeId, TTree& DstTree, const int& DstParentNodeId=-1);
01999 
02000   void WrTree(const int& NodeId=0, const int& Lev=0);
02001 };
02002 
02003 template <class TVal>
02004 void TTree<TVal>::GetNodeIdV(TIntV& NodeIdV, const int& NodeId){
02005   if (NodeId==0){NodeIdV.Clr(); if (GetNodes()==0){return;}}
02006   else if (GetParentNodeId(NodeId)==-1){return;}
02007   NodeIdV.Add(NodeId);
02008   for (int ChildN=0; ChildN<GetChildren(NodeId); ChildN++){
02009     int ChildNodeId=GetChildNodeId(NodeId, ChildN);
02010     if (ChildNodeId!=-1){
02011       GetNodeIdV(NodeIdV, ChildNodeId);
02012     }
02013   }
02014 }
02015 
02016 template <class TVal>
02017 void TTree<TVal>::GenRandomTree(const int& Nodes, TRnd& Rnd){
02018   Clr();
02019   if (Nodes>0){
02020     AddRoot(TVal());
02021     for (int NodeN=1; NodeN<Nodes; NodeN++){
02022       int ParentNodeId=Rnd.GetUniDevInt(0, GetNodes()-1);
02023       AddNode(ParentNodeId, TVal());
02024     }
02025   }
02026 }
02027 
02028 template <class TVal>
02029 void TTree<TVal>::DelNode(const int& NodeId){
02030   if (NodeId==0){
02031     Clr();
02032   } else {
02033     TIntV& ChildNodeIdV=NodeV[GetParentNodeId(NodeId)].Val2;
02034     int ChildNodeIdN=ChildNodeIdV.SearchForw(NodeId);
02035     ChildNodeIdV[ChildNodeIdN]=-1;
02036   }
02037 }
02038 
02039 template <class TVal>
02040 void TTree<TVal>::CopyTree(const int& SrcNodeId, TTree& DstTree, const int& DstParentNodeId){
02041   int DstNodeId=DstTree.AddNode(DstParentNodeId, GetNodeVal(SrcNodeId));
02042   for (int ChildN=0; ChildN<GetChildren(SrcNodeId); ChildN++){
02043     int ChildNodeId=GetChildNodeId(SrcNodeId, ChildN);
02044     if (ChildNodeId!=-1){
02045       CopyTree(ChildNodeId, DstTree, DstNodeId);
02046     }
02047   }
02048 }
02049 
02050 template <class TVal>
02051 void TTree<TVal>::WrTree(const int& NodeId, const int& Lev){
02052   for (int LevN=0; LevN<Lev; LevN++){printf("| ");}
02053   printf("%d (%d)\n", NodeId, GetChildren(NodeId));
02054   for (int ChildN=0; ChildN<GetChildren(NodeId); ChildN++){
02055     int ChildNodeId=GetChildNodeId(NodeId, ChildN);
02056     if (ChildNodeId!=-1){
02057       WrTree(ChildNodeId, Lev+1);
02058     }
02059   }
02060 }
02061 
02063 // Common-Tree-Types
02064 typedef TTree<TInt> TIntTree;
02065 typedef TTree<TFlt> TFltTree;
02066 typedef TTree<TStr> TStrTree;
02067 typedef TTree<TStrIntPr> TStrIntPrTree;
02068 typedef TTree<TStrIntStrVTr> TStrIntStrVTrTree;
02069 
02071 // Stack
02072 template <class TVal>
02073 class TSStack{
02074 private:
02075   TVec<TVal> ValV;
02076 public:
02077   TSStack(): ValV(){}
02078   TSStack(const int& MxVals): ValV(MxVals, 0){}
02079   TSStack(const TSStack& Stack): ValV(Stack.ValV){}
02080   explicit TSStack(TSIn& SIn): ValV(SIn){}
02081   void Save(TSOut& SOut) const {ValV.Save(SOut);}
02082 
02083   TSStack& operator=(const TSStack& Stack){
02084     if (this!=&Stack){ValV=Stack.ValV;} return *this;}
02085   bool operator==(const TSStack& Stack) const {return this==&Stack;}
02086   const TVal& operator[](const int& ValN) const {return ValV[ValV.Len()-ValN-1];}
02087   TVal& operator[](const int& ValN) {return ValV[ValV.Len()-ValN-1];}
02088 
02089   bool Empty(){return ValV.Len()==0;}
02090   void Clr(const bool& DoDel=false) {ValV.Clr(DoDel);}
02091   bool IsIn(const TVal& Val) const {return ValV.IsIn(Val);}
02092   int Len(){return ValV.Len();}
02093   TVal& Top(){Assert(0<ValV.Len()); return ValV.Last();}
02094   const TVal& Top() const {Assert(0<ValV.Len()); return ValV.Last();}
02095   void Push(){ValV.Add();}
02096   void Push(const TVal& Val){ValV.Add(Val);}
02097   void Pop(){Assert(0<ValV.Len()); ValV.DelLast();}
02098 };
02099 
02101 // Common-Stack-Types
02102 typedef TSStack<TInt> TIntS;
02103 typedef TSStack<TBoolChPr> TBoolChS;
02104 
02106 // Queue
02107 template <class TVal>
02108 class TQQueue{
02109 private:
02110   TInt MxLast, MxLen;
02111   TInt First, Last;
02112   TVec<TVal> ValV;
02113 public:
02114   TQQueue(const int& _MxLast=64, const int& _MxLen=-1):
02115     MxLast(_MxLast), MxLen(_MxLen), First(0), Last(0), ValV(){
02116     Assert(int(MxLast)>0); Assert((MxLen==-1)||(int(MxLen)>0));}
02117   TQQueue(const TQQueue& Queue):
02118     MxLast(Queue.MxLast), MxLen(Queue.MxLen),
02119     First(Queue.First), Last(Queue.Last), ValV(Queue.ValV){}
02120   explicit TQQueue(TSIn& SIn):
02121     MxLast(SIn), MxLen(SIn), First(SIn), Last(SIn), ValV(SIn){}
02122   void Save(TSOut& SOut) const {
02123     MxLast.Save(SOut); MxLen.Save(SOut);
02124     First.Save(SOut); Last.Save(SOut); ValV.Save(SOut);}
02125 
02126   TQQueue& operator=(const TQQueue& Queue){
02127     if (this!=&Queue){MxLast=Queue.MxLast; MxLen=Queue.MxLen;
02128       First=Queue.First; Last=Queue.Last; ValV=Queue.ValV;}
02129     return *this;}
02130   const TVal& operator[](const int& ValN) const {Assert((0<=ValN)&&(ValN<Len()));
02131     return ValV[Last+ValN];}
02132 
02133   void Clr(const bool& DoDel=true){ValV.Clr(DoDel); First=Last=0;}
02134   void Gen(const int& _MxLast=64, const int& _MxLen=-1){
02135     MxLast=_MxLast; MxLen=_MxLen; First=0; Last=0; ValV.Clr();}
02136   void GetSubValV(const int& _BValN, const int& _EValN, TVec<TVal>& SubValV) const {
02137     int BValN=TInt::GetMx(0, _BValN);
02138     int EValN=TInt::GetMn(Len()-1, _EValN);
02139     SubValV.Gen(EValN-BValN+1);
02140     for (int ValN=BValN; ValN<=EValN; ValN++){
02141       SubValV[ValN-BValN]=ValV[Last+ValN];}
02142   }
02143 
02144   bool Empty() const {return First==Last;}
02145   int Len() const {return First-Last;}
02146   const TVal& Top() const {
02147     Assert(First!=Last); return ValV[Last];}
02148   void Pop(){
02149     IAssert(First!=Last); Last++;
02150     if (First==Last){ValV.Clr(); First=Last=0;}}
02151   void Push(const TVal& Val){
02152     if (Last>MxLast){ValV.Del(0, Last-1); First-=Last; Last=0;}
02153     if ((MxLen!=-1)&&(MxLen==Len())){Pop();}
02154     First++; ValV.Add(Val);}
02155 
02156   void Shuffle(TRnd& Rnd){
02157     TVec<TVal> ValV(Len(), 0); while (!Empty()){ValV.Add(Top()); Pop();}
02158     ValV.Shuffle(Rnd); Clr();
02159     for (int ValN=0; ValN<ValV.Len(); ValN++){Push(ValV[ValN]);}}
02160 };
02161 
02163 // Common-Queue-Types
02164 typedef TQQueue<TInt> TIntQ;
02165 typedef TQQueue<TFlt> TFltQ;
02166 typedef TQQueue<TStr> TStrQ;
02167 typedef TQQueue<TIntPr> TIntPrQ;
02168 typedef TQQueue<TIntStrPr> TIntStrPrQ;
02169 typedef TQQueue<TFltV> TFltVQ;
02170 typedef TQQueue<TAscFltV> TAscFltVQ;
02171 typedef TVec<TQQueue<TInt> > TIntQV;
02172 
02174 // List-Node
02175 template <class TVal>
02176 class TLstNd{
02177 public:
02178   TLstNd* PrevNd;
02179   TLstNd* NextNd;
02180   TVal Val;
02181 public:
02182   TLstNd(): PrevNd(NULL), NextNd(NULL), Val(){}
02183   TLstNd(const TLstNd&);
02184   TLstNd(TLstNd* _PrevNd, TLstNd* _NextNd, const TVal& _Val):
02185     PrevNd(_PrevNd), NextNd(_NextNd), Val(_Val){}
02186 
02187   TLstNd& operator=(const TLstNd&);
02188 
02189   TLstNd* Prev() const {Assert(this!=NULL); return PrevNd;}
02190   TLstNd* Next() const {Assert(this!=NULL); return NextNd;}
02191   TVal& GetVal(){Assert(this!=NULL); return Val;}
02192   const TVal& GetVal() const {Assert(this!=NULL); return Val;}
02193 };
02194 
02196 // List
02197 template <class TVal>
02198 class TLst{
02199 public:
02200   typedef TLstNd<TVal>* PLstNd;
02201 private:
02202   int Nds;
02203   PLstNd FirstNd;
02204   PLstNd LastNd;
02205 public:
02206   TLst(): Nds(0), FirstNd(NULL), LastNd(NULL){}
02207   TLst(const TLst&);
02208   ~TLst(){Clr();}
02209   explicit TLst(TSIn& SIn);
02210   void Save(TSOut& SOut) const;
02211 
02212   TLst& operator=(const TLst&);
02213 
02214   void Clr(){
02215     PLstNd Nd=FirstNd;
02216     while (Nd!=NULL){PLstNd NextNd=Nd->NextNd; delete Nd; Nd=NextNd;}
02217     Nds=0; FirstNd=NULL; LastNd=NULL;}
02218 
02219   bool Empty() const {return Nds==0;}
02220   int Len() const {return Nds;}
02221   PLstNd First() const {return FirstNd;}
02222   PLstNd Last() const {return LastNd;}
02223   TVal& FirstVal() const {return FirstNd->GetVal();}
02224   TVal& LastVal() const {return LastNd->GetVal();}
02225 
02226   PLstNd AddFront(const TVal& Val);
02227   PLstNd AddBack(const TVal& Val);
02228   PLstNd AddFrontSorted(const TVal& Val, const bool& Asc=true);
02229   PLstNd AddBackSorted(const TVal& Val, const bool& Asc=true);
02230   void PutFront(const PLstNd& Nd);
02231   void PutBack(const PLstNd& Nd);
02232   PLstNd Ins(const PLstNd& Nd, const TVal& Val);
02233   void Del(const TVal& Val);
02234   void Del(const PLstNd& Nd);
02235   void DelFirst() { PLstNd DelNd = FirstNd; Del(DelNd); }
02236   void DelLast() { PLstNd DelNd = LastNd; Del(DelNd); }
02237 
02238   PLstNd SearchForw(const TVal& Val);
02239   PLstNd SearchBack(const TVal& Val);
02240 
02241   friend class TLstNd<TVal>;
02242 };
02243 
02244 template <class TVal>
02245 TLst<TVal>::TLst(TSIn& SIn):
02246   Nds(0), FirstNd(NULL), LastNd(NULL){
02247   int CheckNds=0; SIn.Load(CheckNds);
02248   for (int NdN=0; NdN<CheckNds; NdN++){AddBack(TVal(SIn));}
02249   Assert(Nds==CheckNds);
02250 }
02251 
02252 template <class TVal>
02253 void TLst<TVal>::Save(TSOut& SOut) const {
02254   SOut.Save(Nds);
02255   PLstNd Nd=FirstNd; int CheckNds=0;
02256   while (Nd!=NULL){
02257     Nd->Val.Save(SOut); Nd=Nd->NextNd; CheckNds++;}
02258   IAssert(Nds==CheckNds);
02259 }
02260 
02261 template <class TVal>
02262 TLstNd<TVal>* TLst<TVal>::AddFront(const TVal& Val){
02263   PLstNd Nd=new TLstNd<TVal>(NULL, FirstNd, Val);
02264   if (FirstNd!=NULL){FirstNd->PrevNd=Nd; FirstNd=Nd;}
02265   else {FirstNd=Nd; LastNd=Nd;}
02266   Nds++; return Nd;
02267 }
02268 
02269 template <class TVal>
02270 TLstNd<TVal>* TLst<TVal>::AddBack(const TVal& Val){
02271   PLstNd Nd=new TLstNd<TVal>(LastNd, NULL, Val);
02272   if (LastNd!=NULL){LastNd->NextNd=Nd; LastNd=Nd;}
02273   else {FirstNd=Nd; LastNd=Nd;}
02274   Nds++; return Nd;
02275 }
02276 
02277 template <class TVal>
02278 TLstNd<TVal>* TLst<TVal>::AddFrontSorted(const TVal& Val, const bool& Asc){
02279   PLstNd Nd=First();
02280   if (Nd==NULL){
02281     return Ins(Nd, Val);
02282   } else {
02283     while ((Nd!=NULL)&&((Asc&&(Val>Nd()))||(!Asc&&(Val<Nd())))){
02284       Nd=Nd->Next();}
02285     if (Nd==NULL){return Ins(Nd->Last(), Val);}
02286     else {return Ins(Nd->Prev(), Val);}
02287   }
02288 }
02289 
02290 template <class TVal>
02291 TLstNd<TVal>* TLst<TVal>::AddBackSorted(const TVal& Val, const bool& Asc){
02292   PLstNd Nd=Last();
02293   while ((Nd!=NULL)&&((Asc&&(Val<Nd->Val))||(!Asc&&(Val>Nd->Val)))){
02294     Nd=Nd->Prev();}
02295   return Ins(Nd, Val);
02296 }
02297 
02298 template <class TVal>
02299 void TLst<TVal>::PutFront(const PLstNd& Nd){
02300   Assert(Nd!=NULL);
02301   // unchain
02302   if (Nd->PrevNd==NULL){FirstNd=Nd->NextNd;}
02303   else {Nd->PrevNd->NextNd=Nd->NextNd;}
02304   if (Nd->NextNd==NULL){LastNd=Nd->PrevNd;}
02305   else {Nd->NextNd->PrevNd=Nd->PrevNd;}
02306   // add to front
02307   Nd->PrevNd=NULL; Nd->NextNd=FirstNd;
02308   if (FirstNd!=NULL){FirstNd->PrevNd=Nd; FirstNd=Nd;}
02309   else {FirstNd=Nd; LastNd=Nd;}
02310 }
02311 
02312 template <class TVal>
02313 void TLst<TVal>::PutBack(const PLstNd& Nd){
02314   Assert(Nd!=NULL);
02315   // unchain
02316   if (Nd->PrevNd==NULL){FirstNd=Nd->NextNd;}
02317   else {Nd->PrevNd->NextNd=Nd->NextNd;}
02318   if (Nd->NextNd==NULL){LastNd=Nd->PrevNd;}
02319   else {Nd->NextNd->PrevNd=Nd->PrevNd;}
02320   // add to back
02321   Nd->PrevNd=LastNd; Nd->NextNd=NULL;
02322   if (LastNd!=NULL){LastNd->NextNd=Nd; LastNd=Nd;}
02323   else {FirstNd=Nd; LastNd=Nd;}
02324 }
02325 
02326 template <class TVal>
02327 TLstNd<TVal>* TLst<TVal>::Ins(const PLstNd& Nd, const TVal& Val){
02328   if (Nd==NULL){return AddFront(Val);}
02329   else if (Nd->NextNd==NULL){return AddBack(Val);}
02330   else {
02331     PLstNd NewNd=new TLstNd<TVal>(Nd, Nd->NextNd, Val);
02332     Nd->NextNd=NewNd; NewNd->NextNd->PrevNd=Nd;
02333     Nds++; return Nd;
02334   }
02335 }
02336 
02337 template <class TVal>
02338 void TLst<TVal>::Del(const TVal& Val){
02339   PLstNd Nd=SearchForw(Val);
02340   if (Nd!=NULL){Del(Nd);}
02341 }
02342 
02343 template <class TVal>
02344 void TLst<TVal>::Del(const PLstNd& Nd){
02345   Assert(Nd!=NULL);
02346   if (Nd->PrevNd==NULL){FirstNd=Nd->NextNd;}
02347   else {Nd->PrevNd->NextNd=Nd->NextNd;}
02348   if (Nd->NextNd==NULL){LastNd=Nd->PrevNd;}
02349   else {Nd->NextNd->PrevNd=Nd->PrevNd;}
02350   Nds--; delete Nd;
02351 }
02352 
02353 template <class TVal>
02354 TLstNd<TVal>* TLst<TVal>::SearchForw(const TVal& Val){
02355   PLstNd Nd=First();
02356   while (Nd!=NULL){
02357     if (Nd->GetVal()==Val){return Nd;}
02358     Nd=Nd->Next();
02359   }
02360   return NULL;
02361 }
02362 
02363 template <class TVal>
02364 TLstNd<TVal>* TLst<TVal>::SearchBack(const TVal& Val){
02365   PLstNd Nd=Last();
02366   while (Nd!=NULL){
02367     if (Nd->GetVal()==Val){return Nd;}
02368     Nd=Nd->Prev();
02369   }
02370   return NULL;
02371 }
02372 
02374 // Common-List-Types
02375 typedef TLst<TInt> TIntL; typedef TLstNd<TInt>* PIntLN;
02376 typedef TLst<TIntKd> TIntKdL; typedef TLstNd<TIntKd>* PIntKdLN;
02377 typedef TLst<TFlt> TFltL; typedef TLstNd<TFlt>* PFltLN;
02378 typedef TLst<TFltIntKd> TFltIntKdL; typedef TLstNd<TFltIntKd>* PFltIntKdLN;
02379 typedef TLst<TAscFltIntKd> TAscFltIntKdL; typedef TLstNd<TAscFltIntKd>* PAscFltIntKdLN;
02380 typedef TLst<TStr> TStrL; typedef TLstNd<TStr>* PStrLN;
02381 
02383 // Record-File
02384 template <class THd, class TRec>
02385 class TFRec{
02386 private:
02387   PFRnd FRnd;
02388 public:
02389   TFRec(const TStr& FNm, const TFAccess& FAccess, const bool& CreateIfNo):
02390     FRnd(PFRnd(new TFRnd(FNm, FAccess, CreateIfNo, sizeof(THd), sizeof(TRec)))){}
02391   TFRec(const TFRec&);
02392 
02393   TFRec& operator=(const TFRec&);
02394 
02395   void SetRecN(const int& RecN){FRnd->SetRecN(RecN);}
02396   int GetRecN(){return FRnd->GetRecN();}
02397   int GetRecs(){return FRnd->GetRecs();}
02398 
02399   void GetHd(THd& Hd){FRnd->GetHd(&Hd);}
02400   void PutHd(const THd& Hd){FRnd->PutHd(&Hd);}
02401   void GetRec(TRec& Rec, const int& RecN=-1){FRnd->GetRec(&Rec, RecN);}
02402   void PutRec(const TRec& Rec, const int& RecN=-1){FRnd->PutRec(&Rec, RecN);}
02403 };
02404 
02406 // Function
02407 template <class TFuncPt>
02408 class TFunc{
02409 private:
02410   TFuncPt FuncPt;
02411 public:
02412   TFunc(): FuncPt(NULL){}
02413   TFunc(const TFunc& Func): FuncPt(Func.FuncPt){}
02414   TFunc(const TFuncPt& _FuncPt): FuncPt(_FuncPt){}
02415   TFunc(TSIn&){Fail;}
02416   void Save(TSOut&) const {Fail;}
02417 
02418   TFunc& operator=(const TFunc& Func){
02419     if (this!=&Func){FuncPt=Func.FuncPt;} return *this;}
02420   bool operator==(const TFunc& Func) const {
02421     return FuncPt==Func.FuncPt;}
02422   bool operator<(const TFunc&) const {
02423     Fail; return false;}
02424   TFuncPt operator()() const {return FuncPt;}
02425 };