110#define RTLD_DEFAULT ((void *)::GetModuleHandle(NULL))
111#define dlsym(library, function_name) ::GetProcAddress((HMODULE)library, function_name)
129using std::multimap, std::make_pair, std::string;
138 static constexpr const char kUndeterminedClassInfoName[] =
"<NOT YET DETERMINED FROM fClassInfo>";
140 class TMmallocDescTemp {
144 TMmallocDescTemp(
void *value =
nullptr) :
165 TNameMapNode(
const char *typedf,
const char *orig) :
178 const static bool foundSymbol = dlsym(RTLD_DEFAULT,
"usedToIdentifyRootClingByDlSym");
201 auto strLen =
name ? strlen(
name) : 0;
202 if (strLen == 0)
return;
204 const char* endCharPtr = strchr(
name,
'<');
205 endCharPtr = !endCharPtr ? &
name[strLen] : endCharPtr;
207 const char* beginCharPtr = endCharPtr;
208 while (beginCharPtr!=
name){
209 if (*beginCharPtr==
':'){
215 beginCharPtr = beginCharPtr!=endCharPtr ? beginCharPtr :
name;
216 std::string s(beginCharPtr, endCharPtr);
218 printf(
"TDeclNameRegistry::AddQualifiedName Adding key %s for class/namespace %s\n", s.c_str(),
name);
240 printf(
"TDeclNameRegistry Destructor. List of %lu names:\n",
243 printf(
" - %s\n", key.c_str());
308 std::pair<RepoCont_t::iterator, Bool_t> tmp =
fObjectVersionRepository.insert(RepoCont_t::value_type>(location, version));
310 Warning(where,
"Reregistering an object of class '%s' version %d at address %p",
what->GetName(), version, p);
314 Warning(where,
"Failed to reregister an object of class '%s' version %d at address %p",
what->GetName(), version, location);
327 RepoCont_t::iterator tmp = cur++;
328 if ((tmp->first == location) && (tmp->second ==
what->GetClassVersion())) {
344 size_t objsize =
what->Size();
345 long delta = (
char*)newadd - (
char*)oldadd;
349 RepoCont_t::iterator tmp = cur++;
350 if (oldadd <= tmp->first && tmp->first < ( ((
char*)oldadd) + objsize) ) {
366#define R__USE_STD_MAP
368#if defined R__USE_STD_MAP
372 typedef std::map<std::string,TClass*>
IdMap_t;
395 IdMap_t::const_iterator iter =
fMap.find(key);
397 if (iter !=
fMap.end()) cl = iter->second;
409#ifdef R__COMPLETE_MEM_TERMINATION
418 void Add(
const char *key, TClass *&obj) {
419 TObjString *realkey =
new TObjString(key);
420 fMap.Add(realkey, obj);
422 TClass*
Find(
const char *key)
const {
423 const TPair *
a = (
const TPair *)fMap.FindObject(key);
424 if (
a)
return (TClass*)
a->Value();
427 void Remove(
const char *key) {
428 TObjString realkey(key);
429 TObject *actual = fMap.Remove(&realkey);
452 std::pair<const key_type, mapped_type>
pair = make_pair(key, obj);
457 return fMap.count(key);
462 return fMap.equal_range(key);
473#ifdef R__COMPLETE_MEM_TERMINATION
475 return &gIdMapObject;
484#ifdef R__COMPLETE_MEM_TERMINATION
486 return &gDeclIdMapObject;
498bool isIdentifierChar(
char c) {
499 return isalnum(
c) ||
c ==
'_';
505static int CountStringOccurrences(
const TString &needle,
const TString &haystack) {
507 int numOccurrences = 0;
508 Ssiz_t posFound = haystack.
Index(needle, currStart);
512 auto hasDelimLeft = [&]() {
514 || !isIdentifierChar(haystack[posFound - 1]);
516 auto hasDelimRight = [&]() {
518 || !isIdentifierChar(haystack[posFound + needle.
Length()]);
521 if (hasDelimLeft() && hasDelimRight())
523 currStart = posFound + needle.
Length();
524 posFound = haystack.
Index(needle, currStart);
526 return numOccurrences;
533static bool ShouldReplaceDouble32TypeInfo(
TClass *newCl,
TClass *existingCl) {
539 int numExistingDouble32 = CountStringOccurrences(
"Double32_t", existingCl->
GetName());
540 int numExistingFloat16 = CountStringOccurrences(
"Float16_t", existingCl->
GetName());
543 if (numExistingDouble32 + numExistingFloat16 == 0)
546 int numNewDouble32 = CountStringOccurrences(
"Double32_t", newCl->
GetName());
547 int numNewFloat16 = CountStringOccurrences(
"Float16_t", newCl->
GetName());
550 return numExistingDouble32 + numExistingFloat16 > numNewDouble32 + numNewFloat16;
562 gROOT->GetListOfClasses()->Add(cl);
564 bool shouldAddTypeInfo =
true;
566 shouldAddTypeInfo = ShouldReplaceDouble32TypeInfo(cl, existingCl);
567 if (shouldAddTypeInfo)
580 if (!cl || !
id)
return;
592 gROOT->GetListOfClasses()->Remove(oldcl);
595 if (existingCl == oldcl)
629 void Inspect(
TClass *cl,
const char *parent,
const char *
name,
const void *addr,
Bool_t isTransient)
override;
645 const Int_t kvalue = 30;
647 const Int_t ktitle = 50;
649 const Int_t ktitle = 42;
651 const Int_t kline = 1024;
654 UInt_t *cdatime =
nullptr;
659 const char *memberName;
660 const char *memberFullTypeName;
661 const char *memberTitle;
667 if (member->GetDataType()) {
668 memberDataType = (
EDataType)member->GetDataType()->GetType();
670 memberName = member->GetName();
671 memberFullTypeName = member->GetFullTypeName();
672 memberTitle = member->GetTitle();
673 isapointer = member->IsaPointer();
674 isbasic = member->IsBasic();
676 isarray = member->GetArrayDim();
682 const char *cursor = mname;
683 while ( (*cursor)==
'*' ) ++cursor;
686 if ( pos !=
kNPOS ) {
690 if (!element)
return;
695 memberName = element->
GetName();
698 membertype =
gROOT->GetType(memberFullTypeName);
700 isbasic = membertype !=
nullptr;
708 if (strcmp(memberName,
"fDatime") == 0 && memberDataType ==
kUInt_t) {
712 if (strcmp(memberName,
"fBits") == 0 && memberDataType ==
kUInt_t) {
717 static TClassRef stdClass(
"std::string");
718 Bool_t isStdString = (dataClass == stdClass);
721 for (i = 0;i < kline; i++)
line[i] =
' ';
727 char *pointer = (
char*)add;
728 char **ppointer = (
char**)(pointer);
731 char **p3pointer = (
char**)(*ppointer);
736 snprintf(&
line[kvalue],kline-kvalue,
"->%zx ", (
size_t)p3pointer);
738 }
else if (membertype) {
740 i = strlen(*ppointer);
741 if (kvalue+i > kline) i=kline-1-kvalue;
743 for (
Int_t j = 0; j < i; j++) {
744 if (!std::isprint((*ppointer)[j])) {
750 strncpy(
line + kvalue, *ppointer, i);
757 line[kvalue+1] =
'>';
758 strncpy(&
line[kvalue+2], membertype->
AsString(p3pointer), std::min(kline-1-kvalue-2,(
int)strlen(membertype->
AsString(p3pointer))));
760 }
else if (!strcmp(memberFullTypeName,
"char*") ||
761 !strcmp(memberFullTypeName,
"const char*")) {
762 i = strlen(*ppointer);
763 if (kvalue+i >= kline) i=kline-1-kvalue;
765 for (
Int_t j = 0; j < i; j++) {
766 if (!std::isprint((*ppointer)[j])) {
772 strncpy(
line + kvalue, *ppointer, kline - 1 - kvalue);
779 snprintf(&
line[kvalue],kline-kvalue,
"->%zx ", (
size_t)p3pointer);
782 }
else if (membertype) {
784 cdatime = (
UInt_t*)pointer;
786 snprintf(&
line[kvalue],kline-kvalue,
"%d/%d",cdate,ctime);
790 strncpy(&
line[kvalue], membertype->
AsString(pointer), std::min(kline-1-kvalue,(
int)strlen(membertype->
AsString(pointer))));
794 std::string *str = (std::string*)pointer;
796 }
else if (isTString) {
801 snprintf(&
line[kvalue],kline-kvalue,
"->%zx ", (
size_t)pointer);
806 if (isdate ==
kFALSE && strcmp(memberFullTypeName,
"char*") && strcmp(memberFullTypeName,
"const char*")) {
807 i = strlen(&
line[0]);
line[i] =
' ';
808 assert(250 > ktitle);
809 strlcpy(&
line[ktitle],memberTitle,250-ktitle+1);
813 strncat(
line,
" ...", kline-strlen(
line)-1);
835 void Inspect(
TClass *cl,
const char *parent,
const char *
name,
const void *addr,
Bool_t isTransient)
override;
854 isTransientMember =
kTRUE;
957 void* addrForRecursion =
nullptr;
959 addrForRecursion =
const_cast<void*
>(add);
988 void Inspect(
TClass *cl,
const char *parent,
const char *
name,
const void *addr,
Bool_t isTransient)
override;
996 const void *addr,
Bool_t )
998 if(tit && strchr(tit,
'.'))
return ;
1006 int ln = strcspn(
name,
"[ ");
1010 if (!classInfo)
return;
1017 while (
gCling->DataMemberInfo_Next(
m)) {
1018 mname =
gCling->DataMemberInfo_Name(
m);
1020 if ((found = (iname==mname)))
break;
1032 if (mname ==
"G__virtualinfo")
return;
1034 int size =
sizeof(
void*);
1038 for (
int dim = 0; dim <
gCling->DataMemberInfo_ArrayDim(
m); dim++) nmax *=
gCling->DataMemberInfo_MaxIndex(
m,dim);
1051 gCling->DataMemberInfo_Delete(
m);
1054 for(
int i=0; i<nmax; i++) {
1056 char *ptr = (
char*)addr + i*
size;
1071 bwname = actualClass->
GetName();
1078 strcmp(bwname.
Data(),actualClass->
GetName())==0) {
1080 int l = strcspn(bwname.
Data(),
"[ ");
1081 if (
l<bwname.
Length() && bwname[
l]==
'[') {
1082 char cbuf[13];
snprintf(cbuf,13,
"[%02d]",i);
1085 bwname = (
const char*)ts;
1089 if (proxy==
nullptr) {
1096 if (valueCl==
nullptr) {
1102 TClass *actualCl =
nullptr;
1104 int sz = proxy->
Size();
1106 char fmt[] = {
"#%09d"};
1107 fmt[3] =
'0'+(
int)log10(
double(sz))+1;
1109 for (
int ii=0;ii<sz;ii++) {
1110 void *p = proxy->
At(ii);
1147 TMmallocDescTemp setreset;
1168 ::Fatal(
"TClass::TClass",
"ROOT system not initialized");
1171 TMmallocDescTemp setreset;
1178 ::Fatal(
"TClass::TClass",
"gInterpreter not initialized");
1182 ::Warning(
"TClass::TClass",
"no dictionary for class %s is available",
name);
1199 Init(
name, cversion,
nullptr,
nullptr,
nullptr,
nullptr, -1, -1,
nullptr, silent);
1222 "A TClass entry cannot be initialized in a state different from kForwardDeclared or kEmulated.");
1223 Init(
name, cversion,
nullptr,
nullptr,
nullptr,
nullptr, -1, -1,
nullptr, silent);
1246 ::Fatal(
"TClass::TClass",
"ROOT system not initialized");
1252 ::Fatal(
"TClass::TClass",
"gInterpreter not initialized");
1254 if (!classInfo || !
gInterpreter->ClassInfo_IsValid(classInfo)) {
1261 Init(
fName, cversion,
nullptr,
nullptr, dfil, ifil, dl, il, classInfo, silent);
1280 Init(
name,cversion,
nullptr,
nullptr, dfil, ifil, dl, il,
nullptr, silent);
1290 const char *dfil,
const char *ifil,
Int_t dl,
Int_t il,
1298 Init(
name, cversion, &info, isa, dfil, ifil, dl, il,
nullptr, silent);
1316 info->
Clear(
"build");
1341 const char *dfil,
const char *ifil,
Int_t dl,
Int_t il,
1342 ClassInfo_t *givenInfo,
1346 ::Fatal(
"TClass::TClass",
"ROOT system not initialized");
1348 ::Error(
"TClass::Init",
"The name parameter is invalid (null or empty)");
1389 TClass **persistentRef =
nullptr;
1407 info->
Clear(
"build");
1425 (*fMethod).fClass =
this;
1437 ::Fatal(
"TClass::Init",
"gInterpreter not initialized");
1440 bool invalid = !
gInterpreter->ClassInfo_IsValid(givenInfo);
1441 bool notloaded = !
gInterpreter->ClassInfo_IsLoaded(givenInfo);
1442 auto property =
gInterpreter->ClassInfo_Property(givenInfo);
1444 if (invalid || (notloaded && (property &
kIsNamespace)) ||
1484 proto->FillTClass(
this);
1510 ::Error(
"TClass::Init",
"no interpreter information for class %s is available even though it has a TClass "
1511 "initialization routine.",
1517 ::Warning(
"TClass::Init",
"no dictionary for class %s is available",
fName.Data());
1529 if (!givenInfo && strchr (
name,
'<')) {
1541 if (resolvedThis !=
name) {
1565 if (resolvedThis !=
fName) {
1566 oldcl = (
TClass*)
gROOT->GetListOfClasses()->FindObject(resolvedThis);
1567 if (oldcl && oldcl !=
this) {
1573 while ( TNameMapNode* htmp =
static_cast<TNameMapNode*
> (next()) ) {
1574 if (resolvedThis != htmp->String())
continue;
1575 oldcl = (
TClass*)
gROOT->GetListOfClasses()->FindObject(htmp->fOrigName);
1576 if (oldcl && oldcl !=
this) {
1594 if (persistentRef) {
1601 if ( isStl || !strncmp(
GetName(),
"stdext::hash_",13) || !strncmp(
GetName(),
"__gnu_cxx::hash_",16) ) {
1612 }
else if (!silent) {
1613 Warning(
"Init",
"Collection proxy for %s was not properly initialized!",
GetName());
1625 auto rulesiter = registry.find(
GetName());
1626 if (rulesiter != registry.end()) {
1628 for (
const auto &helper : rulesiter->second) {
1634 "The rule for class: \"%s\": version, \"%s\" and data members: \"%s\" has been skipped because %s.",
1635 GetName(), helper.fVersion.c_str(), helper.fTarget.c_str(), errmsg.
Data());
1656 while ( TNameMapNode* htmp =
static_cast<TNameMapNode*
> (next()) ) {
1657 if (resolvedThis == htmp->String() && htmp->fOrigName ==
GetName()) {
1683 (*fUsingData).Delete();
1695 (*fMethod).Delete();
1728 std::map<std::string, TObjArray*>::iterator it;
1729 std::map<std::string, TObjArray*>::iterator end = (*fConversionStreamerInfo).end();
1730 for( it = (*fConversionStreamerInfo).begin(); it != end; ++it ) {
1740 Int_t ReadRulesContent(FILE *
f)
1752 while ((
c = fgetc(
f)) != EOF) {
1758 if (rule.Length() > 0) {
1810 static const char *suffix =
"class.rules";
1816 FILE *
f = fopen(sname,
"r");
1818 res = ReadRulesContent(
f);
1821 ::Error(
"TClass::ReadRules()",
"Cannot find rules file %s", sname.
Data());
1834 if (!filename || !filename[0]) {
1835 ::Error(
"TClass::ReadRules",
"no file name specified");
1839 FILE *
f = fopen(filename,
"r");
1841 ::Error(
"TClass::ReadRules",
"Failed to open %s\n",filename);
1844 Int_t count = ReadRulesContent(
f);
1897 ::Warning(
"TClass::AddRule",
"The rule for class: \"%s\": version, \"%s\" and data members: \"%s\" has been skipped because it conflicts with one of the other rules (%s).",
1924 return gReadRulesRegistry;
1927 return gReadRawRulesRegistry;
1973 obj->ShowMembers(insp);
1994 }
else if (actual !=
this) {
1995 return actual->
Browse(obj,
b);
2049 isTransient =
kTRUE;
2054 TMmallocDescTemp setreset;
2065 static TClassRef clRefString(
"std::string");
2066 if (clRefString ==
this) {
2076 Error(
"BuildRealData",
"Inspection for %s not supported!",
GetName());
2088 if ( isTransient ) {
2096 Error(
"BuildRealData",
"Cannot find any ShowMembers function for %s!",
GetName());
2111 c->BuildRealData(
nullptr, isTransient);
2131 Error(
"BuildEmulatedRealData",
"Missing StreamerInfo for %s",
GetName());
2197 TMmallocDescTemp setreset;
2224 if (strcmp(
GetName(),
"string") == 0) {
2232 gInterpreter->InspectMembers(insp, obj,
this, isTransient);
2236 sinfo->CallShowMembers(obj, insp, isTransient);
2251 return gInterpreter->InspectMembers(insp, obj,
this, isTransient);
2314 }
else if (!
c->CanSplitBaseAllow()) {
2358 static TClassRef stdStringClass(
"std::string");
2415 if (new_name ==
nullptr || new_name[0]==
'\0' ||
fName == new_name) {
2416 Error(
"Clone",
"The name of the class must be changed when cloning a TClass object.");
2446 copy->
fName = new_name;
2505 gROOT->ProcessLine(
"new TCanvas(\"R__class\",\"class\",20,20,1000,750);");
2512 gPad->DrawClassObject(
this,option);
2553 if (
sizeof(
this) == 4)
2556 Printf(
"==> Dumping object at: 0x%016lx, name=%s, class=%s\n",prObj,tobj->
GetName(),
GetName());
2559 if (
sizeof(
this) == 4)
2560 Printf(
"==> Dumping object at: 0x%08lx, class=%s\n",prObj,
GetName());
2562 Printf(
"==> Dumping object at: 0x%016lx, class=%s\n",prObj,
GetName());
2567 Info(
"Dump",
"No ShowMembers function, dumping disabled");
2577 static const UInt_t maxsize = 255;
2578 static char name[maxsize+2];
2582 for (
UInt_t i = 0; i < nch && icur < maxsize; ++i, ++icur) {
2583 if (
text[i] ==
'\"' ||
text[i] ==
'[' ||
text[i] ==
'~' ||
2586 text[i] ==
'?' ||
text[i] ==
'>') {
2630 return realTObject->
IsA();
2665 if (strcmp(
GetName(), classname) == 0)
return this;
2674 else return nullptr;
2684 if (cl ==
this)
return this;
2696 if (cl ==
c)
return c;
2697 c1 =
c->GetBaseClass(cl);
2715 if (cl ==
this)
return 0;
2717 if (!
fBase.load()) {
2724 if (!sinfo)
return -1;
2736 if (!baseclass)
return -1;
2738 if (subOffset == -2)
return -2;
2743 Error(
"GetBaseClassOffsetRecurse",
"Can not determine alignment for base class %s (got %zu)\n",
2746 if (subOffset != -1)
return offset+subOffset;
2747 offset += baseclass->
Size();
2751 if (!baseclass)
return -1;
2753 if (subOffset == -2)
return -2;
2758 Error(
"GetBaseClassOffsetRecurse",
"Can not determine alignment for base class %s (got %zu)\n",
2761 if (subOffset != -1)
return offset+subOffset;
2762 offset += baseclass->
Size();
2765 Error(
"GetBaseClassOffsetRecurse",
"Unexpected element type for base class: %s\n",element->
IsA()->
GetName());
2777 if (
fBase.load() ==
nullptr)
2780 lnk =
fBase.load()->FirstLink();
2796 off =
c->GetBaseClassOffsetRecurse(cl);
2797 if (off == -2)
return -2;
2816 if (
this == toBase)
return 0;
2832 if(derived && base) {
2834 return gCling->ClassInfo_GetBaseOffset(derived, base, address, isDerivedObject);
2854 if (dm)
return this;
2862 TClass *cdm =
c->GetBaseDataMember(datamember);
2863 if (cdm)
return cdm;
2874 struct TClassLocalStorage {
2875 TClassLocalStorage() : fCollectionProxy(nullptr), fStreamer(nullptr) {};
2877 TVirtualCollectionProxy *fCollectionProxy;
2878 TClassStreamer *fStreamer;
2880 static TClassLocalStorage *GetStorage(
const TClass *cl)
2886 if (*thread_ptr==
nullptr) *thread_ptr =
new TExMap();
2887 TExMap *lmap = (TExMap*)(*thread_ptr);
2893 local = (
ULongptr_t)
new TClassLocalStorage();
2896 return (TClassLocalStorage*)local;
2924 TClassLocalStorage *local = TClassLocalStorage::GetStorage(
this);
2926 if (local->fCollectionProxy==
nullptr) local->fCollectionProxy =
fCollectionProxy->Generate();
2927 return local->fCollectionProxy;
2938 TClassLocalStorage *local = TClassLocalStorage::GetStorage(
this);
2940 if (local->fStreamer==
nullptr) {
2941 local->fStreamer =
fStreamer->Generate();
2942 const std::type_info &orig = (
typeid(*fStreamer) );
2943 if (!local->fStreamer) {
2944 Warning(
"GetStreamer",
"For %s, the TClassStreamer (%s) passed's call to Generate failed!",
GetName(),orig.name());
2946 const std::type_info © = (
typeid(*local->fStreamer) );
2947 if (strcmp(orig.name(),copy.name())!=0) {
2948 Warning(
"GetStreamer",
"For %s, the TClassStreamer passed does not properly implement the Generate method (%s vs %s)\n",
GetName(),orig.name(),copy.name());
2952 return local->fStreamer;
3001 if (!
name || !
name[0])
return nullptr;
3003 if (strstr(
name,
"(anonymous)"))
return nullptr;
3004 if (strstr(
name,
"(unnamed)"))
return nullptr;
3005 if (strncmp(
name,
"class ",6)==0)
name += 6;
3006 if (strncmp(
name,
"struct ",7)==0)
name += 7;
3008 if (!
gROOT->GetListOfClasses())
return nullptr;
3067 TClass *loadedcl = (dict)();
3077 bool disableAutoParsing =
gInterpreter->IsAutoParsingSuspended();
3080 static const bool requestDisableAutoParsing =
3081 !
gEnv->GetValue(
"Root.TClass.GetClass.AutoParsing",
true) ||
3082 gSystem->Getenv(
"ROOT_DISABLE_TCLASS_GET_CLASS_AUTOPARSING") !=
nullptr;
3083 if (requestDisableAutoParsing)
3084 disableAutoParsing =
true;
3090 std::string normalizedName;
3099 if (type->GetType() > 0)
3103 normalizedName = type->GetTypeName();
3104 nameChanged =
kTRUE;
3112 if (normalizedName !=
name) {
3113 cl = (
TClass*)
gROOT->GetListOfClasses()->FindObject(normalizedName.c_str());
3122 nameChanged =
kTRUE;
3125 normalizedName = cl->
GetName();
3140 auto loadClass = [](
const char *requestedname) ->
TClass* {
3143 TClass *loadedcl = (dict)();
3154 if(
TClass *loadedcl = loadClass(normalizedName.c_str()))
3159 if (
TClass *loadedcl = loadClass(normalizedName.c_str()))
3171 std::string normalizedNameAfterAutoLoad;
3173 nameChanged = normalizedNameAfterAutoLoad != normalizedName;
3174 normalizedName = normalizedNameAfterAutoLoad;
3188 if (!ispair && !ispairbase) {
3189 if (
TDataType* theDataType =
gROOT->GetType(normalizedName.c_str())){
3191 auto underlyingTypeName = theDataType->GetTypeName();
3208 if (hint_pair_offset && hint_pair_size) {
3216 static constexpr size_t slen = std::char_traits<char>::length(
"pair");
3217 static const char *associativeContainer[] = {
"map",
"unordered_map",
"multimap",
3218 "unordered_multimap",
"set",
"unordered_set",
"multiset",
"unordered_multiset" };
3219 for(
auto contname : associativeContainer) {
3220 std::string collname = contname;
3221 collname.append( normalizedName.c_str() + slen );
3228 cl = p->GetValueClass();
3241 std::string::size_type posLess = normalizedName.find(
'<');
3242 if (posLess != std::string::npos) {
3243 gCling->AutoParse(normalizedName.substr(0, posLess).c_str());
3249 printf(
"TClass::GetClass: Header Parsing - The representation of %s was not found in the type system. A lookup in the interpreter is about to be tried: this can cause parsing. This can be avoided selecting %s in the linkdef/selection file.\n",normalizedName.c_str(), normalizedName.c_str());
3251 if (normalizedName.length()) {
3261 auto ci =
gInterpreter->ClassInfo_Factory(normalizedName.c_str());
3263 auto method =
gInterpreter->MethodInfo_Factory(funcDecl);
3269 funcPtr(
nullptr, 0,
nullptr, &res);
3281 std::string alternative;
3282 gInterpreter->GetInterpreterTypeName(normalizedName.c_str(), alternative,
kTRUE);
3283 if (alternative.empty())
3285 const char *altname = alternative.c_str();
3286 if (strncmp(altname,
"std::", 5) == 0) {
3291 if (altname != normalizedName && strcmp(altname,
name) != 0) {
3318 if (!
gROOT->GetListOfClasses())
3326 if (cl && cl->
IsLoaded())
return cl;
3352 if (!load)
return nullptr;
3362 TIter next(
gROOT->GetListOfClassGenerators());
3373 int autoload_old =
gCling->SetClassAutoLoading(1);
3374 if (!autoload_old) {
3376 gCling->SetClassAutoLoading(0);
3381 cl =
GetClass(typeinfo, load, hint_pair_offset, hint_pair_size);
3387 if (hint_pair_offset) {
3392 free(demangled_name);
3415 if (!info || !
gCling->ClassInfo_IsValid(info))
return nullptr;
3416 if (!
gROOT->GetListOfClasses())
return nullptr;
3437 if (!load)
return nullptr;
3439 TClass *loadedcl =
nullptr;
3440 if (cl) loadedcl =
gROOT->LoadClass(cl->
GetName(),silent);
3441 else loadedcl =
gROOT->LoadClass(
name,silent);
3443 if (loadedcl)
return loadedcl;
3468 if (!
gROOT->GetListOfClasses())
return 0;
3473 if (iter.first == iter.second)
return false;
3474 std::vector<TClass*>::iterator vectIt = classes.begin();
3476 vectIt = classes.insert(vectIt, it->second);
3504 || datamember ==
nullptr)
return nullptr;
3507 const char *start_name = datamember;
3508 while (*start_name ==
'*') ++start_name;
3513 if (
const char *s = strchr(start_name,
'[')){
3514 UInt_t len = s-start_name;
3543 if (strchr(
name,
'[')==
nullptr) {
3585 std::string givenName(
name);
3588 std::string::size_type firstBracket = givenName.find_first_of(
"[");
3589 std::string nameNoDim(givenName.substr(0, firstBracket));
3593 std::string objName(obj->
GetName());
3594 std::string::size_type pos = objName.find_first_of(
"[");
3595 if (pos != std::string::npos) {
3598 if (objName == nameNoDim) {
3605 std::ostringstream ptrname;
3606 ptrname <<
"*" << givenName;
3613 std::string::size_type firstDot = givenName.find_first_of(
".");
3614 if (firstDot == std::string::npos) {
3625 std::string::size_type lastDot = givenName.find_last_of(
".");
3626 std::ostringstream starname;
3627 starname << givenName.substr(0, lastDot) <<
".*" << givenName.substr(lastDot + 1);
3643 std::string::size_type bracket = starname.str().find_first_of(
"[");
3644 if (bracket != std::string::npos) {
3653 std::string firstDotName(givenName.substr(firstDot + 1));
3696 if (!
fBase.load()) {
3717 Fatal(
"GetListOfBases",
"gInterpreter not initialized");
3720 if (!
fBase.load()) {
3746 auto temp =
fEnums.load();
3748 if (requestListLoading) {
3763 if (!requestListLoading) {
3818 if (!(*data).IsLoaded())
3821 }
else if (load) (*data).Load();
3832 auto data =
fData.load();
3833 if (data && data->IsLoaded())
3835 }
else if (!load &&
fData)
3876 if (
gDebug>0)
Info(
"GetListOfMethods",
"Header Parsing - Asking for all the methods of class %s: this can involve parsing.",
GetName());
3909 if (
gDebug>0)
Info(
"GetListOfAllPublicMethods",
"Header Parsing - Asking for all the methods of class %s: this can involve parsing.",
GetName());
3939 while ((baseClass = (
TBaseClass *) nextBase())) {
3947 while ((method = (
TMethod*)next())) {
3951 list->AddFirst(method);
3953 if (
m &&
m->GetNargs() == method->
GetNargs())
3978 return cl->IsLoaded();
4006 TIter nextMemb(ldm);
4017 TClass* dmTClass =
nullptr;
4037 for (
int i = 0; i < 2; i++) {
4053 if (
this == sCIString)
return;
4065 auto checkDicts = [&](
const string &clName){
4072 if (cl && !cl->HasDictionary()) {
4073 cl->GetMissingDictionariesWithRecursionCheck(result, visited, recurse);
4077 const auto &elements = splitType.
fElements;
4078 const auto &templName = elements[0];
4081 if (templName ==
"pair") {
4089 if (templName ==
"unique_ptr" || templName ==
"array") {
4090 checkDicts(elements[1]);
4097 if (templName ==
"tuple") {
4100 const auto nTemplArgs = elements.size() - 1;
4102 for (
auto iTemplArg = 1U; iTemplArg < nTemplArgs; ++iTemplArg) {
4103 checkDicts(elements[iTemplArg]);
4152 if (
this == sCIString)
return;
4161 if (strncmp(
fName,
"unique_ptr<", 11) == 0 || strncmp(
fName,
"array<", 6) == 0 || strncmp(
fName,
"tuple<", 6) == 0) {
4214 while ((acl = (
TClass*)nextClass())) {
4215 if (acl == newcl)
continue;
4220 info->
Update(
this, newcl);
4232 Warning(
"ResetClassInfo(Long_t tagnum)",
"Call to deprecated interface (does nothing)");
4281 (*fUsingData).Unload();
4285 (*fMethod).Unload();
4319 if (options==
nullptr || options[0]==0)
return;
4321 if (strstr(options,
"streamerinfo")!=
nullptr) {
4325 std::map<std::string, TObjArray*>::iterator it;
4326 std::map<std::string, TObjArray*>::iterator end = (*fConversionStreamerInfo).end();
4327 for( it = (*fConversionStreamerInfo).begin(); it != end; ++it ) {
4328 it->second->ls(options);
4354 TClass *classPtr =
nullptr;
4355 TIter next(methodList);
4357 while ((method = (
TMethod*) next())) {
4359 if (classPtr != method->
GetClass()) {
4367 TIter nextarg(margsList);
4368 while ((methodArg = (
TMethodArg*)nextarg())) {
4418 if(
fMethod.compare_exchange_strong(expected, temp.get()) ) {
4454 m =
c->GetMethodAllAny(method);
4476 Fatal(
"GetMethod",
"gInterpreter not initialized");
4482 if (!decl)
return nullptr;
4489 "\nDid not find matching TMethod <%s> with \"%s\" %sfor %s",
4490 method,params,objectIsConst ?
"const " :
"",
GetName());
4500 return static_cast<TMethod *
>(method);
4503 if (
auto base =
static_cast<TBaseClass *
>(item)->GetClassPointer())
4504 if (
TFunction* method = base->FindClassOrBaseMethodWithId(declId))
4505 return static_cast<TMethod *
>(method);
4522 Fatal(
"GetMethodWithPrototype",
"gInterpreter not initialized");
4526 objectIsConst, mode);
4528 if (!decl)
return nullptr;
4531 Error(
"GetMethodWithPrototype",
4532 "\nDid not find matching TMethod <%s> with \"%s\" %sfor %s",
4533 method,
proto,objectIsConst ?
"const " :
"",
GetName());
4548 if (faddr == (
Longptr_t)
m->InterfaceMethod())
4567 Fatal(
"GetClassMethod",
"gInterpreter not initialized");
4573 if (!decl)
return nullptr;
4593 Fatal(
"GetClassMethodWithPrototype",
"gInterpreter not initialized");
4600 if (!decl)
return nullptr;
4698 if ((version < -1) || (version >= (
fStreamerInfo->GetSize()-1))) {
4699 Error(
"GetStreamerInfo",
"class: %s, attempting to access a wrong version: %d",
GetName(), version);
4718 TMmallocDescTemp setreset;
4727 sinfo->
Build(silent);
4772 newname +=
"@@emulated";
4797 for (
Int_t i = -1; sinfo ==
nullptr && i < ninfos; ++i)
4810 Error(
"GetStreamerInfoAbstractEmulated",
"could not create TVirtualStreamerInfo");
4835 newname +=
"@@emulated";
4850 if (!sinfo && (checksum !=
fCheckSum)) {
4860 for (
Int_t i = -1; sinfo ==
nullptr && i < ninfos; ++i)
4873 Error(
"GetStreamerInfoAbstractEmulated",
"could not create TVirtualStreamerInfo");
4920 Error(
"IgnoreTObjectStreamer",
"Must be called before the creation of StreamerInfo");
4946 if (cl ==
this)
return kTRUE;
4956 if (!clbase)
return kFALSE;
4975 if (cl ==
this)
return obj;
5050 auto obj =
NewObject(defConstructor, quiet);
5051 if (obj.GetPtr() && obj.GetAllocator()) {
5055 return obj.GetPtr();
5077 Error(
"New",
"cannot create object of class %s",
GetName());
5094 Error(
"New",
"cannot create object of class %s",
GetName());
5106 Error(
"New",
"cannot create object of class %s",
GetName());
5135 p = { sinfo->
New(), sinfo};
5145 Error(
"New",
"Failed to construct class '%s' using streamer info",
GetName());
5150 Fatal(
"New",
"This cannot happen!");
5163 auto obj =
NewObject(arena, defConstructor);
5164 if (obj.GetPtr() && obj.GetAllocator()) {
5168 return obj.GetPtr();
5190 Error(
"New with placement",
"cannot create object of class %s version %d at address %p",
GetName(),
fClassVersion, arena);
5206 Error(
"New with placement",
"cannot create object of class %s version %d at address %p",
GetName(),
fClassVersion, arena);
5235 Error(
"New with placement",
"Cannot construct class '%s' version %d at address %p, no streamer info available!",
GetName(),
fClassVersion, arena);
5241 p = { sinfo->
New(arena), sinfo };
5251 Error(
"New with placement",
"This cannot happen!");
5266 if (obj.GetPtr() && obj.GetAllocator()) {
5270 return obj.GetPtr();
5344 p = { sinfo->
NewArray(nElements), sinfo };
5354 Error(
"NewArray",
"This cannot happen!");
5368 if (obj.GetPtr() && obj.GetAllocator()) {
5372 return obj.GetPtr();
5394 Error(
"NewArray with placement",
"cannot create object of class %s version %d at address %p",
GetName(),
fClassVersion, arena);
5410 Error(
"NewArray with placement",
"cannot create object of class %s version %d at address %p",
GetName(),
fClassVersion, arena);
5439 Error(
"NewArray with placement",
"Cannot construct class '%s' version %d at address %p, no streamer info available!",
GetName(),
fClassVersion, arena);
5445 p = { sinfo->
NewArray(nElements, arena), sinfo };
5461 Error(
"NewArray with placement",
"This cannot happen!");
5473 if (obj ==
nullptr)
return;
5480 }
else if ((!dtorOnly) &&
fDelete) {
5523 objVer = iter->second;
5525 currentVersion =
kTRUE;
5532 if (!inRepo || currentVersion) {
5539 Error(
"Destructor",
"No streamer info available for class '%s' version %d at address %p, cannot destruct emulated object!",
GetName(),
fClassVersion, p);
5545 Error(
"Destructor",
"Doing Dump() ...");
5558 Error(
"Destructor",
"No streamer info available for class '%s' version %d, cannot destruct object at addr: %p",
GetName(), objVer, p);
5565 Error(
"Destructor2",
"Doing Dump() ...");
5576 Error(
"Destructor",
"This cannot happen! (class %s)",
GetName());
5586 if (obj.
GetPtr() ==
nullptr)
5602 if (ary ==
nullptr)
return;
5609 Error(
"DeleteArray",
"Destructor only is not supported!");
5648 objVer = iter->second;
5650 currentVersion =
kTRUE;
5657 if (!inRepo || currentVersion) {
5664 Error(
"DeleteArray",
"No streamer info available for class '%s' version %d at address %p, cannot destruct object!",
GetName(),
fClassVersion, ary);
5670 Error(
"DeleteArray",
"Doing Dump() ...");
5683 Error(
"DeleteArray",
"No streamer info available for class '%s' version %d at address %p, cannot destruct object!",
GetName(), objVer, ary);
5690 Error(
"DeleteArray",
"Doing Dump() ...");
5702 Error(
"DeleteArray",
"This cannot happen! (class '%s')",
GetName());
5712 if (obj.
GetPtr() ==
nullptr)
return;
5794 Fatal(
"TClass::GetClassAlignment",
"Cannot determine alignment for collection proxy of class %s.",
GetName());
5797 return alignof(std::vector<char>);
5820 char *s =
new char[maxsize];
5824 b.ReadString(s, maxsize);
5825 while (strlen(s) == (maxsize - 1)) {
5827 b.SetBufferOffset(pos);
5828 maxsize = 2*maxsize;
5830 s =
new char[maxsize];
5831 b.ReadString(s, maxsize);
5836 ::Error(
"TClass::Load",
"dictionary of class %s not found", s);
5860 if (result)
return result;
5908 TIter next(
gROOT->GetListOfClassGenerators());
5935 bool autoParse = !
gInterpreter->IsAutoParsingSuspended();
5949 ::Error(
"TClass::LoadClassInfo",
"no interpreter information for class %s is available"
5950 " even though it has a TClass initialization routine.",
5976 const char *dfil,
const char *ifil,
5981 TMmallocDescTemp setreset;
5982 return new TClass(cname,
id, info, isa, dfil, ifil, dl, il);
5990 const char *dfil,
const char *ifil,
5995 TMmallocDescTemp setreset;
5996 return new TClass(cname,
id, dfil, ifil, dl, il);
6102 The class %s transitioned from not having a specified class version\n\
6103 to having a specified class version (the current class version is %d).\n\
6104 However too many different non-versioned layouts of the class have\n\
6105 already been loaded so far. To work around this problem you can\n\
6106 load fewer 'old' file in the same ROOT session or load the C++ library\n\
6107 describing the class %s before opening the files or increase the version\n\
6108 number of the class for example ClassDef(%s,%d).\n\
6109 Do not try to write objects with the current class definition,\n\
6110 the files might not be readable.\n",
6114 The StreamerInfo version %d for the class %s which was read\n\
6115 from a file previously opened has the same version as the active class\n\
6116 but a different checksum. You should update the version to ClassDef(%s,%d).\n\
6117 Do not try to write objects with the current class definition,\n\
6118 the files will not be readable.\n"
6129 if (strncmp(
GetName(),
"map<", 4) == 0)
6131 else if (strncmp(
GetName(),
"multimap<", 9) == 0)
6133 else if (strncmp(
GetName(),
"unordered_map<", 14) == 0)
6135 else if (strncmp(
GetName(),
"unordered_multimap<", 19) == 0)
6138 std::string pairname(
"pair");
6139 pairname.append(
GetName() + noffset);
6141 if ( pcl && !pcl->IsLoaded() && !pcl->IsSyntheticPair() )
6147 while (
auto acl = (
TClass*)nextClass()) {
6148 if (acl ==
this)
continue;
6149 if (acl->fCollectionProxy && acl->fCollectionProxy->GetValueClass() == pcl) {
6150 acl->fCollectionProxy->Reset();
6154 TIter next(pcl->GetStreamerInfos());
6156 if (info->IsBuilt()) {
6157 info->Clear(
"build");
6217 TMmallocDescTemp setreset;
6430 Fatal(
"SetUnloaded",
"The TClass for %s is being unloaded when in state %d\n",
6454 (*fMethod).Unload();
6460 (*fUsingData).Unload();
6559 //info is empty. Let's build the default Streamer descriptor
6561 char *temp = new char[10000];
6565 //add list of base classes
6566 TIter nextb(GetListOfBases());
6568 while ((base = (TBaseClass*) nextb())) {
6569 snprintf(local,100,"%s;",base->GetName());
6570 strlcat(temp,local,10000);
6573 //add list of data members and types
6574 TIter nextd(GetListOfDataMembers());
6575 while ((dm = (TDataMember *) nextd())) {
6576 if (dm->IsEnum()) continue;
6577 if (!dm->IsPersistent()) continue;
6578 Long_t property = dm->Property();
6579 if (property & kIsStatic) continue;
6580 TClass *acl = TClass::GetClass(dm->GetTypeName(),update);
6583 if (acl->GetClassVersion() == 0) continue;
6586 // dm->GetArrayIndex() returns an empty string if it does not
6588 const char * index = dm->GetArrayIndex();
6589 if (strlen(index)==0)
6590 snprintf(local,100,"%s %s;",dm->GetFullTypeName(),dm->GetName());
6592 snprintf(local,100,"%s %s[%s];",dm->GetFullTypeName(),dm->GetName(),index);
6593 strlcat(temp,local,10000);
6595 //fStreamerInfo = temp;
6684 for (
int i=0; i<il; i++)
id =
id*3+
name[i];
6693 TIter nextBase(tlb);
6702 for (
int i=0; i<il; i++)
id =
id*3+
name[i];
6705 Error(
"GetCheckSum",
"Calculating the checksum for (%s) requires the base class (%s) meta information to be available!",
6714 TList *tlm = ((
TClass*)
this)->GetListOfDataMembers();
6716 TIter nextMemb(tlm);
6732 for (i=0; i<il; i++)
id =
id*3+
name[i];
6744 type.
ReplaceAll(
"ULong64_t",
"unsigned long long");
6748 if (type==
"signed char") type =
"char";
6760 for (i=0; i<il; i++)
id =
id*3+type[i];
6764 for (
int ii=0;ii<dim;ii++)
id =
id*3+tdm->
GetMaxIndex(ii);
6771 left = strstr(tdm->
GetTitle(),
"[");
6773 const char *right = strstr(left,
"]");
6776 while (left != right) {
6821 Error(
"AdoptMemberStreamer",
6822 "Cannot adopt member streamer for %s::%s: StreamerInfo for the class is already compiled.",
GetName(),
6844 Error(
"AdoptMemberStreamer",
"Cannot adopt member streamer for %s::%s",
GetName(),
name);
6868 return b.ReadClassBuffer(
this,pointer,version,
start,count);
6877 return b.ReadClassBuffer(
this,pointer);
6889 b.WriteClassBuffer(
this,pointer);
6902 streamer->
Stream(
b,
object,onfile_class);
6924 if (
R__likely(onfile_class ==
nullptr || pThis == onfile_class)) {
6941 if (
b.IsReading()) {
6942 b.ReadClassEmulated(pThis,
object, onfile_class);
6944 b.WriteClassBuffer(pThis,
object);
6975 if (
b.IsReading()) {
6976 b.ReadClassBuffer(pThis,
object, onfile_class);
6980 b.WriteClassBuffer(pThis,
object);
6999 pThis->
Fatal(
"StreamerDefault",
"fStreamerImpl not properly initialized (%d)", pThis->
fStreamerType);
7171 for (
Int_t i=-1;i<ninfos;++i) {
7193 for (
Int_t i=-1;i<ninfos;i++) {
7197 if (!info)
continue;
7238 std::map<std::string, TObjArray*>::iterator it;
7241 it = (*fConversionStreamerInfo).find( cl->
GetName() );
7243 if( it != (*fConversionStreamerInfo).end() ) {
7247 if( arr && version >= -1 && version < arr->GetSize() && arr->
At( version ) )
7259 if( version >= -1 && version < clSI->GetSize() )
7302 (*fConversionStreamerInfo)[cl->
GetName()] = arr;
7305 Error(
"GetConversionStreamerInfo",
"Conversion StreamerInfo from %s to %s version %d has already been created",
7346 std::map<std::string, TObjArray*>::iterator it;
7350 it = (*fConversionStreamerInfo).find( cl->
GetName() );
7352 if( it != (*fConversionStreamerInfo).end() ) {
7408 (*fConversionStreamerInfo)[cl->
GetName()] = arr;
7422 std::vector<::ROOT::Internal::TSchemaHelper> &&rules)
7428 auto rset = cl->GetSchemaRules(
kTRUE);
7429 for (
const auto &it : rules) {
7434 "TGenericClassInfo",
7435 "The rule for class: \"%s\": version, \"%s\" and data members: \"%s\" has been skipped because %s.",
7436 cl->GetName(), it.fVersion.c_str(), it.fTarget.c_str(), errmsg.
Data());
7442 auto ans = registry.try_emplace(classname, std::move(rules));
7444 ans.first->second.insert(ans.first->second.end(), rules.begin(), rules.end());
7461 Error(
"RegisterStreamerInfo",
7462 "Register StreamerInfo for %s on non-empty slot (%d).",
7506 static const char *handVerified[] = {
7507 "TEnvRec",
"TDataType",
"TObjArray",
"TList",
"THashList",
7508 "TClass",
"TCling",
"TInterpreter",
"TMethod",
"ROOT::Internal::TCheckHashRecursiveRemoveConsistency",
7509 "TCheckHashRecursiveRemoveConsistency",
"TGWindow",
7510 "TDirectory",
"TDirectoryFile",
"TObject",
"TH1",
7511 "TQClass",
"TGlobal" };
7513 if (cname && cname[0]) {
7514 for (
auto cursor : handVerified) {
7515 if (strcmp(cname, cursor) == 0)
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
int Int_t
Signed integer 4 bytes (int).
long Longptr_t
Integer large enough to hold a pointer (platform-dependent).
short Version_t
Class version identifier (short).
unsigned char UChar_t
Unsigned Character 1 byte (unsigned char).
int Ssiz_t
String size (currently int).
unsigned long ULongptr_t
Unsigned integer large enough to hold a pointer (platform-dependent).
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int).
unsigned long ULong_t
Unsigned long integer 4 bytes (unsigned long). Size depends on architecture.
long Long_t
Signed long integer 4 bytes (long). Size depends on architecture.
bool Bool_t
Boolean (0=false, 1=true) (bool).
constexpr Ssiz_t kNPOS
The equivalent of std::string::npos for the ROOT class TString.
const char Option_t
Option string (const char).
TClass *(* DictFuncPtr_t)()
void(* MemberStreamerFunc_t)(TBuffer &, void *, Int_t)
TClass *(* IsAGlobalFunc_t)(const TClass *, const void *obj)
void(* ClassStreamerFunc_t)(TBuffer &, void *)
void(* ClassConvStreamerFunc_t)(TBuffer &, void *, const TClass *)
externTClassTable * gClassTable
TClass::ENewType & TClass__GetCallingNew()
static bool IsFromRootCling()
ROOT::TMapDeclIdToTClass DeclIdMap_t
ROOT::TMapTypeToTClass IdMap_t
void(* tcling_callfunc_Wrapper_t)(void *, int, void **, void *)
const Bool_t kIterBackward
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
externTInterpreter * gCling
externTVirtualMutex * gInterpreterMutex
externTVirtualMutex * gROOTMutex
void Printf(const char *fmt,...)
Formats a string in a circular formatting buffer and prints the string.
R__EXTERN void **(* gThreadTsd)(void *, Int_t)
#define R__LOCKGUARD2(mutex)
#define R__LOCKGUARD(mutex)
#define R__WRITE_LOCKGUARD(mutex)
#define R__READ_LOCKGUARD(mutex)
Bool_t AddRule(TSchemaRule *rule, EConsistencyCheck checkConsistency=kCheckAll, TString *errmsg=nullptr)
The consistency check always fails if the TClass object was not set!
static bool Check(TClass &classRef)
A spin mutex-as-code-guard class.
DeclIdMap_t::key_type key_type
DeclIdMap_t::size_type size_type
multimap< TDictionary::DeclId_t, TClass * > DeclIdMap_t
size_type CountElementsWithKey(const key_type &key)
std::pair< const_iterator, const_iterator > equal_range
equal_range Find(const key_type &key) const
void Remove(const key_type &key)
DeclIdMap_t::const_iterator const_iterator
DeclIdMap_t::mapped_type mapped_type
void Add(const key_type &key, mapped_type obj)
mapped_type Find(const key_type &key) const
IdMap_t::size_type size_type
IdMap_t::mapped_type mapped_type
IdMap_t::const_iterator const_iterator
std::map< std::string, TClass * > IdMap_t
IdMap_t::key_type key_type
void Remove(const key_type &key)
void Add(const key_type &key, mapped_type &obj)
Bool_t SetFromRule(const char *rule)
Set the content fot this object from the rule See TClass::AddRule for details on the syntax.
const char * GetTargetString() const
Get the target data members of this rule as a simple string (i.e. the in memory data member).
const char * GetVersion() const
Get the version string.
const char * GetTargetClass() const
Get the targte class of this rule (i.e. the in memory class).
~TAutoInspector() override
Bool_t IsTreatingNonAccessibleTypes() override
TAutoInspector(TBrowser *b)
void Inspect(TClass *cl, const char *parent, const char *name, const void *addr, Bool_t isTransient) override
This method is called from ShowMembers() via AutoBrowse().
Each class (see TClass) has a linked list of its base class(es).
Int_t GetDelta()
Get offset from "this" to part of base class.
ROOT::ESTLType IsSTLContainer()
Return which type (if any) of STL container the data member is.
Long_t Property() const override
Get property description word. For meaning of bits see EProperty.
TClass * GetClassPointer(Bool_t load=kTRUE)
Get pointer to the base class TClass.
Using a TBrowser one can browse all ROOT objects.
Buffer base class used for serializing objects.
void Inspect(TClass *cl, const char *parent, const char *name, const void *addr, Bool_t isTransient) override
This method is called from ShowMembers() via BuildRealdata().
TBuildRealData(void *obj, TClass *cl)
Objects following this interface can be passed onto the TROOT object to implement a user customized w...
virtual TClass * GetClass(const char *classname, Bool_t load)=0
TClassRef is used to implement a permanent reference to a TClass object.
virtual void Stream(TBuffer &b, void *objp, const TClass *onfileClass)
static DictFuncPtr_t GetDict(const char *cname)
Given the class name returns the Dictionary() function of a class (uses hash of name).
static TProtoClass * GetProtoNorm(const char *cname)
Given the class normalized name returns the TClassProto object for the class.
static DictFuncPtr_t GetDictNorm(const char *cname)
Given the normalized class name returns the Dictionary() function of a class (uses hash of name).
~InsertTClassInRegistryRAII()
TDeclNameRegistry & fNoInfoOrEmuOrFwdDeclNameRegistry
InsertTClassInRegistryRAII(TClass::EState &state, const char *name, TDeclNameRegistry &emuRegistry)
Bool_t HasDeclName(const char *name) const
std::unordered_set< std::string > fClassNamesSet
void AddQualifiedName(const char *name)
Extract this part of the name.
TDeclNameRegistry(Int_t verbLevel=0)
TDeclNameRegistry class constructor.
std::atomic_flag fSpinLock
TClass instances represent classes, structs and namespaces in the ROOT type system.
UInt_t GetCheckSum(ECheckSum code=kCurrentCheckSum) const
Call GetCheckSum with validity check.
Bool_t IsSyntheticPair() const
RepoCont_t fObjectVersionRepository
ShowMembersFunc_t fShowMembers
TDataMember * GetDataMember(const char *datamember) const
Return pointer to datamember object with name "datamember".
TVirtualIsAProxy * fIsA
!pointer to the class's IsA proxy.
TList * GetListOfUsingDataMembers(Bool_t load=kTRUE)
Return list containing the TDataMembers of using declarations of a class.
void ForceReload(TClass *oldcl)
we found at least one equivalent.
ROOT::DelArrFunc_t fDeleteArray
Bool_t CanSplit() const
Return true if the data member of this TClass can be saved separately.
TClassStreamer * fStreamer
void SetDirectoryAutoAdd(ROOT::DirAutoAdd_t dirAutoAddFunc)
Install a new wrapper around the directory auto add function.
void * NewArray(Long_t nElements, ENewType defConstructor=kClassNew) const
Return a pointer to a newly allocated array of objects of this class.
static TDeclNameRegistry fNoInfoOrEmuOrFwdDeclNameRegistry
TListOfFunctionTemplates * fFuncTemplate
ClassStreamerFunc_t fStreamerFunc
void AdoptReferenceProxy(TVirtualRefProxy *proxy)
Adopt the Reference proxy pointer to indicate that this class represents a reference.
TMethod * GetClassMethod(Longptr_t faddr)
Look for a method in this class that has the interface function address faddr.
TVirtualStreamerInfo * DetermineCurrentStreamerInfo()
Determine and set pointer to current TVirtualStreamerInfo.
void Browse(TBrowser *b) override
This method is called by a browser to get the class information.
ROOT::ESTLType GetCollectionType() const
Return the 'type' of the STL the TClass is representing.
void Draw(Option_t *option="") override
Draw detailed class inheritance structure.
void ResetInstanceCount()
ClassStreamerFunc_t GetStreamerFunc() const
Get a wrapper/accessor function around this class custom streamer (member function).
void RemoveStreamerInfo(Int_t slot)
Remove and delete the StreamerInfo in the given slot.
void SetCanSplit(Int_t splitmode)
Set the splitability of this class:
bool AdoptMemberStreamer(const char *name, TMemberStreamer *strm)
Adopt the TMemberStreamer pointer to by p and use it to Stream non basic member name.
TList * CreateListOfDataMembers(std::atomic< TListOfDataMembers * > &data, TDictionary::EMemberSelection selection, bool load)
Create the list containing the TDataMembers (of actual data members or members pulled in through usin...
TVirtualStreamerInfo * GetStreamerInfoAbstractEmulated(Int_t version=0) const
For the case where the requestor class is emulated and this class is abstract, returns a pointer to t...
void * New(ENewType defConstructor=kClassNew, Bool_t quiet=kFALSE) const
Return a pointer to a newly allocated object of this class.
void SetMerge(ROOT::MergeFunc_t mergeFunc)
Install a new wrapper around 'Merge'.
void SetBrowse(ROOT::BrowseFunc_t browseFunc)
Install a new wrapper around 'Browse'.
ConvSIMap_t fConversionStreamerInfo
ROOT::DirAutoAdd_t fDirAutoAdd
Bool_t HasDataMemberInfo() const
TVirtualRefProxy * fRefProxy
!Pointer to reference proxy if this class represents a reference
TList * GetMenuList() const
Return the list of menu items associated with the class.
TMethod * GetMethod(const char *method, const char *params, Bool_t objectIsConst=kFALSE)
Find the best method (if there is one) matching the parameters.
static TClass * Load(TBuffer &b)
Load class description from I/O buffer and return class object.
EState fState
!Current 'state' of the class (Emulated,Interpreted,Loaded)
ROOT::DesFunc_t GetDestructor() const
Return the wrapper around the destructor.
TMethod * GetMethodWithPrototype(const char *method, const char *proto, Bool_t objectIsConst=kFALSE, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch)
Find the method with a given prototype.
void CopyCollectionProxy(const TVirtualCollectionProxy &)
Replaces the collection proxy for this class.
Int_t fStreamerType
!cached of the streaming method to use
static void RegisterReadRules(ROOT::TSchemaRule::RuleType_t, const char *classname, std::vector<::ROOT::Internal::TSchemaHelper > &&rules)
Register a set of read rules for a target class.
void ls(Option_t *opt="") const override
The ls function lists the contents of a class on stdout.
std::atomic< TList * > fBase
std::atomic< Char_t > fCanSplit
!Indicates whether this class can be split or not. Values are -1, 0, 1, 2
Bool_t HasDictionary() const
Check whether a class has a dictionary or not.
const TList * GetListOfAllPublicMethods(Bool_t load=kTRUE)
Returns a list of all public methods of this class and its base classes.
TList * GetListOfAllPublicDataMembers(Bool_t load=kTRUE)
Returns a list of all public data members of this class and its base classes.
TClass(const TClass &tc)=delete
static void AddClassToDeclIdMap(TDictionary::DeclId_t id, TClass *cl)
static: Add a TClass* to the map of classes.
virtual ~TClass()
TClass dtor. Deletes all list that might have been created.
Bool_t fIsSyntheticPair
Indicates whether this class represents a pair and was not created from a dictionary nor interpreter ...
void Destructor(void *obj, Bool_t dtorOnly=kFALSE)
Explicitly call destructor for object.
std::atomic< TVirtualStreamerInfo * > fCurrentInfo
!cached current streamer info.
TList * GetListOfFunctionTemplates(Bool_t load=kTRUE)
Return TListOfFunctionTemplates for a class.
void * DynamicCast(const TClass *base, void *obj, Bool_t up=kTRUE)
Cast obj of this class type up to baseclass cl if up is true.
const char * fImplFileName
void RegisterStreamerInfo(TVirtualStreamerInfo *info)
Register the StreamerInfo in the given slot, change the State of the TClass as appropriate.
std::atomic< UInt_t > fCheckSum
void UnregisterAddressInRepository(const char *where, void *location, const TClass *what) const
std::atomic< TListOfFunctions * > fMethod
static void RemoveClassDeclId(TDictionary::DeclId_t id)
void SetNewArray(ROOT::NewArrFunc_t newArrayFunc)
Install a new wrapper around 'new []'.
Bool_t CallShowMembers(const void *obj, TMemberInspector &insp, Bool_t isTransient=kFALSE) const
Call ShowMembers() on the obj of this class type, passing insp and parent.
const char * fDeclFileName
void SetCollectionProxy(const ROOT::Detail::TCollectionProxyInfo &)
Create the collection proxy object (and the streamer object) from using the information in the TColle...
static Bool_t HasDictionarySelection(const char *clname)
Check whether a class has a dictionary or ROOT can load one.
void AdoptSchemaRules(ROOT::Detail::TSchemaRuleSet *rules)
Adopt a new set of Data Model Evolution rules.
static void StreamerInstrumented(const TClass *pThis, void *object, TBuffer &b, const TClass *onfile_class)
Case of instrumented class with a library.
TVirtualStreamerInfo * SetStreamerInfo(Int_t version, const char *info="")
Info is a string describing the names and types of attributes written by the class Streamer function.
static std::atomic< Int_t > fgClassCount
TVirtualStreamerInfo * GetCurrentStreamerInfo()
ROOT::DirAutoAdd_t GetDirectoryAutoAdd() const
Return the wrapper around the directory auto add function.
void AddImplFile(const char *filename, int line)
TCollection * GetListOfMethodOverloads(const char *name) const
Return the collection of functions named "name".
std::atomic< TListOfEnums * > fEnums
static Bool_t HasNoInfoOrEmuOrFwdDeclaredDecl(const char *)
TVirtualMutex * fOVRMutex
TList * GetListOfEnums(Bool_t load=kTRUE)
Return a list containing the TEnums of a class.
Bool_t IsStartingWithTObject() const
Returns true if this class inherits from TObject and if the start of the TObject parts is at the very...
TList * GetListOfMethods(Bool_t load=kTRUE)
Return list containing the TMethods of a class.
size_t GetClassAlignment() const
Return the alignment requirement (in bytes) for objects of this class.
TClass()
Internal, default constructor.
Int_t GetNmethods()
Return the number of methods of this class Note that in case the list of methods is not yet created,...
std::atomic< Bool_t > fIsOffsetStreamerSet
!saved remember if fOffsetStreamer has been set.
void IgnoreTObjectStreamer(Bool_t ignore=kTRUE)
When the class kIgnoreTObjectStreamer bit is set, the automatically generated Streamer will not call ...
TClassStreamer * GetStreamer() const
Return the Streamer Class allowing streaming (if any).
static IdMap_t * GetIdMap()
void SetDelete(ROOT::DelFunc_t deleteFunc)
Install a new wrapper around 'delete'.
static Int_t AutoBrowse(TObject *obj, TBrowser *browser)
Browse external object inherited from TObject.
ROOT::NewFunc_t GetNew() const
Return the wrapper around new ThisClass().
TClass * GetBaseClass(const char *classname)
Return pointer to the base class "classname".
Longptr_t GetDataMemberOffset(const char *membername) const
return offset for member name.
Int_t GetNdata()
Return the number of data members of this class Note that in case the list of data members is not yet...
void SetDestructor(ROOT::DesFunc_t destructorFunc)
Install a new wrapper around the destructor.
virtual void PostLoadCheck()
Do the initialization that can only be done after the CINT dictionary has been fully populated and ca...
void LoadClassInfo() const
Try to load the ClassInfo if available.
void SetResetAfterMerge(ROOT::ResetAfterMergeFunc_t resetFunc)
Install a new wrapper around 'ResetAfterMerge'.
TVirtualStreamerInfo * GetStreamerInfoImpl(Int_t version, Bool_t silent) const
Bool_t MatchLegacyCheckSum(UInt_t checksum) const
Return true if the checksum passed as argument is one of the checksum value produced by the older che...
TViewPubFunctions * fAllPubMethod
Bool_t HasInterpreterInfo() const
static void AddClass(TClass *cl)
static: Add a class to the list and map of classes.
void GetMissingDictionariesForBaseClasses(TCollection &result, TCollection &visited, bool recurse)
Verify the base classes always.
ROOT::Detail::TSchemaRuleSet * fSchemaRules
! Schema evolution rules
std::atomic< Long_t > fProperty
!Property See TClass::Property() for details
static void StreamerDefault(const TClass *pThis, void *object, TBuffer &b, const TClass *onfile_class)
Default streaming in cases where either we have no way to know what to do or if Property() has not ye...
void SetUnloaded()
Call this method to indicate that the shared library containing this class's code has been removed (u...
ROOT::DelArrFunc_t GetDeleteArray() const
Return the wrapper around delete [] ThisObject.
Bool_t HasInterpreterInfoInMemory() const
ClassConvStreamerFunc_t fConvStreamerFunc
void BuildRealData(void *pointer=nullptr, Bool_t isTransient=kFALSE)
Build a full list of persistent data members.
void SetRuntimeProperties()
Internal routine to set calculate the class properties that can only be known at run-time,...
void BuildEmulatedRealData(const char *name, Longptr_t offset, TClass *cl, Bool_t isTransient=kFALSE)
Build the list of real data for an emulated class.
std::unordered_map< std::string, std::vector< ROOT::Internal::TSchemaHelper > > SchemaHelperMap_t
static TClass * LoadClass(const char *requestedname, Bool_t silent)
Helper function used by TClass::GetClass().
const std::type_info * GetTypeInfo() const
void SetStreamerImpl(Int_t streamerType)
Internal routine to set fStreamerImpl based on the value of fStreamerType.
TList * GetListOfDataMembers(Bool_t load=kTRUE)
Return list containing the TDataMembers of a class.
void Move(void *arenaFrom, void *arenaTo) const
Register the fact that an object was moved from the memory location 'arenaFrom' to the memory locatio...
static DeclIdMap_t * GetDeclIdMap()
Short_t GetDeclFileLine() const
void SetStreamerFunc(ClassStreamerFunc_t strm)
Set a wrapper/accessor function around this class custom streamer.
const char * GetImplFileName() const
TList * GetListOfRealData() const
Int_t Size() const
Return size of object of this class.
void SetCurrentStreamerInfo(TVirtualStreamerInfo *info)
Set pointer to current TVirtualStreamerInfo.
static DictFuncPtr_t GetDict(const char *cname)
Return a pointer to the dictionary loading function generated by rootcint.
Longptr_t fOffsetStreamer
!saved info to call Streamer
ROOT::NewArrFunc_t GetNewArray() const
Return the wrapper around new ThisClass[].
static void StreamerTObjectEmulated(const TClass *pThis, void *object, TBuffer &b, const TClass *onfile_class)
Case of TObjects when we do not have the library defining the class.
ROOT::ResetAfterMergeFunc_t GetResetAfterMerge() const
Return the wrapper around Merge.
TMethod * GetClassMethodWithPrototype(const char *name, const char *proto, Bool_t objectIsConst=kFALSE, ROOT::EFunctionMatchMode mode=ROOT::kConversionMatch)
Find the method with a given prototype.
Bool_t CanIgnoreTObjectStreamer()
void SetGlobalIsA(IsAGlobalFunc_t)
This function installs a global IsA function for this class.
void GetMissingDictionariesForMembers(TCollection &result, TCollection &visited, bool recurse)
Verify the Data Members.
TObjArray * fStreamerInfo
const ROOT::Detail::TSchemaRuleSet * GetSchemaRules() const
Return the set of the schema rules if any.
TObject * Clone(const char *newname="") const override
Create a Clone of this TClass object using a different name but using the same 'dictionary'.
TVirtualCollectionProxy * fCollectionProxy
static ENewType IsCallingNew()
Static method returning the defConstructor flag passed to TClass::New().
TList * GetListOfBases()
Return list containing the TBaseClass(es) of a class.
void Store(TBuffer &b) const
Store class description on I/O buffer.
void InterpretedShowMembers(void *obj, TMemberInspector &insp, Bool_t isTransient)
Do a ShowMembers() traversal of all members and base classes' members using the reflection informatio...
static THashTable * fgClassTypedefHash
void Init(const char *name, Version_t cversion, const std::type_info *info, TVirtualIsAProxy *isa, const char *dfil, const char *ifil, Int_t dl, Int_t il, ClassInfo_t *classInfo, Bool_t silent)
Initialize a TClass object.
std::atomic< TListOfDataMembers * > fData
static void StreamerStreamerInfo(const TClass *pThis, void *object, TBuffer &b, const TClass *onfile_class)
Case of where we should directly use the StreamerInfo.
const TObjArray * GetStreamerInfos() const
void SetClassVersion(Version_t version)
Private function.
char * EscapeChars(const char *text) const
Introduce an escape character () in front of a special chars.
const std::type_info * fTypeInfo
std::atomic< TVirtualStreamerInfo * > fLastReadInfo
!cached streamer info used in the last read.
static void StreamerTObject(const TClass *pThis, void *object, TBuffer &b, const TClass *onfile_class)
Case of TObjects.
Bool_t IsLoaded() const
Return true if the shared library of this class is currently in the a process's memory.
static Bool_t AddRule(const char *rule)
Add a schema evolution customization rule.
Bool_t IsTObject() const
Return kTRUE is the class inherits from TObject.
static void RemoveClass(TClass *cl)
static: Remove a class from the list and map of classes
Bool_t HasLocalHashMember() const
Returns true if this class has an definition and/or overload of the member function Hash.
void DeleteArray(void *ary, Bool_t dtorOnly=kFALSE)
Explicitly call operator delete[] for an array.
ClassConvStreamerFunc_t GetConvStreamerFunc() const
Get a wrapper/accessor function around this class custom conversion streamer (member function).
Bool_t IsForeign() const
Return kTRUE is the class is Foreign (the class does not have a Streamer method).
ClassInfo_t * GetClassInfo() const
TViewPubDataMembers * fAllPubData
TVirtualStreamerInfo * GetStreamerInfo(Int_t version=0, Bool_t isTransient=kFALSE) const
returns a pointer to the TVirtualStreamerInfo object for version If the object does not exist,...
Bool_t HasConsistentHashMember()
Return 'true' if we can guarantee that if this class (or any class in this class inheritance hierarch...
void AdoptStreamer(TClassStreamer *strm)
Adopt a TClassStreamer object.
TClass * GetBaseDataMember(const char *datamember)
Return pointer to (base) class that contains datamember.
void Dump() const override
Dump contents of object on stdout.
Bool_t InheritsFrom(const char *cl) const override
Return kTRUE if this class inherits from a class with name "classname".
Int_t GetBaseClassOffset(const TClass *toBase, void *address=nullptr, bool isDerivedObject=true)
ObjectPtr NewObjectArray(Long_t nElements, ENewType defConstructor=kClassNew) const
Return a pointer to a newly allocated array of objects of this class.
TVirtualCollectionProxy * GetCollectionProxy() const
Return the proxy describing the collection (if any).
void ResetCaches()
To clean out all caches.
Long_t ClassProperty() const
Return the C++ property of this class, eg.
const char * GetSharedLibs()
Get the list of shared libraries containing the code for class cls.
void CalculateStreamerOffset() const
Calculate the offset between an object of this class to its base class TObject.
void GetMissingDictionariesForPairElements(TCollection &result, TCollection &visited, bool recurse)
void ReplaceWith(TClass *newcl) const
void RegisterAddressInRepository(const char *where, void *location, const TClass *what) const
Long_t Property() const override
Returns the properties of the TClass as a bit field stored as a Long_t value.
Bool_t HasDefaultConstructor(Bool_t testio=kFALSE) const
Return true if we have access to a constructor usable for I/O.
void GetMenuItems(TList *listitems)
Returns list of methods accessible by context menu.
void SetNew(ROOT::NewFunc_t newFunc)
Install a new wrapper around 'new'.
std::atomic< TMethodCall * > fIsAMethod
!saved info to call a IsA member function
static Int_t ReadRules()
Read the class.rules files from the default location:.
Bool_t CanSplitBaseAllow()
void MoveAddressInRepository(const char *where, void *oldadd, void *newadd, const TClass *what) const
std::atomic< StreamerImpl_t > fStreamerImpl
! Pointer to the function implementing streaming for this class
void SetContextMenuTitle(const char *title)
Change (i.e. set) the title of the TNamed.
void SetMemberStreamer(const char *name, MemberStreamerFunc_t strm)
Install a new member streamer (p will be copied).
std::atomic< TClass ** > fPersistentRef
!Persistent address of pointer to this TClass object and its successors.
IsAGlobalFunc_t fGlobalIsA
TVirtualStreamerInfo * GetConversionStreamerInfo(const char *onfile_classname, Int_t version) const
Return a Conversion StreamerInfo from the class 'classname' for version number 'version' to this clas...
Short_t GetImplFileLine() const
TMethod * GetMethodAllAny(const char *method)
Return pointer to method without looking at parameters.
std::atomic< UChar_t > fRuntimeProperties
! Properties that can only be evaluated at run-time
TVirtualStreamerInfo * FindConversionStreamerInfo(const char *onfile_classname, UInt_t checksum) const
Return a Conversion StreamerInfo from the class 'classname' for the layout represented by 'checksum' ...
Int_t GetBaseClassOffsetRecurse(const TClass *toBase)
Return data member offset to the base class "cl".
ROOT::DelFunc_t GetDelete() const
Return the wrapper around delete ThisObject.
static TClass * LoadClassDefault(const char *requestedname, Bool_t silent)
Helper function used by TClass::GetClass().
void SetClassSize(Int_t sizof)
TMethod * FindClassOrBaseMethodWithId(DeclId_t faddr)
Find a method with decl id in this class or its bases.
static void StreamerExternal(const TClass *pThis, void *object, TBuffer &b, const TClass *onfile_class)
There is special streamer for the class.
Long_t fClassProperty
!C++ Property of the class (is abstract, has virtual table, etc.)
TString fContextMenuTitle
static void StreamerTObjectInitialized(const TClass *pThis, void *object, TBuffer &b, const TClass *onfile_class)
Case of TObjects when fIsOffsetStreamerSet is known to have been set.
static void ConvStreamerInstrumented(const TClass *pThis, void *object, TBuffer &b, const TClass *onfile_class)
Case of instrumented class with a library.
std::atomic< Bool_t > fCanLoadClassInfo
!Indicates whether the ClassInfo is supposed to be available.
void SetConvStreamerFunc(ClassConvStreamerFunc_t strm)
Set a wrapper/accessor function around this class custom conversion streamer.
ROOT::BrowseFunc_t GetBrowse() const
Return the wrapper around Browse.
TVirtualStreamerInfo * FindStreamerInfo(TObjArray *arr, UInt_t checksum) const
Find the TVirtualStreamerInfo in the StreamerInfos corresponding to checksum.
void GetMissingDictionaries(THashTable &result, bool recurse=false)
Get the classes that have a missing dictionary starting from this one.
void MakeCustomMenuList()
Makes a customizable version of the popup menu list, i.e.
TVirtualStreamerInfo * FindStreamerInfoAbstractEmulated(UInt_t checksum) const
For the case where the requestor class is emulated and this class is abstract, returns a pointer to t...
static SchemaHelperMap_t & GetReadRulesRegistry(ROOT::TSchemaRule::RuleType_t type)
Return the registry for the unassigned read rules.
TMethod * GetMethodAny(const char *method)
Return pointer to method without looking at parameters.
TVirtualIsAProxy * GetIsAProxy() const
Return the proxy implementing the IsA functionality.
ROOT::MergeFunc_t GetMerge() const
Return the wrapper around Merge.
ROOT::ResetAfterMergeFunc_t fResetAfterMerge
Bool_t IsFolder() const override
Returns kTRUE in case object contains browsable objects (like containers or lists of other objects).
std::atomic< Bool_t > fHasRootPcmInfo
!Whether info was loaded from a root pcm.
TClass * GetActualClass(const void *object) const
Return a pointer to the real class of the object.
ROOT::DesFunc_t fDestructor
const char * GetDeclFileName() const
Return name of the file containing the declaration of this class.
ObjectPtr NewObject(ENewType defConstructor=kClassNew, Bool_t quiet=kFALSE) const
TRealData * GetRealData(const char *name) const
Return pointer to TRealData element with name "name".
void SetDeleteArray(ROOT::DelArrFunc_t deleteArrayFunc)
Install a new wrapper around 'delete []'.
Bool_t fHasCustomStreamerMember
The class has a Streamer method and it is implemented by the user or an older (not StreamerInfo based...
TFunctionTemplate * GetFunctionTemplate(const char *name)
void ResetClassInfo()
Make sure that the current ClassInfo is up to date.
ROOT::NewArrFunc_t fNewArray
Int_t ReadBuffer(TBuffer &b, void *pointer, Int_t version, UInt_t start, UInt_t count)
Function called by the Streamer functions to deserialize information from buffer b into object at p.
void GetMissingDictionariesWithRecursionCheck(TCollection &result, TCollection &visited, bool recurse)
From the second level of recursion onwards it is different state check.
ROOT::BrowseFunc_t fBrowse
bool IsClassStructOrUnion() const
std::atomic< TListOfDataMembers * > fUsingData
TListOfFunctions * GetMethodList()
Return (create an empty one if needed) the list of functions.
void ResetMenuList()
Resets the menu list to it's standard value.
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
Int_t WriteBuffer(TBuffer &b, void *pointer, const char *info="")
Function called by the Streamer functions to serialize object at p to buffer b.
static TClass * LoadClassCustom(const char *requestedname, Bool_t silent)
Helper function used by TClass::GetClass().
Collection abstract base class.
void ls(Option_t *option="") const override
List (ls) all objects in this collection.
virtual void Add(TObject *obj)=0
TObject * FindObject(const char *name) const override
Find an object in this collection using its name.
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
All ROOT classes may have RTTI (run time type identification) support added.
Int_t GetMaxIndex(Int_t dim) const
Return maximum index for array dimension "dim".
const char * GetTrueTypeName() const
Get the desugared type name of this data member, including const and volatile qualifiers.
Bool_t IsPersistent() const
Long_t Property() const override
Get property description word. For meaning of bits see EProperty.
Int_t GetArrayDim() const
Return number of array dimensions.
Bool_t IsBasic() const
Return true if data member is a basic type, e.g. char, int, long...
Bool_t IsaPointer() const
Return true if data member is a pointer.
TDataType * GetDataType() const
const char * GetTypeName() const
Get the decayed type name of this data member, removing const and volatile qualifiers,...
const char * GetFullTypeName() const
Get the concrete type name of this data member, including const and volatile qualifiers.
Basic data type descriptor (datatype information is obtained from CINT).
Long_t Property() const override
Get property description word. For meaning of bits see EProperty.
const char * AsString(void *buf) const
Return string containing value in buffer formatted according to the basic data type.
TString GetTypeName()
Get basic type of typedef, e,g.: "class TDirectory*" -> "TDirectory".
static TDataType * GetDataType(EDataType type)
Given a EDataType type, get the TDataType* that represents it.
static void GetDateTime(UInt_t datetime, Int_t &date, Int_t &time)
Static function that returns the date and time.
EMemberSelection
Kinds of members to include in lists.
void Inspect(TClass *cl, const char *parent, const char *name, const void *addr, Bool_t isTransient) override
Print value of member mname.
TDumpMembers(bool noAddr)
static TEnum * GetEnum(const std::type_info &ti, ESearchAction sa=kALoadAndInterpLookup)
Long64_t GetValue(ULong64_t hash, Long64_t key)
Return the value belonging to specified key and hash value.
void AddAt(UInt_t slot, ULong64_t hash, Long64_t key, Long64_t value)
Add an (key,value) pair to the table.
Dictionary for function template This class describes one single function template.
Global functions class (global functions are obtained from CINT).
Int_t GetNargs() const
Number of function arguments.
THashTable implements a hash table to store TObject's.
void Add(TObject *obj) override
Add object to the hash table.
TObject * FindObject(const char *name) const override
Find object using its name.
TDictionary::DeclId_t DeclId_t
TIsAProxy implementation class.
A collection of TDataMember objects designed for fast access given a DeclId_t and for keep track of T...
A collection of TEnum objects designed for fast access given a DeclId_t and for keep track of TEnum t...
A collection of TEnum objects designed for fast access given a DeclId_t and for keep track of TEnum t...
A collection of TFunction objects designed for fast access given a DeclId_t and for keep track of TFu...
A collection of TFunction objects designed for fast access given a DeclId_t and for keep track of TFu...
TFunction * Get(DeclId_t id)
Return (after creating it if necessary) the TMethod or TFunction describing the function correspondin...
virtual TList * GetListForObject(const char *name) const
Return the set of overloads for this name, collecting all available ones.
TObject * FindObject(const TObject *obj) const override
Find object using its hash value (returned by its Hash() member).
void Add(TObject *obj) override
virtual TObjLink * FirstLink() const
void Delete(Option_t *option="") override
Remove all objects from the list AND delete all heap based objects.
TMap implements an associative array of (key,value) pairs using a THashTable for efficient retrieval ...
Abstract base class for accessing the data-members of a class.
TMemberInspector(const TMemberInspector &)=delete
virtual void Inspect(TClass *cl, const char *parent, const char *name, const void *addr)
EObjectPointerState GetObjectValidity() const
Each ROOT method (see TMethod) has a linked list of its arguments.
const char * GetFullTypeName() const
Get full type description of method argument, e.g.: "class TDirectory*".
Each ROOT class (see TClass) has a linked list of methods.
TClass * GetClass() const
EMenuItemKind IsMenuItem() const
virtual TList * GetListOfMethodArgs()
Returns methodarg list and additionally updates fDataMember in TMethod by calling FindDataMember();.
TObject * Clone(const char *newname="") const override
Make a clone of an object using the Streamer facility.
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
const char * GetName() const override
Returns name of object.
const char * GetTitle() const override
Returns title of object.
virtual void SetName(const char *name)
Set the name of the TNamed.
void ls(Option_t *option="") const override
List TNamed name and title.
Int_t GetEntriesFast() const
void Clear(Option_t *option="") override
Remove all objects from the array.
virtual void AddAtAndExpand(TObject *obj, Int_t idx)
Add object at position idx.
TObject * At(Int_t idx) const override
TObject * UncheckedAt(Int_t i) const
TObject * FindObject(const char *name) const override
Find an object in this collection using its name.
Int_t GetLast() const override
Return index of last object in array.
Wrapper around a TObject so it can be stored in a TList.
TObject * GetObject() const
Collectable string class.
Mother of all ROOT objects.
static void SetObjectStat(Bool_t stat)
Turn on/off tracking of objects in the TObjectTable.
Bool_t TestBit(UInt_t f) const
virtual const char * GetName() const
Returns name of object.
virtual void Browse(TBrowser *b)
Browse object. May be overridden for another default action.
virtual void Streamer(TBuffer &)
Stream an object of class TObject.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
static Bool_t GetObjectStat()
Get status of object stat flag.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
virtual void SetUniqueID(UInt_t uid)
Set the unique object id.
virtual TClass * IsA() const
TObject()
TObject constructor.
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
static const TString & GetEtcDir()
Get the sysconfig directory in the installation. Static utility function.
The TRealData class manages the effective list of all data members for a given class.
const char * GetName() const override
Returns name of object.
void AdoptStreamer(TMemberStreamer *p)
Long_t GetThisOffset() const
void SetIsObject(Bool_t isObject)
TClass * GetClassPointer() const override
Returns a pointer to the TClass of this element.
Describe one element (data member) to be Streamed.
virtual const char * GetFullName() const
Return element name including dimensions, if any Note that this function stores the name into a stati...
virtual TClass * GetClassPointer() const
Returns a pointer to the TClass of this element and updates fClassObject.
Int_t GetArrayDim() const
virtual Bool_t IsaPointer() const
const char * GetTypeName() const
TClass * IsA() const override
virtual Bool_t IsBase() const
Return kTRUE if the element represent a base class.
TClass * GetClassPointer() const override
Returns a pointer to the TClass of this element.
static constexpr Ssiz_t kNPOS
TString & Replace(Ssiz_t pos, Ssiz_t n, const char *s)
const char * Data() const
virtual TClass * IsA() const
TString & ReplaceAll(const TString &s1, const TString &s2)
UInt_t Hash(ECaseCompare cmp=kExact) const
Return hash value.
TString & Remove(Ssiz_t pos)
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
View implementing the TList interface and giving access all the TDictionary describing public data me...
View implementing the TList interface and giving access all the TFunction describing public methods i...
RAII helper class that ensures that PushProxy() / PopProxy() are called when entering / leaving a C++...
Defines a common interface to inspect/change the contents of an object that represents a collection.
virtual Int_t GetProperties() const
Return miscallenous properties of the proxy (see TVirtualCollectionProxy::EProperty).
virtual void Destructor(void *p, Bool_t dtorOnly=kFALSE) const
Execute the container destructor.
virtual void DeleteArray(void *p, Bool_t dtorOnly=kFALSE) const
Execute the container array destructor.
virtual TClass * GetValueClass() const =0
If the value type is a user-defined class, return a pointer to the TClass representing the value type...
virtual void * At(UInt_t idx)=0
Return the address of the value at index idx.
virtual UInt_t Size() const =0
Return the current number of elements in the container.
virtual TVirtualCollectionProxy * Generate() const =0
Returns a clean object of the actual class that derives from TVirtualCollectionProxy.
virtual Bool_t HasPointers() const =0
Return true if the content is of type 'pointer to'.
This class implements a mutex interface.
small helper class to store/restore gPad context in TPad methods
TVirtualPad is an abstract base class for the Pad and Canvas classes.
virtual TVirtualPad * cd(Int_t subpadnumber=0)=0
Abstract Interface class describing Streamer information for one class.
virtual TVirtualStreamerInfo * GenerateInfoForPair(const std::string &pairclassname, bool silent, size_t hint_pair_offset, size_t hint_pair_size)=0
Generate the TClass and TStreamerInfo for the requested pair.
virtual void DeleteArray(void *p, Bool_t dtorOnly=kFALSE)=0
virtual void Clear(Option_t *="") override=0
Set name and title to empty strings ("").
virtual void SetClassVersion(Int_t vers)=0
virtual TClassStreamer * GenEmulatedClassStreamer(const char *class_name, Bool_t silent)=0
Bool_t IsCompiled() const
virtual TVirtualStreamerInfo * NewInfo(TClass *cl)=0
virtual TClass * GetActualClass(const void *obj) const =0
virtual UInt_t GetCheckSum() const =0
virtual Int_t GetOffset(const char *) const =0
static const char * GetElementCounterStart(const char *dmTitle)
Given a comment/title declaring an array counter, for example:
virtual void Build(Bool_t isTransient=kFALSE)=0
virtual void BuildCheck(TFile *file=nullptr, Bool_t load=kTRUE)=0
virtual Bool_t BuildFor(const TClass *cl)=0
virtual TVirtualCollectionProxy * GenExplicitProxy(const ::ROOT::Detail::TCollectionProxyInfo &info, TClass *cl)=0
virtual void * NewArray(Long_t nElements, void *ary=nullptr)=0
virtual TVirtualCollectionProxy * GenEmulatedProxy(const char *class_name, Bool_t silent)=0
virtual void SetClass(TClass *cl)=0
virtual TObjArray * GetElements() const =0
virtual Int_t GetSize() const =0
virtual void BuildOld()=0
static TVirtualStreamerInfo * Factory()
Static function returning a pointer to a new TVirtualStreamerInfo object.
virtual size_t GetClassAlignment() const =0
virtual void * New(void *obj=nullptr)=0
virtual Version_t GetOldVersion() const =0
virtual Int_t GetOnFileClassVersion() const =0
virtual void Destructor(void *p, Bool_t dtorOnly=kFALSE)=0
virtual Bool_t CompareContent(TClass *cl, TVirtualStreamerInfo *info, Bool_t warn, Bool_t complete, TFile *file)=0
virtual Int_t GetClassVersion() const =0
virtual void Update(const TClass *oldClass, TClass *newClass)=0
virtual TClass * GetClass() const =0
constexpr T AlignUp(T value, T align) noexcept
Round value up to the next multiple of align.
externvoid * gMmallocDesc
constexpr bool IsValidAlignment(std::size_t align) noexcept
Return true if align is a valid C++ alignment value: strictly positive and a power of two.
Bool_t HasConsistentHashMember(TClass &clRef)
Return true is the Hash/RecursiveRemove setup is consistent, i.e.
void(* DirAutoAdd_t)(void *, TDirectory *)
externTVirtualRWMutex * gCoreMutex
void(* ResetAfterMergeFunc_t)(void *, TFileMergeInfo *)
void(* DesFunc_t)(void *)
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)
Global function called by a class' static Dictionary() method (see the ClassDef macro).
void(* DelFunc_t)(void *)
void(* BrowseFunc_t)(const void *, TBrowser *)
void *(* NewArrFunc_t)(Long_t size, void *arena)
void Class_ShowMembers(TClass *cl, const void *obj, TMemberInspector &)
Indirect call to the implementation of ShowMember allowing [forward] declaration with out a full defi...
void(* DelArrFunc_t)(void *)
void *(* NewFunc_t)(void *)
Long64_t(* MergeFunc_t)(void *, TCollection *, TFileMergeInfo *)
bool IsStdPairBase(std::string_view name)
std::string ResolveTypedef(const char *tname, bool resolveAll=false)
bool IsStdArray(std::string_view name)
bool IsStdClass(const char *type)
return true if the class belongs to the std namespace
bool IsStdPair(std::string_view name)
bool IsInterpreterDetail(const char *type)
Return true if the type is one the interpreter details which are only forward declared (ClassInfo_t e...
char * DemangleTypeIdName(const std::type_info &ti, int &errorCode)
Demangle in a portable way the type id name.
ROOT::ESTLType IsSTLCont(std::string_view type)
type : type name: vector<list<classA,allocator>,allocator> result: 0 : not stl container code of cont...
std::string ShortType(const char *typeDesc, int mode)
Return the absolute type of typeDesc.
bool IsArtificial(std::string_view name)
void GetNormalizedName(std::string &norm_name, std::string_view name)
Return the normalized name.
bool IsSTLBitset(const char *type)
Return true is the name is std::bitset<number> or bitset<number>.
UInt_t Find(std::list< std::pair< const Node< T > *, Float_t > > &nlist, const Node< T > *node, const T &event, UInt_t nfind)
TMatrixT< Element > & Add(TMatrixT< Element > &target, Element scalar, const TMatrixT< Element > &source)
Modify addition: target += scalar * source.
bool IsTemplate()
Check if the type is a template.
std::vector< std::string > fElements
TVirtualStreamerInfo * GetAllocator() const
TClass::ENewType & fCurrentValue
TClass__GetCallingNewRAII(TClass::ENewType newvalue)
TClass::ENewType fOldValue
~TClass__GetCallingNewRAII()