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;