36 if (!
name || status != 0)
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);
70 std::string& nameMember) {
72 if (nameMember.empty()) {
85TGenericClassInfo::TGenericClassInfo(
const char *fullClassname,
const char *declFileName,
Int_t declFileLine,
91 fClassName(fullClassname),
92 fDeclFileName(declFileName),
93 fDeclFileLine(declFileLine),
94 fDictionary(dictionary),
96 fImplFileName(nullptr),
101 fResetAfterMerge(nullptr),
105 fDeleteArray(nullptr),
106 fDestructor(nullptr),
107 fDirAutoAdd(nullptr),
109 fStreamerFunc(nullptr),
110 fConvStreamerFunc(nullptr),
111 fCollectionProxy(nullptr),
113 fAlignment(alignof_),
114 fPragmaBits(pragmabits),
115 fCollectionProxyInfo(nullptr),
116 fCollectionStreamerInfo(nullptr)
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,
129 fClassName(fullClassname),
130 fDeclFileName(declFileName),
131 fDeclFileLine(declFileLine),
132 fDictionary(dictionary),
134 fImplFileName(nullptr),
139 fResetAfterMerge(nullptr),
143 fDeleteArray(nullptr),
144 fDestructor(nullptr),
145 fDirAutoAdd(nullptr),
147 fStreamerFunc(nullptr),
148 fConvStreamerFunc(nullptr),
149 fCollectionProxy(nullptr),
151 fAlignment(alignof_),
152 fPragmaBits(pragmabits),
153 fCollectionProxyInfo(nullptr),
154 fCollectionStreamerInfo(nullptr)
162 class TForNamespace {};
164 TGenericClassInfo::TGenericClassInfo(
const char *fullClassname,
Int_t version,
const char *declFileName,
165 Int_t declFileLine,
const Internal::TInitBehavior *action,
169 fClassName(fullClassname),
170 fDeclFileName(declFileName),
171 fDeclFileLine(declFileLine),
172 fDictionary(dictionary),
173 fInfo(typeid(TForNamespace)),
174 fImplFileName(nullptr),
179 fResetAfterMerge(nullptr),
183 fDeleteArray(nullptr),
184 fDestructor(nullptr),
185 fDirAutoAdd(nullptr),
187 fStreamerFunc(nullptr),
188 fConvStreamerFunc(nullptr),
189 fCollectionProxy(nullptr),
192 fPragmaBits(pragmabits),
193 fCollectionProxyInfo(nullptr),
194 fCollectionStreamerInfo(nullptr)
250 void TGenericClassInfo::Init(
Int_t pragmabits)
256 if (!fAction)
return;
257 GetAction().Register(fClassName,
264 TGenericClassInfo::~TGenericClassInfo()
268 delete fCollectionProxyInfo;
269 delete fCollectionStreamerInfo;
277 for(
auto alt : fAlternate)
280 GetAction().Unregister(GetClassName(), fClass);
283 const Internal::TInitBehavior &TGenericClassInfo::GetAction()
const
290 TClass *TGenericClassInfo::GetClass()
301 ::Fatal(
"TClass::TClass",
"ROOT system not initialized");
305 ::Warning(
"TClass::TClass",
"ROOT system is being torn down");
307 return new TClass(GetClassName(),
true);
310 if (!fClass && fAction) {
314 if (fClass)
return fClass;
316 fClass = GetAction().CreateClass(GetClassName(),
325 fClass->fHasCustomStreamerMember =
true;
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);
339 for (
const auto &[
name, strm] : fAdoptedMemberStreamers)
340 fClass->AdoptMemberStreamer(
name.c_str(), strm);
341 fAdoptedMemberStreamers.clear();
344 if (!fClass->IsZombie()) {
345 if (fCollectionProxy) fClass->CopyCollectionProxy(*fCollectionProxy);
346 else if (fCollectionProxyInfo) {
347 fClass->SetCollectionProxy(*fCollectionProxyInfo);
350 fClass->SetClassSize(fSizeof);
351 fClass->SetClassAlignment(fAlignment);
357 CreateRuleSet( fReadRules,
true );
358 CreateRuleSet( fReadRawRules,
false );
361 fClass->CreateAttributeMap();
366 fClass->GetAttributeMap()->AddProperty(
"rntuple.streamerMode",
"false");
368 fClass->GetAttributeMap()->AddProperty(
"rntuple.streamerMode",
"true");
372 if (!fRNTupleSoARecord.empty()) {
373 fClass->CreateAttributeMap();
374 fClass->GetAttributeMap()->AddProperty(
"rntuple.SoARecord", fRNTupleSoARecord.c_str());
383 void TGenericClassInfo::CreateRuleSet( std::vector<Internal::TSchemaHelper>& vect,
386 if ( vect.empty() ) {
394 TSchemaRuleSet* rset = fClass->GetSchemaRules(
kTRUE );
402 std::vector<Internal::TSchemaHelper>::iterator it;
403 for( it = vect.begin(); it != vect.end(); ++it ) {
405 fClass->GetName(), *it);
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() );
415 const char *TGenericClassInfo::GetClassName()
const
423 Detail::TCollectionProxyInfo *TGenericClassInfo::GetCollectionProxyInfo()
const
427 return fCollectionProxyInfo;
430 Detail::TCollectionProxyInfo *TGenericClassInfo::GetCollectionStreamerInfo()
const
434 return fCollectionProxyInfo;
437 const std::type_info &TGenericClassInfo::GetInfo()
const
444 const std::vector<Internal::TSchemaHelper>& TGenericClassInfo::GetReadRawRules()
const
448 return fReadRawRules;
452 const std::vector<Internal::TSchemaHelper>& TGenericClassInfo::GetReadRules()
const
458 void TGenericClassInfo::SetFromTemplate()
466 Int_t TGenericClassInfo::SetImplFile(
const char *file,
Int_t line)
470 fImplFileName = file;
471 fImplFileLine =
line;
472 if (fClass) fClass->AddImplFile(file,
line);
476 Int_t TGenericClassInfo::SetDeclFile(
const char *file,
Int_t line)
480 fDeclFileName = file;
481 fDeclFileLine =
line;
482 if (fClass) fClass->SetDeclFile(file,
line);
495 void TGenericClassInfo::SetRNTupleSoARecord(
const std::string &recordName)
497 fRNTupleSoARecord = recordName;
500 void TGenericClassInfo::AdoptAlternate(ROOT::TClassAlt *alt)
502 fAlternate.push_back(alt);
507 bool TGenericClassInfo::AdoptMemberStreamer(
const char *
name, TMemberStreamer *strm)
510 assert(fAdoptedMemberStreamers.empty());
511 return fClass->AdoptMemberStreamer(
name, strm);
514 auto [it, inserted] = fAdoptedMemberStreamers.emplace(
name, strm);
522 void TGenericClassInfo::AdoptCollectionProxyInfo(TCollectionProxyInfo *info)
527 delete fCollectionProxyInfo;
528 fCollectionProxyInfo = info;
531 void TGenericClassInfo::AdoptCollectionStreamerInfo(TCollectionProxyInfo *info)
536 delete fCollectionStreamerInfo;
537 fCollectionStreamerInfo = info;
540 Short_t TGenericClassInfo::AdoptStreamer(TClassStreamer *streamer)
545 delete fStreamer; fStreamer =
nullptr;
547 fClass->AdoptStreamer(streamer);
549 fStreamer = streamer;
554 Short_t TGenericClassInfo::AdoptCollectionProxy(TVirtualCollectionProxy *collProxy)
559 delete fCollectionProxy; fCollectionProxy =
nullptr;
560 fCollectionProxy = collProxy;
561 if (fClass && fCollectionProxy && !fClass->IsZombie()) {
562 fClass->CopyCollectionProxy(*fCollectionProxy);
567 void TGenericClassInfo::SetReadRawRules(
const std::vector<Internal::TSchemaHelper>& rules )
570 fReadRawRules = rules;
574 void TGenericClassInfo::SetReadRules(
const std::vector<Internal::TSchemaHelper>& rules )
584 delete fStreamer; fStreamer =
nullptr;
586 fClass->AdoptStreamer(
new TClassStreamer(streamer));
588 fStreamer =
new TClassStreamer(streamer);
597 fStreamerFunc = streamer;
598 if (fClass) fClass->SetStreamerFunc(streamer);
605 fConvStreamerFunc = streamer;
606 if (fClass) fClass->SetConvStreamerFunc(streamer);
609 const char *TGenericClassInfo::GetDeclFileName()
const
613 return fDeclFileName;
616 Int_t TGenericClassInfo::GetDeclFileLine()
const
620 return fDeclFileLine;
623 const char *TGenericClassInfo::GetImplFileName()
627 if (!fImplFileName) SetFromTemplate();
628 return fImplFileName;
631 Int_t TGenericClassInfo::GetImplFileLine()
635 if (!fImplFileLine) SetFromTemplate();
636 return fImplFileLine;
639 Int_t TGenericClassInfo::GetVersion()
const
646 TClass *TGenericClassInfo::IsA(
const void *obj)
650 return (*GetIsA())(obj);
653 TVirtualIsAProxy* TGenericClassInfo::GetIsA()
const
660 void TGenericClassInfo::SetNew(
NewFunc_t newFunc)
665 if (fClass) fClass->SetNew(fNew);
668 void TGenericClassInfo::SetNewArray(
NewArrFunc_t newArrayFunc)
672 fNewArray = newArrayFunc;
673 if (fClass) fClass->SetNewArray(fNewArray);
676 void TGenericClassInfo::SetDelete(
DelFunc_t deleteFunc)
680 fDelete = deleteFunc;
681 if (fClass) fClass->SetDelete(fDelete);
684 void TGenericClassInfo::SetDeleteArray(
DelArrFunc_t deleteArrayFunc)
688 fDeleteArray = deleteArrayFunc;
689 if (fClass) fClass->SetDeleteArray(fDeleteArray);
692 void TGenericClassInfo::SetDestructor(
DesFunc_t destructorFunc)
696 fDestructor = destructorFunc;
697 if (fClass) fClass->SetDestructor(fDestructor);
700 void TGenericClassInfo::SetDirectoryAutoAdd(
DirAutoAdd_t func)
705 if (fClass) fClass->SetDirectoryAutoAdd(fDirAutoAdd);
713 if (fClass) fClass->SetMerge(fMerge);
720 fResetAfterMerge = func;
721 if (fClass) fClass->SetResetAfterMerge(fResetAfterMerge);
724 NewFunc_t TGenericClassInfo::GetNew()
const
738 DelFunc_t TGenericClassInfo::GetDelete()
const
752 DesFunc_t TGenericClassInfo::GetDestructor()
const
759 DirAutoAdd_t TGenericClassInfo::GetDirectoryAutoAdd()
const
bool Bool_t
Boolean (0=false, 1=true) (bool)
int Int_t
Signed integer 4 bytes (int)
short Short_t
Signed Short integer 2 bytes (short)
TClass *(* DictFuncPtr_t)()
std::atomic< TClass * > atomic_TClass_ptr
void(* ClassStreamerFunc_t)(TBuffer &, void *)
void(* ClassConvStreamerFunc_t)(TBuffer &, void *, const TClass *)
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
void Fatal(const char *location, const char *msgfmt,...)
Use this function in case of a fatal error. It will abort the program.
R__EXTERN TVirtualMutex * gInterpreterMutex
externTVirtualMutex * gROOTMutex
#define R__LOCKGUARD(mutex)
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)())
@ kHasCustomStreamerMember
TClass instances represent classes, structs and namespaces in the ROOT type system.
const char * GetTitle() const override
Returns title of object.
virtual UInt_t GetUniqueID() const
Return the unique object id.
const char * Data() const
static constexpr Version_t Class_Version()
const TInitBehavior * DefineBehavior(void *, void *)
std::string GetDemangledTypeName(const std::type_info &t)
void(* DirAutoAdd_t)(void *, TDirectory *)
void(* ResetAfterMergeFunc_t)(void *, TFileMergeInfo *)
void(* DesFunc_t)(void *)
void(* DelFunc_t)(void *)
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)
void ResetClassVersion(TClass *, const char *, Short_t)
Global function to update the version number.
void(* DelArrFunc_t)(void *)
void *(* NewFunc_t)(void *)
Long64_t(* MergeFunc_t)(void *, TCollection *, TFileMergeInfo *)
void RemoveClassAlternate(ROOT::TClassAlt *)
void Init(TClassEdit::TInterpreterLookupHelper *helper)
char * DemangleName(const char *mangled_name, int &errorCode)
void GetNormalizedName(std::string &norm_name, std::string_view name)
Return the normalized name.