1 // @(#)root/table:$Id$ 2 // Author: Valery Fine(fine@mail.cern.ch) 03/07/98 3 4 /************************************************************************* 5 * Copyright (C) 1995-2006, 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_TDataSetIter 13 #define ROOT_TDataSetIter 14 15 16 ////////////////////////////////////////////////////////////////////////// 17 // // 18 // // 19 // TDataSetIter // 20 // // 21 // Iterator of TDataSet lists. // 22 // // 23 // Provides "standard" features of the TIter class for TDataSet object // 24 // and // 25 // allows navigating TDataSet structure using the custom "directory" // 26 // notation (see TDataSet::Find(const Char *path) method) // 27 // // 28 ////////////////////////////////////////////////////////////////////////// 29 30 #include "TList.h" 31 #include "TNamed.h" 32 33 #include "TDataSet.h" 34 35 class TDataSetIter : public TObject{ 36 protected: 37 TIter *fNext; // "standard" ROOT iterator for containers 38 TIter *fNextSet[100]; // the list of the TList iterators to bypass the whole dataset 39 Int_t fDepth; // the current depth of the passing 40 Int_t fMaxDepth; // the max depth of the passing (=1 by default) 41 42 TDataSet *fDataSet; // Pointer to the last selected TDataSet 43 TDataSet *fRootDataSet; // Pointer to the root TDataSet 44 TDataSet *fWorkingDataSet; // Pointer to the working TDataSet 45 TDataSet *NextDataSet(TIter &next); 46 TDataSet *NextDataSet(Int_t nDataSet); 47 TDataSet *GetNullSet(); // return a fake pointer == -1 casted to (TDataSet *) 48 49 static TDataSet *fgNullDataSet; 50 51 private: 52 53 TDataSetIter(const TDataSetIter&); // Not implemented. 54 TDataSetIter &operator=(const TDataSetIter&); // Not implemented. 55 56 public: 57 TDataSetIter(TDataSet *l=0, Int_t depth=1, Bool_t dir=kIterForward); 58 TDataSetIter(TDataSet *l, Bool_t dir); 59 virtual ~TDataSetIter(); 60 61 virtual TDataSet *Add(TDataSet *set){return Add(set,(TDataSet *)0);} 62 virtual TDataSet *Add(TDataSet *set, const Char_t *path); 63 virtual TDataSet *Add(TDataSet *set, TDataSet *dataset); 64 65 virtual TDataSet *Cd(const Char_t *dirname); 66 virtual TDataSet *Cd(TDataSet *ds); 67 virtual TDataSet *operator()( TDataSet::EDataSetPass mode=TDataSet::kContinue ) {return Next(mode);} 68 virtual TDataSet *operator()(const Char_t *path) { return Find(path); } 69 virtual TDataSet *operator[](const Char_t *path); 70 virtual Int_t GetDepth() const {return fDepth;} 71 virtual TDataSet *Cwd() const {return fWorkingDataSet;} 72 virtual TDataSet *Dir(Char_t *dirname); 73 virtual Int_t Du() const; // summarize dataset usage 74 virtual Int_t Df() const {return 0;} // report number of free "table" blocks. 75 76 virtual TDataSet *Find(const Char_t *path, TDataSet *rootset=0,Bool_t mkdir=kFALSE,Bool_t titleFlag=kFALSE); 77 virtual TDataSet *FindByPath(const Char_t *path, TDataSet *rootset=0,Bool_t mkdir=kFALSE); 78 virtual TDataSet *FindDataSet(const Char_t *name,const Char_t *path="",Option_t *opt=""); 79 virtual TDataSet *FindByName(const Char_t *name,const Char_t *path="",Option_t *opt=""); 80 virtual TDataSet *FindByTitle(const Char_t *title,const Char_t *path="",Option_t *opt=""); 81 virtual TDataSet *FindDataSet(TDataSet *set,const Char_t *path,Option_t *opt=""); 82 virtual TDataSet *FindByPointer(TDataSet *set,const Char_t *path=0,Option_t *opt=""); 83 virtual TObject *FindObject(const Char_t *name) const; 84 virtual TObject *FindObject(const TObject *obj) const; 85 86 virtual Int_t Flag(UInt_t flag=TDataSet::kMark,TDataSet::EBitOpt reset=TDataSet::kSet){return Flag((TDataSet *)0,flag,reset);} 87 virtual Int_t Flag(const Char_t *path,UInt_t flag=TDataSet::kMark,TDataSet::EBitOpt reset=TDataSet::kSet); 88 virtual Int_t Flag(TDataSet *dataset,UInt_t flag=TDataSet::kMark,TDataSet::EBitOpt reset=TDataSet::kSet); 89 90 virtual TDataSet *Ls(const Char_t *dirname="",Option_t *opt="") const; 91 virtual TDataSet *Ls(const Char_t *dirname,Int_t depth) const; 92 virtual void ls(Option_t *dirname="") const { Ls(dirname,"");} 93 virtual TDataSet *ls(TString dirname,Option_t *opt="") const {return Ls(dirname.Data(),opt);} 94 virtual TDataSet *ls(const Char_t *dirname,Int_t depth) const {return Ls(dirname,depth);} 95 virtual TDataSet *Mkdir(const Char_t *dirname); 96 virtual TDataSet *Md(const Char_t *dirname) {return Mkdir(dirname);} 97 virtual TString Path(const Char_t *path) {TDataSet *set = Find(path); return set ? set->Path():TString ("");} 98 virtual TString Path() {return fWorkingDataSet ? fWorkingDataSet->Path() : TString ("");} 99 virtual TDataSet *Pwd(Option_t *opt="") const {if (Cwd()) Cwd()->ls(opt); return Cwd();} 100 virtual TDataSet *Rmdir(TDataSet *dataset,Option_t *option=""); 101 virtual TDataSet *Rmdir(const Char_t *dirname,Option_t *option=""){return Rmdir(Find(dirname),option);} 102 virtual TDataSet *Rd(const Char_t *dirname,Option_t *option="") {return Rmdir(Find(dirname),option);} 103 104 virtual TDataSet *Shunt(TDataSet *set){return Shunt(set,(TDataSet *)0);} 105 virtual TDataSet *Shunt(TDataSet *set, const Char_t *path); 106 virtual TDataSet *Shunt(TDataSet *set, TDataSet *dataset); 107 108 virtual TDataSet *Next( TDataSet::EDataSetPass mode=TDataSet::kContinue); 109 virtual TDataSet *Next(const Char_t *path, TDataSet *rootset=0,Bool_t mkdir=kFALSE){return Find(path,rootset,mkdir);} 110 virtual Bool_t Notify() { return TObject::Notify();} 111 virtual void Notify(TDataSet *dataset); 112 const Option_t *GetOption() const { return fNext ? fNext->GetOption():0; } 113 virtual void Reset(TDataSet *l=0,Int_t depth=0); 114 virtual TDataSet *operator *() const ; 115 116 ClassDef(TDataSetIter,0) // class-iterator to navigate TDataSet structure 117 }; 118 119 #endif 120 121