1 // @(#)root/table:$Id$ 2 // Author: Valery Fine(fine@mail.cern.ch) 03/07/98 3 4 /************************************************************************* 5 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. * 6 * All rights reserved. * 7 * * 8 * For the licensing terms see $ROOTSYS/LICENSE. * 9 * For the list of contributors see $ROOTSYS/README/CREDITS. * 10 *************************************************************************/ 11 12 #ifndef ROOT_TDataSet 13 #define ROOT_TDataSet 14 15 16 ////////////////////////////////////////////////////////////////////////// 17 // // 18 // TDataSet // 19 // // 20 // TDataSet class is a base class to implement the directory-like // 21 // data structures and maintain it via TDataSetIter class iterator // 22 // // 23 ////////////////////////////////////////////////////////////////////////// 24 25 #include "TList.h" 26 #include "TObjArray.h" 27 28 #include "TNamed.h" 29 #include "TNode.h" 30 31 class TDataSetIter; 32 class TBrowser; 33 34 class TDataSet : public TNamed 35 { 36 friend class TDataSetIter; 37 public: 38 // The control codes to navigate the TDataSet structure via TDataSet::Pass method 39 40 typedef enum { 41 kContinue, // continue passing 42 kPrune, // stop passing of the current branch but continue with the next one if any 43 kStop, // break passing 44 kUp, // break passing, return to the previous level, then continue 45 kStruct, // work with structural links only 46 kAll, // work with all links 47 kRefs, // work with refs links only 48 kMarked // work with marked links only 49 } EDataSetPass; 50 51 private: 52 void operator=(const TDataSet &){} 53 // -- Int_t IncCnt(){ fCnt++; return fCnt;} 54 // -- Int_t DecCnt(){ fCnt--; return fCnt;} 55 // -- Int_t Cnt() { return fCnt;} 56 protected: 57 static TDataSet *fgMainSet; // pointer the main dataset; 58 TDataSet *fParent; // pointer to mother of the directory 59 TSeqCollection *fList; // List of the the the objects included into this dataset 60 // -- Int_t fCnt; // reference counter. 61 virtual void SetMother(TObject *mother) {SetParent((TDataSet*)mother);} 62 TDataSet(const char *name,const char *title): 63 TNamed(name,title),fParent(0),fList(0){} // to support TDictionary 64 void AddMain(TDataSet *set); 65 static EDataSetPass SortIt(TDataSet *ds); 66 static EDataSetPass SortIt(TDataSet *ds,void *user); 67 TDataSet *GetRealParent(); 68 void MakeCollection(); 69 70 71 public: 72 73 //----- dataset flags 74 enum ESetBits { 75 kMark = BIT(22) // if object is marked 76 ,kArray = BIT(20) // if object has TObjArray inside 77 }; 78 79 enum EBitOpt { 80 kSet = kTRUE, 81 kReset = kFALSE 82 }; 83 84 TDataSet(const char *name="", TDataSet *parent=0, Bool_t arrayFlag = kFALSE); 85 TDataSet(const TDataSet &src,EDataSetPass iopt=kAll); 86 TDataSet(TNode &src); 87 virtual ~TDataSet(); 88 virtual void Add(TDataSet *dataset); 89 virtual void AddAt(TDataSet *dataset,Int_t idx=0); 90 virtual void AddAtAndExpand(TDataSet *dataset, Int_t idx=0); 91 virtual void AddFirst(TDataSet *dataset); 92 virtual void AddLast(TDataSet *dataset); 93 TDataSet *At(Int_t idx) const; 94 virtual void Browse(TBrowser *b); 95 virtual TObject *Clone(const char *newname="") const; 96 virtual void Delete(Option_t *opt=""); 97 virtual TDataSet *Find(const char *path) const; 98 virtual TDataSet *FindByName(const char *name,const char *path="",Option_t *opt="") const; 99 virtual TDataSet *FindByPath(const char *path) const; 100 virtual TDataSet *FindByTitle(const char *title,const char *path="",Option_t *opt="") const; 101 TObject *FindObject(const char *name) const {return FindByName(name);} 102 TObject *FindObject(const TObject *o) const { return TObject::FindObject(o);} 103 virtual TDataSet *First() const; 104 TObjArray *GetObjArray() const { return (TObjArray *)fList; } 105 virtual TSeqCollection *GetCollection() const { return (TSeqCollection *)fList; } 106 TList *GetList() const { return (TList *)fList; } 107 virtual Int_t GetListSize() const; 108 static TDataSet *GetMainSet(); 109 TObject *GetMother() const { return (TObject*)GetParent();} 110 virtual TObject *GetObject() const; 111 virtual TDataSet *GetParent() const { return fParent;} 112 virtual Long_t HasData() const {return 0;} // Check whether this dataset has extra "data-members" 113 virtual TDataSet *Instance() const; 114 static TDataSet *instance(); 115 virtual TString Path() const; // return the "full" path of this dataset 116 virtual EDataSetPass Pass(EDataSetPass ( *callback)(TDataSet *),Int_t depth=0); 117 virtual EDataSetPass Pass(EDataSetPass ( *callback)(TDataSet *,void*),void *user,Int_t depth=0); 118 virtual void PrintContents(Option_t *opt="") const; 119 virtual Int_t Purge(Option_t *opt=""); 120 virtual void Remove(TDataSet *set); 121 virtual TDataSet *RemoveAt(Int_t idx); 122 virtual void SetMother(TDataSet *parent=0){SetParent(parent);}; 123 virtual void SetObject(TObject *obj); 124 virtual void SetParent(TDataSet *parent=0); 125 virtual void SetWrite(); 126 virtual void Shunt(TDataSet *newParent=0); 127 virtual void Sort(); //Sort objects in lexical order 128 virtual Bool_t IsEmpty() const; 129 virtual Bool_t IsFolder() const {return kTRUE;} 130 virtual Bool_t IsMarked() const ; 131 virtual Bool_t IsThisDir(const char *dirname,int len=-1,int ignorecase=0) const ; 132 virtual TDataSet *Last() const; 133 virtual void ls(Option_t *option="") const; // Option "*" means print all levels 134 virtual void ls(Int_t depth) const; // Print the "depth" levels of this datatset 135 void Mark(); // *MENU* 136 void UnMark(); // *MENU* 137 void MarkAll(); // *MENU* 138 void UnMarkAll(); // *MENU* 139 void InvertAllMarks(); // *MENU* 140 void Mark(UInt_t flag,EBitOpt reset=kSet); 141 virtual TDataSet *Next() const; 142 virtual TDataSet *Prev() const; 143 virtual void Update(); // Update dataset 144 virtual void Update(TDataSet *set,UInt_t opt=0);// Update this dataset with the new one 145 virtual Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0); 146 virtual Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0) const; 147 ClassDef(TDataSet,1) // The base class to create the hierarchical data structures 148 }; 149 150 inline void TDataSet::Add(TDataSet *dataset){ AddLast(dataset); } 151 inline TDataSet *TDataSet::At(Int_t idx) const {return fList ? (TDataSet *)fList->At(idx) : 0; } 152 inline Int_t TDataSet::GetListSize() const {return (fList) ? fList->GetSize():0;} 153 inline TDataSet *TDataSet::instance() { return new TDataSet();} 154 inline Bool_t TDataSet::IsMarked() const { return TestBit(kMark); } 155 inline void TDataSet::Mark(UInt_t flag,EBitOpt reset){ SetBit(flag,reset); } 156 inline void TDataSet::Mark() { Mark(kMark,kSet); } 157 inline void TDataSet::UnMark() { Mark(kMark,kReset); } 158 159 160 #endif 161