ROOT logo
// @(#)root/cont:$Id: TRefTable.cxx 37274 2010-12-04 21:31:29Z pcanal $
// Author: Rene Brun   28/09/2001

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// A TRefTable maintains the association between a referenced object    //
// and the parent object supporting this referenced object.             //
//                                                                      //
// The parent object is typically a branch of a TTree. For each object  //
// referenced in a TTree entry, the corresponding entry in the TTree's  //
// TBranchRef::fRefTable contains the index of the branch that          //
// needs to be loaded to bring the object into memory.                  //
//                                                                      //
// Persistency of a TRefTable is split into two parts:                  //
// * entry specific information is stored (read) by FillBuffer          //
//   (ReadBuffer). For each referenced object the object's fUniqueID    //
//   and the referencing TRef::fPID is stored (to allow the TRefTable   //
//   to autoload references created by different processes).            //
// * non-entry specific, i.e. global information is stored (read) by    //
//   the Streamer function. This comprises all members marked as        //
//   persistent.                                                        //
//                                                                      //
// As TObject::fUniqueID is only unique for a given TProcessID, a table //
// of unique IDs is kept for each used TProcessID. There is no natural  //
// order of TProcessIDs, so TRefTable stores a vector of the TGUID of   //
// all known TProcessIDs in fProcessGUIDs; the index of a TProcessID in //
// this vector defines the index of the auto-loading info in fParentIDs //
// for that TProcessID. The mapping of TProcessID* to index is cached   //
// for quick non-persistent lookup.                                     //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TRefTable.h"
#include "TObjArray.h"
#include "TProcessID.h"
#include <algorithm>

TRefTable *TRefTable::fgRefTable = 0;

ClassImp(TRefTable)
//______________________________________________________________________________
TRefTable::TRefTable() : fNumPIDs(0), fAllocSize(0), fN(0), fParentIDs(0), fParentID(-1),
                         fDefaultSize(10), fUID(0), fUIDContext(0), fSize(0), fParents(0), fOwner(0)
{
   // Default constructor for I/O.

   fgRefTable   = this;
}

//______________________________________________________________________________
TRefTable::TRefTable(TObject *owner, Int_t size) :
     fNumPIDs(0), fAllocSize(0), fN(0), fParentIDs(0), fParentID(-1),
     fDefaultSize(size<10 ? 10 : size), fUID(0), fUIDContext(0), fSize(0), fParents(new TObjArray(1)), fOwner(owner)
{
   // Create a TRefTable with initial size.

   fgRefTable   = this;
}

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

   delete [] fAllocSize;
   delete [] fN;
   for (Int_t pid = 0; pid < fNumPIDs; ++pid) {
      delete [] fParentIDs[pid];
   }
   delete [] fParentIDs;
   delete fParents;
   if (fgRefTable == this) fgRefTable = 0;
}

//______________________________________________________________________________
Int_t TRefTable::Add(Int_t uid, TProcessID *context)
{
   // Add a new uid to the table.
   // we add a new pair (uid,fparent) to the map
   // This function is called by TObject::Streamer or TStreamerInfo::WriteBuffer

   if (!context)
      context = TProcessID::GetSessionProcessID();
   Int_t iid = GetInternalIdxForPID(context);

   Int_t newsize = 0;
   uid = uid & 0xffffff;
   if (uid >= fAllocSize[iid]) {
      newsize = uid + uid / 2;
      if (newsize < fDefaultSize)
         newsize = fDefaultSize;
      newsize = ExpandForIID(iid, newsize);
   }
   if (newsize < 0) {
      Error("Add", "Cannot allocate space to store uid=%d", uid);
      return -1;
   }
   if (fParentID < 0) {
      Error("Add", "SetParent must be called before adding uid=%d", uid);
      return -1;
   }
   fParentIDs[iid][uid] = fParentID + 1;
   if (uid >= fN[iid]) fN[iid] = uid + 1;
   return uid;
}


