// @(#)root/cont
// Author: Philippe Canal Aug 2013

/*************************************************************************
 * Copyright (C) 1995-2013, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TListOfDataMembers                                                   //
//                                                                      //
// A collection of TDataMember objects designed for fast access given a //
// DeclId_t and for keep track of TDataMember that were described       //
// unloaded data member.                                                //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TListOfDataMembers.h"
#include "TClass.h"
#include "TClassRef.h"
#include "TExMap.h"
#include "TDataMember.h"
#include "TGlobal.h"
#include "TInterpreter.h"
#include "TVirtualMutex.h"
#include "TError.h"
#include "TEnumConstant.h"
#include "TClassEdit.h"

constexpr unsigned int idsSize=19;

ClassImp(TListOfDataMembers)

//______________________________________________________________________________
TListOfDataMembers::TListOfDataMembers(TClass *cl /*=0*/) :
   fClass(cl),fIds(0),fUnloaded(0),fIsLoaded(kFALSE), fLastLoadMarker(0)
{
   // Constructor.
}

//______________________________________________________________________________
TListOfDataMembers::~TListOfDataMembers()
{
   // Destructor.

   THashList::Delete();
   delete fIds;
   if (fUnloaded) fUnloaded->Delete();
   delete fUnloaded;
}

//______________________________________________________________________________
void TListOfDataMembers::MapObject(TObject* obj)
{
   // Add a pair<id, object> to the map of data members and their ids.
   if (!fIds) fIds = new TExMap(idsSize);

   if (fClass) {
      TDataMember *d = dynamic_cast<TDataMember*>(obj);
      if (d) {
         fIds->Add((Long64_t)d->GetDeclId(),(Long64_t)d);
      }
   } else {
      TGlobal *g = dynamic_cast<TGlobal*>(obj);
      if (g && g->GetDeclId()) {
         fIds->Add((Long64_t)g->GetDeclId(),(Long64_t)g);
      }
   }
}

//______________________________________________________________________________
void TListOfDataMembers::AddFirst(TObject *obj)
{
   // Add object at the beginning of the list.

   THashList::AddFirst(obj);
   MapObject(obj);
}

//______________________________________________________________________________
void TListOfDataMembers::AddFirst(TObject *obj, Option_t *opt)
{
   // Add object at the beginning of the list and also store option.
   // Storing an option is useful when one wants to change the behaviour
   // of an object a little without having to create a complete new
   // copy of the object. This feature is used, for example, by the Draw()
   // method. It allows the same object to be drawn in different ways.

   THashList::AddFirst(obj,opt);
   MapObject(obj);
}

//______________________________________________________________________________
void TListOfDataMembers::AddLast(TObject *obj)
{
   // Add object at the end of the list.

   THashList::AddLast(obj);
   MapObject(obj);
}

//______________________________________________________________________________
void TListOfDataMembers::AddLast(TObject *obj, Option_t *opt)
{
   // Add object at the end of the list and also store option.
   // Storing an option is useful when one wants to change the behaviour
   // of an object a little without having to create a complete new
   // copy of the object. This feature is used, for example, by the Draw()
   // method. It allows the same object to be drawn in different ways.

   THashList::AddLast(obj, opt);
   MapObject(obj);
}

//______________________________________________________________________________
void TListOfDataMembers::AddAt(TObject *obj, Int_t idx)
{
   // Insert object at location idx in the list.

   THashList::AddAt(obj, idx);
   MapObject(obj);
}

//______________________________________________________________________________
void TListOfDataMembers::AddAfter(const TObject *after, TObject *obj)
{
   // Insert object after object after in the list.

   THashList::AddAfter(after, obj);
   MapObject(obj);
}

//______________________________________________________________________________
void TListOfDataMembers::AddAfter(TObjLink *after, TObject *obj)
{
   // Insert object after object after in the list.

   THashList::AddAfter(after, obj);
   MapObject(obj);
}

//______________________________________________________________________________
void TListOfDataMembers::AddBefore(const TObject *before, TObject *obj)
{
   // Insert object before object before in the list.

   THashList::AddBefore(before, obj);
   MapObject(obj);
}

//______________________________________________________________________________
void TListOfDataMembers::AddBefore(TObjLink *before, TObject *obj)
{
   // Insert object before object before in the list.

   THashList::AddBefore(before, obj);
   MapObject(obj);
}

//______________________________________________________________________________
void TListOfDataMembers::Clear(Option_t *option)
{
   // Remove all objects from the list. Does not delete the objects unless
   // the THashList is the owner (set via SetOwner()).

   if (fUnloaded) fUnloaded->Clear(option);
   if (fIds) fIds->Clear();
   THashList::Clear(option);
   fIsLoaded = kFALSE;
}

//______________________________________________________________________________
void TListOfDataMembers::Delete(Option_t *option /* ="" */)
{
   // Delete all TDataMember object files.

   if (fUnloaded) fUnloaded->Delete(option);
   THashList::Delete(option);
   fIsLoaded = kFALSE;
}

