ROOT logo
// @(#)root/cont:$Id: TClassTable.cxx 30950 2009-11-02 17:01:02Z brun $
// Author: Fons Rademakers   11/08/95

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// This class registers for all classes their name, id and dictionary   //
// function in a hash table. Classes are automatically added by the     //
// ctor of a special init class when a global of this init class is     //
// initialized when the program starts (see the ClassImp macro).        //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "RConfig.h"
#include <stdlib.h>
#include <string>
#include <map>
#include <typeinfo>
#include "Riostream.h"

#include "TClassTable.h"
#include "TClass.h"
#include "TClassEdit.h"
#include "TROOT.h"
#include "TString.h"
#include "TError.h"
#include "TRegexp.h"

#include "TObjString.h"
#include "TMap.h"

TClassTable *gClassTable;

TClassRec  **TClassTable::fgTable;
TClassRec  **TClassTable::fgSortedTable;
int          TClassTable::fgSize;
int          TClassTable::fgTally;
Bool_t       TClassTable::fgSorted;
int          TClassTable::fgCursor;
TClassTable::IdMap_t *TClassTable::fgIdMap;

ClassImp(TClassTable)

//______________________________________________________________________________
namespace ROOT {

   class TMapTypeToClassRec {
#if defined R__USE_STD_MAP
     // This wrapper class allow to avoid putting #include <map> in the
     // TROOT.h header file.
   public:
#ifdef R__GLOBALSTL
      typedef map<string, TClassRec*>           IdMap_t;
#else
      typedef std::map<std::string, TClassRec*> IdMap_t;
#endif
      typedef IdMap_t::key_type                 key_type;
      typedef IdMap_t::const_iterator           const_iterator;
      typedef IdMap_t::size_type                size_type;
#ifdef R__WIN32
      // Window's std::map does NOT defined mapped_type
      typedef TClassRec*                        mapped_type;
#else
      typedef IdMap_t::mapped_type              mapped_type;
#endif

   private:
      IdMap_t fMap;

   public:
      void Add(const key_type &key, mapped_type &obj) {
         fMap[key] = obj;
      }

      mapped_type Find(const key_type &key) const {

         IdMap_t::const_iterator iter = fMap.find(key);
         mapped_type cl = 0;
         if (iter != fMap.end()) cl = iter->second;
         return cl;
      }

      void Remove(const key_type &key) { fMap.erase(key); }

      void Print() {
         Info("TMapTypeToClassRec::Print", "printing the typeinfo map in TClassTable");
         for (const_iterator iter = fMap.begin(); iter != fMap.end(); iter++) {
            printf("Key: %40s 0x%lx\n", iter->first.c_str(), iter->second);
         }
      }
#else
   private:
      TMap fMap;
   public:
      void Add(const char *key, TClassRec *&obj) {
         TObjString *realkey = new TObjString(key);
         fMap.Add(realkey, (TObject*)obj);
      }

      TClassRec *Find(const char *key) const {
         const TPair *a = (const TPair *)fMap.FindObject(key);
         if (a) return (TClassRec*) a->Value();
         return 0;
      }

      void Remove(const char *key) {
         TObjString realkey(key);
         TObject *actual = fMap.Remove(&realkey);
         delete actual;
      }

      void Print() {
         Info("TMapTypeToClassRec::Print", "printing the typeinfo map in TClassTable");
         TIter next(&fMap);
         TObjString *key;
         while((key = (TObjString*)next())) {
            printf("Key: %s\n",key->String().Data());
            TClassRec *data = (TClassRec*)fMap.GetValue(key);
            if (data) {
               printf("  class: %s %d\n",data->fName,data->fId);
            } else {
               printf("  no class: \n");
            }
         }
      }
#endif
   };
}

//______________________________________________________________________________
TClassTable::TClassTable()
{
   // TClassTable is a singleton (i.e. only one can exist per application).

   if (gClassTable) return;

   fgSize  = 1009;  //this is thge result of (int)TMath::NextPrime(1000);
   fgTable = new TClassRec* [fgSize];
   fgIdMap = new IdMap_t;
   memset(fgTable, 0, fgSize*sizeof(TClassRec*));
   gClassTable = this;
}