//______________________________________________________________________________
Int_t TRefTable::AddInternalIdxForPID(TProcessID *procid)
{
   // Add the internal index for fProcessIDs, fAllocSize, etc given a PID.

   if (!procid)
      procid = TProcessID::GetSessionProcessID();
   Int_t pid = procid->GetUniqueID();
   if (fMapPIDtoInternal.size() <= (size_t) pid)
      fMapPIDtoInternal.resize(TProcessID::GetNProcessIDs(), -1);

   Int_t iid = fMapPIDtoInternal[pid];
   if (iid == -1) {
      // need to update
      iid = FindPIDGUID(procid->GetTitle());
      if (iid == -1) {
         fProcessGUIDs.push_back(procid->GetTitle());
         iid = fProcessGUIDs.size() - 1;
      }
      fMapPIDtoInternal[pid] = iid;
   }

   ExpandPIDs(iid + 1);
   return iid;
}

//______________________________________________________________________________
void TRefTable::Clear(Option_t * /*option*/ )
{
   // Clear all entries in the table.

   for (Int_t iid = 0; iid < fNumPIDs; ++iid) {
      memset(fParentIDs[iid], 0, sizeof(Int_t) * fN[iid]);
   }
   memset(fN, 0, sizeof(Int_t) * fNumPIDs);
   fParentID = -1;
}

//______________________________________________________________________________
Int_t TRefTable::Expand(Int_t pid, Int_t newsize)
{
   // Expand fParentIDs to newsize for ProcessID pid.

   Int_t iid = GetInternalIdxForPID(pid);
   if (iid < 0) return -1;
   return ExpandForIID(iid, newsize);
}

//______________________________________________________________________________
Int_t TRefTable::ExpandForIID(Int_t iid, Int_t newsize)
{
   // Expand fParentIDs to newsize for internel ProcessID index iid.

   if (newsize < 0)  return newsize;
   if (newsize != fAllocSize[iid]) {
      Int_t *temp = fParentIDs[iid];
      if (newsize != 0) {
         fParentIDs[iid] = new Int_t[newsize];
         if (newsize < fAllocSize[iid])
            memcpy(fParentIDs[iid], temp, newsize * sizeof(Int_t));
         else {
            memcpy(fParentIDs[iid], temp, fAllocSize[iid] * sizeof(Int_t));
            memset(&fParentIDs[iid][fAllocSize[iid]], 0,
                   (newsize - fAllocSize[iid]) * sizeof(Int_t));
         }
      } else {
         fParentIDs[iid] = 0;
      }
      if (fAllocSize[iid]) delete [] temp;
      fAllocSize[iid] = newsize;
   }
   return newsize;
}

//______________________________________________________________________________
void TRefTable::ExpandPIDs(Int_t numpids)
{
   // Expand the arrays of managed PIDs

   if (numpids <= fNumPIDs) return;

   // else add to internal tables
   Int_t oldNumPIDs = fNumPIDs;
   fNumPIDs  = numpids;

   Int_t *temp = fAllocSize;
   fAllocSize = new Int_t[fNumPIDs];
   if (temp) memcpy(fAllocSize, temp, oldNumPIDs * sizeof(Int_t));
   memset(&fAllocSize[oldNumPIDs], 0,
          (fNumPIDs - oldNumPIDs) * sizeof(Int_t));
   delete [] temp;

   temp = fN;
   fN = new Int_t[fNumPIDs];
   if (temp) memcpy(fN, temp, oldNumPIDs * sizeof(Int_t));
   memset(&fN[oldNumPIDs], 0, (fNumPIDs - oldNumPIDs) * sizeof(Int_t));
   delete [] temp;

   Int_t **temp2 = fParentIDs;
   fParentIDs = new Int_t *[fNumPIDs];
   if (temp2) memcpy(fParentIDs, temp2, oldNumPIDs * sizeof(Int_t *));
   memset(&fParentIDs[oldNumPIDs], 0,
          (fNumPIDs - oldNumPIDs) * sizeof(Int_t*));
}

