SNAP Library 2.0, Developer Reference  2013-05-13 16:33:57
SNAP, a general purpose, high performance system for analysis and manipulation of large networks
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
pp.h
Go to the documentation of this file.
00001 
00002 // Property-Tag
00003 typedef enum {
00004   ptUndef, ptBool, ptInt, ptFlt, ptStr, ptValV, ptSel, ptSet} TPpTagVal;
00005 
00006 class TPpTag{
00007 public:
00008   static TStr GetStr(const int& Tag);
00009   static TPpTagVal GetTag(const TStr& Str);
00010   static TPpTagVal LoadTxt(TILx& Lx){
00011     return GetTag(Lx.GetIdStr());}
00012   static void SaveTxt(TOLx& Lx, const TInt& Tag){SaveTxt(Lx, int(Tag));}
00013   static void SaveTxt(TOLx& Lx, const int& Tag){
00014     Lx.PutIdStr(GetStr(Tag));}
00015 };
00016 
00018 // Property-Value
00019 class TPpVal{
00020 private:
00021   TInt Tag;
00022   TBool Bool; TInt Int; TFlt Flt; TStr Str; TVec<TPpVal> ValV;
00023 public:
00024   TPpVal(): Tag(ptUndef){}
00025   TPpVal(const TPpVal& PpVal): Tag(PpVal.Tag), Bool(PpVal.Bool),
00026     Int(PpVal.Int), Flt(PpVal.Flt), Str(PpVal.Str), ValV(PpVal.ValV){}
00027   TPpVal(const bool& b): Tag(ptBool), Bool(b){}
00028   TPpVal(const TBool& b): Tag(ptBool), Bool(b){}
00029   TPpVal(const int& _Int): Tag(ptInt), Int(_Int){}
00030   TPpVal(const TInt& _Int): Tag(ptInt), Int(_Int){}
00031   TPpVal(const double& _Flt): Tag(ptFlt), Flt(_Flt){}
00032   TPpVal(const TFlt& _Flt): Tag(ptFlt), Flt(_Flt){}
00033   TPpVal(const TStr& _Str): Tag(ptStr), Str(_Str){}
00034   TPpVal(const char* CStr): Tag(ptStr), Str(TStr(CStr)){}
00035   TPpVal(const TVec<TPpVal>& _ValV): Tag(ptValV), ValV(_ValV){}
00036   TPpVal(TSIn& SIn):
00037     Tag(SIn), Bool(SIn), Int(SIn), Flt(SIn), Str(SIn), ValV(SIn){}
00038   void Save(TSOut& SOut){
00039     Tag.Save(SOut); Bool.Save(SOut); Int.Save(SOut);
00040     Flt.Save(SOut); Str.Save(SOut); ValV.Save(SOut);}
00041 
00042   TPpVal& operator=(const TPpVal& PpVal){
00043     Tag=PpVal.Tag; Bool=PpVal.Bool; Int=PpVal.Int;
00044     Flt=PpVal.Flt; Str=PpVal.Str; ValV=PpVal.ValV; return *this;}
00045   bool operator==(const TPpVal& PpVal) const;
00046   bool operator<(const TPpVal& PpVal) const {
00047     if ((Tag==PpVal.Tag)&&(int(Tag)==ptInt)){return Int<PpVal.Int;}
00048     else if ((Tag==PpVal.Tag)&&(int(Tag)==ptFlt)){return Flt<PpVal.Flt;}
00049     else {Fail; return false;}}
00050 
00051   int GetTag() const {return (int)Tag;}
00052   TBool GetBool() const {IAssert(int(Tag)==ptBool); return Bool;}
00053   TInt GetInt() const {IAssert(int(Tag)==ptInt); return Int;}
00054   TFlt GetFlt() const {IAssert(int(Tag)==ptFlt); return Flt;}
00055   TStr GetStr() const {IAssert(int(Tag)==ptStr); return Str;}
00056   TVec<TPpVal> GetValV() const {IAssert(int(Tag)==ptValV); return ValV;}
00057 
00058   TStr GetValStr(const bool& DoAddTag=false) const;
00059   static TPpVal LoadTxt(TILx& Lx);
00060   void SaveTxt(TOLx& Lx) const;
00061 };
00062 typedef TVec<TPpVal> TPpValV;
00063 
00065 // Property
00066 class TPp;
00067 typedef TPt<TPp> PPp;
00068 typedef TVec<PPp> TPpV;
00069 
00070 class TPp{
00071 private:
00072   TCRef CRef;
00073 private:
00074   static TStr PpNm;
00075 private:
00076   TStr IdNm, UcIdNm, DescNm;
00077   TInt Tag, ValVTag;
00078   TPpVal Val, DfVal;
00079   TPpVal MnVal, MxVal;
00080   TPpValV CcValV;
00081   TPpV PpV;
00082   void IAssertSubPp() const {IAssert((int(Tag)==ptSel)||(int(Tag)==ptSet));}
00083   int GetPpN(const TStr& IdNm) const;
00084   void GetChA(const int& Lev, const bool& Brief, TChA& ChA) const;
00085 public:
00086   TPp():
00087     IdNm(), UcIdNm(), DescNm(),
00088     Tag(ptUndef), ValVTag(),
00089     Val(), DfVal(), MnVal(), MxVal(),
00090     CcValV(), PpV(){}
00091   TPp(const TPp& Pp):
00092     IdNm(Pp.IdNm), UcIdNm(Pp.IdNm.GetUc()), DescNm(Pp.DescNm),
00093     Tag(Pp.Tag), ValVTag(Pp.ValVTag),
00094     Val(Pp.Val), DfVal(Pp.DfVal), MnVal(Pp.MnVal), MxVal(Pp.MxVal),
00095     CcValV(Pp.CcValV), PpV(Pp.PpV){}
00096   TPp(const TStr& _IdNm, const TStr& _DescNm,
00097    const TPpTagVal& _Tag=ptUndef, const TPpTagVal& _ValVTag=ptUndef):
00098     IdNm(_IdNm), UcIdNm(_IdNm.GetUc()), DescNm(_DescNm),
00099     Tag(_Tag), ValVTag(_ValVTag),
00100     Val(), DfVal(), MnVal(), MxVal(),
00101     CcValV(), PpV(){IAssert(int(ValVTag)!=ptValV);}
00102   TPp(TSIn& SIn):
00103     IdNm(SIn), UcIdNm(SIn), DescNm(SIn),
00104     Tag(SIn), ValVTag(SIn),
00105     Val(SIn), DfVal(SIn), MnVal(SIn), MxVal(SIn),
00106     CcValV(SIn), PpV(SIn){}
00107   static PPp Load(TSIn& SIn){return new TPp(SIn);}
00108   void Save(TSOut& SOut){
00109     IdNm.Save(SOut); UcIdNm.Save(SOut); DescNm.Save(SOut);
00110     Tag.Save(SOut); ValVTag.Save(SOut);
00111     Val.Save(SOut); DfVal.Save(SOut); MnVal.Save(SOut); MxVal.Save(SOut);
00112     CcValV.Save(SOut); PpV.Save(SOut);}
00113 
00114   TPp& operator=(const TPp& Pp){
00115     if (this!=&Pp){
00116       IdNm=Pp.IdNm; UcIdNm=Pp.UcIdNm; DescNm=Pp.DescNm;
00117       Tag=Pp.Tag; ValVTag=Pp.ValVTag;
00118       Val=Pp.Val; DfVal=Pp.DfVal; MnVal=Pp.MnVal; MxVal=Pp.MxVal;
00119       CcValV=Pp.CcValV; PpV=Pp.PpV;}
00120     return *this;}
00121 
00122   // basic operations
00123   TStr GetIdNm() const {return IdNm;}
00124   TStr GetUcIdNm() const {return UcIdNm;}
00125   TStr GetDescNm() const {return DescNm;}
00126   int GetTag() const {return Tag;}
00127   int GetValVTag() const {return ValVTag;}
00128   void PutVal(const TPpVal& _Val);
00129   TPpVal GetVal() const {if (Val==TPpVal()){return DfVal;} else {return Val;}}
00130 
00131   // property definition
00132   void PutDfVal(const TPpVal& _DfVal){PutVal(_DfVal); DfVal=Val;}
00133   TPpVal GetDfVal() const {return DfVal;}
00134   void PutMnMxVal(const TPpVal& _MnVal, const TPpVal& _MxVal){
00135     IAssert((int(Tag)==ptInt)||(int(Tag)==ptFlt));
00136     IAssert((Tag==_MnVal.GetTag())&&(Tag==_MxVal.GetTag()));
00137     MnVal=_MnVal; MxVal=_MxVal;}
00138   TPpVal GetMnVal() const {IAssert((int(Tag)==ptInt)||(int(Tag)==ptFlt)); return MnVal;}
00139   TPpVal GetMxVal() const {IAssert((int(Tag)==ptInt)||(int(Tag)==ptFlt)); return MxVal;}
00140   void AddCcVal(const TPpVal& _Val){
00141     IAssert((int(Tag)==ptStr)||(int(Tag)==_Val.GetTag()));
00142     IAssert(CcValV.SearchForw(_Val)==-1); CcValV.Add(_Val);}
00143   void PutCcValV(const TPpValV& CcValV){
00144     for (int CcValN=0; CcValN<CcValV.Len(); CcValN++){AddCcVal(CcValV[CcValN]);}}
00145   int GetCcVals() const {IAssert(int(Tag)==ptStr); return CcValV.Len();}
00146   TPpVal GetCcVal(const int& CcValN) const {
00147     IAssert(int(Tag)==ptStr); return CcValV[CcValN];}
00148 
00149   // property put/get
00150   bool IsPp(const TStr& IdNm) const {IAssertSubPp(); return GetPpN(IdNm)!=-1;}
00151   bool IsPp(const TStr& IdNm, PPp& Pp) const {
00152     IAssertSubPp(); int PpN=GetPpN(IdNm);
00153     if (PpN==-1){return false;} else {Pp=GetPp(PpN); return true;}}
00154   int GetPps() const {IAssertSubPp(); return PpV.Len();}
00155   int AddPp(const PPp& Pp){IAssertSubPp(); return PpV.Add(Pp);}
00156   void AddPpV(const TPpV& PpV){
00157     for (int PpN=0; PpN<PpV.Len(); PpN++){AddPp(PpV[PpN]);}}
00158   PPp GetPp(const int& PpN) const {IAssertSubPp(); return PpV[PpN];}
00159   PPp GetPp(const TStr& IdPath) const;
00160   PPp GetSelPp() const {
00161     IAssert(int(Tag)==ptSel); return GetPp(GetVal().GetStr());}
00162 
00163   // add&create property shortcuts
00164   int AddPpInt(const TStr& IdNm, const TStr& DescNm=TStr()){
00165     PPp Pp=PPp(new TPp(IdNm, DescNm, ptInt)); return AddPp(Pp);}
00166   int AddPpInt(const TStr& IdNm, const TStr& DescNm,
00167    const int& MnVal, const int& MxVal, const int& DfVal){
00168     PPp Pp=PPp(new TPp(IdNm, DescNm, ptInt));
00169     Pp->PutMnMxVal(MnVal, MxVal); Pp->PutDfVal(DfVal); return AddPp(Pp);}
00170   int AddPpFlt(const TStr& IdNm, const TStr& DescNm=TStr()){
00171     PPp Pp=PPp(new TPp(IdNm, DescNm, ptFlt)); return AddPp(Pp);}
00172   int AddPpFlt(const TStr& IdNm, const TStr& DescNm,
00173    const double& MnVal, const double& MxVal, const double& DfVal){
00174     PPp Pp=PPp(new TPp(IdNm, DescNm, ptFlt));
00175     Pp->PutMnMxVal(MnVal, MxVal); Pp->PutDfVal(DfVal); return AddPp(Pp);}
00176   int AddPpStr(const TStr& IdNm, const TStr& DescNm=TStr(), const TStr& DfVal=TStr()){
00177     PPp Pp=PPp(new TPp(IdNm, DescNm, ptStr));
00178     Pp->PutDfVal(DfVal); return AddPp(Pp);}
00179   static PPp GetSetPp(const TStr& IdNm, const TStr& DescNm=TStr()){
00180     return PPp(new TPp(IdNm, DescNm, ptSet));}
00181 
00182   // boolean property put/get shortcuts
00183   void PutValBool(const bool& Val){PutVal(TPpVal(Val));}
00184   TBool GetValBool() const {return GetVal().GetBool();}
00185   void PutValBool(const TStr& IdPath, const bool& Val){
00186     GetPp(IdPath)->PutVal(TPpVal(Val));}
00187   TBool GetValBool(const TStr& IdPath) const {
00188     return GetPp(IdPath)->GetVal().GetBool();}
00189 
00190   // integer property put/get shortcuts
00191   void PutValInt(const int& Val){PutVal(TPpVal(Val));}
00192   TInt GetValInt() const {return GetVal().GetInt();}
00193   void PutValInt(const TStr& IdPath, const int& Val){
00194     GetPp(IdPath)->PutVal(TPpVal(Val));}
00195   TInt GetValInt(const TStr& IdPath) const {
00196     return GetPp(IdPath)->GetVal().GetInt();}
00197 
00198   // float property put/get shortcuts
00199   void PutValFlt(const double& Val){PutVal(TPpVal(Val));}
00200   TFlt GetValFlt() const {return GetVal().GetFlt();}
00201   void PutValFlt(const TStr& IdPath, const double& Val){
00202     GetPp(IdPath)->PutVal(TPpVal(Val));}
00203   TFlt GetValFlt(const TStr& IdPath) const {
00204     return GetPp(IdPath)->GetVal().GetFlt();}
00205 
00206   // string property put/get shortcuts
00207   void PutValStr(const TStr& Val){PutVal(TPpVal(Val));}
00208   TStr GetValStr() const {return GetVal().GetStr();}
00209   void PutValStr(const TStr& IdPath, const TStr& Val){
00210     GetPp(IdPath)->PutVal(TPpVal(Val));}
00211   TStr GetValStr(const TStr& IdPath) const {
00212     return GetPp(IdPath)->GetVal().GetStr();}
00213 
00214   // value property vector put/get shortcuts
00215   void PutValValV(const TPpValV& Val){PutVal(TPpVal(Val));}
00216   TPpValV GetValValV() const {return GetVal().GetValV();}
00217   void PutValValV(const TStr& IdPath, const TPpValV& Val){
00218     GetPp(IdPath)->PutVal(TPpVal(Val));}
00219   TPpValV GetValValV(const TStr& IdPath) const {
00220     return GetPp(IdPath)->GetVal().GetValV();}
00221 
00222   // string
00223   TStr GetStr(const bool& Brief=true) const {
00224     TChA ChA; GetChA(0, Brief, ChA); return ChA;}
00225 
00226   // file
00227   static PPp LoadTxt(const PSIn& SIn){
00228     TILx Lx(SIn, TFSet()|iloCmtAlw|iloSigNum|oloCsSens); return LoadTxt(Lx);}
00229   void SaveTxt(const PSOut& SOut) const {
00230     TOLx Lx(SOut, TFSet()|oloCmtAlw|oloFrcEoln|oloSigNum|oloCsSens); SaveTxt(Lx);}
00231   static PPp LoadTxt(TILx& Lx);
00232   void SaveTxt(TOLx& Lx, const int& Lev=0) const;
00233 
00234   friend class TPt<TPp>;
00235 };
00236 
00237 inline PPp MkClone(const PPp& Pp){return new TPp(*Pp);}
00238