ROOT logo
// @(#)root/cont:$Id$
// Author: Fons Rademakers   13/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.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// Collection abstract base class. This class describes the base        //
// protocol all collection classes have to implement. The ROOT          //
// collection classes always store pointers to objects that inherit     //
// from TObject. They never adopt the objects. Therefore, it is the     //
// user's responsability to take care of deleting the actual objects    //
// once they are not needed anymore. In exceptional cases, when the     //
// user is 100% sure nothing else is referencing the objects in the     //
// collection, one can delete all objects and the collection at the     //
// same time using the Delete() function.                               //
//                                                                      //
// Collections can be iterated using an iterator object (see            //
// TIterator). Depending on the concrete collection class there may be  //
// some additional methods of iterating. See the repective classes.     //
//                                                                      //
// TCollection inherits from TObject since we want to be able to have   //
// collections of collections.                                          //
//                                                                      //
// In a later release the collections may become templatized.           //
//                                                                      //
//Begin_Html
/*
<img src="gif/tcollection_classtree.gif">
*/
//End_Html
//////////////////////////////////////////////////////////////////////////

#include "TCollection.h"
#include "Riostream.h"
#include "Varargs.h"
#include "TClass.h"
#include "TROOT.h"
#include "TBrowser.h"
#include "TObjectTable.h"
#include "TRegexp.h"
#include "TPRegexp.h"
#include "TVirtualMutex.h"

TVirtualMutex *gCollectionMutex = 0;

TCollection   *TCollection::fgCurrentCollection = 0;
TObjectTable  *TCollection::fgGarbageCollection = 0;
Bool_t         TCollection::fgEmptyingGarbage   = kFALSE;
Int_t          TCollection::fgGarbageStack      = 0;

ClassImp(TCollection)
ClassImp(TIter)

//______________________________________________________________________________
void TCollection::AddAll(const TCollection *col)
{
   // Add all objects from collection col to this collection.

   TIter next(col);
   TObject *obj;

   while ((obj = next()))
      Add(obj);
}

//______________________________________________________________________________
void TCollection::AddVector(TObject *va_(obj1), ...)
{
   // Add all arguments to the collection. The list of objects must be
   // temrinated by 0, e.g.: l.AddVector(o1, o2, o3, o4, 0);

   va_list ap;
   va_start(ap, va_(obj1));
   TObject *obj;

   Add(va_(obj1));
   while ((obj = va_arg(ap, TObject *)))
      Add(obj);
   va_end(ap);
}

//______________________________________________________________________________
Bool_t TCollection::AssertClass(TClass *cl) const
{
   // Make sure all objects in this collection inherit from class cl.

   TObject *obj;
   TIter    next(this);
   Bool_t   error = kFALSE;

   if (!cl) {
      Error("AssertClass", "class == 0");
      return kTRUE;
   }

   for (int i = 0; (obj = next()); i++)
      if (!obj->InheritsFrom(cl)) {
         Error("AssertClass", "element %d is not an instance of class %s (%s)",
               i, cl->GetName(), obj->ClassName());
         error = kTRUE;
      }
   return error;
}

//______________________________________________________________________________
void TCollection::Browse(TBrowser *b)
{
   // Browse this collection (called by TBrowser).
   // If b=0, there is no Browse call TObject::Browse(0) instead.
   //         This means TObject::Inspect() will be invoked indirectly

   TIter next(this);
   TObject *obj;

   if (b)
      while ((obj = next())) b->Add(obj);
   else
      TObject::Browse(b);
}

//______________________________________________________________________________
TObject *TCollection::Clone(const char *newname) const
{
   // Make a clone of an collection using the Streamer facility.
   // If newname is specified, this will be the name of the new collection.
   
   TCollection *new_collection = (TCollection*)TObject::Clone(newname);
   if (newname && strlen(newname)) new_collection->SetName(newname);
   return new_collection;
}


//______________________________________________________________________________
Int_t TCollection::Compare(const TObject *obj) const
{
   // Compare two TCollection objects. Returns 0 when equal, -1 when this is
   // smaller and +1 when bigger (like strcmp()).

   if (this == obj) return 0;
   return fName.CompareTo(obj->GetName());
}

//______________________________________________________________________________
void TCollection::Draw(Option_t *option)
{
   // Draw all objects in this collection.

   TIter next(this);
   TObject *object;

   while ((object = next())) {
      object->Draw(option);
   }
}

