32 const unsigned int idsSize=19;
34 ClassImp(TListOfDataMembers);
39 TListOfDataMembers::TListOfDataMembers(TClass *cl ) :
40 fClass(cl),fIds(0),fUnloaded(0),fIsLoaded(kFALSE), fLastLoadMarker(0)
47 TListOfDataMembers::~TListOfDataMembers()
51 if (fUnloaded) fUnloaded->Delete();
58 void TListOfDataMembers::MapObject(TObject* obj)
60 if (!fIds) fIds =
new TExMap(idsSize);
63 TDataMember *d =
dynamic_cast<TDataMember*
>(obj);
65 fIds->Add((Long64_t)d->GetDeclId(),(Long64_t)d);
68 TGlobal *g =
dynamic_cast<TGlobal*
>(obj);
69 if (g && g->GetDeclId()) {
70 fIds->Add((Long64_t)g->GetDeclId(),(Long64_t)g);
78 void TListOfDataMembers::AddFirst(TObject *obj)
80 THashList::AddFirst(obj);
91 void TListOfDataMembers::AddFirst(TObject *obj, Option_t *opt)
93 THashList::AddFirst(obj,opt);
100 void TListOfDataMembers::AddLast(TObject *obj)
102 THashList::AddLast(obj);
113 void TListOfDataMembers::AddLast(TObject *obj, Option_t *opt)
115 THashList::AddLast(obj, opt);
122 void TListOfDataMembers::AddAt(TObject *obj, Int_t idx)
124 THashList::AddAt(obj, idx);
131 void TListOfDataMembers::AddAfter(
const TObject *after, TObject *obj)
133 THashList::AddAfter(after, obj);
140 void TListOfDataMembers::AddAfter(TObjLink *after, TObject *obj)
142 THashList::AddAfter(after, obj);
149 void TListOfDataMembers::AddBefore(
const TObject *before, TObject *obj)
151 THashList::AddBefore(before, obj);
158 void TListOfDataMembers::AddBefore(TObjLink *before, TObject *obj)
160 THashList::AddBefore(before, obj);
168 void TListOfDataMembers::Clear(Option_t *option)
170 if (fUnloaded) fUnloaded->Clear(option);
171 if (fIds) fIds->Clear();
172 THashList::Clear(option);
179 void TListOfDataMembers::Delete(Option_t *option )
181 if (fUnloaded) fUnloaded->Delete(option);
182 THashList::Delete(option);
190 TObject *TListOfDataMembers::FindObject(
const char *name)
const
192 TObject *result = THashList::FindObject(name);
194 if (IsLoaded() && fClass && fClass->Property() & (kIsClass|kIsStruct|kIsUnion)) {
199 R__LOCKGUARD(gInterpreterMutex);
201 TInterpreter::DeclId_t decl;
202 if (fClass) decl = gInterpreter->GetDataMember(fClass->GetClassInfo(),name);
203 else decl = gInterpreter->GetDataMember(0,name);
204 if (decl) result =
const_cast<TListOfDataMembers*
>(
this)->Get(decl);
213 TDictionary *TListOfDataMembers::Find(DeclId_t
id)
const
217 return fIds ? (TDataMember*)fIds->GetValue((Long64_t)
id) : 0;
224 TDictionary *TListOfDataMembers::Get(DeclId_t
id)
228 TDictionary *dm = Find(
id);
232 if (!fClass->HasInterpreterInfoInMemory()) {
240 if (!gInterpreter->ClassInfo_Contains(fClass->GetClassInfo(),id))
return 0;
242 if (!gInterpreter->ClassInfo_Contains(0,
id))
return 0;
245 R__LOCKGUARD(gInterpreterMutex);
247 DataMemberInfo_t *info = gInterpreter->DataMemberInfo_Factory(
id,fClass ? fClass->GetClassInfo() : 0);
250 const char *name = gInterpreter->DataMemberInfo_Name(info);
252 TDictionary *update = fUnloaded ? (TDictionary *)fUnloaded->FindObject(name) : 0;
255 ((TDataMember*)update)->Update(info);
257 ((TGlobal*)update)->Update(info);
262 if (fClass) dm =
new TDataMember(info, fClass);
263 else dm =
new TGlobal(info);
267 THashList::AddLast(dm);
268 if (!fIds) fIds =
new TExMap(idsSize);
269 fIds->Add((Long64_t)
id,(Long64_t)dm);
282 TDictionary *TListOfDataMembers::Get(DataMemberInfo_t *info,
bool skipChecks)
286 TDictionary::DeclId_t
id = gInterpreter->GetDeclId(info);
287 R__ASSERT(
id != 0 &&
"DeclId should not be null");
288 TDictionary *dm = fIds ? (TDataMember*)fIds->GetValue((Long64_t)
id) : 0;
291 if (!fClass->HasInterpreterInfoInMemory()) {
299 if (!skipChecks && !gInterpreter->ClassInfo_Contains(fClass->GetClassInfo(),id))
return 0;
301 if (!skipChecks && !gInterpreter->ClassInfo_Contains(0,
id))
return 0;
304 R__LOCKGUARD(gInterpreterMutex);
306 DataMemberInfo_t *dm_info = gInterpreter->DataMemberInfo_FactoryCopy(info);
309 const char *name = gInterpreter->DataMemberInfo_Name(info);
310 TDataMember *update = fUnloaded ? (TDataMember *)fUnloaded->FindObject(name) : 0;
312 update->Update(dm_info);
316 if (fClass) dm =
new TDataMember(dm_info, fClass);
317 else dm =
new TGlobal(dm_info);
321 THashList::AddLast(dm);
322 if (!fIds) fIds =
new TExMap(idsSize);
323 fIds->Add((Long64_t)
id,(Long64_t)dm);
331 void TListOfDataMembers::UnmapObject(TObject* obj)
335 TDataMember *d =
dynamic_cast<TDataMember*
>(obj);
337 if (d->GetDeclId()) {
338 fIds->Remove((Long64_t)d->GetDeclId());
343 TGlobal *g =
dynamic_cast<TGlobal*
>(obj);
345 if (g->GetDeclId()) {
346 fIds->Remove((Long64_t)g->GetDeclId());
362 void TListOfDataMembers::RecursiveRemove(TObject *obj)
366 THashList::RecursiveRemove(obj);
367 if (fUnloaded) fUnloaded->RecursiveRemove(obj);
375 TObject* TListOfDataMembers::Remove(TObject *obj)
379 found = THashList::Remove(obj);
380 if (!found && fUnloaded) {
381 found = fUnloaded->Remove(obj);
384 if (found)
return obj;
391 TObject* TListOfDataMembers::Remove(TObjLink *lnk)
395 TObject *obj = lnk->GetObject();
397 THashList::Remove(lnk);
398 if (fUnloaded) fUnloaded->Remove(obj);
408 void TListOfDataMembers::Load()
410 if (fClass && fClass->Property() & (kIsClass|kIsStruct|kIsUnion)) {
413 if (fIsLoaded)
return;
417 if (fClass && fClass->GetClassInfo() == 0)
return;
419 R__LOCKGUARD(gInterpreterMutex);
421 ULong64_t currentTransaction = gInterpreter->GetInterpreterStateMarker();
422 if (currentTransaction == fLastLoadMarker) {
425 fLastLoadMarker = currentTransaction;
437 if (fClass) info = fClass->GetClassInfo();
438 else info = gInterpreter->ClassInfo_Factory();
442 bool skipChecks =
false;
444 auto complexType = TClassEdit::GetComplexType(fClass->GetName());
445 switch(complexType) {
446 case TClassEdit::EComplexType::kNone:
450 case TClassEdit::EComplexType::kFloat:
453 info = TClass::GetClass(
"_root_std_complex<float>")->GetClassInfo();
456 case TClassEdit::EComplexType::kDouble:
459 info = TClass::GetClass(
"_root_std_complex<double>")->GetClassInfo();
462 case TClassEdit::EComplexType::kInt:
465 info = TClass::GetClass(
"_root_std_complex<int>")->GetClassInfo();
468 case TClassEdit::EComplexType::kLong:
471 info = TClass::GetClass(
"_root_std_complex<long>")->GetClassInfo();
478 DataMemberInfo_t *t = gInterpreter->DataMemberInfo_Factory(info);
479 while (gInterpreter->DataMemberInfo_Next(t)) {
480 if (gInterpreter->DataMemberInfo_IsValid(t)) {
486 gInterpreter->DataMemberInfo_Delete(t);
487 if (!fClass) gInterpreter->ClassInfo_Delete(info);
493 void TListOfDataMembers::Streamer(TBuffer &R__b)
495 if (R__b.IsReading()) {
496 R__b.ReadClassBuffer(TListOfDataMembers::Class(),
this);
499 R__b.WriteClassBuffer(TListOfDataMembers::Class(),
this);
506 void TListOfDataMembers::Update(TDictionary *member) {
508 TDataMember *d =
dynamic_cast<TDataMember*
>(member);
510 if (d->GetDeclId()) {
511 if (!fIds) fIds =
new TExMap(idsSize);
512 fIds->Add((Long64_t)d->GetDeclId(),(Long64_t)d);
514 TDictionary *update = fUnloaded ? (TDictionary *)fUnloaded->FindObject(d->GetName()) : 0;
515 if (update) fUnloaded->Remove(update);
517 if (! THashList::FindObject(d) ) {
520 THashList::AddLast(d);
524 TGlobal *g =
dynamic_cast<TGlobal*
>(member);
526 if (g->GetDeclId()) {
527 if (!fIds) fIds =
new TExMap(idsSize);
528 fIds->Add((Long64_t)g->GetDeclId(),(Long64_t)g);
530 TDictionary *update = fUnloaded ? (TDictionary *)fUnloaded->FindObject(g->GetName()) : 0;
531 if (update) fUnloaded->Remove(update);
533 if (! THashList::FindObject(g) ) {
536 THashList::AddLast(g);
551 void TListOfDataMembers::Unload()
553 TObjLink *lnk = FirstLink();
555 TDictionary *data = (TDictionary *)lnk->GetObject();
557 if (!fUnloaded) fUnloaded =
new THashList;
558 fUnloaded->Add(data);
573 void TListOfDataMembers::Unload(TDictionary *mem)
575 if (THashList::Remove(mem)) {
580 if (!fUnloaded) fUnloaded =
new THashList;