31 #include <unordered_set>
44 class TVirtualStreamerInfo;
45 class TVirtualCollectionProxy;
47 class TVirtualIsAProxy;
48 class TVirtualRefProxy;
50 class TListOfFunctions;
51 class TListOfFunctionTemplates;
52 class TListOfDataMembers;
54 class TViewPubFunctions;
55 class TViewPubDataMembers;
56 class TFunctionTemplate;
60 class TGenericClassInfo;
61 class TMapTypeToTClass;
62 class TMapDeclIdToTClass;
65 class TCollectionProxyInfo;
68 class TCheckHashRecursiveRemoveConsistency;
72 typedef ROOT::TMapTypeToTClass IdMap_t;
73 typedef ROOT::TMapDeclIdToTClass DeclIdMap_t;
75 class TClass :
public TDictionary {
78 friend void ROOT::ResetClassVersion(TClass*,
const char*, Short_t);
79 friend class ROOT::TGenericClassInfo;
80 friend class TProtoClass;
81 friend class ROOT::Internal::TCheckHashRecursiveRemoveConsistency;
86 kReservedLoading = BIT(7),
88 kClassSaved = BIT(12),
89 kHasLocalHashMember = BIT(14),
90 kIgnoreTObjectStreamer = BIT(15),
95 kIsEmulation = BIT(19),
96 kStartWithTObject = BIT(20),
98 kHasNameMapNode = BIT(22),
99 kHasCustomStreamerMember = BIT(23)
101 enum ENewType { kRealNew = 0, kClassNew, kDummyNew };
103 kCurrentCheckSum = 0,
105 kReflexNoComment = 2,
124 kLoaded = kHasTClassInit,
133 class TDeclNameRegistry {
138 TDeclNameRegistry(Int_t verbLevel=0);
139 void AddQualifiedName(
const char *name);
140 Bool_t HasDeclName(
const char *name)
const;
141 ~TDeclNameRegistry();
144 std::unordered_set<std::string> fClassNamesSet;
145 mutable std::atomic_flag fSpinLock;
148 class InsertTClassInRegistryRAII {
150 TClass::EState& fState;
152 TDeclNameRegistry& fNoInfoOrEmuOrFwdDeclNameRegistry;
154 InsertTClassInRegistryRAII(TClass::EState &state,
const char *name, TDeclNameRegistry &emuRegistry);
155 ~InsertTClassInRegistryRAII();
169 std::atomic<TClass**> fPersistentRef;
171 typedef std::atomic<std::map<std::string, TObjArray*>*> ConvSIMap_t;
173 mutable TObjArray *fStreamerInfo;
174 mutable ConvSIMap_t fConversionStreamerInfo;
176 std::atomic<TList*> fBase;
177 TListOfDataMembers *fData;
179 std::atomic<TListOfEnums*> fEnums;
180 TListOfFunctionTemplates *fFuncTemplate;
181 std::atomic<TListOfFunctions*> fMethod;
183 TViewPubDataMembers*fAllPubData;
184 TViewPubFunctions *fAllPubMethod;
185 mutable TList *fClassMenuList;
187 const char *fDeclFileName;
188 const char *fImplFileName;
189 Short_t fDeclFileLine;
190 Short_t fImplFileLine;
191 UInt_t fInstanceCount;
193 mutable std::atomic<UInt_t> fCheckSum;
194 TVirtualCollectionProxy *fCollectionProxy;
195 Version_t fClassVersion;
196 ClassInfo_t *fClassInfo;
197 TString fContextMenuTitle;
198 const std::type_info *fTypeInfo;
199 ShowMembersFunc_t fShowMembers;
200 TClassStreamer *fStreamer;
203 TVirtualIsAProxy *fIsA;
204 IsAGlobalFunc_t fGlobalIsA;
205 mutable std::atomic<TMethodCall*> fIsAMethod;
207 ROOT::MergeFunc_t fMerge;
208 ROOT::ResetAfterMergeFunc_t fResetAfterMerge;
209 ROOT::NewFunc_t fNew;
210 ROOT::NewArrFunc_t fNewArray;
211 ROOT::DelFunc_t fDelete;
212 ROOT::DelArrFunc_t fDeleteArray;
213 ROOT::DesFunc_t fDestructor;
214 ROOT::DirAutoAdd_t fDirAutoAdd;
215 ClassStreamerFunc_t fStreamerFunc;
216 ClassConvStreamerFunc_t fConvStreamerFunc;
220 mutable std::atomic<Long_t> fProperty;
221 mutable Long_t fClassProperty;
224 std::atomic<Bool_t> fHasRootPcmInfo;
225 mutable std::atomic<Bool_t> fCanLoadClassInfo;
226 mutable std::atomic<Bool_t> fIsOffsetStreamerSet;
227 mutable std::atomic<Bool_t> fVersionUsed;
229 enum class ERuntimeProperties : UChar_t {
233 kConsistentHash = BIT(1)
235 friend bool operator&(UChar_t l, ERuntimeProperties r) {
236 return l &
static_cast<UChar_t
>(r);
238 mutable std::atomic<UChar_t> fRuntimeProperties;
240 mutable Long_t fOffsetStreamer;
243 mutable std::atomic<TVirtualStreamerInfo*> fCurrentInfo;
244 mutable std::atomic<TVirtualStreamerInfo*> fLastReadInfo;
245 TVirtualRefProxy *fRefProxy;
246 ROOT::Detail::TSchemaRuleSet *fSchemaRules;
248 typedef void (*StreamerImpl_t)(
const TClass* pThis,
void *obj, TBuffer &b,
const TClass *onfile_class);
249 #ifdef R__NO_ATOMIC_FUNCTION_POINTER
250 mutable StreamerImpl_t fStreamerImpl;
252 mutable std::atomic<StreamerImpl_t> fStreamerImpl;
255 Bool_t CanSplitBaseAllow();
256 TListOfFunctions *GetMethodList();
257 TMethod *GetClassMethod(Long_t faddr);
258 TMethod *FindClassOrBaseMethodWithId(DeclId_t faddr);
259 Int_t GetBaseClassOffsetRecurse(
const TClass *toBase);
260 void Init(
const char *name, Version_t cversion,
const std::type_info *info,
261 TVirtualIsAProxy *isa,
262 const char *dfil,
const char *ifil,
264 ClassInfo_t *classInfo,
266 void ForceReload (TClass* oldcl);
267 void LoadClassInfo()
const;
269 static TClass *LoadClassDefault(
const char *requestedname, Bool_t silent);
270 static TClass *LoadClassCustom(
const char *requestedname, Bool_t silent);
272 void SetClassVersion(Version_t version);
273 void SetClassSize(Int_t sizof) { fSizeof = sizof; }
274 TVirtualStreamerInfo* DetermineCurrentStreamerInfo();
276 void SetStreamerImpl();
278 void SetRuntimeProperties();
281 static void StreamerExternal(
const TClass* pThis,
void *
object, TBuffer &b,
const TClass *onfile_class);
282 static void StreamerTObject(
const TClass* pThis,
void *
object, TBuffer &b,
const TClass *onfile_class);
283 static void StreamerTObjectInitialized(
const TClass* pThis,
void *
object, TBuffer &b,
const TClass *onfile_class);
284 static void StreamerTObjectEmulated(
const TClass* pThis,
void *
object, TBuffer &b,
const TClass *onfile_class);
285 static void StreamerInstrumented(
const TClass* pThis,
void *
object, TBuffer &b,
const TClass *onfile_class);
286 static void ConvStreamerInstrumented(
const TClass* pThis,
void *
object, TBuffer &b,
const TClass *onfile_class);
287 static void StreamerStreamerInfo(
const TClass* pThis,
void *
object, TBuffer &b,
const TClass *onfile_class);
288 static void StreamerDefault(
const TClass* pThis,
void *
object, TBuffer &b,
const TClass *onfile_class);
290 static IdMap_t *GetIdMap();
291 static DeclIdMap_t *GetDeclIdMap();
292 static std::atomic<Int_t> fgClassCount;
294 static TDeclNameRegistry fNoInfoOrEmuOrFwdDeclNameRegistry;
295 static Bool_t HasNoInfoOrEmuOrFwdDeclaredDecl(
const char*);
298 enum { kLoading = kReservedLoading, kUnloading = kReservedLoading };
300 enum EStreamerType {kDefault=0, kEmulatedStreamer=1, kTObject=2, kInstrumented=4, kForeign=8, kExternal=16};
314 class TNameMapNode :
public TObjString
317 TNameMapNode (
const char* typedf,
const char* orig);
323 static THashTable* fgClassTypedefHash;
326 TClass(
const TClass& tc) =
delete;
327 TClass& operator=(
const TClass&) =
delete;
330 TVirtualStreamerInfo *FindStreamerInfo(TObjArray *arr, UInt_t checksum)
const;
331 void GetMissingDictionariesForBaseClasses(TCollection &result, TCollection &visited,
bool recurse);
332 void GetMissingDictionariesForMembers(TCollection &result, TCollection &visited,
bool recurse);
333 void GetMissingDictionariesWithRecursionCheck(TCollection &result, TCollection &visited,
bool recurse);
334 void GetMissingDictionariesForPairElements(TCollection &result, TCollection &visited,
bool recurse);
338 TClass(
const char *name, Bool_t silent = kFALSE);
339 TClass(
const char *name, Version_t cversion, Bool_t silent = kFALSE);
340 TClass(
const char *name, Version_t cversion, EState theState, Bool_t silent = kFALSE);
341 TClass(ClassInfo_t *info, Version_t cversion,
342 const char *dfil,
const char *ifil = 0,
343 Int_t dl = 0, Int_t il = 0, Bool_t silent = kFALSE);
344 TClass(
const char *name, Version_t cversion,
345 const char *dfil,
const char *ifil = 0,
346 Int_t dl = 0, Int_t il = 0, Bool_t silent = kFALSE);
347 TClass(
const char *name, Version_t cversion,
348 const std::type_info &info, TVirtualIsAProxy *isa,
349 const char *dfil,
const char *ifil,
350 Int_t dl, Int_t il, Bool_t silent = kFALSE);
353 void AddInstance(Bool_t heap = kFALSE) { fInstanceCount++;
if (heap) fOnHeap++; }
354 void AddImplFile(
const char *filename,
int line);
355 static Bool_t AddRule(
const char *rule);
356 static Int_t ReadRules(
const char *filename);
357 static Int_t ReadRules();
358 void AdoptSchemaRules( ROOT::Detail::TSchemaRuleSet *rules );
359 virtual void Browse(TBrowser *b);
360 void BuildRealData(
void *pointer=0, Bool_t isTransient = kFALSE);
361 void BuildEmulatedRealData(
const char *name, Long_t offset, TClass *cl);
362 void CalculateStreamerOffset()
const;
363 Bool_t CallShowMembers(
const void* obj, TMemberInspector &insp, Bool_t isTransient = kFALSE)
const;
364 Bool_t CanSplit()
const;
365 Bool_t CanIgnoreTObjectStreamer() {
return TestBit(kIgnoreTObjectStreamer);}
366 Long_t ClassProperty()
const;
367 TObject *Clone(
const char *newname=
"")
const;
368 void CopyCollectionProxy(
const TVirtualCollectionProxy&);
369 void Draw(Option_t *option=
"");
370 void Dump()
const { TDictionary::Dump(); }
371 void Dump(
const void *obj, Bool_t noAddr = kFALSE)
const;
372 char *EscapeChars(
const char *text)
const;
373 TVirtualStreamerInfo *FindStreamerInfo(UInt_t checksum)
const;
374 TVirtualStreamerInfo *GetConversionStreamerInfo(
const char* onfile_classname, Int_t version )
const;
375 TVirtualStreamerInfo *FindConversionStreamerInfo(
const char* onfile_classname, UInt_t checksum )
const;
376 TVirtualStreamerInfo *GetConversionStreamerInfo(
const TClass* onfile_cl, Int_t version )
const;
377 TVirtualStreamerInfo *FindConversionStreamerInfo(
const TClass* onfile_cl, UInt_t checksum )
const;
378 Bool_t HasDataMemberInfo()
const {
return fHasRootPcmInfo || HasInterpreterInfo(); }
379 Bool_t HasDefaultConstructor()
const;
380 Bool_t HasInterpreterInfoInMemory()
const {
return 0 != fClassInfo; }
381 Bool_t HasInterpreterInfo()
const {
return fCanLoadClassInfo || fClassInfo; }
382 UInt_t GetCheckSum(ECheckSum code = kCurrentCheckSum)
const;
383 UInt_t GetCheckSum(Bool_t &isvalid)
const;
384 UInt_t GetCheckSum(ECheckSum code, Bool_t &isvalid)
const;
385 TVirtualCollectionProxy *GetCollectionProxy()
const;
386 TVirtualIsAProxy *GetIsAProxy()
const;
387 TMethod *GetClassMethod(
const char *name,
const char *params, Bool_t objectIsConst = kFALSE);
388 TMethod *GetClassMethodWithPrototype(
const char *name,
const char *proto,
389 Bool_t objectIsConst = kFALSE,
390 ROOT::EFunctionMatchMode mode = ROOT::kConversionMatch);
391 Version_t GetClassVersion()
const { fVersionUsed = kTRUE;
return fClassVersion; }
392 Int_t GetClassSize()
const {
return Size(); }
393 TDataMember *GetDataMember(
const char *datamember)
const;
394 Long_t GetDataMemberOffset(
const char *membername)
const;
395 const char *GetDeclFileName()
const;
396 Short_t GetDeclFileLine()
const {
return fDeclFileLine; }
397 ROOT::DelFunc_t GetDelete()
const;
398 ROOT::DesFunc_t GetDestructor()
const;
399 ROOT::DelArrFunc_t GetDeleteArray()
const;
400 ClassInfo_t *GetClassInfo()
const {
401 if (fCanLoadClassInfo && !TestBit(kLoading))
405 const char *GetContextMenuTitle()
const {
return fContextMenuTitle; }
406 TVirtualStreamerInfo *GetCurrentStreamerInfo() {
407 if (fCurrentInfo.load())
return fCurrentInfo;
408 else return DetermineCurrentStreamerInfo();
410 TVirtualStreamerInfo *GetLastReadInfo()
const {
return fLastReadInfo; }
411 void SetLastReadInfo(TVirtualStreamerInfo *info) { fLastReadInfo = info; }
412 TList *GetListOfDataMembers(Bool_t load = kTRUE);
413 TList *GetListOfEnums(Bool_t load = kTRUE);
414 TList *GetListOfFunctionTemplates(Bool_t load = kTRUE);
415 TList *GetListOfBases();
416 TList *GetListOfMethods(Bool_t load = kTRUE);
417 TCollection *GetListOfMethodOverloads(
const char* name)
const;
418 TList *GetListOfRealData()
const {
return fRealData; }
419 const TList *GetListOfAllPublicMethods(Bool_t load = kTRUE);
420 TList *GetListOfAllPublicDataMembers(Bool_t load = kTRUE);
421 const char *GetImplFileName()
const {
return fImplFileName; }
422 Short_t GetImplFileLine()
const {
return fImplFileLine; }
423 TClass *GetActualClass(
const void *
object)
const;
424 TClass *GetBaseClass(
const char *classname);
425 TClass *GetBaseClass(
const TClass *base);
426 Int_t GetBaseClassOffset(
const TClass *toBase,
void *address = 0,
bool isDerivedObject =
true);
427 TClass *GetBaseDataMember(
const char *datamember);
428 ROOT::ESTLType GetCollectionType()
const;
429 ROOT::DirAutoAdd_t GetDirectoryAutoAdd()
const;
430 TFunctionTemplate *GetFunctionTemplate(
const char *name);
431 UInt_t GetInstanceCount()
const {
return fInstanceCount; }
432 UInt_t GetHeapInstanceCount()
const {
return fOnHeap; }
433 void GetMenuItems(TList *listitems);
434 TList *GetMenuList()
const;
435 TMethod *GetMethod(
const char *method,
const char *params, Bool_t objectIsConst = kFALSE);
436 TMethod *GetMethodWithPrototype(
const char *method,
const char *proto, Bool_t objectIsConst = kFALSE,
437 ROOT::EFunctionMatchMode mode = ROOT::kConversionMatch);
438 TMethod *GetMethodAny(
const char *method);
439 TMethod *GetMethodAllAny(
const char *method);
441 ROOT::MergeFunc_t GetMerge()
const;
442 ROOT::ResetAfterMergeFunc_t GetResetAfterMerge()
const;
443 ROOT::NewFunc_t GetNew()
const;
444 ROOT::NewArrFunc_t GetNewArray()
const;
446 TClass *
const*GetPersistentRef()
const {
return fPersistentRef; }
447 TRealData *GetRealData(
const char *name)
const;
448 TVirtualRefProxy *GetReferenceProxy()
const {
return fRefProxy; }
449 const ROOT::Detail::TSchemaRuleSet *GetSchemaRules()
const;
450 ROOT::Detail::TSchemaRuleSet *GetSchemaRules(Bool_t create = kFALSE);
451 const char *GetSharedLibs();
452 ShowMembersFunc_t GetShowMembersWrapper()
const {
return fShowMembers; }
453 EState GetState()
const {
return fState; }
454 TClassStreamer *GetStreamer()
const;
455 ClassStreamerFunc_t GetStreamerFunc()
const;
456 ClassConvStreamerFunc_t GetConvStreamerFunc()
const;
457 const TObjArray *GetStreamerInfos()
const {
return fStreamerInfo; }
458 TVirtualStreamerInfo *GetStreamerInfo(Int_t version=0)
const;
459 TVirtualStreamerInfo *GetStreamerInfoAbstractEmulated(Int_t version=0)
const;
460 TVirtualStreamerInfo *FindStreamerInfoAbstractEmulated(UInt_t checksum)
const;
461 const std::type_info *GetTypeInfo()
const {
return fTypeInfo; };
466 Bool_t HasConsistentHashMember()
468 if (!fRuntimeProperties)
469 SetRuntimeProperties();
470 return fRuntimeProperties.load() & ERuntimeProperties::kConsistentHash;
472 Bool_t HasDictionary()
const;
473 static Bool_t HasDictionarySelection(
const char* clname);
474 Bool_t HasLocalHashMember()
const;
475 void GetMissingDictionaries(THashTable& result,
bool recurse =
false);
476 void IgnoreTObjectStreamer(Bool_t ignore=kTRUE);
477 Bool_t InheritsFrom(
const char *cl)
const;
478 Bool_t InheritsFrom(
const TClass *cl)
const;
479 void InterpretedShowMembers(
void* obj, TMemberInspector &insp, Bool_t isTransient);
480 Bool_t IsFolder()
const {
return kTRUE; }
481 Bool_t IsLoaded()
const;
482 Bool_t IsForeign()
const;
483 Bool_t IsStartingWithTObject()
const;
484 Bool_t IsVersioned()
const {
return !( GetClassVersion()<=1 && IsForeign() ); }
485 Bool_t IsTObject()
const;
486 static TClass *LoadClass(
const char *requestedname, Bool_t silent);
487 void ls(Option_t *opt=
"")
const;
488 void MakeCustomMenuList();
489 Bool_t MatchLegacyCheckSum(UInt_t checksum)
const;
490 void Move(
void *arenaFrom,
void *arenaTo)
const;
491 void *New(ENewType defConstructor = kClassNew, Bool_t quiet = kFALSE)
const;
492 void *New(
void *arena, ENewType defConstructor = kClassNew)
const;
493 void *NewArray(Long_t nElements, ENewType defConstructor = kClassNew)
const;
494 void *NewArray(Long_t nElements,
void *arena, ENewType defConstructor = kClassNew)
const;
495 virtual void PostLoadCheck();
496 Long_t Property()
const;
497 Int_t ReadBuffer(TBuffer &b,
void *pointer, Int_t version, UInt_t start, UInt_t count);
498 Int_t ReadBuffer(TBuffer &b,
void *pointer);
499 void RegisterStreamerInfo(TVirtualStreamerInfo *info);
500 void RemoveStreamerInfo(Int_t slot);
501 void ReplaceWith(TClass *newcl)
const;
503 void ResetClassInfo(Long_t tagnum);
504 void ResetClassInfo();
505 void ResetInstanceCount() { fInstanceCount = fOnHeap = 0; }
506 void ResetMenuList();
508 void SetCanSplit(Int_t splitmode);
509 void SetCollectionProxy(
const ROOT::Detail::TCollectionProxyInfo&);
510 void SetContextMenuTitle(
const char *title);
511 void SetCurrentStreamerInfo(TVirtualStreamerInfo *info);
512 void SetGlobalIsA(IsAGlobalFunc_t);
513 void SetDeclFile(
const char *name,
int line) { fDeclFileName = name; fDeclFileLine = line; }
514 void SetDelete(ROOT::DelFunc_t deleteFunc);
515 void SetDeleteArray(ROOT::DelArrFunc_t deleteArrayFunc);
516 void SetDirectoryAutoAdd(ROOT::DirAutoAdd_t dirAutoAddFunc);
517 void SetDestructor(ROOT::DesFunc_t destructorFunc);
518 void SetImplFileName(
const char *implFileName) { fImplFileName = implFileName; }
519 void SetMerge(ROOT::MergeFunc_t mergeFunc);
520 void SetResetAfterMerge(ROOT::ResetAfterMergeFunc_t resetFunc);
521 void SetNew(ROOT::NewFunc_t newFunc);
522 void SetNewArray(ROOT::NewArrFunc_t newArrayFunc);
523 TVirtualStreamerInfo *SetStreamerInfo(Int_t version,
const char *info=
"");
525 Int_t WriteBuffer(TBuffer &b,
void *pointer,
const char *info=
"");
527 void AdoptReferenceProxy(TVirtualRefProxy* proxy);
528 void AdoptStreamer(TClassStreamer *strm);
529 void AdoptMemberStreamer(
const char *name, TMemberStreamer *strm);
530 void SetMemberStreamer(
const char *name, MemberStreamerFunc_t strm);
531 void SetStreamerFunc(ClassStreamerFunc_t strm);
532 void SetConvStreamerFunc(ClassConvStreamerFunc_t strm);
535 static void AddClass(TClass *cl);
536 static void AddClassToDeclIdMap(TDictionary::DeclId_t
id, TClass* cl);
537 static void RemoveClass(TClass *cl);
538 static void RemoveClassDeclId(TDictionary::DeclId_t
id);
539 static TClass *GetClass(
const char *name, Bool_t load = kTRUE, Bool_t silent = kFALSE);
540 static TClass *GetClass(
const std::type_info &typeinfo, Bool_t load = kTRUE, Bool_t silent = kFALSE);
541 static TClass *GetClass(ClassInfo_t *info, Bool_t load = kTRUE, Bool_t silent = kFALSE);
543 static TClass *GetClass(Bool_t load = kTRUE, Bool_t silent = kFALSE);
544 static Bool_t GetClass(DeclId_t
id, std::vector<TClass*> &classes);
545 static DictFuncPtr_t GetDict (
const char *cname);
546 static DictFuncPtr_t GetDict (
const std::type_info &info);
548 static Int_t AutoBrowse(TObject *obj, TBrowser *browser);
549 static ENewType IsCallingNew();
550 static TClass *Load(TBuffer &b);
551 void Store(TBuffer &b)
const;
556 Int_t Browse(
void *obj, TBrowser *b)
const;
557 void DeleteArray(
void *ary, Bool_t dtorOnly = kFALSE);
558 void Destructor(
void *obj, Bool_t dtorOnly = kFALSE);
559 void *DynamicCast(
const TClass *base,
void *obj, Bool_t up = kTRUE);
560 const void *DynamicCast(
const TClass *base,
const void *obj, Bool_t up = kTRUE);
561 Bool_t IsFolder(
void *obj)
const;
563 inline void Streamer(
void *obj, TBuffer &b,
const TClass *onfile_class = 0)
const
566 #ifdef R__NO_ATOMIC_FUNCTION_POINTER
567 fStreamerImpl(
this,obj,b,onfile_class);
569 auto t = fStreamerImpl.load();
570 t(
this,obj,b,onfile_class);
579 template <
typename T>
580 TClass *GetClassHelper(Bool_t, Bool_t, std::true_type)
585 template <
typename T>
586 TClass *GetClassHelper(Bool_t load, Bool_t silent, std::false_type)
588 return TClass::GetClass(
typeid(T), load, silent);
594 template <
typename T>
595 TClass *TClass::GetClass(Bool_t load, Bool_t silent)
597 typename std::is_base_of<TObject, T>::type tag;
598 return ROOT::Internal::GetClassHelper<T>(load, silent, tag);
603 template <
typename T> TClass *GetClass(T * ) {
return TClass::GetClass<T>(); }
604 template <
typename T> TClass *GetClass(
const T * ) {
return TClass::GetClass<T>(); }
606 #ifndef R__NO_CLASS_TEMPLATE_SPECIALIZATION
608 template <
typename T> TClass* GetClass( T** ) {
return TClass::GetClass<T>(); }
609 template <
typename T> TClass* GetClass(
const T** ) {
return TClass::GetClass<T>(); }
610 template <
typename T> TClass* GetClass( T*
const* ) {
return TClass::GetClass<T>(); }
611 template <
typename T> TClass* GetClass(
const T*
const* ) {
return TClass::GetClass<T>(); }
614 extern TClass *CreateClass(
const char *cname, Version_t
id,
615 const char *dfil,
const char *ifil,
619 #endif // ROOT_TClass