//______________________________________________________________________________
TObject *TListOfDataMembers::FindObject(const char *name) const
{
   // Specialize FindObject to do search for the
   // a data member just by name or create it if its not already in the list

   TObject *result = THashList::FindObject(name);
   if (!result) {
      if (IsLoaded() && fClass && fClass->Property() & (kIsClass|kIsStruct|kIsUnion)) {
         // We already have all the information, no need to search more
         return 0;
      }

      R__LOCKGUARD(gInterpreterMutex);

      TInterpreter::DeclId_t decl;
      if (fClass) decl = gInterpreter->GetDataMember(fClass->GetClassInfo(),name);
      else        decl = gInterpreter->GetDataMember(0,name);
      if (decl) result = const_cast<TListOfDataMembers*>(this)->Get(decl);
   }
   return result;
}

//______________________________________________________________________________
TDictionary *TListOfDataMembers::Get(DeclId_t id)
{
   // Return (after creating it if necessary) the TDataMember
   // describing the data member corresponding to the Decl 'id'.

   if (!id) return 0;

   TDictionary *dm = fIds ? (TDataMember*)fIds->GetValue((Long64_t)id) : 0;
   if (!dm) {
      if (fClass) {
         if (!fClass->HasInterpreterInfoInMemory()) {
            // The interpreter does not know about this class yet (or a problem
            // occurred that prevented the proper updating of fClassInfo).
            // So this decl can not possibly be part of this class.
            // [In addition calling GetClassInfo would trigger a late parsing
            //  of the header which we want to avoid].
            return 0;
         }
         if (!gInterpreter->ClassInfo_Contains(fClass->GetClassInfo(),id)) return 0;
      } else {
         if (!gInterpreter->ClassInfo_Contains(0,id)) return 0;
      }

      R__LOCKGUARD(gInterpreterMutex);

      DataMemberInfo_t *info = gInterpreter->DataMemberInfo_Factory(id,fClass ? fClass->GetClassInfo() : 0);

      // Let's see if this is a reload ...
      const char *name = gInterpreter->DataMemberInfo_Name(info);

      TDictionary *update = fUnloaded ? (TDictionary *)fUnloaded->FindObject(name) : 0;
      if (update) {
         if (fClass) {
            ((TDataMember*)update)->Update(info);
         } else {
            ((TGlobal*)update)->Update(info);
         }
         dm = update;
      }
      if (!dm) {
         if (fClass) dm = new TDataMember(info, fClass);
         else dm = new TGlobal(info);
      }
      // Calling 'just' THahList::Add would turn around and call
      // TListOfDataMembers::AddLast which should *also* do the fIds->Add.
      THashList::AddLast(dm);
      if (!fIds) fIds = new TExMap(idsSize);
      fIds->Add((Long64_t)id,(Long64_t)dm);
   }
   return dm;
}

//______________________________________________________________________________
TDictionary *TListOfDataMembers::Get(DataMemberInfo_t *info, bool skipChecks)
{
   // Return (after creating it if necessary) the TDataMember
   // describing the data member corresponding to the Decl 'id'.
   // The skipChecks flag controls the consistency checks performed inspecting
   // the AST. In some cases, we explicitely alter the datamembers in the
   // typesystem with respect to the AST and therefore we must not enforce
   // consistency.

   if (!info) return 0;

   TDictionary::DeclId_t id = gInterpreter->GetDeclId(info);
   R__ASSERT( id != 0 && "DeclId should not be null");
   TDictionary *dm = fIds ? (TDataMember*)fIds->GetValue((Long64_t)id) : 0;
   if (!dm) {
      if (fClass) {
         if (!fClass->HasInterpreterInfoInMemory()) {
            // The interpreter does not know about this class yet (or a problem
            // occurred that prevented the proper updating of fClassInfo).
            // So this decl can not possibly be part of this class.
            // [In addition calling GetClassInfo would trigger a late parsing
            //  of the header which we want to avoid].
            return 0;
         }
         if (!skipChecks && !gInterpreter->ClassInfo_Contains(fClass->GetClassInfo(),id)) return 0;
      } else {
         if (!skipChecks && !gInterpreter->ClassInfo_Contains(0,id)) return 0;
      }

      R__LOCKGUARD(gInterpreterMutex);

      DataMemberInfo_t *dm_info = gInterpreter->DataMemberInfo_FactoryCopy(info);

      // Let's see if this is a reload ...
      const char *name = gInterpreter->DataMemberInfo_Name(info);
      TDataMember *update = fUnloaded ? (TDataMember *)fUnloaded->FindObject(name) : 0;
      if (update) {
         update->Update(dm_info);
         dm = update;
      }
      if (!dm) {
         if (fClass) dm = new TDataMember(dm_info, fClass);
         else dm = new TGlobal(dm_info);
      }
      // Calling 'just' THahList::Add would turn around and call
      // TListOfDataMembers::AddLast which should *also* do the fIds->Add.
      THashList::AddLast(dm);
      if (!fIds) fIds = new TExMap(idsSize);
      fIds->Add((Long64_t)id,(Long64_t)dm);
   }
   return dm;
}

//______________________________________________________________________________
void TListOfDataMembers::UnmapObject(TObject* obj)
{
   // Remove a pair<id, object> from the map of data members and their ids.
   if (!fIds) return;
   if (fClass) {
      TDataMember *d = dynamic_cast<TDataMember*>(obj);
      if (d) {
         if (d->GetDeclId()) {
            fIds->Remove((Long64_t)d->GetDeclId());
         }
         d->Update(0);
      }
   } else {
      TGlobal *g = dynamic_cast<TGlobal*>(obj);
      if (g) {
         if (g->GetDeclId()) {
            fIds->Remove((Long64_t)g->GetDeclId());
         }
         g->Update(0);
      }
   }
}