//______________________________________________________________________________
TClassTable::~TClassTable()
{
   // TClassTable singleton is deleted in Terminate().

   // Try to avoid spurrious warning from memory leak checkers.
   if (gClassTable != this) return;

   for (Int_t i = 0; i < fgSize; i++) {
      TClassRec *r = fgTable[i];
      while (r) {
         delete [] r->fName;
         TClassRec *next = r->fNext;
         delete r;
         r = next;
      }
   }
   delete [] fgTable; fgTable = 0;
   delete [] fgSortedTable; fgSortedTable = 0;
   delete fgIdMap; fgIdMap = 0;
}

//______________________________________________________________________________
void TClassTable::Print(Option_t *option) const
{
   // Print the class table. Before printing the table is sorted
   // alphabetically. Only classes specified in option are listed.
   // The default is to list all classes.
   // Standard wilcarding notation supported.

   if (fgTally == 0 || !fgTable)
      return;

   SortTable();

   int n = 0, ninit = 0, nl = 0;

   int nch = strlen(option);
   TRegexp re(option, kTRUE);

   Printf("");
   Printf("Defined classes");
   Printf("class                                 version  bits  initialized");
   Printf("================================================================");
   for (int i = 0; i < fgTally; i++) {
      if (!fgTable[i]) continue;
      TClassRec *r = fgSortedTable[i];
      if (!r) break;
      n++;
      TString s = r->fName;
      if (nch && strcmp(option,r->fName) && s.Index(re) == kNPOS) continue;
      nl++;
      if (TClass::GetClass(r->fName, kFALSE)) {
         ninit++;
         Printf("%-35s %6d %7d       Yes", r->fName, r->fId, r->fBits);
      } else
         Printf("%-35s %6d %7d       No",  r->fName, r->fId, r->fBits);
   }
   Printf("----------------------------------------------------------------");
   Printf("Listed Classes: %4d  Total classes: %4d   initialized: %4d",nl, n, ninit);
   Printf("================================================================");

   Printf("");
}

//---- static members --------------------------------------------------------

//______________________________________________________________________________
char *TClassTable::At(int index)
{
    // Returns class at index from sorted class table. Don't use this iterator
    // while modifying the class table. The class table can be modified
    // when making calls like TClass::GetClass(), etc.
    // Returns 0 if index points beyond last class name.

   SortTable();
   if (index >= 0 && index < fgTally) {
      TClassRec *r = fgSortedTable[index];
      if (r) return r->fName;
   }
   return 0;
}

//______________________________________________________________________________
int   TClassTable::Classes() { return fgTally; }
//______________________________________________________________________________
void  TClassTable::Init() { fgCursor = 0; SortTable(); }

namespace ROOT { class TForNamespace {}; } // Dummy class to give a typeid to namespace (see also TGenericClassInfo)

//______________________________________________________________________________
void TClassTable::Add(const char *cname, Version_t id,  const type_info &info,
                      VoidFuncPtr_t dict, Int_t pragmabits)
{
   // Add a class to the class table (this is a static function).

   if (!gClassTable)
      new TClassTable;

  // check if already in table, if so return
   TClassRec *r = FindElement(cname, kTRUE);
   if (r->fName) {
      if ( strcmp(r->fInfo->name(),typeid(ROOT::TForNamespace).name())==0
           && strcmp(info.name(),typeid(ROOT::TForNamespace).name())==0 ) {
         // We have a namespace being reloaded.
         // This okay we just keep the old one.
         return;
      }
      if (TClassEdit::IsSTLCont(cname)==0) {
         // Warn only for class that are not STL containers.
         ::Warning("TClassTable::Add", "class %s already in TClassTable", cname);
      }
      return;
   }

   r->fName = StrDup(cname);
   r->fId   = id;
   r->fBits = pragmabits;
   r->fDict = dict;
   r->fInfo = &info;

   fgIdMap->Add(info.name(),r);

   fgTally++;
   fgSorted = kFALSE;
}

//______________________________________________________________________________
void TClassTable::Remove(const char *cname)
{
   // Remove a class from the class table. This happens when a shared library
   // is unloaded (i.e. the dtor's of the global init objects are called).

   if (!gClassTable || !fgTable) return;

   int slot = 0;
   const char *p = cname;

   while (*p) slot = slot<<1 ^ *p++;
   if (slot < 0) slot = -slot;
   slot %= fgSize;

   TClassRec *r;
   TClassRec *prev = 0;
   for (r = fgTable[slot]; r; r = r->fNext) {
      if (!strcmp(r->fName, cname)) {
         if (prev)
            prev->fNext = r->fNext;
         else
            fgTable[slot] = r->fNext;
         fgIdMap->Remove(r->fInfo->name());
         delete [] r->fName;
         delete r;
         fgTally--;
         fgSorted = kFALSE;
         break;
      }
      prev = r;
   }
}

