00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef ROOT_TFileIter
00014 #define ROOT_TFileIter
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 #ifndef ROOT_TString
00048 #include "TString.h"
00049 #endif
00050 #ifndef ROOT_TIterator
00051 #include "TIterator.h"
00052 #endif
00053 #ifndef ROOT_TList
00054 #include "TList.h"
00055 #endif
00056 #ifndef ROOT_TFile
00057 #include "TFile.h"
00058 #endif
00059
00060
00061 class TFileIter : public TListIter {
00062
00063 private:
00064
00065 TFile *fFileBackUp;
00066 TDirectory *fDirectoryBackUp;
00067 TFileIter *fNestedIterator;
00068
00069 virtual TIterator &operator=(const TIterator &) { return *this; }
00070 virtual bool operator!=(const TIterator &it) const { return TListIter::operator!=(it);}
00071
00072 protected:
00073 TDirectory *fRootFile;
00074 TString fEventName;
00075 UInt_t fRunNumber;
00076 UInt_t fEventNumber;
00077 Int_t fCursorPosition;
00078 Bool_t fOwnTFile;
00079
00080 void Initialize();
00081 TObject *ReadObj(const TKey *key) const;
00082 void RestoreFileScope();
00083 void SaveFileScope();
00084 TKey *NextEventKey(UInt_t eventNumber=UInt_t(-1), UInt_t runNumber=UInt_t(-1), const char *name="*");
00085
00086 public:
00087
00088 TFileIter(const char *name, Option_t *option = "",
00089 const char *ftitle = "", Int_t compress = 1,
00090 Int_t netopt = 0);
00091 TFileIter(TFile *file=0);
00092 TFileIter(TDirectory *directory);
00093 TFileIter(const TFileIter &);
00094 virtual ~TFileIter();
00095
00096 Int_t CurrentCursorPosition() const;
00097 virtual const TFile *GetTFile() const;
00098 virtual const TDirectory *GetTDirectory() const;
00099 static TString MapName(const char *name, const char *localSystemKey = 0
00100 , const char *mountedFileSystemKey = 0);
00101 static const char *GetResourceName();
00102 static const char *GetDefaultMapFileName();
00103 static const char *GetLocalFileNameKey();
00104 static const char *GetForeignFileSystemKey();
00105 static void PurgeKeys(TList *listOfKeys);
00106 virtual Bool_t IsOpen() const;
00107 virtual TObject *NextEventGet(UInt_t eventNumber=UInt_t(-1), UInt_t runNumber=UInt_t(-1), const char *name="*");
00108 virtual Int_t NextEventPut(TObject *obj, UInt_t eventNum, UInt_t runNumber, const char *name=0);
00109 void SetCursorPosition(Int_t cursorPosition);
00110 void SetCursorPosition(const char *keyNameToFind);
00111 Int_t GetObjlen() const;
00112 virtual Int_t TotalKeys() const;
00113 virtual TKey *SkipObjects(Int_t nSkip=1);
00114 virtual TObject *GetObject() const;
00115 virtual Int_t GetDepth() const;
00116
00117 TKey *GetCurrentKey() const;
00118 const char *GetKeyName() const;
00119
00120 TFileIter &operator=(Int_t cursorPosition);
00121 TFileIter &operator=(const char *keyNameToFind);
00122 TFileIter &operator+=(Int_t shift);
00123 TFileIter &operator-=(Int_t shift);
00124 TFileIter &operator++();
00125 TFileIter &operator--();
00126
00127 TObject *operator*() const;
00128 operator const char *() const;
00129 operator const TFile *() const;
00130 operator const TDirectory *() const;
00131 operator int () const;
00132 int operator==(const char *name) const;
00133 int operator!=(const char *name) const;
00134
00135 public:
00136
00137 virtual TObject *Next();
00138 virtual TObject *Next(Int_t nSkip);
00139 virtual void Reset();
00140 virtual void Rewind();
00141 TObject *operator()(Int_t nSkip);
00142 TObject *operator()();
00143
00144 ClassDef(TFileIter,0)
00145 };
00146
00147
00148 inline const char *TFileIter::GetResourceName() {return "ForeignFileMap";}
00149
00150 inline const char *TFileIter::GetDefaultMapFileName() {return "io.config";}
00151
00152 inline const char *TFileIter::GetLocalFileNameKey() {return "LocalFileSystem";}
00153
00154 inline const char *TFileIter::GetForeignFileSystemKey(){return "MountedFileSystem";}
00155
00156
00157 inline Int_t TFileIter::CurrentCursorPosition() const
00158 {
00159
00160 return fNestedIterator ? fNestedIterator->CurrentCursorPosition() : fCursorPosition;
00161 }
00162
00163
00164 inline const TFile *TFileIter::GetTFile() const { return GetTDirectory()->GetFile(); }
00165
00166 inline const TDirectory *TFileIter::GetTDirectory() const
00167 { return fNestedIterator ? fNestedIterator->GetTDirectory() : fRootFile; }
00168
00169
00170 inline TObject *TFileIter::Next()
00171 {
00172
00173
00174 return Next(1);
00175 }
00176
00177
00178 inline void TFileIter::Rewind()
00179 {
00180
00181 Reset();
00182 }
00183
00184 inline void TFileIter::SetCursorPosition(Int_t cursorPosition)
00185 {
00186
00187
00188 if (fNestedIterator)
00189 fNestedIterator->SetCursorPosition(cursorPosition);
00190 else
00191 SkipObjects(cursorPosition - fCursorPosition);
00192 }
00193
00194
00195 inline TFileIter &TFileIter::operator=(const char *keyNameToFind)
00196 {
00197
00198 SetCursorPosition(keyNameToFind); return *this;}
00199
00200
00201 inline TFileIter &TFileIter::operator=(Int_t cursorPosition)
00202 {
00203
00204 SetCursorPosition(cursorPosition);
00205 return *this;
00206 }
00207
00208 inline TFileIter::operator const TDirectory *() const
00209 { return GetTDirectory(); }
00210
00211
00212 inline TFileIter::operator const TFile *() const
00213 { return GetTFile (); }
00214
00215 inline TFileIter &TFileIter::operator+=(Int_t shift)
00216 { SkipObjects(shift); return *this;}
00217
00218 inline TFileIter &TFileIter::operator-=(Int_t shift)
00219 { return operator+=(-shift);}
00220
00221 inline TFileIter &TFileIter::operator++()
00222 { SkipObjects( 1); return *this;}
00223
00224 inline TFileIter &TFileIter::operator--()
00225 { SkipObjects(-1); return *this;}
00226
00227 inline TObject *TFileIter::operator*() const
00228 { return GetObject();}
00229
00230 inline TFileIter::operator int () const
00231 { return CurrentCursorPosition(); }
00232
00233 inline TFileIter::operator const char *() const
00234 {
00235
00236 return GetKeyName();
00237 }
00238
00239 inline int TFileIter::operator==(const char *name) const
00240 { return name ? !strcmp(name,GetKeyName()):0;}
00241
00242
00243 inline int TFileIter::operator!=(const char *name) const
00244 { return !(operator==(name)); }
00245
00246
00247 inline TObject *TFileIter::operator()(){ return Next(); }
00248
00249 inline TObject *TFileIter::operator()(Int_t nSkip){ return Next(nSkip);}
00250
00251
00252 inline void TFileIter::SaveFileScope()
00253 { fFileBackUp = gFile; fDirectoryBackUp = gDirectory; }
00254
00255
00256 inline void TFileIter::RestoreFileScope()
00257 { gFile = fFileBackUp; gDirectory = fDirectoryBackUp; }
00258
00259 #endif