//______________________________________________________________________________
void TListOfDataMembers::RecursiveRemove(TObject *obj)
{
   // Remove object from this collection and recursively remove the object
   // from all other objects (and collections).
   // This function overrides TCollection::RecursiveRemove that calls
   // the Remove function. THashList::Remove cannot be called because
   // it uses the hash value of the hash table. This hash value
   // is not available anymore when RecursiveRemove is called from
   // the TObject destructor.

   if (!obj) return;

   THashList::RecursiveRemove(obj);
   if (fUnloaded) fUnloaded->RecursiveRemove(obj);
   UnmapObject(obj);

}

//______________________________________________________________________________
TObject* TListOfDataMembers::Remove(TObject *obj)
{
   // Remove object from the list.

   Bool_t found;

   found = THashList::Remove(obj);
   if (!found && fUnloaded) {
      found = fUnloaded->Remove(obj);
   }
   UnmapObject(obj);
   if (found) return obj;
   else return 0;
}

//______________________________________________________________________________
TObject* TListOfDataMembers::Remove(TObjLink *lnk)
{
   // Remove object via its objlink from the list.

   if (!lnk) return 0;

   TObject *obj = lnk->GetObject();

   THashList::Remove(lnk);
   if (fUnloaded) fUnloaded->Remove(obj);

   UnmapObject(obj);
   return obj;
}

//______________________________________________________________________________
void TListOfDataMembers::Load()
{
   // Load all the DataMembers known to the intepreter for the scope 'fClass'
   // into this collection.

   if (fClass && fClass->Property() & (kIsClass|kIsStruct|kIsUnion)) {
      // Class and union are not extendable, if we already
      // loaded all the data member there is no need to recheck
      if (fIsLoaded) return;
   }

   // This will provoke the parsing of the headers if need be.
   if (fClass && fClass->GetClassInfo() == 0) return;

   R__LOCKGUARD(gInterpreterMutex);

   ULong64_t currentTransaction = gInterpreter->GetInterpreterStateMarker();
   if (currentTransaction == fLastLoadMarker) {
      return;
   }
   fLastLoadMarker = currentTransaction;

   // In the case of namespace, even if we have loaded before we need to
   // load again in case there was new data member added.

   // Mark the list as loaded to avoid an infinite recursion in the case
   // where we have a data member that is a variable size array.  In that
   // case TDataMember::Init needs to get/load the list to find the data
   // member used as the array size.
   fIsLoaded = kTRUE;

   ClassInfo_t *info;
   if (fClass) info = fClass->GetClassInfo();
   else info = gInterpreter->ClassInfo_Factory();

   // Treat the complex<float>, complex<double> in a special way, i.e. replacing
   // the datamembers with the ones of _root_std_complex<T>
   bool skipChecks = false;
   if (fClass){
      auto complexType = TClassEdit::GetComplexType(fClass->GetName());
      switch(complexType) {
         case TClassEdit::EComplexType::kNone:
         {
            break;
         }
         case TClassEdit::EComplexType::kFloat:
         {
            skipChecks = true;
            info = TClass::GetClass("_root_std_complex<float>")->GetClassInfo();
            break;
         }
         case TClassEdit::EComplexType::kDouble:
         {
            skipChecks = true;
            info = TClass::GetClass("_root_std_complex<double>")->GetClassInfo();
            break;
         }
         case TClassEdit::EComplexType::kInt:
         {
            skipChecks = true;
            info = TClass::GetClass("_root_std_complex<int>")->GetClassInfo();
            break;
         }
         case TClassEdit::EComplexType::kLong:
         {
            skipChecks = true;
            info = TClass::GetClass("_root_std_complex<long>")->GetClassInfo();
            break;
         }
      }
   }

   // Now we follow the ordinary pattern
   DataMemberInfo_t *t = gInterpreter->DataMemberInfo_Factory(info);
   while (gInterpreter->DataMemberInfo_Next(t)) {
      if (gInterpreter->DataMemberInfo_IsValid(t)) {
         // Get will check if there is already there or create a new one
         // (or re-use a previously unloaded version).
         Get(t,skipChecks);
      }
   }
   if (!fClass) gInterpreter->ClassInfo_Delete(info);
}

//______________________________________________________________________________
void TListOfDataMembers::Streamer(TBuffer &R__b)
{
   // Stream an object of class TListOfDataMembers.

   if (R__b.IsReading()) {
      R__b.ReadClassBuffer(TListOfDataMembers::Class(),this);
      fIsLoaded = kTRUE;
   } else {
      R__b.WriteClassBuffer(TListOfDataMembers::Class(),this);
   }
}

