12 #ifndef ROOT_TDirectory
13 #define ROOT_TDirectory
34 class TDirectory :
public TNamed {
43 std::atomic<TDirectory*> fDirectory{
nullptr};
44 std::atomic<bool> fActiveDestructor{
false};
45 std::atomic<bool> fDirectoryWait{
false};
46 TContext *fPrevious{
nullptr};
47 TContext *fNext{
nullptr};
49 TContext(TContext&) =
delete;
50 TContext& operator=(TContext&) =
delete;
53 friend class TDirectory;
55 TContext(TDirectory *previous, TDirectory *newCurrent) : fDirectory(previous)
60 (*fDirectory).RegisterContext(
this);
66 TContext() : fDirectory(TDirectory::CurrentDirectory())
71 (*fDirectory).RegisterContext(
this);
73 TContext(TDirectory *newCurrent) : fDirectory(TDirectory::CurrentDirectory())
78 (*fDirectory).RegisterContext(
this);
89 TObject *fMother{
nullptr};
90 TList *fList{
nullptr};
92 mutable TString fPathBuffer;
93 TContext *fContext{
nullptr};
95 std::atomic<size_t> fContextPeg;
96 mutable std::atomic_flag fSpinLock;
98 static Bool_t fgAddDirectory;
100 Bool_t cd1(
const char *path);
101 static Bool_t Cd1(
const char *path);
104 void FillFullPath(TString& buf)
const;
105 void RegisterContext(TContext *ctxt);
106 void UnregisterContext(TContext *ctxt);
107 void BuildDirectory(TFile* motherFile, TDirectory* motherDir);
109 friend class TContext;
112 TDirectory(
const TDirectory &directory) =
delete;
113 void operator=(
const TDirectory &) =
delete;
118 TDirectory(
const char *name,
const char *title, Option_t *option =
"", TDirectory* motherDir =
nullptr);
119 virtual ~TDirectory();
120 static void AddDirectory(Bool_t add=kTRUE);
121 static Bool_t AddDirectoryStatus();
122 virtual void Append(TObject *obj, Bool_t replace = kFALSE);
123 virtual void Add(TObject *obj, Bool_t replace = kFALSE) { Append(obj,replace); }
124 virtual Int_t AppendKey(TKey *) {
return 0;}
125 void Browse(TBrowser *b)
override;
126 virtual void Build(TFile* motherFile =
nullptr, TDirectory* motherDir =
nullptr) { BuildDirectory(motherFile, motherDir); }
127 void Clear(Option_t *option=
"")
override;
128 virtual TObject *CloneObject(
const TObject *obj, Bool_t autoadd = kTRUE);
129 virtual void Close(Option_t *option=
"");
130 static TDirectory *&CurrentDirectory();
131 void Copy(TObject &)
const override { MayNotUse(
"Copy(TObject &)"); }
132 virtual Bool_t cd(
const char *path =
nullptr);
133 virtual void DeleteAll(Option_t *option=
"");
134 void Delete(
const char *namecycle=
"")
override;
135 void Draw(Option_t *option=
"")
override;
136 virtual TKey *FindKey(
const char * )
const {
return nullptr;}
137 virtual TKey *FindKeyAny(
const char * )
const {
return nullptr;}
138 TObject *FindObject(
const char *name)
const override;
139 TObject *FindObject(
const TObject *obj)
const override;
140 virtual TObject *FindObjectAny(
const char *name)
const;
141 virtual TObject *FindObjectAnyFile(
const char * )
const {
return nullptr;}
142 virtual TObject *Get(
const char *namecycle);
144 template <
class T>
inline T* Get(
const char* namecycle)
146 return static_cast<T*
>(GetObjectChecked(namecycle, TClass::GetClass<T>()));
148 virtual TDirectory *GetDirectory(
const char *namecycle, Bool_t printError =
false,
const char *funcname =
"GetDirectory");
149 template <
class T>
inline void GetObject(
const char* namecycle, T*& ptr)
151 ptr = (T *)GetObjectChecked(namecycle, TClass::GetClass<T>());
153 virtual void *GetObjectChecked(
const char *namecycle,
const char* classname);
154 virtual void *GetObjectChecked(
const char *namecycle,
const TClass* cl);
155 virtual void *GetObjectUnchecked(
const char *namecycle);
156 virtual Int_t GetBufferSize()
const {
return 0;}
157 virtual TFile *GetFile()
const {
return 0; }
158 virtual TKey *GetKey(
const char * , Short_t =9999)
const {
return nullptr;}
159 virtual TList *GetList()
const {
return fList; }
160 virtual TList *GetListOfKeys()
const {
return nullptr; }
161 TObject *GetMother()
const {
return fMother; }
162 TDirectory *GetMotherDir()
const {
return !fMother ?
nullptr :
dynamic_cast<TDirectory*
>(fMother); }
163 virtual Int_t GetNbytesKeys()
const {
return 0; }
164 virtual Int_t GetNkeys()
const {
return 0; }
165 virtual Long64_t GetSeekDir()
const {
return 0; }
166 virtual Long64_t GetSeekParent()
const {
return 0; }
167 virtual Long64_t GetSeekKeys()
const {
return 0; }
168 virtual const char *GetPathStatic()
const;
169 virtual const char *GetPath()
const;
170 TUUID GetUUID()
const {
return fUUID;}
171 Bool_t IsFolder()
const override {
return kTRUE; }
172 virtual Bool_t IsModified()
const {
return kFALSE; }
173 virtual Bool_t IsWritable()
const {
return kFALSE; }
174 void ls(Option_t *option=
"")
const override;
175 virtual TDirectory *mkdir(
const char *name,
const char *title=
"", Bool_t returnExistingDirectory = kFALSE);
176 virtual TFile *OpenFile(
const char * , Option_t * =
"",
177 const char * =
"", Int_t = 1,
178 Int_t = 0) {
return nullptr;}
179 void Paint(Option_t *option=
"")
override;
180 void Print(Option_t *option=
"")
const override;
181 virtual void Purge(Short_t =1) {}
182 virtual void pwd()
const;
183 virtual void ReadAll(Option_t * =
"") {}
184 virtual Int_t ReadKeys(Bool_t =kTRUE) {
return 0;}
185 virtual Int_t ReadTObject(TObject * ,
const char * ) {
return 0;}
186 virtual TObject *Remove(TObject*);
187 void RecursiveRemove(TObject *obj)
override;
188 virtual void rmdir(
const char *name);
189 virtual void Save() {}
190 virtual Int_t SaveObjectAs(
const TObject * ,
const char * =
"", Option_t * =
"")
const;
191 virtual void SaveSelf(Bool_t = kFALSE) {}
192 virtual void SetBufferSize(Int_t ) {}
193 virtual void SetModified() {}
194 virtual void SetMother(TObject *mother) {fMother = (TObject*)mother;}
195 void SetName(
const char* newname)
override;
196 virtual void SetTRefAction(TObject * , TObject * ) {}
197 virtual void SetSeekDir(Long64_t) {}
198 virtual void SetWritable(Bool_t) {}
199 Int_t Sizeof()
const override {
return 0;}
200 virtual Int_t Write(
const char * =
nullptr, Int_t =0, Int_t =0)
override {
return 0;}
201 virtual Int_t Write(
const char * =
nullptr, Int_t =0, Int_t =0)
const override {
return 0;}
202 virtual Int_t WriteTObject(
const TObject *obj,
const char *name =
nullptr, Option_t * =
"", Int_t =0);
204 Int_t WriteObject(
void *obj,
const char* name, Option_t *option=
"", Int_t bufsize=0);
206 template <
class T>
inline Int_t WriteObject(
const T* obj,
const char* name, Option_t *option=
"", Int_t bufsize=0)
208 return WriteObjectAny(obj, TClass::GetClass<T>(), name, option, bufsize);
210 virtual Int_t WriteObjectAny(
const void *,
const char * ,
const char * , Option_t * =
"", Int_t =0) {
return 0;}
211 virtual Int_t WriteObjectAny(
const void *,
const TClass * ,
const char * , Option_t * =
"", Int_t =0) {
return 0;}
212 virtual void WriteDirHeader() {}
213 virtual void WriteKeys() {}
215 static Bool_t Cd(
const char *path);
216 static void DecodeNameCycle(
const char *namecycle,
char *name, Short_t &cycle,
const size_t namesize = 0);
217 static void EncodeNameCycle(
char *buffer,
const char *name, Short_t cycle);
219 ClassDefOverride(TDirectory,5)
223 #define gDirectory (TDirectory::CurrentDirectory())
225 #elif defined(__MAKECINT__)
227 R__EXTERN TDirectory *gDirectory;