//______________________________________________________________________________
void TCollection::Dump() const
{
   // Dump all objects in this collection.

   TIter next(this);
   TObject *object;

   while ((object = next())) {
      object->Dump();
   }
}

//______________________________________________________________________________
TObject *TCollection::FindObject(const char *name) const
{
   // Find an object in this collection using its name. Requires a sequential
   // scan till the object has been found. Returns 0 if object with specified
   // name is not found.

   TIter next(this);
   TObject *obj;

   while ((obj = next()))
      if (!strcmp(name, obj->GetName())) return obj;
   return 0;
}

//______________________________________________________________________________
TObject *TCollection::operator()(const char *name) const
{
  // Find an object in this collection by name.

   return FindObject(name);
}

//______________________________________________________________________________
TObject *TCollection::FindObject(const TObject *obj) const
{
   // Find an object in this collection using the object's IsEqual()
   // member function. Requires a sequential scan till the object has
   // been found. Returns 0 if object is not found.
   // Typically this function is overridden by a more efficient version
   // in concrete collection classes (e.g. THashTable).

   TIter next(this);
   TObject *ob;

   while ((ob = next()))
      if (ob->IsEqual(obj)) return ob;
   return 0;
}

//______________________________________________________________________________
const char *TCollection::GetName() const
{
  // Return name of this collection.
  // if no name, return the collection class name.

   if (fName.Length() > 0) return fName.Data();
   return ClassName();
}

//______________________________________________________________________________
Int_t TCollection::GrowBy(Int_t delta) const
{
  // Increase the collection's capacity by delta slots.

   if (delta < 0) {
      Error("GrowBy", "delta < 0");
      delta = Capacity();
   }
   return Capacity() + TMath::Range(2, kMaxInt - Capacity(), delta);
}

//______________________________________________________________________________
Bool_t  TCollection::IsArgNull(const char *where, const TObject *obj) const
{
   // Returns true if object is a null pointer.

   return obj ? kFALSE : (Error(where, "argument is a null pointer"), kTRUE);
}

//______________________________________________________________________________
void TCollection::ls(Option_t *option) const
{
   // List (ls) all objects in this collection.
   // Wildcarding supported, eg option="xxx*" lists only objects
   // with names xxx*.

   TROOT::IndentLevel();
   cout <<"OBJ: " << IsA()->GetName() << "\t" << GetName() << "\t" << GetTitle() << " : "
        << Int_t(TestBit(kCanDelete)) << endl;

   TRegexp re(option,kTRUE);
   TIter next(this);
   TObject *object;
   char *star = 0;
   if (option) star = (char*)strchr(option,'*');

   TROOT::IncreaseDirLevel();
   while ((object = next())) {
      if (star) {
         TString s = object->GetName();
         if (s != option && s.Index(re) == kNPOS) continue;
      }
      object->ls(option);
   }
   TROOT::DecreaseDirLevel();
}

//______________________________________________________________________________
void TCollection::Paint(Option_t *option)
{
   // Paint all objects in this collection.

   this->R__FOR_EACH(TObject,Paint)(option);
}

//______________________________________________________________________________
void TCollection::PrintCollectionHeader(Option_t*) const
{
   // Print the collection header.

   TROOT::IndentLevel();
   printf("Collection name='%s', class='%s', size=%d\n",
          GetName(), ClassName(), GetSize());
}

//______________________________________________________________________________
const char* TCollection::GetCollectionEntryName(TObject* entry) const
{
   // For given collection entry return the string that is used to
   // identify the object and, potentially, perform wildcard/regexp
   // filtering on.

   return entry->GetName();
}

//______________________________________________________________________________
void TCollection::PrintCollectionEntry(TObject* entry, Option_t* option, Int_t recurse) const
{
   // Print the collection entry.

   TCollection* coll = dynamic_cast<TCollection*>(entry);
   if (coll) {
      coll->Print(option, recurse);
   } else {
      TROOT::IndentLevel();
      entry->Print(option);
   }
}

//______________________________________________________________________________
void TCollection::Print(Option_t *option) const
{
   // Defualt print for collections, calls Print(option, 1).
   // This will print the collection header and Print() methods of
   // all the collection entries.
   //
   // If you want to override Print() for a collection class, first
   // see if you can accomplish it by overriding the following protected
   // methods:
   //   void        PrintCollectionHeader(Option_t* option) const;
   //   const char* GetCollectionEntryName(TObject* entry) const;
   //   void        PrintCollectionEntry(TObject* entry, Option_t* option, Int_t recurse) const;
   // Otherwise override the Print(Option_t *option, Int_t)
   // variant. Remember to declare:
   //   using TCollection::Print;
   // somewhere close to the method declaration.

   Print(option, 1);
}