//______________________________________________________________________________
TClassRec *TClassTable::FindElement(const char *cname, Bool_t insert)
{
   // Find a class by name in the class table (using hash of name). Returns
   // 0 if the class is not in the table. Unless arguments insert is true in
   // which case a new entry is created and returned.

   if (!fgTable) return 0;

   int slot = 0;
   const char *p = cname;

   while (*p) slot = slot<<1 ^ *p++;
   if (slot < 0) slot = -slot;
   slot %= fgSize;

   TClassRec *r;

   for (r = fgTable[slot]; r; r = r->fNext)
      if (!strcmp(r->fName, cname)) return r;

   if (!insert) return 0;

   r = new TClassRec;
   r->fName = 0;
   r->fId   = 0;
   r->fDict = 0;
   r->fInfo = 0;
   r->fNext = fgTable[slot];
   fgTable[slot] = r;

   return r;
}

//______________________________________________________________________________
Version_t TClassTable::GetID(const char *cname)
{
   // Returns the ID of a class.

   TClassRec *r = FindElement(cname);
   if (r) return r->fId;
   return -1;
}

//______________________________________________________________________________
Int_t TClassTable::GetPragmaBits(const char *cname)
{
   // Returns the pragma bits as specified in the LinkDef.h file.

   TClassRec *r = FindElement(cname);
   if (r) return r->fBits;
   return 0;
}

//______________________________________________________________________________
VoidFuncPtr_t TClassTable::GetDict(const char *cname)
{
   // Given the class name returns the Dictionary() function of a class
   // (uses hash of name).

   if (gDebug > 9) {
      ::Info("GetDict", "searches for %s", cname);
      fgIdMap->Print();
   }

   TClassRec *r = FindElement(cname);
   if (r) return r->fDict;
   return 0;
}

//______________________________________________________________________________
VoidFuncPtr_t TClassTable::GetDict(const type_info& info)
{
   // Given the type_info returns the Dictionary() function of a class
   // (uses hash of type_info::name()).

   if (gDebug > 9) {
      ::Info("GetDict", "searches for %s at 0x%lx", info.name(), &info);
      fgIdMap->Print();
   }

   TClassRec *r = fgIdMap->Find(info.name());
   if (r) return r->fDict;
   return 0;
}


//______________________________________________________________________________
extern "C" {
   static int ClassComp(const void *a, const void *b)
   {
      // Function used for sorting classes alphabetically.

      return strcmp((*(TClassRec **)a)->fName, (*(TClassRec **)b)->fName);
   }
}

//______________________________________________________________________________
char *TClassTable::Next()
{
    // Returns next class from sorted class table. Don't use this iterator
    // while modifying the class table. The class table can be modified
    // when making calls like TClass::GetClass(), etc.

   if (fgCursor < fgTally) {
      TClassRec *r = fgSortedTable[fgCursor++];
      return r->fName;
   } else
      return 0;
}

//______________________________________________________________________________
void TClassTable::PrintTable()
{
   // Print the class table. Before printing the table is sorted
   // alphabetically.

   if (fgTally == 0 || !fgTable)
      return;

   SortTable();

   int n = 0, ninit = 0;

   Printf("");
   Printf("Defined classes");
   Printf("class                                 version  bits  initialized");
   Printf("================================================================");
   for (int i = 0; i < fgTally; i++) {
      if (!fgTable[i]) continue;
      TClassRec *r = fgSortedTable[i];
      if (!r) break;
      n++;
      if (TClass::GetClass(r->fName, kFALSE)) {
         ninit++;
         Printf("%-35s %6d %7d       Yes", r->fName, r->fId, r->fBits);
      } else
         Printf("%-35s %6d %7d       No",  r->fName, r->fId, r->fBits);
   }
   Printf("----------------------------------------------------------------");
   Printf("Total classes: %4d   initialized: %4d", n, ninit);
   Printf("================================================================");

   Printf("");
}