//______________________________________________________________________________
void TRefTable::FillBuffer(TBuffer & b)
{
   // Fill buffer b with the fN elements in fParentdIDs.
   // This function is called by TBranchRef::FillLeaves.

   b << -fNumPIDs; // write out "-" to signal new TRefTable buffer format using PID table
   for (Int_t iid = 0; iid < fNumPIDs; ++iid) {
      b << fN[iid];
      b.WriteFastArray(fParentIDs[iid], fN[iid]);
   }
}


//______________________________________________________________________________
Int_t TRefTable::FindPIDGUID(const char *guid) const
{
   // Get fProcessGUIDs' index of the TProcessID with GUID guid
   std::vector<std::string>::const_iterator posPID
      = std::find(fProcessGUIDs.begin(), fProcessGUIDs.end(), guid);
   if (posPID == fProcessGUIDs.end()) return -1;
   return posPID - fProcessGUIDs.begin();
}

//______________________________________________________________________________
TObject *TRefTable::GetParent(Int_t uid, TProcessID *context /* =0 */ ) const 
{
   // Return object corresponding to uid.
   if (!fParents) return 0;

   Int_t iid = -1;
   if (!context) context = TProcessID::GetSessionProcessID();
   iid = GetInternalIdxForPID(context);

   uid = uid & 0xFFFFFF;
   if (uid < 0 || uid >= fN[iid]) return 0;
   Int_t pnumber = fParentIDs[iid][uid] - 1;
   Int_t nparents = fParents->GetEntriesFast();
   if (pnumber < 0 || pnumber >= nparents) return 0;
   return fParents->UncheckedAt(pnumber);
}

//______________________________________________________________________________
Int_t TRefTable::GetInternalIdxForPID(TProcessID *procid) const 
{
   // Get the index for fProcessIDs, fAllocSize, etc given a PID.
   // Uses fMapPIDtoInternal and the pid's GUID / fProcessGUID 

   return const_cast <TRefTable*>(this)->AddInternalIdxForPID(procid);
}

//______________________________________________________________________________
Int_t TRefTable::GetInternalIdxForPID(Int_t pid) const 
{
   // Get the index for fProcessIDs, fAllocSize, etc given a PID.
   // Uses fMapPIDtoInternal and the pid's GUID / fProcessGUID

   return GetInternalIdxForPID(TProcessID::GetProcessID(pid));
}


//______________________________________________________________________________
TRefTable *TRefTable::GetRefTable()
{
   // Static function returning the current TRefTable.

   return fgRefTable;
}

//______________________________________________________________________________
Bool_t TRefTable::Notify()
{
   // This function is called by TRef::Streamer or TStreamerInfo::ReadBuffer
   // when reading a reference.
   // This function, in turns, notifies the TRefTable owner for action.
   // eg, when the owner is a TBranchRef, TBranchRef::Notify is called
   // to read the branch containing the referenced object.

   return fOwner->Notify();
}

//______________________________________________________________________________
void TRefTable::ReadBuffer(TBuffer &b)
{
   // Fill buffer b with the fN elements in fParentdIDs.
   // This function is called by TBranchRef::ReadLeaves

   Int_t firstInt = 0;          // we don't know yet what it means
   b >> firstInt;

   Int_t numIids = -1;
   Int_t startIid = 0;
   if (firstInt < 0) numIids = -firstInt; // new format
   else {
      // old format, only one PID
      numIids = 1;

      TProcessID *fileProcessID = b.GetLastProcessID(this);

      startIid = GetInternalIdxForPID(fileProcessID);
      if (startIid == -1) {
         fProcessGUIDs.push_back(fileProcessID->GetTitle());
         startIid = fProcessGUIDs.size() - 1;
      }
      numIids += startIid;
   }

   ExpandPIDs(numIids);
   for (Int_t iid = startIid; iid < numIids; ++iid) {
      Int_t newN = 0;
      if (firstInt < 0) b >> newN;
      else newN = firstInt;
      if (newN > fAllocSize[iid])
         ExpandForIID(iid, newN + newN / 2);
      fN[iid] = newN;
      b.ReadFastArray(fParentIDs[iid], fN[iid]);
   }
}