//______________________________________________________________________________
void TListOfDataMembers::Update(TDictionary *member) {
   // Move the member or data member to the expect set of list.

   if (fClass) {
      TDataMember *d = dynamic_cast<TDataMember*>(member);
      if (d) {
         if (d->GetDeclId()) {
            if (!fIds) fIds = new TExMap(idsSize);
            fIds->Add((Long64_t)d->GetDeclId(),(Long64_t)d);
         }
         TDictionary *update = fUnloaded ? (TDictionary *)fUnloaded->FindObject(d->GetName()) : 0;
         if (update) fUnloaded->Remove(update);

         if (! THashList::FindObject(d) ) {
            // Calling 'just' THahList::Add would turn around and call
            // TListOfDataMembers::AddLast which should *also* do the fIds->Add.
            THashList::AddLast(d);
         }
      }
   } else {
      TGlobal *g = dynamic_cast<TGlobal*>(member);
      if (g) {
         if (g->GetDeclId()) {
            if (!fIds) fIds = new TExMap(idsSize);
            fIds->Add((Long64_t)g->GetDeclId(),(Long64_t)g);

            TDictionary *update = fUnloaded ? (TDictionary *)fUnloaded->FindObject(g->GetName()) : 0;
            if (update) fUnloaded->Remove(update);

            if (! THashList::FindObject(g) ) {
               // Calling 'just' THahList::Add would turn around and call
               // TListOfDataMembers::AddLast which should *also* do the fIds->Add.
               THashList::AddLast(g);
            }
         }
      }
   }


}

//______________________________________________________________________________
void TListOfDataMembers::Unload()
{
   // Mark 'all func' as being unloaded.
   // After the unload, the data member can no longer be found directly,
   // until the decl can be found again in the interpreter (in which
   // the func object will be reused.

   TObjLink *lnk = FirstLink();
   while (lnk) {
      TDictionary *data = (TDictionary *)lnk->GetObject();
      UnmapObject(data);
      fUnloaded = new THashList;
      fUnloaded->Add(data);

      lnk = lnk->Next();
   }

   THashList::Clear();
   fIsLoaded = kFALSE;
}