//______________________________________________________________________________
void TClassTable::SortTable()
{
   // Sort the class table by ascending class ID's.

   if (!fgSorted) {
      delete [] fgSortedTable;
      fgSortedTable = new TClassRec* [fgTally];

      int j = 0;
      for (int i = 0; i < fgSize; i++)
         for (TClassRec *r = fgTable[i]; r; r = r->fNext)
            fgSortedTable[j++] = r;

      ::qsort(fgSortedTable, fgTally, sizeof(TClassRec *), ::ClassComp);
      fgSorted = kTRUE;
   }
}

//______________________________________________________________________________
void TClassTable::Terminate()
{
   // Deletes the class table (this static class function calls the dtor).

   if (gClassTable) {
      for (int i = 0; i < fgSize; i++)
         for (TClassRec *r = fgTable[i]; r; ) {
            TClassRec *t = r;
            r = r->fNext;
            fgIdMap->Remove(r->fInfo->name());
            delete [] t->fName;
            delete t;
         }
      delete [] fgTable; fgTable = 0;
      delete [] fgSortedTable; fgSortedTable = 0;
      delete fgIdMap; fgIdMap = 0;
      fgSize = 0;
      SafeDelete(gClassTable);
   }
}

//______________________________________________________________________________
void ROOT::AddClass(const char *cname, Version_t id,
                    const type_info& info,
                    VoidFuncPtr_t dict,
                    Int_t pragmabits)
{
   // Global function called by the ctor of a class's init class
   // (see the ClassImp macro).

   TClassTable::Add(cname, id, info, dict, pragmabits);
}

//______________________________________________________________________________
void ROOT::ResetClassVersion(TClass *cl, const char *cname, Short_t newid)
{
   // Global function to update the version number.
   // This is called via the RootClassVersion macro.
   //
   // if cl!=0 and cname==-1, set the new class version if and only is
   // greater than the existing one and greater or equal to 2;
   // and also ignore the request if fVersionUsed is true.
   //
   // Note on class version number:
   //   If no class has been specified, TClass::GetVersion will return -1
   //   The Class Version 0 request the whole object to be transient
   //   The Class Version 1, unless specify via ClassDef indicates that the
   //      I/O should use the TClass checksum to distinguish the layout of the class

   if (cname && cname!=(void*)-1) {
      TClassRec *r = TClassTable::FindElement(cname,kFALSE);
      if (r) r->fId = newid;
   }
   if (cl) {
      if (cl->fVersionUsed) {
         // Problem, the reset is called after the first usage!
         if (cname!=(void*)-1) 
            Error("ResetClassVersion","Version number of %s can not be changed after first usage!",
                  cl->GetName());
      } else {
         if (newid < 0) {
            Error("SetClassVersion","The class version (for %s) must be positive (value %d is ignored)",cl->GetName(),newid);
         }
         if (cname==(void*)-1) {
            if (cl->fClassVersion<newid && 2<=newid) {
               cl->SetClassVersion(newid);
            }
         } else {
            cl->SetClassVersion(newid);
         }
      }
   }
}


//______________________________________________________________________________
void ROOT::RemoveClass(const char *cname)
{
   // Global function called by the dtor of a class's init class
   // (see the ClassImp macro).

   // don't delete class information since it is needed by the I/O system
   // to write the StreamerInfo to file
   if (cname) {
      // Let's still remove this information to allow reloading later.
      // Anyway since the shared library has been unloaded, the dictionary
      // pointer is now invalid ....
      // We still keep the TClass object around because TFile needs to
      // get to the TStreamerInfo.
      if (gROOT && gROOT->GetListOfClasses()) {
         TObject *pcname;
         if ((pcname=gROOT->GetListOfClasses()->FindObject(cname))) {
            TClass *cl = dynamic_cast<TClass*>(pcname);
            if (cl) cl->SetUnloaded();
         }
      }
      TClassTable::Remove(cname);
   }
}

//______________________________________________________________________________
TNamed *ROOT::RegisterClassTemplate(const char *name, const char *file,
                                    Int_t line)
{
   // Global function to register the implementation file and line of
   // a class template (i.e. NOT a concrete class).

   static TList table;

   TString classname(name);
   Ssiz_t loc = classname.Index("<");
   if (loc >= 1) classname.Remove(loc);
   if (file) {
      TNamed *obj = new TNamed((const char*)classname, file);
      obj->SetUniqueID(line);
      table.Add(obj);
      return obj;
   } else {
      return (TNamed*)table.FindObject(classname);
   }
}

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