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