//______________________________________________________________________________
void TListOfDataMembers::Unload(TDictionary *mem)
{
   // Mark 'func' as being unloaded.
   // After the unload, the data member can no longer be found directly,
   // until the decl can be found again in the interpreter (in which
   // the func object will be reused.

   if (THashList::Remove(mem)) {
      // We contains the object, let remove it from the other internal
      // list and move it to the list of unloaded objects.

      UnmapObject(mem);
      fUnloaded = new THashList;
      fUnloaded->Add(mem);
   }
}
 TListOfDataMembers.cxx:1
 TListOfDataMembers.cxx:2
 TListOfDataMembers.cxx:3
 TListOfDataMembers.cxx:4
 TListOfDataMembers.cxx:5
 TListOfDataMembers.cxx:6
 TListOfDataMembers.cxx:7
 TListOfDataMembers.cxx:8
 TListOfDataMembers.cxx:9
 TListOfDataMembers.cxx:10
 TListOfDataMembers.cxx:11
 TListOfDataMembers.cxx:12
 TListOfDataMembers.cxx:13
 TListOfDataMembers.cxx:14
 TListOfDataMembers.cxx:15
 TListOfDataMembers.cxx:16
 TListOfDataMembers.cxx:17
 TListOfDataMembers.cxx:18
 TListOfDataMembers.cxx:19
 TListOfDataMembers.cxx:20
 TListOfDataMembers.cxx:21
 TListOfDataMembers.cxx:22
 TListOfDataMembers.cxx:23
 TListOfDataMembers.cxx:24
 TListOfDataMembers.cxx:25
 TListOfDataMembers.cxx:26
 TListOfDataMembers.cxx:27
 TListOfDataMembers.cxx:28
 TListOfDataMembers.cxx:29
 TListOfDataMembers.cxx:30
 TListOfDataMembers.cxx:31
 TListOfDataMembers.cxx:32
 TListOfDataMembers.cxx:33
 TListOfDataMembers.cxx:34
 TListOfDataMembers.cxx:35
 TListOfDataMembers.cxx:36
 TListOfDataMembers.cxx:37
 TListOfDataMembers.cxx:38
 TListOfDataMembers.cxx:39
 TListOfDataMembers.cxx:40
 TListOfDataMembers.cxx:41
 TListOfDataMembers.cxx:42
 TListOfDataMembers.cxx:43
 TListOfDataMembers.cxx:44
 TListOfDataMembers.cxx:45
 TListOfDataMembers.cxx:46
 TListOfDataMembers.cxx:47
 TListOfDataMembers.cxx:48
 TListOfDataMembers.cxx:49
 TListOfDataMembers.cxx:50
 TListOfDataMembers.cxx:51
 TListOfDataMembers.cxx:52
 TListOfDataMembers.cxx:53
 TListOfDataMembers.cxx:54
 TListOfDataMembers.cxx:55
 TListOfDataMembers.cxx:56
 TListOfDataMembers.cxx:57
 TListOfDataMembers.cxx:58
 TListOfDataMembers.cxx:59
 TListOfDataMembers.cxx:60
 TListOfDataMembers.cxx:61
 TListOfDataMembers.cxx:62
 TListOfDataMembers.cxx:63
 TListOfDataMembers.cxx:64
 TListOfDataMembers.cxx:65
 TListOfDataMembers.cxx:66
 TListOfDataMembers.cxx:67
 TListOfDataMembers.cxx:68
 TListOfDataMembers.cxx:69
 TListOfDataMembers.cxx:70
 TListOfDataMembers.cxx:71
 TListOfDataMembers.cxx:72
 TListOfDataMembers.cxx:73
 TListOfDataMembers.cxx:74
 TListOfDataMembers.cxx:75
 TListOfDataMembers.cxx:76
 TListOfDataMembers.cxx:77
 TListOfDataMembers.cxx:78
 TListOfDataMembers.cxx:79
 TListOfDataMembers.cxx:80
 TListOfDataMembers.cxx:81
 TListOfDataMembers.cxx:82
 TListOfDataMembers.cxx:83
 TListOfDataMembers.cxx:84
 TListOfDataMembers.cxx:85
 TListOfDataMembers.cxx:86
 TListOfDataMembers.cxx:87
 TListOfDataMembers.cxx:88
 TListOfDataMembers.cxx:89
 TListOfDataMembers.cxx:90
 TListOfDataMembers.cxx:91
 TListOfDataMembers.cxx:92
 TListOfDataMembers.cxx:93
 TListOfDataMembers.cxx:94
 TListOfDataMembers.cxx:95
 TListOfDataMembers.cxx:96
 TListOfDataMembers.cxx:97
 TListOfDataMembers.cxx:98
 TListOfDataMembers.cxx:99
 TListOfDataMembers.cxx:100
 TListOfDataMembers.cxx:101
 TListOfDataMembers.cxx:102
 TListOfDataMembers.cxx:103
 TListOfDataMembers.cxx:104
 TListOfDataMembers.cxx:105
 TListOfDataMembers.cxx:106
 TListOfDataMembers.cxx:107
 TListOfDataMembers.cxx:108
 TListOfDataMembers.cxx:109
 TListOfDataMembers.cxx:110
 TListOfDataMembers.cxx:111
 TListOfDataMembers.cxx:112
 TListOfDataMembers.cxx:113
 TListOfDataMembers.cxx:114
 TListOfDataMembers.cxx:115
 TListOfDataMembers.cxx:116
 TListOfDataMembers.cxx:117
 TListOfDataMembers.cxx:118
 TListOfDataMembers.cxx:119
 TListOfDataMembers.cxx:120
 TListOfDataMembers.cxx:121
 TListOfDataMembers.cxx:122
 TListOfDataMembers.cxx:123
 TListOfDataMembers.cxx:124
 TListOfDataMembers.cxx:125
 TListOfDataMembers.cxx:126
 TListOfDataMembers.cxx:127
 TListOfDataMembers.cxx:128
 TListOfDataMembers.cxx:129
 TListOfDataMembers.cxx:130
 TListOfDataMembers.cxx:131
 TListOfDataMembers.cxx:132
 TListOfDataMembers.cxx:133
 TListOfDataMembers.cxx:134
 TListOfDataMembers.cxx:135
 TListOfDataMembers.cxx:136
 TListOfDataMembers.cxx:137
 TListOfDataMembers.cxx:138
 TListOfDataMembers.cxx:139
 TListOfDataMembers.cxx:140
 TListOfDataMembers.cxx:141
 TListOfDataMembers.cxx:142
 TListOfDataMembers.cxx:143
 TListOfDataMembers.cxx:144
 TListOfDataMembers.cxx:145
 TListOfDataMembers.cxx:146
 TListOfDataMembers.cxx:147
 TListOfDataMembers.cxx:148
 TListOfDataMembers.cxx:149
 TListOfDataMembers.cxx:150
 TListOfDataMembers.cxx:151
 TListOfDataMembers.cxx:152
 TListOfDataMembers.cxx:153
 TListOfDataMembers.cxx:154
 TListOfDataMembers.cxx:155
 TListOfDataMembers.cxx:156
 TListOfDataMembers.cxx:157
 TListOfDataMembers.cxx:158
 TListOfDataMembers.cxx:159
 TListOfDataMembers.cxx:160
 TListOfDataMembers.cxx:161
 TListOfDataMembers.cxx:162
 TListOfDataMembers.cxx:163
 TListOfDataMembers.cxx:164
 TListOfDataMembers.cxx:165
 TListOfDataMembers.cxx:166
 TListOfDataMembers.cxx:167
 TListOfDataMembers.cxx:168
 TListOfDataMembers.cxx:169
 TListOfDataMembers.cxx:170
 TListOfDataMembers.cxx:171
 TListOfDataMembers.cxx:172
 TListOfDataMembers.cxx:173
 TListOfDataMembers.cxx:174
 TListOfDataMembers.cxx:175
 TListOfDataMembers.cxx:176
 TListOfDataMembers.cxx:177
 TListOfDataMembers.cxx:178
 TListOfDataMembers.cxx:179
 TListOfDataMembers.cxx:180
 TListOfDataMembers.cxx:181
 TListOfDataMembers.cxx:182
 TListOfDataMembers.cxx:183
 TListOfDataMembers.cxx:184
 TListOfDataMembers.cxx:185
 TListOfDataMembers.cxx:186
 TListOfDataMembers.cxx:187
 TListOfDataMembers.cxx:188
 TListOfDataMembers.cxx:189
 TListOfDataMembers.cxx:190
 TListOfDataMembers.cxx:191
 TListOfDataMembers.cxx:192
 TListOfDataMembers.cxx:193
 TListOfDataMembers.cxx:194
 TListOfDataMembers.cxx:195
 TListOfDataMembers.cxx:196
 TListOfDataMembers.cxx:197
 TListOfDataMembers.cxx:198
 TListOfDataMembers.cxx:199
 TListOfDataMembers.cxx:200
 TListOfDataMembers.cxx:201
 TListOfDataMembers.cxx:202
 TListOfDataMembers.cxx:203
 TListOfDataMembers.cxx:204
 TListOfDataMembers.cxx:205
 TListOfDataMembers.cxx:206
 TListOfDataMembers.cxx:207
 TListOfDataMembers.cxx:208
 TListOfDataMembers.cxx:209
 TListOfDataMembers.cxx:210
 TListOfDataMembers.cxx:211
 TListOfDataMembers.cxx:212
 TListOfDataMembers.cxx:213
 TListOfDataMembers.cxx:214
 TListOfDataMembers.cxx:215
 TListOfDataMembers.cxx:216
 TListOfDataMembers.cxx:217
 TListOfDataMembers.cxx:218
 TListOfDataMembers.cxx:219
 TListOfDataMembers.cxx:220
 TListOfDataMembers.cxx:221
 TListOfDataMembers.cxx:222
 TListOfDataMembers.cxx:223
 TListOfDataMembers.cxx:224
 TListOfDataMembers.cxx:225
 TListOfDataMembers.cxx:226
 TListOfDataMembers.cxx:227
 TListOfDataMembers.cxx:228
 TListOfDataMembers.cxx:229
 TListOfDataMembers.cxx:230
 TListOfDataMembers.cxx:231
 TListOfDataMembers.cxx:232
 TListOfDataMembers.cxx:233
 TListOfDataMembers.cxx:234
 TListOfDataMembers.cxx:235
 TListOfDataMembers.cxx:236
 TListOfDataMembers.cxx:237
 TListOfDataMembers.cxx:238
 TListOfDataMembers.cxx:239
 TListOfDataMembers.cxx:240
 TListOfDataMembers.cxx:241
 TListOfDataMembers.cxx:242
 TListOfDataMembers.cxx:243
 TListOfDataMembers.cxx:244
 TListOfDataMembers.cxx:245
 TListOfDataMembers.cxx:246
 TListOfDataMembers.cxx:247
 TListOfDataMembers.cxx:248
 TListOfDataMembers.cxx:249
 TListOfDataMembers.cxx:250
 TListOfDataMembers.cxx:251
 TListOfDataMembers.cxx:252
 TListOfDataMembers.cxx:253
 TListOfDataMembers.cxx:254
 TListOfDataMembers.cxx:255
 TListOfDataMembers.cxx:256
 TListOfDataMembers.cxx:257
 TListOfDataMembers.cxx:258
 TListOfDataMembers.cxx:259
 TListOfDataMembers.cxx:260
 TListOfDataMembers.cxx:261
 TListOfDataMembers.cxx:262
 TListOfDataMembers.cxx:263
 TListOfDataMembers.cxx:264
 TListOfDataMembers.cxx:265
 TListOfDataMembers.cxx:266
 TListOfDataMembers.cxx:267
 TListOfDataMembers.cxx:268
 TListOfDataMembers.cxx:269
 TListOfDataMembers.cxx:270
 TListOfDataMembers.cxx:271
 TListOfDataMembers.cxx:272
 TListOfDataMembers.cxx:273
 TListOfDataMembers.cxx:274
 TListOfDataMembers.cxx:275
 TListOfDataMembers.cxx:276
 TListOfDataMembers.cxx:277
 TListOfDataMembers.cxx:278
 TListOfDataMembers.cxx:279
 TListOfDataMembers.cxx:280
 TListOfDataMembers.cxx:281
 TListOfDataMembers.cxx:282
 TListOfDataMembers.cxx:283
 TListOfDataMembers.cxx:284
 TListOfDataMembers.cxx:285
 TListOfDataMembers.cxx:286
 TListOfDataMembers.cxx:287
 TListOfDataMembers.cxx:288
 TListOfDataMembers.cxx:289
 TListOfDataMembers.cxx:290
 TListOfDataMembers.cxx:291
 TListOfDataMembers.cxx:292
 TListOfDataMembers.cxx:293
 TListOfDataMembers.cxx:294
 TListOfDataMembers.cxx:295
 TListOfDataMembers.cxx:296
 TListOfDataMembers.cxx:297
 TListOfDataMembers.cxx:298
 TListOfDataMembers.cxx:299
 TListOfDataMembers.cxx:300
 TListOfDataMembers.cxx:301
 TListOfDataMembers.cxx:302
 TListOfDataMembers.cxx:303
 TListOfDataMembers.cxx:304
 TListOfDataMembers.cxx:305
 TListOfDataMembers.cxx:306
 TListOfDataMembers.cxx:307
 TListOfDataMembers.cxx:308
 TListOfDataMembers.cxx:309
 TListOfDataMembers.cxx:310
 TListOfDataMembers.cxx:311
 TListOfDataMembers.cxx:312
 TListOfDataMembers.cxx:313
 TListOfDataMembers.cxx:314
 TListOfDataMembers.cxx:315
 TListOfDataMembers.cxx:316
 TListOfDataMembers.cxx:317
 TListOfDataMembers.cxx:318
 TListOfDataMembers.cxx:319
 TListOfDataMembers.cxx:320
 TListOfDataMembers.cxx:321
 TListOfDataMembers.cxx:322
 TListOfDataMembers.cxx:323
 TListOfDataMembers.cxx:324
 TListOfDataMembers.cxx:325
 TListOfDataMembers.cxx:326
 TListOfDataMembers.cxx:327
 TListOfDataMembers.cxx:328
 TListOfDataMembers.cxx:329
 TListOfDataMembers.cxx:330
 TListOfDataMembers.cxx:331
 TListOfDataMembers.cxx:332
 TListOfDataMembers.cxx:333
 TListOfDataMembers.cxx:334
 TListOfDataMembers.cxx:335
 TListOfDataMembers.cxx:336
 TListOfDataMembers.cxx:337
 TListOfDataMembers.cxx:338
 TListOfDataMembers.cxx:339
 TListOfDataMembers.cxx:340
 TListOfDataMembers.cxx:341
 TListOfDataMembers.cxx:342
 TListOfDataMembers.cxx:343
 TListOfDataMembers.cxx:344
 TListOfDataMembers.cxx:345
 TListOfDataMembers.cxx:346
 TListOfDataMembers.cxx:347
 TListOfDataMembers.cxx:348
 TListOfDataMembers.cxx:349
 TListOfDataMembers.cxx:350
 TListOfDataMembers.cxx:351
 TListOfDataMembers.cxx:352
 TListOfDataMembers.cxx:353
 TListOfDataMembers.cxx:354
 TListOfDataMembers.cxx:355
 TListOfDataMembers.cxx:356
 TListOfDataMembers.cxx:357
 TListOfDataMembers.cxx:358
 TListOfDataMembers.cxx:359
 TListOfDataMembers.cxx:360
 TListOfDataMembers.cxx:361
 TListOfDataMembers.cxx:362
 TListOfDataMembers.cxx:363
 TListOfDataMembers.cxx:364
 TListOfDataMembers.cxx:365
 TListOfDataMembers.cxx:366
 TListOfDataMembers.cxx:367
 TListOfDataMembers.cxx:368
 TListOfDataMembers.cxx:369
 TListOfDataMembers.cxx:370
 TListOfDataMembers.cxx:371
 TListOfDataMembers.cxx:372
 TListOfDataMembers.cxx:373
 TListOfDataMembers.cxx:374
 TListOfDataMembers.cxx:375
 TListOfDataMembers.cxx:376
 TListOfDataMembers.cxx:377
 TListOfDataMembers.cxx:378
 TListOfDataMembers.cxx:379
 TListOfDataMembers.cxx:380
 TListOfDataMembers.cxx:381
 TListOfDataMembers.cxx:382
 TListOfDataMembers.cxx:383
 TListOfDataMembers.cxx:384
 TListOfDataMembers.cxx:385
 TListOfDataMembers.cxx:386
 TListOfDataMembers.cxx:387
 TListOfDataMembers.cxx:388
 TListOfDataMembers.cxx:389
 TListOfDataMembers.cxx:390
 TListOfDataMembers.cxx:391
 TListOfDataMembers.cxx:392
 TListOfDataMembers.cxx:393
 TListOfDataMembers.cxx:394
 TListOfDataMembers.cxx:395
 TListOfDataMembers.cxx:396
 TListOfDataMembers.cxx:397
 TListOfDataMembers.cxx:398
 TListOfDataMembers.cxx:399
 TListOfDataMembers.cxx:400
 TListOfDataMembers.cxx:401
 TListOfDataMembers.cxx:402
 TListOfDataMembers.cxx:403
 TListOfDataMembers.cxx:404
 TListOfDataMembers.cxx:405
 TListOfDataMembers.cxx:406
 TListOfDataMembers.cxx:407
 TListOfDataMembers.cxx:408
 TListOfDataMembers.cxx:409
 TListOfDataMembers.cxx:410
 TListOfDataMembers.cxx:411
 TListOfDataMembers.cxx:412
 TListOfDataMembers.cxx:413
 TListOfDataMembers.cxx:414
 TListOfDataMembers.cxx:415
 TListOfDataMembers.cxx:416
 TListOfDataMembers.cxx:417
 TListOfDataMembers.cxx:418
 TListOfDataMembers.cxx:419
 TListOfDataMembers.cxx:420
 TListOfDataMembers.cxx:421
 TListOfDataMembers.cxx:422
 TListOfDataMembers.cxx:423
 TListOfDataMembers.cxx:424
 TListOfDataMembers.cxx:425
 TListOfDataMembers.cxx:426
 TListOfDataMembers.cxx:427
 TListOfDataMembers.cxx:428
 TListOfDataMembers.cxx:429
 TListOfDataMembers.cxx:430
 TListOfDataMembers.cxx:431
 TListOfDataMembers.cxx:432
 TListOfDataMembers.cxx:433
 TListOfDataMembers.cxx:434
 TListOfDataMembers.cxx:435
 TListOfDataMembers.cxx:436
 TListOfDataMembers.cxx:437
 TListOfDataMembers.cxx:438
 TListOfDataMembers.cxx:439
 TListOfDataMembers.cxx:440
 TListOfDataMembers.cxx:441
 TListOfDataMembers.cxx:442
 TListOfDataMembers.cxx:443
 TListOfDataMembers.cxx:444
 TListOfDataMembers.cxx:445
 TListOfDataMembers.cxx:446
 TListOfDataMembers.cxx:447
 TListOfDataMembers.cxx:448
 TListOfDataMembers.cxx:449
 TListOfDataMembers.cxx:450
 TListOfDataMembers.cxx:451
 TListOfDataMembers.cxx:452
 TListOfDataMembers.cxx:453
 TListOfDataMembers.cxx:454
 TListOfDataMembers.cxx:455
 TListOfDataMembers.cxx:456
 TListOfDataMembers.cxx:457
 TListOfDataMembers.cxx:458
 TListOfDataMembers.cxx:459
 TListOfDataMembers.cxx:460
 TListOfDataMembers.cxx:461
 TListOfDataMembers.cxx:462
 TListOfDataMembers.cxx:463
 TListOfDataMembers.cxx:464
 TListOfDataMembers.cxx:465
 TListOfDataMembers.cxx:466
 TListOfDataMembers.cxx:467
 TListOfDataMembers.cxx:468
 TListOfDataMembers.cxx:469
 TListOfDataMembers.cxx:470
 TListOfDataMembers.cxx:471
 TListOfDataMembers.cxx:472
 TListOfDataMembers.cxx:473
 TListOfDataMembers.cxx:474
 TListOfDataMembers.cxx:475
 TListOfDataMembers.cxx:476
 TListOfDataMembers.cxx:477
 TListOfDataMembers.cxx:478
 TListOfDataMembers.cxx:479
 TListOfDataMembers.cxx:480
 TListOfDataMembers.cxx:481
 TListOfDataMembers.cxx:482
 TListOfDataMembers.cxx:483
 TListOfDataMembers.cxx:484
 TListOfDataMembers.cxx:485
 TListOfDataMembers.cxx:486
 TListOfDataMembers.cxx:487
 TListOfDataMembers.cxx:488
 TListOfDataMembers.cxx:489
 TListOfDataMembers.cxx:490
 TListOfDataMembers.cxx:491
 TListOfDataMembers.cxx:492
 TListOfDataMembers.cxx:493
 TListOfDataMembers.cxx:494
 TListOfDataMembers.cxx:495
 TListOfDataMembers.cxx:496
 TListOfDataMembers.cxx:497
 TListOfDataMembers.cxx:498
 TListOfDataMembers.cxx:499
 TListOfDataMembers.cxx:500
 TListOfDataMembers.cxx:501
 TListOfDataMembers.cxx:502
 TListOfDataMembers.cxx:503
 TListOfDataMembers.cxx:504
 TListOfDataMembers.cxx:505
 TListOfDataMembers.cxx:506
 TListOfDataMembers.cxx:507
 TListOfDataMembers.cxx:508
 TListOfDataMembers.cxx:509
 TListOfDataMembers.cxx:510
 TListOfDataMembers.cxx:511
 TListOfDataMembers.cxx:512
 TListOfDataMembers.cxx:513
 TListOfDataMembers.cxx:514
 TListOfDataMembers.cxx:515
 TListOfDataMembers.cxx:516
 TListOfDataMembers.cxx:517
 TListOfDataMembers.cxx:518
 TListOfDataMembers.cxx:519
 TListOfDataMembers.cxx:520
 TListOfDataMembers.cxx:521
 TListOfDataMembers.cxx:522
 TListOfDataMembers.cxx:523
 TListOfDataMembers.cxx:524
 TListOfDataMembers.cxx:525
 TListOfDataMembers.cxx:526
 TListOfDataMembers.cxx:527
 TListOfDataMembers.cxx:528
 TListOfDataMembers.cxx:529
 TListOfDataMembers.cxx:530
 TListOfDataMembers.cxx:531
 TListOfDataMembers.cxx:532
 TListOfDataMembers.cxx:533
 TListOfDataMembers.cxx:534
 TListOfDataMembers.cxx:535
 TListOfDataMembers.cxx:536
 TListOfDataMembers.cxx:537
 TListOfDataMembers.cxx:538
 TListOfDataMembers.cxx:539
 TListOfDataMembers.cxx:540
 TListOfDataMembers.cxx:541
 TListOfDataMembers.cxx:542
 TListOfDataMembers.cxx:543
 TListOfDataMembers.cxx:544
 TListOfDataMembers.cxx:545
 TListOfDataMembers.cxx:546
 TListOfDataMembers.cxx:547
 TListOfDataMembers.cxx:548
 TListOfDataMembers.cxx:549
 TListOfDataMembers.cxx:550
 TListOfDataMembers.cxx:551
 TListOfDataMembers.cxx:552
 TListOfDataMembers.cxx:553
 TListOfDataMembers.cxx:554
 TListOfDataMembers.cxx:555
 TListOfDataMembers.cxx:556
 TListOfDataMembers.cxx:557
 TListOfDataMembers.cxx:558
 TListOfDataMembers.cxx:559
 TListOfDataMembers.cxx:560
 TListOfDataMembers.cxx:561
 TListOfDataMembers.cxx:562
 TListOfDataMembers.cxx:563
 TListOfDataMembers.cxx:564
 TListOfDataMembers.cxx:565
 TListOfDataMembers.cxx:566
 TListOfDataMembers.cxx:567
 TListOfDataMembers.cxx:568
 TListOfDataMembers.cxx:569