Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches
TGenericClassInfo.cxx
Go to the documentation of this file.
1// @(#)root/meta:$Id$
2// Author: Philippe Canal 08/05/2002
3
4/*************************************************************************
5 * Copyright (C) 1995-2002, Rene Brun, Fons Rademakers and al. *
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#include "TROOT.h"
13#include "TClass.h"
14#include "TClassEdit.h"
15#include "TDictAttributeMap.h"
17#include "TStreamer.h"
18#include "TVirtualIsAProxy.h"
21#include "TSchemaRule.h"
22#include "TSchemaRuleSet.h"
23#include "TError.h"
24#include "TVirtualMutex.h"
25#include "TInterpreter.h"
26#include "TClassTable.h"
27
28namespace ROOT {
29namespace Internal {
30
31 std::string GetDemangledTypeName(const std::type_info &t)
32 {
33 int status = 0;
34 char *name = TClassEdit::DemangleName(t.name(), status);
35
36 if (!name || status != 0)
37 return "";
38
39 std::string ret;
41 free(name);
42 return ret;
43 }
44
45 const TInitBehavior *DefineBehavior(void * /*parent_type*/,
46 void * /*actual_type*/)
47 {
48
49 // This function loads the default behavior for the
50 // loading of classes.
51
52 static TDefaultInitBehavior theDefault;
53 return &theDefault;
54 }
55
57 NewFunc_t New, NewArrFunc_t NewArray,
58 DelFunc_t Delete, DelArrFunc_t DeleteArray,
59 DesFunc_t Destruct) {
61 R__instance.SetNew(New);
62 R__instance.SetNewArray(NewArray);
63 R__instance.SetDelete(Delete);
64 R__instance.SetDeleteArray(DeleteArray);
65 R__instance.SetDestructor(Destruct);
66 R__instance.SetImplFile("", -1);
67 }
68
69 void TCDGIILIBase::SetName(const std::string& name,
70 std::string& nameMember) {
72 if (nameMember.empty()) {
74 }
75 }
76
78 if (!isA.load()) {
80 dictfun();
81 }
82 }
83} // Internal
84
85TGenericClassInfo::TGenericClassInfo(const char *fullClassname, const char *declFileName, Int_t declFileLine,
86 const std::type_info &info, const Internal::TInitBehavior *action,
87 DictFuncPtr_t dictionary, TVirtualIsAProxy *isa, Int_t pragmabits, Int_t sizof,
88 std::size_t alignof_)
89 : fAction(action),
90 fClass(nullptr),
91 fClassName(fullClassname),
92 fDeclFileName(declFileName),
93 fDeclFileLine(declFileLine),
94 fDictionary(dictionary),
95 fInfo(info),
96 fImplFileName(nullptr),
98 fIsA(isa),
99 fVersion(1),
100 fMerge(nullptr),
101 fResetAfterMerge(nullptr),
102 fNew(nullptr),
103 fNewArray(nullptr),
104 fDelete(nullptr),
105 fDeleteArray(nullptr),
106 fDestructor(nullptr),
107 fDirAutoAdd(nullptr),
108 fStreamer(nullptr),
109 fStreamerFunc(nullptr),
110 fConvStreamerFunc(nullptr),
111 fCollectionProxy(nullptr),
112 fSizeof(sizof),
113 fAlignment(alignof_),
114 fPragmaBits(pragmabits),
115 fCollectionProxyInfo(nullptr),
117{
118 // Constructor.
119
120 Init(pragmabits);
121}
122
123TGenericClassInfo::TGenericClassInfo(const char *fullClassname, Int_t version, const char *declFileName,
124 Int_t declFileLine, const std::type_info &info,
125 const Internal::TInitBehavior *action, DictFuncPtr_t dictionary,
126 TVirtualIsAProxy *isa, Int_t pragmabits, Int_t sizof, std::size_t alignof_)
127 : fAction(action),
128 fClass(nullptr),
129 fClassName(fullClassname),
130 fDeclFileName(declFileName),
131 fDeclFileLine(declFileLine),
132 fDictionary(dictionary),
133 fInfo(info),
134 fImplFileName(nullptr),
135 fImplFileLine(0),
136 fIsA(isa),
137 fVersion(version),
138 fMerge(nullptr),
139 fResetAfterMerge(nullptr),
140 fNew(nullptr),
141 fNewArray(nullptr),
142 fDelete(nullptr),
143 fDeleteArray(nullptr),
144 fDestructor(nullptr),
145 fDirAutoAdd(nullptr),
146 fStreamer(nullptr),
147 fStreamerFunc(nullptr),
148 fConvStreamerFunc(nullptr),
149 fCollectionProxy(nullptr),
150 fSizeof(sizof),
151 fAlignment(alignof_),
152 fPragmaBits(pragmabits),
153 fCollectionProxyInfo(nullptr),
155
156{
157 // Constructor with version number and no showmembers.
158
159 Init(pragmabits);
160}
161
162 class TForNamespace {}; // Dummy class to give a typeid to namespace (See also TClassTable.cc)
163
164 TGenericClassInfo::TGenericClassInfo(const char *fullClassname, Int_t version, const char *declFileName,
165 Int_t declFileLine, const Internal::TInitBehavior *action,
166 DictFuncPtr_t dictionary, Int_t pragmabits)
167 : fAction(action),
168 fClass(nullptr),
169 fClassName(fullClassname),
170 fDeclFileName(declFileName),
171 fDeclFileLine(declFileLine),
172 fDictionary(dictionary),
173 fInfo(typeid(TForNamespace)),
174 fImplFileName(nullptr),
175 fImplFileLine(0),
176 fIsA(nullptr),
177 fVersion(version),
178 fMerge(nullptr),
179 fResetAfterMerge(nullptr),
180 fNew(nullptr),
181 fNewArray(nullptr),
182 fDelete(nullptr),
183 fDeleteArray(nullptr),
184 fDestructor(nullptr),
185 fDirAutoAdd(nullptr),
186 fStreamer(nullptr),
187 fStreamerFunc(nullptr),
188 fConvStreamerFunc(nullptr),
189 fCollectionProxy(nullptr),
190 fSizeof(0),
191 fAlignment(0),
192 fPragmaBits(pragmabits),
193 fCollectionProxyInfo(nullptr),
195
196 {
197 // Constructor for namespace
198
199 Init(pragmabits);
200 }
201
202 /* TGenericClassInfo::TGenericClassInfo(const TGenericClassInfo& gci) :
203 fAction(gci.fAction),
204 fClass(gci.fClass),
205 fClassName(gci.fClassName),
206 fDeclFileName(gci.fDeclFileName),
207 fDeclFileLine(gci.fDeclFileLine),
208 fDictionary(gci.fDictionary),
209 fInfo(gci.fInfo),
210 fImplFileName(gci.fImplFileName),
211 fImplFileLine(gci.fImplFileLine),
212 fIsA(gci.fIsA),
213 fVersion(gci.fVersion),
214 fNew(gci.fNew),
215 fNewArray(gci.fNewArray),
216 fDelete(gci.fDelete),
217 fDeleteArray(gci.fDeleteArray),
218 fDestructor(gci.fDestructor),
219 fStreamer(gci.fStreamer),
220 fCollectionProxy(gci.fCollectionProxy),
221 fSizeof(gci.fSizeof)
222 { }
223
224 TGenericClassInfo& TGenericClassInfo::operator=(const TGenericClassInfo& gci)
225 {
226 if(this!=&gci) {
227 fAction=gci.fAction;
228 fClass=gci.fClass;
229 fClassName=gci.fClassName;
230 fDeclFileName=gci.fDeclFileName;
231 fDeclFileLine=gci.fDeclFileLine;
232 fDictionary=gci.fDictionary;
233 fInfo=gci.fInfo;
234 fImplFileName=gci.fImplFileName;
235 fImplFileLine=gci.fImplFileLine;
236 fIsA=gci.fIsA;
237 fVersion=gci.fVersion;
238 fNew=gci.fNew;
239 fNewArray=gci.fNewArray;
240 fDelete=gci.fDelete;
241 fDeleteArray=gci.fDeleteArray;
242 fDestructor=gci.fDestructor;
243 fStreamer=gci.fStreamer;
244 fCollectionProxy=gci.fCollectionProxy;
245 fSizeof=gci.fSizeof;
246 } return *this;
247 }
248 */
249
251 {
252 // Initilization routine.
253
254 //TVirtualStreamerInfo::Class_Version MUST be the same as TStreamerInfo::Class_Version
256 if (!fAction) return;
258 fVersion,
259 fInfo, // typeid(RootClass),
261 pragmabits);
262 }
263
265 {
266 // Destructor.
267
270 delete fStreamer;
271 if (!fClass)
272 delete fIsA; // fIsA is adopted by the class if any.
273 fIsA = nullptr;
275 if (!gROOTLocal || !gROOTLocal->Initialized() || !gROOTLocal->GetListOfClasses())
276 return;
277 for(auto alt : fAlternate)
279 if (fAction)
281 }
282
284 {
285 // Return the creator action.
286
287 return *fAction;
288 }
289
291 {
292 // Generate and return the TClass object.
293
294 // First make sure that TROOT is initialized, do this before checking
295 // for fClass. If the request is for the TClass of TObject and TROOT
296 // is not initialized, the TROOT creation (because of the ROOT pcm files)
297 // will lead to its own request of the TClass for TObject and thus
298 // upon returning, the TClass for TObject will have already been created
299 // and fClass will have been set.
300 if (!gROOT)
301 ::Fatal("TClass::TClass", "ROOT system not initialized");
302
303 if (gROOT->TestBit(kInvalidObject)) {
304 if (gDebug > 1)
305 ::Warning("TClass::TClass", "ROOT system is being torn down");
306 // We are at the end of time, let's do the minimum, silently.
307 return new TClass(GetClassName(), true);
308 }
309
310 if (!fClass && fAction) {
312 // Check again, while we waited for the lock, something else might
313 // have set fClass.
314 if (fClass) return fClass;
315
317 GetVersion(),
318 GetInfo(),
319 GetIsA(),
325 fClass->fHasCustomStreamerMember = true;
326 }
327 fClass->SetNew(fNew);
328 fClass->SetNewArray(fNewArray);
329 fClass->SetDelete(fDelete);
330 fClass->SetDeleteArray(fDeleteArray);
331 fClass->SetDestructor(fDestructor);
332 fClass->SetDirectoryAutoAdd(fDirAutoAdd);
333 fClass->SetStreamerFunc(fStreamerFunc);
334 fClass->SetConvStreamerFunc(fConvStreamerFunc);
335 fClass->SetMerge(fMerge);
336 fClass->SetResetAfterMerge(fResetAfterMerge);
337 fClass->AdoptStreamer(fStreamer);
338 fStreamer = nullptr;
339 for (const auto &[name, strm] : fAdoptedMemberStreamers)
340 fClass->AdoptMemberStreamer(name.c_str(), strm);
342 // If IsZombie is true, something went wrong and we will not be
343 // able to properly copy the collection proxy
344 if (!fClass->IsZombie()) {
345 if (fCollectionProxy) fClass->CopyCollectionProxy(*fCollectionProxy);
346 else if (fCollectionProxyInfo) {
347 fClass->SetCollectionProxy(*fCollectionProxyInfo);
348 }
349 }
350 fClass->SetClassSize(fSizeof);
351 fClass->SetClassAlignment(fAlignment);
352
353 //---------------------------------------------------------------------
354 // Attach the schema evolution information
355 ///////////////////////////////////////////////////////////////////////
356
357 CreateRuleSet( fReadRules, true );
359
361 fClass->CreateAttributeMap();
362 // The force-split and force-unsplit flags are mutually exclusive
366 fClass->GetAttributeMap()->AddProperty("rntuple.streamerMode", "false");
368 fClass->GetAttributeMap()->AddProperty("rntuple.streamerMode", "true");
369 }
370 }
371
372 if (!fRNTupleSoARecord.empty()) {
373 fClass->CreateAttributeMap();
374 fClass->GetAttributeMap()->AddProperty("rntuple.SoARecord", fRNTupleSoARecord.c_str());
375 }
376 }
377 return fClass;
378 }
379
380 /////////////////////////////////////////////////////////////////////////////
381 /// Attach the schema evolution information to TClassObject
382
383 void TGenericClassInfo::CreateRuleSet( std::vector<Internal::TSchemaHelper>& vect,
384 Bool_t ProcessReadRules )
385 {
386 if ( vect.empty() ) {
387 return;
388 }
389
390 //------------------------------------------------------------------------
391 // Get the rules set
392 //////////////////////////////////////////////////////////////////////////
393
394 TSchemaRuleSet* rset = fClass->GetSchemaRules( kTRUE );
395
396 //------------------------------------------------------------------------
397 // Process the rules
398 //////////////////////////////////////////////////////////////////////////
399
400 TSchemaRule* rule;
401 TString errmsg;
402 std::vector<Internal::TSchemaHelper>::iterator it;
403 for( it = vect.begin(); it != vect.end(); ++it ) {
404 rule = new TSchemaRule(ProcessReadRules ? TSchemaRule::kReadRule : TSchemaRule::kReadRawRule,
405 fClass->GetName(), *it);
406
407 if (!rset->AddRule(rule, TSchemaRuleSet::kCheckAll, &errmsg)) {
408 ::Warning( "TGenericClassInfo", "The rule for class: \"%s\": version, \"%s\" and data members: \"%s\" has been skipped because %s.",
409 GetClassName(), it->fVersion.c_str(), it->fTarget.c_str(), errmsg.Data() );
410 delete rule;
411 }
412 }
413 }
414
416 {
417 // Return the class name
418
419 return fClassName;
420 }
421
422
424 {
425 // Return the set of info we have for the CollectionProxy, if any
426
428 }
429
431 {
432 // Return the set of info we have for the Collection Streamer, if any
433
435 }
436
437 const std::type_info &TGenericClassInfo::GetInfo() const
438 {
439 // Return the typeinfo value
440
441 return fInfo;
442 }
443
444 const std::vector<Internal::TSchemaHelper>& TGenericClassInfo::GetReadRawRules() const
445 {
446 // Return the list of rule give raw access to the TBuffer.
447
448 return fReadRawRules;
449 }
450
451
452 const std::vector<Internal::TSchemaHelper>& TGenericClassInfo::GetReadRules() const
453 {
454 // Return the list of Data Model Evolution regular read rules.
455 return fReadRules;
456 }
457
459 {
460 // Import the information from the class template.
461
462 TNamed *info = ROOT::RegisterClassTemplate(GetClassName(), nullptr, 0);
463 if (info) SetImplFile(info->GetTitle(), info->GetUniqueID());
464 }
465
467 {
468 // Set the name of the implementation file.
469
470 fImplFileName = file;
472 if (fClass) fClass->AddImplFile(file,line);
473 return 0;
474 }
475
477 {
478 // Set the name of the declaration file.
479
480 fDeclFileName = file;
482 if (fClass) fClass->SetDeclFile(file,line);
483 return 0;
484 }
485
487 {
488 // Set a class version number.
489
491 fVersion = version;
492 return version;
493 }
494
495 void TGenericClassInfo::SetRNTupleSoARecord(const std::string &recordName)
496 {
497 fRNTupleSoARecord = recordName;
498 }
499
501 {
502 fAlternate.push_back(alt);
503 }
504
505 /// Returns false if the member streamer could not be adopted (this happens if the underlying TClass had its
506 /// StreamerInfo compiled already).
508 {
509 if (fClass) {
510 assert(fAdoptedMemberStreamers.empty());
511 return fClass->AdoptMemberStreamer(name, strm);
512 }
513
514 auto [it, inserted] = fAdoptedMemberStreamers.emplace(name, strm);
515 if (!inserted) {
516 delete it->second;
517 it->second = strm;
518 }
519 return true;
520 }
521
523 {
524 // Set the info for the CollectionProxy and take ownership of the object
525 // being passed
526
529 }
530
532 {
533 // Set the info for the Collection Streamer and take ownership of the object
534 // being passed
535
538 }
539
541 {
542 // Set a Streamer object. The streamer object is now 'owned'
543 // by the TGenericClassInfo.
544
545 delete fStreamer; fStreamer = nullptr;
546 if (fClass) {
547 fClass->AdoptStreamer(streamer);
548 } else {
549 fStreamer = streamer;
550 }
551 return 0;
552 }
553
555 {
556 // Set the CollectProxy object. The CollectionProxy object is now 'owned'
557 // by the TGenericClassInfo.
558
559 delete fCollectionProxy; fCollectionProxy = nullptr;
560 fCollectionProxy = collProxy;
561 if (fClass && fCollectionProxy && !fClass->IsZombie()) {
562 fClass->CopyCollectionProxy(*fCollectionProxy);
563 }
564 return 0;
565 }
566
567 void TGenericClassInfo::SetReadRawRules( const std::vector<Internal::TSchemaHelper>& rules )
568 {
569 // Set the list of Data Model Evolution read rules giving direct access to the TBuffer.
570 fReadRawRules = rules;
571 }
572
573
574 void TGenericClassInfo::SetReadRules( const std::vector<Internal::TSchemaHelper>& rules )
575 {
576 // Set the list of Data Model Evolution regular read rules.
577 fReadRules = rules;
578 }
579
581 {
582 // Set a External Streamer function.
583
584 delete fStreamer; fStreamer = nullptr;
585 if (fClass) {
586 fClass->AdoptStreamer(new TClassStreamer(streamer));
587 } else {
588 fStreamer = new TClassStreamer(streamer);
589 }
590 return 0;
591 }
592
594 {
595 // Set a wrapper around the Streamer member function.
596
597 fStreamerFunc = streamer;
598 if (fClass) fClass->SetStreamerFunc(streamer);
599 }
600
602 {
603 // Set a wrapper around the Streamer member function.
604
605 fConvStreamerFunc = streamer;
606 if (fClass) fClass->SetConvStreamerFunc(streamer);
607 }
608
610 {
611 // Get the name of the declaring header file.
612
613 return fDeclFileName;
614 }
615
617 {
618 // Get the declaring line number.
619
620 return fDeclFileLine;
621 }
622
624 {
625 // Get the implementation filename.
626
628 return fImplFileName;
629 }
630
632 {
633 // Get the ClassDef line number.
634
636 return fImplFileLine;
637 }
638
640 {
641 // Return the class version number.
642
643 return fVersion;
644 }
645
647 {
648 // Return the actual type of the object.
649
650 return (*GetIsA())(obj);
651 }
652
654 {
655 // Return the IsA proxy.
656
657 return fIsA;
658 }
659
661 {
662 // Install a new wrapper around 'new'.
663
664 fNew = newFunc;
665 if (fClass) fClass->SetNew(fNew);
666 }
667
669 {
670 // Install a new wrapper around 'new []'.
671
672 fNewArray = newArrayFunc;
673 if (fClass) fClass->SetNewArray(fNewArray);
674 }
675
677 {
678 // Install a new wrapper around 'delete'.
679
680 fDelete = deleteFunc;
681 if (fClass) fClass->SetDelete(fDelete);
682 }
683
685 {
686 // Install a new wrapper around 'delete []'.
687
688 fDeleteArray = deleteArrayFunc;
689 if (fClass) fClass->SetDeleteArray(fDeleteArray);
690 }
691
693 {
694 // Install a new wrapper around the destructor.
695
696 fDestructor = destructorFunc;
697 if (fClass) fClass->SetDestructor(fDestructor);
698 }
699
701 {
702 // Install a new wrapper around SetDirectoryAutoAdd.
703
704 fDirAutoAdd = func;
705 if (fClass) fClass->SetDirectoryAutoAdd(fDirAutoAdd);
706 }
707
709 {
710 // Install a new wrapper around the Merge function.
711
712 fMerge = func;
713 if (fClass) fClass->SetMerge(fMerge);
714 }
715
717 {
718 // Install a new wrapper around the Merge function.
719
720 fResetAfterMerge = func;
721 if (fClass) fClass->SetResetAfterMerge(fResetAfterMerge);
722 }
723
725 {
726 // Get the wrapper around 'new'.
727
728 return fNew;
729 }
730
732 {
733 // Get the wrapper around 'new []'.
734
735 return fNewArray;
736 }
737
739 {
740 // Get the wrapper around 'delete'.
741
742 return fDelete;
743 }
744
746 {
747 // Get the wrapper around 'delete []'.
748
749 return fDeleteArray;
750 }
751
753 {
754 // Get the wrapper around the destructor.
755
756 return fDestructor;
757 }
758
760 {
761 // Get the wrapper around the directory-auto-add function .
762
763 return fDirAutoAdd;
764 }
765
766}
char * ret
Definition Rotated.cxx:221
int Int_t
Signed integer 4 bytes (int).
Definition RtypesCore.h:59
bool Bool_t
Boolean (0=false, 1=true) (bool).
Definition RtypesCore.h:77
short Short_t
Signed Short integer 2 bytes (short).
Definition RtypesCore.h:53
constexpr Bool_t kTRUE
Definition RtypesCore.h:107
TClass *(* DictFuncPtr_t)()
Definition Rtypes.h:86
std::atomic< TClass * > atomic_TClass_ptr
Definition Rtypes.h:202
void(* ClassStreamerFunc_t)(TBuffer &, void *)
Definition Rtypes.h:78
void(* ClassConvStreamerFunc_t)(TBuffer &, void *, const TClass *)
Definition Rtypes.h:79
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
Definition TError.cxx:252
void Fatal(const char *location, const char *msgfmt,...)
Use this function in case of a fatal error. It will abort the program.
Definition TError.cxx:267
char name[80]
Definition TGX11.cxx:148
externTVirtualMutex * gInterpreterMutex
@ kInvalidObject
Definition TObject.h:382
Int_t gDebug
Definition TROOT.cxx:777
#define gROOT
Definition TROOT.h:417
externTVirtualMutex * gROOTMutex
Definition TROOT.h:63
#define R__LOCKGUARD(mutex)
#define free
Definition civetweb.c:1578
Bool_t AddRule(TSchemaRule *rule, EConsistencyCheck checkConsistency=kCheckAll, TString *errmsg=nullptr)
The consistency check always fails if the TClass object was not set!
static void SetInstance(::ROOT::TGenericClassInfo &R__instance, NewFunc_t, NewArrFunc_t, DelFunc_t, DelArrFunc_t, DesFunc_t)
static void SetName(const std::string &name, std::string &nameMember)
static void SetfgIsA(atomic_TClass_ptr &isA, TClass *(*dictfun)())
virtual void Unregister(const char *classname, TClass *cl) const =0
virtual TClass * CreateClass(const char *cname, Version_t id, const std::type_info &info, TVirtualIsAProxy *isa, const char *dfil, const char *ifil, Int_t dl, Int_t il) const =0
virtual void Register(const char *cname, Version_t id, const std::type_info &info, DictFuncPtr_t dict, Int_t pragmabits) const =0
std::vector< ROOT::TClassAlt * > fAlternate
void AdoptAlternate(ROOT::TClassAlt *alt)
DesFunc_t GetDestructor() const
const Internal::TInitBehavior * fAction
TVirtualIsAProxy * GetIsA() const
DelArrFunc_t GetDeleteArray() const
Short_t AdoptCollectionProxy(TVirtualCollectionProxy *)
const char * GetClassName() const
void SetDelete(DelFunc_t deleteFunc)
void SetDirectoryAutoAdd(DirAutoAdd_t dirAutoAdd)
void SetDeleteArray(DelArrFunc_t deleteArrayFunc)
TVirtualCollectionProxy * fCollectionProxy
void SetResetAfterMerge(ResetAfterMergeFunc_t)
std::unordered_map< std::string, TMemberStreamer * > fAdoptedMemberStreamers
std::vector< ROOT::Internal::TSchemaHelper > fReadRules
void CreateRuleSet(std::vector< ROOT::Internal::TSchemaHelper > &vect, Bool_t ProcessReadRules)
Attach the schema evolution information to TClassObject.
TClass * IsA(const void *obj)
Short_t SetVersion(Short_t version)
void SetConvStreamerFunc(ClassConvStreamerFunc_t)
Detail::TCollectionProxyInfo * fCollectionProxyInfo
TVirtualIsAProxy * fIsA
void SetRNTupleSoARecord(const std::string &recordName)
Detail::TCollectionProxyInfo * fCollectionStreamerInfo
void SetNewArray(NewArrFunc_t newArrayFunc)
std::vector< ROOT::Internal::TSchemaHelper > fReadRawRules
Int_t SetImplFile(const char *file, Int_t line)
const std::type_info & fInfo
NewArrFunc_t GetNewArray() const
const Internal::TInitBehavior & GetAction() const
ClassStreamerFunc_t fStreamerFunc
Detail::TCollectionProxyInfo * GetCollectionStreamerInfo() const
void SetReadRawRules(const std::vector< ROOT::Internal::TSchemaHelper > &rules)
DirAutoAdd_t GetDirectoryAutoAdd() const
const std::vector< ROOT::Internal::TSchemaHelper > & GetReadRawRules() const
void SetReadRules(const std::vector< ROOT::Internal::TSchemaHelper > &rules)
ClassConvStreamerFunc_t fConvStreamerFunc
const std::type_info & GetInfo() const
Detail::TCollectionProxyInfo * GetCollectionProxyInfo() const
void Init(Int_t pragmabits)
ResetAfterMergeFunc_t fResetAfterMerge
const char * GetDeclFileName() const
void SetDestructor(DesFunc_t destructorFunc)
void AdoptCollectionProxyInfo(Detail::TCollectionProxyInfo *)
const std::vector< ROOT::Internal::TSchemaHelper > & GetReadRules() const
bool AdoptMemberStreamer(const char *name, TMemberStreamer *strm)
Returns false if the member streamer could not be adopted (this happens if the underlying TClass had ...
Int_t SetDeclFile(const char *file, Int_t line)
Short_t SetStreamer(ClassStreamerFunc_t)
Short_t AdoptStreamer(TClassStreamer *)
void AdoptCollectionStreamerInfo(Detail::TCollectionProxyInfo *)
void SetNew(NewFunc_t newFunc)
void SetStreamerFunc(ClassStreamerFunc_t)
@ kNtplForceStreamerMode
Definition TClassTable.h:73
@ kHasCustomStreamerMember
Definition TClassTable.h:71
@ kNtplForceNativeMode
Definition TClassTable.h:72
TClass instances represent classes, structs and namespaces in the ROOT type system.
Definition TClass.h:84
The TNamed class is the base class for all named ROOT classes.
Definition TNamed.h:29
const char * GetTitle() const override
Returns title of object.
Definition TNamed.h:50
virtual UInt_t GetUniqueID() const
Return the unique object id.
Definition TObject.cxx:480
Basic string class.
Definition TString.h:138
const char * Data() const
Definition TString.h:384
Defines a common interface to inspect/change the contents of an object that represents a collection.
static constexpr Version_t Class_Version()
TLine * line
externTROOT * gROOTLocal
Definition TROOT.h:390
const TInitBehavior * DefineBehavior(void *, void *)
std::string GetDemangledTypeName(const std::type_info &)
Returns a string with the demangled and normalized name for the given type.
void(* DirAutoAdd_t)(void *, TDirectory *)
Definition Rtypes.h:120
void(* ResetAfterMergeFunc_t)(void *, TFileMergeInfo *)
Definition Rtypes.h:122
void(* DesFunc_t)(void *)
Definition Rtypes.h:119
void(* DelFunc_t)(void *)
Definition Rtypes.h:117
TNamed * RegisterClassTemplate(const char *name, const char *file, Int_t line)
Global function to register the implementation file and line of a class template (i....
void *(* NewArrFunc_t)(Long_t size, void *arena)
Definition Rtypes.h:116
void ResetClassVersion(TClass *, const char *, Short_t)
Global function to update the version number.
void(* DelArrFunc_t)(void *)
Definition Rtypes.h:118
void *(* NewFunc_t)(void *)
Definition Rtypes.h:115
Long64_t(* MergeFunc_t)(void *, TCollection *, TFileMergeInfo *)
Definition Rtypes.h:121
void RemoveClassAlternate(ROOT::TClassAlt *)
char * DemangleName(const char *mangled_name, int &errorCode)
Definition TClassEdit.h:255
void GetNormalizedName(std::string &norm_name, std::string_view name)
Return the normalized name.