//______________________________________________________________________________
void TRefTable::Reset(Option_t * /*option*/ )
{
   // Clear all entries in the table.
   Clear();
   if (fParents) fParents->Clear();
}

//______________________________________________________________________________
Int_t TRefTable::SetParent(const TObject* parent, Int_t branchID)
{
   // -- Set current parent object, typically a branch of a tree.
   //
   // This function is called by TBranchElement::Fill() and by
   // TBranchElement::GetEntry().
   //
   if (!fParents) {
      return -1;
   }
   Int_t nparents = fParents->GetEntriesFast();
   if (branchID != -1) {
      // -- The branch already has an id cached, just use it.
      fParentID = branchID;
   }
   else {
      // -- The branch does *not* have an id cached, find it or generate one.
      // Lookup the branch.
      fParentID = fParents->IndexOf(parent);
      if (fParentID < 0) {
         // -- The branch is not known, generate an id number.
         fParents->AddAtAndExpand(const_cast<TObject*>(parent), nparents);
         fParentID = nparents;
      }
   }
   return fParentID;
}

//______________________________________________________________________________
void TRefTable::SetRefTable(TRefTable *table)
{
   // Static function setting the current TRefTable.

   fgRefTable = table;
}

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

   if (R__b.IsReading()) {
      R__b.ReadClassBuffer(TRefTable::Class(),this);
   } else {
      R__b.WriteClassBuffer(TRefTable::Class(),this);
      //make sure that all TProcessIDs referenced in the Tree are put to the buffer
      //this is important in case the buffer is a TMessage to be sent through a TSocket
#if 0
      TObjArray *pids = TProcessID::GetPIDs();
      Int_t npids = pids->GetEntries();
      Int_t npid2 = fProcessGUIDs.size();
      for (Int_t i = 0; i < npid2; i++) {
         TProcessID *pid;
         for (Int_t ipid = 0;ipid<npids;ipid++) {
            pid = (TProcessID*)pids->At(ipid);
            if (!pid) continue;
            if (!strcmp(pid->GetTitle(),fProcessGUIDs[i].c_str()))
               R__b.WriteProcessID(pid);
         }
      }
#endif
   }
}
 TRefTable.cxx:1
 TRefTable.cxx:2
 TRefTable.cxx:3
 TRefTable.cxx:4
 TRefTable.cxx:5
 TRefTable.cxx:6
 TRefTable.cxx:7
 TRefTable.cxx:8
 TRefTable.cxx:9
 TRefTable.cxx:10
 TRefTable.cxx:11
 TRefTable.cxx:12
 TRefTable.cxx:13
 TRefTable.cxx:14
 TRefTable.cxx:15
 TRefTable.cxx:16
 TRefTable.cxx:17
 TRefTable.cxx:18
 TRefTable.cxx:19
 TRefTable.cxx:20
 TRefTable.cxx:21
 TRefTable.cxx:22
 TRefTable.cxx:23
 TRefTable.cxx:24
 TRefTable.cxx:25
 TRefTable.cxx:26
 TRefTable.cxx:27
 TRefTable.cxx:28
 TRefTable.cxx:29
 TRefTable.cxx:30
 TRefTable.cxx:31
 TRefTable.cxx:32
 TRefTable.cxx:33
 TRefTable.cxx:34
 TRefTable.cxx:35
 TRefTable.cxx:36
 TRefTable.cxx:37
 TRefTable.cxx:38
 TRefTable.cxx:39
 TRefTable.cxx:40
 TRefTable.cxx:41
 TRefTable.cxx:42
 TRefTable.cxx:43
 TRefTable.cxx:44
 TRefTable.cxx:45
 TRefTable.cxx:46
 TRefTable.cxx:47
 TRefTable.cxx:48
 TRefTable.cxx:49
 TRefTable.cxx:50
 TRefTable.cxx:51
 TRefTable.cxx:52
 TRefTable.cxx:53
 TRefTable.cxx:54
 TRefTable.cxx:55
 TRefTable.cxx:56
 TRefTable.cxx:57
 TRefTable.cxx:58
 TRefTable.cxx:59
 TRefTable.cxx:60
 TRefTable.cxx:61
 TRefTable.cxx:62
 TRefTable.cxx:63
 TRefTable.cxx:64
 TRefTable.cxx:65
 TRefTable.cxx:66
 TRefTable.cxx:67
 TRefTable.cxx:68
 TRefTable.cxx:69
 TRefTable.cxx:70
 TRefTable.cxx:71
 TRefTable.cxx:72
 TRefTable.cxx:73
 TRefTable.cxx:74
 TRefTable.cxx:75
 TRefTable.cxx:76
 TRefTable.cxx:77
 TRefTable.cxx:78
 TRefTable.cxx:79
 TRefTable.cxx:80
 TRefTable.cxx:81
 TRefTable.cxx:82
 TRefTable.cxx:83
 TRefTable.cxx:84
 TRefTable.cxx:85
 TRefTable.cxx:86
 TRefTable.cxx:87
 TRefTable.cxx:88
 TRefTable.cxx:89
 TRefTable.cxx:90
 TRefTable.cxx:91
 TRefTable.cxx:92
 TRefTable.cxx:93
 TRefTable.cxx:94
 TRefTable.cxx:95
 TRefTable.cxx:96
 TRefTable.cxx:97
 TRefTable.cxx:98
 TRefTable.cxx:99
 TRefTable.cxx:100
 TRefTable.cxx:101
 TRefTable.cxx:102
 TRefTable.cxx:103
 TRefTable.cxx:104
 TRefTable.cxx:105
 TRefTable.cxx:106
 TRefTable.cxx:107
 TRefTable.cxx:108
 TRefTable.cxx:109
 TRefTable.cxx:110
 TRefTable.cxx:111
 TRefTable.cxx:112
 TRefTable.cxx:113
 TRefTable.cxx:114
 TRefTable.cxx:115
 TRefTable.cxx:116
 TRefTable.cxx:117
 TRefTable.cxx:118
 TRefTable.cxx:119
 TRefTable.cxx:120
 TRefTable.cxx:121
 TRefTable.cxx:122
 TRefTable.cxx:123
 TRefTable.cxx:124
 TRefTable.cxx:125
 TRefTable.cxx:126
 TRefTable.cxx:127
 TRefTable.cxx:128
 TRefTable.cxx:129
 TRefTable.cxx:130
 TRefTable.cxx:131
 TRefTable.cxx:132
 TRefTable.cxx:133
 TRefTable.cxx:134
 TRefTable.cxx:135
 TRefTable.cxx:136
 TRefTable.cxx:137
 TRefTable.cxx:138
 TRefTable.cxx:139
 TRefTable.cxx:140
 TRefTable.cxx:141
 TRefTable.cxx:142
 TRefTable.cxx:143
 TRefTable.cxx:144
 TRefTable.cxx:145
 TRefTable.cxx:146
 TRefTable.cxx:147
 TRefTable.cxx:148
 TRefTable.cxx:149
 TRefTable.cxx:150
 TRefTable.cxx:151
 TRefTable.cxx:152
 TRefTable.cxx:153
 TRefTable.cxx:154
 TRefTable.cxx:155
 TRefTable.cxx:156
 TRefTable.cxx:157
 TRefTable.cxx:158
 TRefTable.cxx:159
 TRefTable.cxx:160
 TRefTable.cxx:161
 TRefTable.cxx:162
 TRefTable.cxx:163
 TRefTable.cxx:164
 TRefTable.cxx:165
 TRefTable.cxx:166
 TRefTable.cxx:167
 TRefTable.cxx:168
 TRefTable.cxx:169
 TRefTable.cxx:170
 TRefTable.cxx:171
 TRefTable.cxx:172
 TRefTable.cxx:173
 TRefTable.cxx:174
 TRefTable.cxx:175
 TRefTable.cxx:176
 TRefTable.cxx:177
 TRefTable.cxx:178
 TRefTable.cxx:179
 TRefTable.cxx:180
 TRefTable.cxx:181
 TRefTable.cxx:182
 TRefTable.cxx:183
 TRefTable.cxx:184
 TRefTable.cxx:185
 TRefTable.cxx:186
 TRefTable.cxx:187
 TRefTable.cxx:188
 TRefTable.cxx:189
 TRefTable.cxx:190
 TRefTable.cxx:191
 TRefTable.cxx:192
 TRefTable.cxx:193
 TRefTable.cxx:194
 TRefTable.cxx:195
 TRefTable.cxx:196
 TRefTable.cxx:197
 TRefTable.cxx:198
 TRefTable.cxx:199
 TRefTable.cxx:200
 TRefTable.cxx:201
 TRefTable.cxx:202
 TRefTable.cxx:203
 TRefTable.cxx:204
 TRefTable.cxx:205
 TRefTable.cxx:206
 TRefTable.cxx:207
 TRefTable.cxx:208
 TRefTable.cxx:209
 TRefTable.cxx:210
 TRefTable.cxx:211
 TRefTable.cxx:212
 TRefTable.cxx:213
 TRefTable.cxx:214
 TRefTable.cxx:215
 TRefTable.cxx:216
 TRefTable.cxx:217
 TRefTable.cxx:218
 TRefTable.cxx:219
 TRefTable.cxx:220
 TRefTable.cxx:221
 TRefTable.cxx:222
 TRefTable.cxx:223
 TRefTable.cxx:224
 TRefTable.cxx:225
 TRefTable.cxx:226
 TRefTable.cxx:227
 TRefTable.cxx:228
 TRefTable.cxx:229
 TRefTable.cxx:230
 TRefTable.cxx:231
 TRefTable.cxx:232
 TRefTable.cxx:233
 TRefTable.cxx:234
 TRefTable.cxx:235
 TRefTable.cxx:236
 TRefTable.cxx:237
 TRefTable.cxx:238
 TRefTable.cxx:239
 TRefTable.cxx:240
 TRefTable.cxx:241
 TRefTable.cxx:242
 TRefTable.cxx:243
 TRefTable.cxx:244
 TRefTable.cxx:245
 TRefTable.cxx:246
 TRefTable.cxx:247
 TRefTable.cxx:248
 TRefTable.cxx:249
 TRefTable.cxx:250
 TRefTable.cxx:251
 TRefTable.cxx:252
 TRefTable.cxx:253
 TRefTable.cxx:254
 TRefTable.cxx:255
 TRefTable.cxx:256
 TRefTable.cxx:257
 TRefTable.cxx:258
 TRefTable.cxx:259
 TRefTable.cxx:260
 TRefTable.cxx:261
 TRefTable.cxx:262
 TRefTable.cxx:263
 TRefTable.cxx:264
 TRefTable.cxx:265
 TRefTable.cxx:266
 TRefTable.cxx:267
 TRefTable.cxx:268
 TRefTable.cxx:269
 TRefTable.cxx:270
 TRefTable.cxx:271
 TRefTable.cxx:272
 TRefTable.cxx:273
 TRefTable.cxx:274
 TRefTable.cxx:275
 TRefTable.cxx:276
 TRefTable.cxx:277
 TRefTable.cxx:278
 TRefTable.cxx:279
 TRefTable.cxx:280
 TRefTable.cxx:281
 TRefTable.cxx:282
 TRefTable.cxx:283
 TRefTable.cxx:284
 TRefTable.cxx:285
 TRefTable.cxx:286
 TRefTable.cxx:287
 TRefTable.cxx:288
 TRefTable.cxx:289
 TRefTable.cxx:290
 TRefTable.cxx:291
 TRefTable.cxx:292
 TRefTable.cxx:293
 TRefTable.cxx:294
 TRefTable.cxx:295
 TRefTable.cxx:296
 TRefTable.cxx:297
 TRefTable.cxx:298
 TRefTable.cxx:299
 TRefTable.cxx:300
 TRefTable.cxx:301
 TRefTable.cxx:302
 TRefTable.cxx:303
 TRefTable.cxx:304
 TRefTable.cxx:305
 TRefTable.cxx:306
 TRefTable.cxx:307
 TRefTable.cxx:308
 TRefTable.cxx:309
 TRefTable.cxx:310
 TRefTable.cxx:311
 TRefTable.cxx:312
 TRefTable.cxx:313
 TRefTable.cxx:314
 TRefTable.cxx:315
 TRefTable.cxx:316
 TRefTable.cxx:317
 TRefTable.cxx:318
 TRefTable.cxx:319
 TRefTable.cxx:320
 TRefTable.cxx:321
 TRefTable.cxx:322
 TRefTable.cxx:323
 TRefTable.cxx:324
 TRefTable.cxx:325
 TRefTable.cxx:326
 TRefTable.cxx:327
 TRefTable.cxx:328
 TRefTable.cxx:329
 TRefTable.cxx:330
 TRefTable.cxx:331
 TRefTable.cxx:332
 TRefTable.cxx:333
 TRefTable.cxx:334
 TRefTable.cxx:335
 TRefTable.cxx:336
 TRefTable.cxx:337
 TRefTable.cxx:338
 TRefTable.cxx:339
 TRefTable.cxx:340
 TRefTable.cxx:341
 TRefTable.cxx:342
 TRefTable.cxx:343
 TRefTable.cxx:344
 TRefTable.cxx:345
 TRefTable.cxx:346
 TRefTable.cxx:347
 TRefTable.cxx:348
 TRefTable.cxx:349
 TRefTable.cxx:350
 TRefTable.cxx:351
 TRefTable.cxx:352
 TRefTable.cxx:353
 TRefTable.cxx:354
 TRefTable.cxx:355
 TRefTable.cxx:356
 TRefTable.cxx:357
 TRefTable.cxx:358
 TRefTable.cxx:359
 TRefTable.cxx:360
 TRefTable.cxx:361
 TRefTable.cxx:362
 TRefTable.cxx:363
 TRefTable.cxx:364
 TRefTable.cxx:365
 TRefTable.cxx:366
 TRefTable.cxx:367
 TRefTable.cxx:368
 TRefTable.cxx:369
 TRefTable.cxx:370
 TRefTable.cxx:371
 TRefTable.cxx:372
 TRefTable.cxx:373
 TRefTable.cxx:374
 TRefTable.cxx:375
 TRefTable.cxx:376
 TRefTable.cxx:377
 TRefTable.cxx:378
 TRefTable.cxx:379
 TRefTable.cxx:380
 TRefTable.cxx:381
 TRefTable.cxx:382
 TRefTable.cxx:383
 TRefTable.cxx:384
 TRefTable.cxx:385
 TRefTable.cxx:386
 TRefTable.cxx:387
 TRefTable.cxx:388
 TRefTable.cxx:389
 TRefTable.cxx:390
 TRefTable.cxx:391
 TRefTable.cxx:392
 TRefTable.cxx:393
 TRefTable.cxx:394
 TRefTable.cxx:395
 TRefTable.cxx:396
 TRefTable.cxx:397
 TRefTable.cxx:398
 TRefTable.cxx:399
 TRefTable.cxx:400
 TRefTable.cxx:401
 TRefTable.cxx:402
 TRefTable.cxx:403
 TRefTable.cxx:404
 TRefTable.cxx:405
 TRefTable.cxx:406
 TRefTable.cxx:407
 TRefTable.cxx:408
 TRefTable.cxx:409
 TRefTable.cxx:410
 TRefTable.cxx:411