//______________________________________________________________________________
void TCollection::Print(Option_t *option, Int_t recurse) const
{
   // Print the collection header and its elements.
   //
   // If recurse is non-zero, descend into printing of
   // collection-entries with recurse - 1.
   // This means, if recurse is negative, the recursion is infinite.
   //
   // Option is passed recursively.

   PrintCollectionHeader(option);

   if (recurse != 0)
   {
      TIter next(this);
      TObject *object;
      
      TROOT::IncreaseDirLevel();
      while ((object = next())) {
         PrintCollectionEntry(object, option, recurse - 1);
      }
      TROOT::DecreaseDirLevel();
   }
}

//______________________________________________________________________________
void TCollection::Print(Option_t *option, const char* wildcard, Int_t recurse) const
{
   // Print the collection header and its elements that match the wildcard.
   //
   // If recurse is non-zero, descend into printing of
   // collection-entries with recurse - 1.
   // This means, if recurse is negative, the recursion is infinite.
   //
   // Option is passed recursively, but wildcard is only used on the
   // first level.

   PrintCollectionHeader(option);

   if (recurse != 0)
   {
      if (!wildcard) wildcard = "";
      TRegexp re(wildcard, kTRUE);
      Int_t nch = strlen(wildcard);
      TIter next(this);
      TObject *object;

      TROOT::IncreaseDirLevel();
      while ((object = next())) {
         TString s = GetCollectionEntryName(object);
         if (nch == 0 || s == wildcard || s.Index(re) != kNPOS) {
            PrintCollectionEntry(object, option, recurse - 1);
         }
      }
      TROOT::DecreaseDirLevel();
   }
}

//______________________________________________________________________________
void TCollection::Print(Option_t *option, TPRegexp& regexp, Int_t recurse) const
{
   // Print the collection header and its elements that match the regexp.
   //
   // If recurse is non-zero, descend into printing of
   // collection-entries with recurse - 1.
   // This means, if recurse is negative, the recursion is infinite.
   //
   // Option is passed recursively, but regexp is only used on the
   // first level.

   PrintCollectionHeader(option);

   if (recurse != 0)
   {
      TIter next(this);
      TObject *object;

      TROOT::IncreaseDirLevel();
      while ((object = next())) {
         TString s = GetCollectionEntryName(object);
         if (regexp.MatchB(s)) {
            PrintCollectionEntry(object, option, recurse - 1);
         }
      }
      TROOT::DecreaseDirLevel();
   }
}

//______________________________________________________________________________
void TCollection::RecursiveRemove(TObject *obj)
{
   // Remove object from this collection and recursively remove the object
   // from all other objects (and collections).

   if (!obj) return;

   // Scan list and remove obj in the list itself
   while (Remove(obj))
      ;

   // Scan again the list and invoke RecursiveRemove for all objects
   TIter next(this);
   TObject *object;

   while ((object = next())) {
      if (object->TestBit(kNotDeleted)) object->RecursiveRemove(obj);
   }
}

//______________________________________________________________________________
void TCollection::RemoveAll(TCollection *col)
{
   // Remove all objects in collection col from this collection.

   TIter next(col);
   TObject *obj;

   while ((obj = next()))
      Remove(obj);
}

//_______________________________________________________________________
void TCollection::Streamer(TBuffer &b)
{
   // Stream all objects in the collection to or from the I/O buffer.

   Int_t nobjects;
   TObject *obj;
   UInt_t R__s, R__c;

   if (b.IsReading()) {
      Version_t v = b.ReadVersion(&R__s, &R__c);
      if (v > 2)
         TObject::Streamer(b);
      if (v > 1)
         fName.Streamer(b);
      b >> nobjects;
      for (Int_t i = 0; i < nobjects; i++) {
         b >> obj;
         Add(obj);
      }
      b.CheckByteCount(R__s, R__c,TCollection::IsA());
   } else {
      R__c = b.WriteVersion(TCollection::IsA(), kTRUE);
      TObject::Streamer(b);
      fName.Streamer(b);
      nobjects = GetSize();
      b << nobjects;

      TIter next(this);

      while ((obj = next())) {
         b << obj;
      }
      b.SetByteCount(R__c, kTRUE);
   }
}

