00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef ROOT_TClass
00013 #define ROOT_TClass
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef ROOT_TDictionary
00025 #include "TDictionary.h"
00026 #endif
00027 #ifndef ROOT_TString
00028 #include "TString.h"
00029 #endif
00030 #ifndef ROOT_TObjArray
00031 #include "TObjArray.h"
00032 #endif
00033 #ifndef ROOT_TObjString
00034 #include "TObjString.h"
00035 #endif
00036 #include <map>
00037 #include <string>
00038
00039 class TBaseClass;
00040 class TBrowser;
00041 class TDataMember;
00042 class TClassRef;
00043 class TMethod;
00044 class TRealData;
00045 class TCint;
00046 class TBuffer;
00047 class TVirtualStreamerInfo;
00048 class TVirtualCollectionProxy;
00049 class TMethodCall;
00050 class TVirtualIsAProxy;
00051 class TVirtualRefProxy;
00052 class THashTable;
00053
00054 namespace ROOT {
00055 class TGenericClassInfo;
00056 class TCollectionProxyInfo;
00057 class TSchemaRuleSet;
00058 }
00059
00060 namespace ROOT {
00061 class TMapTypeToTClass;
00062 }
00063 typedef ROOT::TMapTypeToTClass IdMap_t;
00064
00065 class TClass : public TDictionary {
00066
00067 friend class TCint;
00068 friend void ROOT::ResetClassVersion(TClass*, const char*, Short_t);
00069 friend class ROOT::TGenericClassInfo;
00070
00071 public:
00072
00073 enum { kClassSaved = BIT(12), kIgnoreTObjectStreamer = BIT(15),
00074 kUnloaded = BIT(16), kIsTObject = BIT(17),
00075 kIsForeign = BIT(18), kIsEmulation = BIT(19),
00076 kStartWithTObject = BIT(20),
00077 kWarned = BIT(21),
00078 kHasNameMapNode = BIT(22)
00079 };
00080 enum ENewType { kRealNew = 0, kClassNew, kDummyNew };
00081
00082 private:
00083
00084 mutable TObjArray *fStreamerInfo;
00085 mutable std::map<std::string, TObjArray*> *fConversionStreamerInfo;
00086 TList *fRealData;
00087 TList *fBase;
00088 TList *fData;
00089 TList *fMethod;
00090 TList *fAllPubData;
00091 TList *fAllPubMethod;
00092 mutable TList *fClassMenuList;
00093
00094 const char *fDeclFileName;
00095 const char *fImplFileName;
00096 Short_t fDeclFileLine;
00097 Short_t fImplFileLine;
00098 UInt_t fInstanceCount;
00099 UInt_t fOnHeap;
00100 mutable UInt_t fCheckSum;
00101 TVirtualCollectionProxy *fCollectionProxy;
00102 Version_t fClassVersion;
00103 ClassInfo_t *fClassInfo;
00104 TString fContextMenuTitle;
00105 const type_info *fTypeInfo;
00106 ShowMembersFunc_t fShowMembers;
00107 mutable void *fInterShowMembers;
00108 TClassStreamer *fStreamer;
00109 TString fSharedLibs;
00110
00111 TVirtualIsAProxy *fIsA;
00112 IsAGlobalFunc_t fGlobalIsA;
00113 mutable TMethodCall *fIsAMethod;
00114
00115 ROOT::NewFunc_t fNew;
00116 ROOT::NewArrFunc_t fNewArray;
00117 ROOT::DelFunc_t fDelete;
00118 ROOT::DelArrFunc_t fDeleteArray;
00119 ROOT::DesFunc_t fDestructor;
00120 ROOT::DirAutoAdd_t fDirAutoAdd;
00121 ClassStreamerFunc_t fStreamerFunc;
00122 Int_t fSizeof;
00123
00124 mutable Long_t fProperty;
00125 mutable Bool_t fVersionUsed;
00126
00127 mutable Bool_t fIsOffsetStreamerSet;
00128 mutable Long_t fOffsetStreamer;
00129 Int_t fStreamerType;
00130 mutable TVirtualStreamerInfo *fCurrentInfo;
00131 TClassRef *fRefStart;
00132 TVirtualRefProxy *fRefProxy;
00133 ROOT::TSchemaRuleSet *fSchemaRules;
00134
00135 typedef void (TClass::*StreamerImpl_t)(void *obj, TBuffer &b, const TClass *onfile_class) const;
00136 mutable StreamerImpl_t fStreamerImpl;
00137
00138 TMethod *GetClassMethod(Long_t faddr);
00139 TMethod *GetClassMethod(const char *name, const char *signature);
00140 Int_t GetBaseClassOffsetRecurse(const TClass *base);
00141 void Init(const char *name, Version_t cversion, const type_info *info,
00142 TVirtualIsAProxy *isa, ShowMembersFunc_t showmember,
00143 const char *dfil, const char *ifil,
00144 Int_t dl, Int_t il,
00145 Bool_t silent);
00146 void ForceReload (TClass* oldcl);
00147
00148 void SetClassVersion(Version_t version);
00149 void SetClassSize(Int_t sizof) { fSizeof = sizof; }
00150
00151
00152 void StreamerExternal(void *object, TBuffer &b, const TClass *onfile_class) const;
00153 void StreamerTObject(void *object, TBuffer &b, const TClass *onfile_class) const;
00154 void StreamerTObjectInitialized(void *object, TBuffer &b, const TClass *onfile_class) const;
00155 void StreamerTObjectEmulated(void *object, TBuffer &b, const TClass *onfile_class) const;
00156 void StreamerInstrumented(void *object, TBuffer &b, const TClass *onfile_class) const;
00157 void StreamerStreamerInfo(void *object, TBuffer &b, const TClass *onfile_class) const;
00158 void StreamerDefault(void *object, TBuffer &b, const TClass *onfile_class) const;
00159
00160 static IdMap_t *fgIdMap;
00161 static ENewType fgCallingNew;
00162 static Int_t fgClassCount;
00163
00164
00165 enum { kLoading = BIT(14) };
00166
00167 enum {kDefault=0, kEmulated=1, kTObject=2, kInstrumented=4, kForeign=8, kExternal=16};
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181 class TNameMapNode
00182 : public TObjString
00183 {
00184 public:
00185 TNameMapNode (const char* typedf, const char* orig);
00186 TString fOrigName;
00187 };
00188
00189
00190
00191
00192
00193
00194
00195 static THashTable* fgClassTypedefHash;
00196 static THashTable* fgClassShortTypedefHash;
00197
00198 private:
00199 TClass(const TClass& tc);
00200 TClass& operator=(const TClass&);
00201
00202 protected:
00203 TVirtualStreamerInfo *FindStreamerInfo(TObjArray* arr, UInt_t checksum) const;
00204 static THashTable *GetClassShortTypedefHash();
00205
00206 public:
00207 TClass();
00208 TClass(const char *name, Bool_t silent = kFALSE);
00209 TClass(const char *name, Version_t cversion,
00210 const char *dfil = 0, const char *ifil = 0,
00211 Int_t dl = 0, Int_t il = 0, Bool_t silent = kFALSE);
00212 TClass(const char *name, Version_t cversion,
00213 const type_info &info, TVirtualIsAProxy *isa,
00214 ShowMembersFunc_t showmember,
00215 const char *dfil, const char *ifil,
00216 Int_t dl, Int_t il, Bool_t silent = kFALSE);
00217 virtual ~TClass();
00218
00219 void AddInstance(Bool_t heap = kFALSE) { fInstanceCount++; if (heap) fOnHeap++; }
00220 void AddImplFile(const char *filename, int line);
00221 void AddRef(TClassRef *ref);
00222 static Bool_t AddRule(const char *rule);
00223 static Int_t ReadRules(const char *filename);
00224 static Int_t ReadRules();
00225 void AdoptSchemaRules( ROOT::TSchemaRuleSet *rules );
00226 virtual void Browse(TBrowser *b);
00227 void BuildRealData(void *pointer=0, Bool_t isTransient = kFALSE);
00228 void BuildEmulatedRealData(const char *name, Long_t offset, TClass *cl);
00229 void CalculateStreamerOffset() const;
00230 Bool_t CallShowMembers(void* obj, TMemberInspector &insp,
00231 Int_t isATObject = -1) const;
00232 Bool_t CanSplit() const;
00233 Bool_t CanIgnoreTObjectStreamer() { return TestBit(kIgnoreTObjectStreamer);}
00234 TObject *Clone(const char *newname="") const;
00235 void CopyCollectionProxy(const TVirtualCollectionProxy&);
00236 void Draw(Option_t *option="");
00237 void Dump() const { TDictionary::Dump(); }
00238 void Dump(void *obj) const;
00239 char *EscapeChars(const char *text) const;
00240 TVirtualStreamerInfo *FindStreamerInfo(UInt_t checksum) const;
00241 TVirtualStreamerInfo *GetConversionStreamerInfo( const char* onfile_classname, Int_t version ) const;
00242 TVirtualStreamerInfo *FindConversionStreamerInfo( const char* onfile_classname, UInt_t checksum ) const;
00243 TVirtualStreamerInfo *GetConversionStreamerInfo( const TClass* onfile_cl, Int_t version ) const;
00244 TVirtualStreamerInfo *FindConversionStreamerInfo( const TClass* onfile_cl, UInt_t checksum ) const;
00245 Bool_t HasDefaultConstructor() const;
00246 UInt_t GetCheckSum(UInt_t code=0) const;
00247 TVirtualCollectionProxy *GetCollectionProxy() const;
00248 TVirtualIsAProxy *GetIsAProxy() const;
00249 Version_t GetClassVersion() const { fVersionUsed = kTRUE; return fClassVersion; }
00250 TDataMember *GetDataMember(const char *datamember) const;
00251 Long_t GetDataMemberOffset(const char *membername) const;
00252 const char *GetDeclFileName() const { return fDeclFileName; }
00253 Short_t GetDeclFileLine() const { return fDeclFileLine; }
00254 ROOT::DelFunc_t GetDelete() const;
00255 ROOT::DesFunc_t GetDestructor() const;
00256 ROOT::DelArrFunc_t GetDeleteArray() const;
00257 ClassInfo_t *GetClassInfo() const { return fClassInfo; }
00258 const char *GetContextMenuTitle() const { return fContextMenuTitle; }
00259 TVirtualStreamerInfo *GetCurrentStreamerInfo() {
00260 if (fCurrentInfo) return fCurrentInfo;
00261 else return (fCurrentInfo=(TVirtualStreamerInfo*)(fStreamerInfo->At(fClassVersion)));
00262 }
00263 TList *GetListOfDataMembers();
00264 TList *GetListOfBases();
00265 TList *GetListOfMethods();
00266 TList *GetListOfRealData() const { return fRealData; }
00267 TList *GetListOfAllPublicMethods();
00268 TList *GetListOfAllPublicDataMembers();
00269 const char *GetImplFileName() const { return fImplFileName; }
00270 Short_t GetImplFileLine() const { return fImplFileLine; }
00271 TClass *GetActualClass(const void *object) const;
00272 TClass *GetBaseClass(const char *classname);
00273 TClass *GetBaseClass(const TClass *base);
00274 Int_t GetBaseClassOffset(const TClass *base);
00275 TClass *GetBaseDataMember(const char *datamember);
00276 ROOT::DirAutoAdd_t GetDirectoryAutoAdd() const;
00277 UInt_t GetInstanceCount() const { return fInstanceCount; }
00278 UInt_t GetHeapInstanceCount() const { return fOnHeap; }
00279 void GetMenuItems(TList *listitems);
00280 TList *GetMenuList() const;
00281 TMethod *GetMethod(const char *method, const char *params);
00282 TMethod *GetMethodWithPrototype(const char *method, const char *proto);
00283 TMethod *GetMethodAny(const char *method);
00284 TMethod *GetMethodAllAny(const char *method);
00285 Int_t GetNdata();
00286 ROOT::NewFunc_t GetNew() const;
00287 ROOT::NewArrFunc_t GetNewArray() const;
00288 Int_t GetNmethods();
00289 TRealData *GetRealData(const char *name) const;
00290 TVirtualRefProxy *GetReferenceProxy() const { return fRefProxy; }
00291 const ROOT::TSchemaRuleSet *GetSchemaRules() const;
00292 ROOT::TSchemaRuleSet *GetSchemaRules(Bool_t create = kFALSE);
00293 const char *GetSharedLibs();
00294 ShowMembersFunc_t GetShowMembersWrapper() const { return fShowMembers; }
00295 TClassStreamer *GetStreamer() const;
00296 ClassStreamerFunc_t GetStreamerFunc() const;
00297 TObjArray *GetStreamerInfos() const { return fStreamerInfo; }
00298 TVirtualStreamerInfo *GetStreamerInfo(Int_t version=0) const;
00299 const type_info *GetTypeInfo() const { return fTypeInfo; };
00300 void IgnoreTObjectStreamer(Bool_t ignore=kTRUE);
00301 Bool_t InheritsFrom(const char *cl) const;
00302 Bool_t InheritsFrom(const TClass *cl) const;
00303 void InterpretedShowMembers(void* obj, TMemberInspector &insp);
00304 Bool_t IsFolder() const { return kTRUE; }
00305 Bool_t IsLoaded() const;
00306 Bool_t IsForeign() const;
00307 Bool_t IsStartingWithTObject() const;
00308 Bool_t IsTObject() const;
00309 void ls(Option_t *opt="") const;
00310 void MakeCustomMenuList();
00311 void Move(void *arenaFrom, void *arenaTo) const;
00312 void *New(ENewType defConstructor = kClassNew) const;
00313 void *New(void *arena, ENewType defConstructor = kClassNew) const;
00314 void *NewArray(Long_t nElements, ENewType defConstructor = kClassNew) const;
00315 void *NewArray(Long_t nElements, void *arena, ENewType defConstructor = kClassNew) const;
00316 virtual void PostLoadCheck();
00317 Long_t Property() const;
00318 Int_t ReadBuffer(TBuffer &b, void *pointer, Int_t version, UInt_t start, UInt_t count);
00319 Int_t ReadBuffer(TBuffer &b, void *pointer);
00320 void RemoveRef(TClassRef *ref);
00321 void ReplaceWith(TClass *newcl, Bool_t recurse = kTRUE) const;
00322 void ResetClassInfo(Long_t tagnum);
00323 void ResetInstanceCount() { fInstanceCount = fOnHeap = 0; }
00324 void ResetMenuList();
00325 Int_t Size() const;
00326 void SetCollectionProxy(const ROOT::TCollectionProxyInfo&);
00327 void SetContextMenuTitle(const char *title);
00328 void SetCurrentStreamerInfo(TVirtualStreamerInfo *info);
00329 void SetGlobalIsA(IsAGlobalFunc_t);
00330 void SetDeclFile(const char *name, int line) { fDeclFileName = name; fDeclFileLine = line; }
00331 void SetDelete(ROOT::DelFunc_t deleteFunc);
00332 void SetDeleteArray(ROOT::DelArrFunc_t deleteArrayFunc);
00333 void SetDirectoryAutoAdd(ROOT::DirAutoAdd_t dirAutoAddFunc);
00334 void SetDestructor(ROOT::DesFunc_t destructorFunc);
00335 void SetImplFileName(const char *implFileName) { fImplFileName = implFileName; }
00336 void SetNew(ROOT::NewFunc_t newFunc);
00337 void SetNewArray(ROOT::NewArrFunc_t newArrayFunc);
00338 TVirtualStreamerInfo *SetStreamerInfo(Int_t version, const char *info="");
00339 void SetUnloaded();
00340 Int_t WriteBuffer(TBuffer &b, void *pointer, const char *info="");
00341
00342 void AdoptReferenceProxy(TVirtualRefProxy* proxy);
00343 void AdoptStreamer(TClassStreamer *strm);
00344 void AdoptMemberStreamer(const char *name, TMemberStreamer *strm);
00345 void SetMemberStreamer(const char *name, MemberStreamerFunc_t strm);
00346 void SetStreamerFunc(ClassStreamerFunc_t strm);
00347
00348
00349 static void AddClass(TClass *cl);
00350 static void RemoveClass(TClass *cl);
00351 static TClass *GetClass(const char *name, Bool_t load = kTRUE, Bool_t silent = kFALSE);
00352 static TClass *GetClass(const type_info &typeinfo, Bool_t load = kTRUE, Bool_t silent = kFALSE);
00353 static VoidFuncPtr_t GetDict (const char *cname);
00354 static VoidFuncPtr_t GetDict (const type_info &info);
00355
00356 static Int_t AutoBrowse(TObject *obj, TBrowser *browser);
00357 static ENewType IsCallingNew();
00358 static TClass *Load(TBuffer &b);
00359 void Store(TBuffer &b) const;
00360
00361
00362
00363
00364 Int_t Browse(void *obj, TBrowser *b) const;
00365 void DeleteArray(void *ary, Bool_t dtorOnly = kFALSE);
00366 void Destructor(void *obj, Bool_t dtorOnly = kFALSE);
00367 void *DynamicCast(const TClass *base, void *obj, Bool_t up = kTRUE);
00368 Bool_t IsFolder(void *obj) const;
00369 inline void Streamer(void *obj, TBuffer &b, const TClass *onfile_class = 0) const
00370 {
00371
00372 (this->*fStreamerImpl)(obj,b,onfile_class);
00373 }
00374
00375 ClassDef(TClass,0)
00376 };
00377
00378 namespace ROOT {
00379
00380 #ifndef R__NO_CLASS_TEMPLATE_SPECIALIZATION
00381 template <typename T> struct IsPointer { enum { kVal = 0 }; };
00382 template <typename T> struct IsPointer<T*> { enum { kVal = 1 }; };
00383 #else
00384 template <typename T> Bool_t IsPointer(const T* ) { return false; };
00385 template <typename T> Bool_t IsPointer(const T** ) { return true; };
00386 #endif
00387
00388 template <typename T> TClass* GetClass( T* ) { return TClass::GetClass(typeid(T)); }
00389 template <typename T> TClass* GetClass(const T* ) { return TClass::GetClass(typeid(T)); }
00390
00391 #ifndef R__NO_CLASS_TEMPLATE_SPECIALIZATION
00392
00393
00394 template <typename T> TClass* GetClass( T** ) { return GetClass((T*)0); }
00395 template <typename T> TClass* GetClass(const T** ) { return GetClass((T*)0); }
00396 template <typename T> TClass* GetClass( T* const* ) { return GetClass((T*)0); }
00397 template <typename T> TClass* GetClass(const T* const* ) { return GetClass((T*)0); }
00398 #endif
00399
00400 extern TClass *CreateClass(const char *cname, Version_t id,
00401 const char *dfil, const char *ifil,
00402 Int_t dl, Int_t il);
00403 }
00404
00405 #endif // ROOT_TClass