//______________________________________________________________________________
Int_t TCollection::Write(const char *name, Int_t option, Int_t bsize) const
{
   // Write all objects in this collection. By default all objects in
   // the collection are written individually (each object gets its
   // own key). Note, this is recursive, i.e. objects in collections
   // in the collection are also written individually. To write all
   // objects using a single key specify a name and set option to
   // TObject::kSingleKey (i.e. 1).

   if ((option & kSingleKey)) {
      return TObject::Write(name, option, bsize);
   } else {
      option &= ~kSingleKey;
      Int_t nbytes = 0;
      TIter next(this);
      TObject *obj;
      while ((obj = next())) {
         nbytes += obj->Write(name, option, bsize);
      }
      return nbytes;
   }
}

//______________________________________________________________________________
Int_t TCollection::Write(const char *name, Int_t option, Int_t bsize)
{
   // Write all objects in this collection. By default all objects in
   // the collection are written individually (each object gets its
   // own key). Note, this is recursive, i.e. objects in collections
   // in the collection are also written individually. To write all
   // objects using a single key specify a name and set option to
   // TObject::kSingleKey (i.e. 1).

   return ((const TCollection*)this)->Write(name,option,bsize);
}

// -------------------- Static data members access -----------------------------
//______________________________________________________________________________
TCollection *TCollection::GetCurrentCollection()
{
   // Return the globally accessible collection.

   return fgCurrentCollection;
}

//______________________________________________________________________________
void TCollection::SetCurrentCollection()
{
   // Set this collection to be the globally accesible collection.

   fgCurrentCollection = this;
}

//______________________________________________________________________________
void TCollection::StartGarbageCollection()
{
   // Set up for garbage collection.

   R__LOCKGUARD2(gCollectionMutex);
   if (!fgGarbageCollection) {
      fgGarbageCollection = new TObjectTable;
      fgEmptyingGarbage   = kFALSE;
      fgGarbageStack      = 0;
   }
   fgGarbageStack++;
}

//______________________________________________________________________________
void TCollection::EmptyGarbageCollection()
{
   // Do the garbage collection.

   R__LOCKGUARD2(gCollectionMutex);
   if (fgGarbageStack > 0) fgGarbageStack--;
   if (fgGarbageCollection && fgGarbageStack == 0 && fgEmptyingGarbage == kFALSE) {
      fgEmptyingGarbage = kTRUE;
      fgGarbageCollection->Delete();
      fgEmptyingGarbage = kFALSE;
      SafeDelete(fgGarbageCollection);
   }
}

//______________________________________________________________________________
void TCollection::GarbageCollect(TObject *obj)
{
   // Add to the list of things to be cleaned up.

   {
      R__LOCKGUARD2(gCollectionMutex);
      if (fgGarbageCollection) {
         if (!fgEmptyingGarbage) {
            fgGarbageCollection->Add(obj);
            return;
         }
      }
   }
   delete obj;
}

//______________________________________________________________________________
void TCollection::SetOwner(Bool_t enable)
{
   // Set whether this collection is the owner (enable==true)
   // of its content.  If it is the owner of its contents,
   // these objects will be deleted whenever the collection itself
   // is delete.   The objects might also be deleted or destructed when Clear
   // is called (depending on the collection).

   if (enable)
      SetBit(kIsOwner);
   else
      ResetBit(kIsOwner);
}

//______________________________________________________________________________
TIter::TIter(const TIter &iter)
{
   // Copy a TIter. This involves allocating a new TIterator of the right
   // sub class and assigning it with the original.

   if (iter.fIterator) {
      fIterator = iter.GetCollection()->MakeIterator();
      fIterator->operator=(*iter.fIterator);
   } else
      fIterator = 0;
}

//______________________________________________________________________________
TIter &TIter::operator=(const TIter &rhs)
{
   // Assigning an TIter to another. This involves allocatiing a new TIterator
   // of the right sub class and assigning it with the original.

   if (this != &rhs) {
      if (rhs.fIterator) {
         delete fIterator;
         fIterator = rhs.GetCollection()->MakeIterator();
         fIterator->operator=(*rhs.fIterator);
      }
   }
   return *this;
}

//______________________________________________________________________________
TIter &TIter::Begin()
{
   // Pointing to the first element of the container.

   fIterator->Reset();
   fIterator->Next();
   return *this;
}

//______________________________________________________________________________
TIter TIter::End()
{
   // Pointing to the element after the last - to a nullptr value in our case.

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