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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TObjArray                                                            //
//                                                                      //
// An array of TObjects. The array expands automatically when
// objects are added (shrinking can be done by hand using Expand(),
// how nice to have meaningful names -:)).
// Use operator[] to have "real" array behaviour.
//
// Note on ownership and copy:
// By default the TObjArray does not own the objects it points to and
// will not delete them unless explicitly asked (via a call to the
// Delete member function).   To assign ownership of the content to
// the array, call:
//     myarr->SetOwner(kTRUE);
// When the array owns its content a call to Clear or the deletion of
// the array itself will lead to the deletion of its contents.
//
// You can either make a shallow copy of the array:
//     otherarr = new TObjArray(*myarr);
//    *otherarr = *myarr;
// in which case ownership (if any) is not transfered but the other
// array points to the same object as the original array.  Note that
// if the content of either array is deleted the other array is not
// notified in any way (i.e. still points to the now deleted objects).
//
// You can also make a deep copy of the array:
//     otherarr = (TObjArray*)myarr->Clone();
// in which case the array and the content are both duplicated (i.e.
// otherarr and myarr do not point to the same objects).  If myarr
// is set to the be the owner of its content, otherarr will also be
// set to the owner of its own conent.
//
//Begin_Html
/*
<img src=gif/tobjarray.gif>
*/
//End_Html
//
//////////////////////////////////////////////////////////////////////////

#include "TObjArray.h"
#include "TError.h"
#include "TROOT.h"
#include "TVirtualMutex.h"
#include <stdlib.h>

ClassImp(TObjArray)

//______________________________________________________________________________
TObjArray::TObjArray(Int_t s, Int_t lowerBound)
{
   // Create an object array. Using s one can set the array size (default is
   // kInitCapacity=16) and lowerBound can be used to set the array lowerbound
   // index (default is 0).

   if (s < 0) {
      Warning("TObjArray", "size (%d) < 0", s);
      s = TCollection::kInitCapacity;
   } else if (s == 0)
      s = TCollection::kInitCapacity;
   fCont = 0;
   Init(s, lowerBound);
}

//______________________________________________________________________________
TObjArray::TObjArray(const TObjArray &a) : TSeqCollection()
{
   // Create a copy of TObjArray a. Note, does not copy the kIsOwner flag.

   fCont = 0;
   Init(a.fSize, a.fLowerBound);

   for (Int_t i = 0; i < fSize; i++)
      fCont[i] = a.fCont[i];

   fLast = a.fLast;
   fName = a.fName;
}

//______________________________________________________________________________
TObjArray::~TObjArray()
{
   // Delete an array. Objects are not deleted unless the TObjArray is the
   // owner (set via SetOwner()).

   if (IsOwner())
      Delete();

   TStorage::Dealloc(fCont);
   fCont = 0;
   fSize = 0;
}

//______________________________________________________________________________
TObjArray& TObjArray::operator=(const TObjArray &a)
{
   // Assignment operator. Note, unsets the kIsOwner flag.

   if (this != &a) {
      if (IsOwner())
         Delete();
      SetOwner(kFALSE);

      Init(a.fSize, a.fLowerBound);

      for (Int_t i = 0; i < fSize; i++)
         fCont[i] = a.fCont[i];

      fLast = a.fLast;
      fName = a.fName;
   }
   return *this;
}

//______________________________________________________________________________
TObject *&TObjArray::operator[](Int_t i)
{
   // Return the object at position i. Returns address at position 0
   // if i is out of bounds. Result may be used as an lvalue.

   int j = i-fLowerBound;
   if (j >= 0 && j < fSize) {
      fLast = TMath::Max(j, GetAbsLast());
      Changed();
      return fCont[j];
   }
   BoundsOk("operator[]", i);
   fLast = -2; // invalidate fLast since the result may be used as an lvalue
   return fCont[0];
}

//______________________________________________________________________________
TObject *TObjArray::operator[](Int_t i) const
{
   // Return the object at position at. Returns 0 if i is out of bounds.

   int j = i-fLowerBound;
   if (j >= 0 && j < fSize) return fCont[j];
   BoundsOk("operator[] const", i);
   return 0;
}

//______________________________________________________________________________
void TObjArray::AddFirst(TObject *obj)
{
   // Add object in the first slot of the array. This will overwrite the
   // first element that might have been there. To have insertion semantics
   // use either a TList or a TOrdCollection.

   fCont[0] = obj;
   if (fLast == -1)
      fLast = 0;
   Changed();
}

//______________________________________________________________________________
void TObjArray::AddLast(TObject *obj)
{
   // Add object in the next empty slot in the array. Expand the array
   // if necessary.

   AddAtAndExpand(obj, GetAbsLast()+1+fLowerBound);
}

//______________________________________________________________________________
void TObjArray::AddBefore(const TObject *before, TObject *obj)
{
   // Add object in the slot before object before. If before=0 add object
   // in the first slot. Note that this will overwrite any object that
   // might have already been in this slot. For insertion semantics use
   // either a TList or a TOrdCollection.

   if (!before)
      AddFirst(obj);
   else {
      Int_t idx = IndexOf(before) - fLowerBound;
      if (idx == -1) {
         Error("AddBefore", "before not found, object not added");
         return;
      }
      if (idx == 0) {
         Error("AddBefore", "cannot add before lowerbound (%d)", fLowerBound);
         return;
      }
      AddAt(obj, idx+fLowerBound-1);
   }
}

//______________________________________________________________________________
void TObjArray::AddAfter(const TObject *after, TObject *obj)
{
   // Add object in the slot after object after. If after=0 add object in
   // the last empty slot. Note that this will overwrite any object that
   // might have already been in this slot. For insertion semantics use
   // either a TList or a TOrdCollection.

   if (!after)
      AddLast(obj);
   else {
      Int_t idx = IndexOf(after) - fLowerBound;
      if (idx == -1) {
         Error("AddAfter", "after not found, object not added");
         return;
      }
      AddAtAndExpand(obj, idx+fLowerBound+1);
   }
}

//______________________________________________________________________________
void TObjArray::AddAtAndExpand(TObject *obj, Int_t idx)
{
   // Add object at position idx. If idx is larger than the current size
   // of the array, expand the array (double its size).

   if (idx < fLowerBound) {
      Error("AddAt", "out of bounds at %d in %lx", idx, (Long_t)this);
      return;
   }
   if (idx-fLowerBound >= fSize)
      Expand(TMath::Max(idx-fLowerBound+1, GrowBy(fSize)));
   fCont[idx-fLowerBound] = obj;
   fLast = TMath::Max(idx-fLowerBound, GetAbsLast());
   Changed();
}

//______________________________________________________________________________
void TObjArray::AddAt(TObject *obj, Int_t idx)
{
   // Add object at position ids. Give an error when idx is out of bounds
   // (i.e. the array is not expanded).

   if (!BoundsOk("AddAt", idx)) return;

   fCont[idx-fLowerBound] = obj;
   fLast = TMath::Max(idx-fLowerBound, GetAbsLast());
   Changed();
}

//______________________________________________________________________________
Int_t  TObjArray::AddAtFree(TObject *obj)
{
   // Return the position of the new object.
   // Find the first empty cell or AddLast if there is no empty cell

   if (Last()) {    // <---------- This is to take in account "empty" TObjArray's
      Int_t i;
      for (i = 0; i < fSize; i++)
         if (!fCont[i]) {         // Add object at position i
            fCont[i] = obj;
            fLast = TMath::Max(i, GetAbsLast());
            Changed();
            return i+fLowerBound;
         }
   }
   AddLast(obj);
   return GetLast();
}

//______________________________________________________________________________
TObject *TObjArray::After(const TObject *obj) const
{
   // Return the object after obj. Returns 0 if obj is last object.

   if (!obj) return 0;

   Int_t idx = IndexOf(obj) - fLowerBound;
   if (idx == -1 || idx == fSize-1) return 0;

   return fCont[idx+1];
}

//______________________________________________________________________________
TObject *TObjArray::Before(const TObject *obj) const
{
   // Return the object before obj. Returns 0 if obj is first object.

   if (!obj) return 0;

   Int_t idx = IndexOf(obj) - fLowerBound;
   if (idx == -1 || idx == 0) return 0;

   return fCont[idx-1];
}

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

   if (IsOwner())
      Delete();
   else
      Init(fSize, fLowerBound);
}

//______________________________________________________________________________
void TObjArray::Compress()
{
   // Remove empty slots from array.

   Int_t j = 0;

   for (Int_t i = 0; i < fSize; i++) {
      if (fCont[i]) {
         fCont[j] = fCont[i];
         j++;
      }
   }

   fLast = j - 1;

   for ( ; j < fSize; j++)
      fCont[j] = 0;
}

//______________________________________________________________________________
void TObjArray::Delete(Option_t *)
{
   // Remove all objects from the array AND delete all heap based objects.

   // In some case, for example TParallelCoord, a list (the pad's list of
   // primitives) will contain both the container and the containees
   // (the TParallelCoorVar) but if the Clear is being called from
   // the destructor of the container of this list, one of the first
   // thing done will be the remove the container (the pad) for the
   // list (of Primitives of the canvas) that was connecting it
   // (indirectly) to the list of cleanups.
   // So let's temporarily add the current list and remove it later.
   bool needRegister = fSize && TROOT::Initialized();
   if(needRegister) {
      R__LOCKGUARD2(gROOTMutex);
      needRegister = needRegister && !gROOT->GetListOfCleanups()->FindObject(this);
   }
   if (needRegister) {
      R__LOCKGUARD2(gROOTMutex);
      gROOT->GetListOfCleanups()->Add(this);
   }
   for (Int_t i = 0; i < fSize; i++) {
      if (fCont[i] && fCont[i]->IsOnHeap()) {
         TCollection::GarbageCollect(fCont[i]);
         fCont[i] = 0;
      }
   }
   if (needRegister) {
      R__LOCKGUARD2(gROOTMutex);
      ROOT::GetROOT()->GetListOfCleanups()->Remove(this);
   }

   Init(fSize, fLowerBound);
}

//______________________________________________________________________________
void TObjArray::Expand(Int_t newSize)
{
   // Expand or shrink the array to newSize elements.

   if (newSize < 0) {
      Error ("Expand", "newSize must be positive (%d)", newSize);
      return;
   }
   if (newSize == fSize)
      return;
   if (newSize < fSize) {
      // if the array is shrinked check whether there are nonempty entries
      for (Int_t j = newSize; j < fSize; j++)
         if (fCont[j]) {
            Error ("Expand", "expand would cut off nonempty entries at %d", j);
            return;
         }
   }
   fCont = (TObject**) TStorage::ReAlloc(fCont, newSize * sizeof(TObject*),
                                         fSize * sizeof(TObject*));
   fSize = newSize;
}

//______________________________________________________________________________
TObject *TObjArray::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.

   Int_t nobjects = GetAbsLast()+1;
   for (Int_t i = 0; i < nobjects; ++i) {
      TObject *obj = fCont[i];
      if (obj && 0==strcmp(name, obj->GetName())) return obj;
   }
   return 0;
}

//______________________________________________________________________________
TObject *TObjArray::FindObject(const TObject *iobj) 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).

   Int_t nobjects = GetAbsLast()+1;
   for (Int_t i = 0; i < nobjects; ++i) {
      TObject *obj = fCont[i];
      if (obj && obj->IsEqual(iobj)) return obj;
   }
   return 0;
}

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

   UInt_t R__s, R__c;
   Int_t nobjects;
   if (b.IsReading()) {
      Version_t v = b.ReadVersion(&R__s, &R__c);
      if (v > 2)
         TObject::Streamer(b);
      if (v > 1)
         fName.Streamer(b);

      if (GetEntriesFast() > 0) Clear();

      b >> nobjects;
      b >> fLowerBound;
      if (nobjects >= fSize) Expand(nobjects);
      fLast = -1;
      TObject *obj;
      for (Int_t i = 0; i < nobjects; i++) {
         obj = (TObject*) b.ReadObjectAny(TObject::Class());
         if (obj) {
            fCont[i] = obj;
            fLast = i;
         }
      }
      Changed();
      b.CheckByteCount(R__s, R__c,TObjArray::IsA());
   } else {
      R__c = b.WriteVersion(TObjArray::IsA(), kTRUE);
      TObject::Streamer(b);
      fName.Streamer(b);
      nobjects = GetAbsLast()+1;
      b << nobjects;
      b << fLowerBound;

      for (Int_t i = 0; i < nobjects; i++) {
         b << fCont[i];
      }
      b.SetByteCount(R__c, kTRUE);
   }
}

//______________________________________________________________________________
TObject *TObjArray::First() const
{
   // Return the object in the first slot.

   return fCont[0];
}

//______________________________________________________________________________
TObject *TObjArray::Last() const
{
   // Return the object in the last filled slot. Returns 0 if no entries.

   if (fLast == -1)
      return 0;
   else
      return fCont[GetAbsLast()];
}

//______________________________________________________________________________
Int_t TObjArray::GetEntries() const
{
   // Return the number of objects in array (i.e. number of non-empty slots).
   // Attention: use this method ONLY if you want to know the number of
   // non-empty slots. This function loops over the complete array and
   // is therefore very slow when applied in a loop. Most of the time you
   // better use GetEntriesFast() (only in case when there are no empty slots).

   Int_t cnt = 0;

   for (Int_t i = 0; i < fSize; i++)
      if (fCont[i]) cnt++;

   return cnt;
}

//______________________________________________________________________________
Int_t TObjArray::GetAbsLast() const
{
   // Return absolute index to last object in array. Returns -1 in case
   // array is empty.

   // For efficiency we need sometimes to update fLast so we have
   // to cast const away. Ugly, but making GetAbsLast() not const breaks
   // many other const functions.
   if (fLast == -2) {
      for (Int_t i = fSize-1; i >= 0; i--)
         if (fCont[i]) {
            ((TObjArray*)this)->fLast = i;
            return fLast;
         }
      ((TObjArray*)this)->fLast = -1;
   }
   return fLast;
}

//______________________________________________________________________________
Int_t TObjArray::GetLast() const
{
   // Return index of last object in array. Returns lowerBound-1 in case
   // array is empty.

   return fLowerBound+GetAbsLast();
}

//______________________________________________________________________________
TObject **TObjArray::GetObjectRef(const TObject *obj) const
{
   // Return address of pointer obj. If obj is 0 returns address of container.

   if (!obj)
      return fCont;

   Int_t index = IndexOf(obj);
   return &fCont[index];
}

//______________________________________________________________________________
Int_t TObjArray::IndexOf(const TObject *obj) const
{
   // obj != 0 Return index of object in array.
   //          Returns lowerBound-1 in case array doesn't contain the obj.
   //
   // obj == 0 Return the index of the first empty slot.
   //          Returns lowerBound-1 in case array doesn't contain any empty slot.

   Int_t i;
   if (obj) {
      for (i = 0; i < fSize; i++)
         if (fCont[i] && fCont[i]->IsEqual(obj))
            return i+fLowerBound;
   } else {    // Look for the first empty slot
      for (i = 0; i < fSize; i++)
         if (!fCont[i])
            return i+fLowerBound;
   }

   return fLowerBound-1;
}

//______________________________________________________________________________
void TObjArray::Init(Int_t s, Int_t lowerBound)
{
   // Initialize a TObjArray.

   if (fCont && fSize != s) {
      TStorage::Dealloc(fCont);
      fCont = 0;
   }

   fSize = s;

   if (!fCont)
      fCont = (TObject**) TStorage::Alloc(fSize*sizeof(TObject*)); //new TObject* [fSize];
   memset(fCont, 0, fSize*sizeof(TObject*));
   fLowerBound = lowerBound;
   fLast = -1;
   Changed();
}

//______________________________________________________________________________
TIterator *TObjArray::MakeIterator(Bool_t dir) const
{
   // Returns an array iterator.

   return new TObjArrayIter(this, dir);
}

//______________________________________________________________________________
Bool_t TObjArray::OutOfBoundsError(const char *where, Int_t i) const
{
   // Generate an out-of-bounds error. Always returns false.

   Error(where, "index %d out of bounds (size: %d, this: 0x%lx)", i, fSize, (Long_t)this);
   return kFALSE;
}

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

   if (!obj) return;

   for (int i = 0; i < fSize; i++) {
      if (fCont[i] && fCont[i]->TestBit(kNotDeleted) && fCont[i]->IsEqual(obj)) {
         fCont[i] = 0;
         // recalculate array size
         if (i == fLast)
            do {
               fLast--;
            } while (fLast >= 0 && fCont[fLast] == 0);
         Changed();
      } else if (fCont[i] && fCont[i]->TestBit(kNotDeleted))
         fCont[i]->RecursiveRemove(obj);
   }
}

//______________________________________________________________________________
TObject *TObjArray::RemoveAt(Int_t idx)
{
   // Remove object at index idx.

   if (!BoundsOk("RemoveAt", idx)) return 0;

   int i = idx-fLowerBound;

   TObject *obj = 0;
   if (fCont[i]) {
      obj = fCont[i];
      fCont[i] = 0;
      // recalculate array size
      if (i == fLast)
         do {
            fLast--;
         } while (fLast >= 0 && fCont[fLast] == 0);
      Changed();
   }
   return obj;
}

//______________________________________________________________________________
TObject *TObjArray::Remove(TObject *obj)
{
   // Remove object from array.

   if (!obj) return 0;

   Int_t idx = IndexOf(obj) - fLowerBound;

   if (idx == -1) return 0;

   TObject *ob = fCont[idx];
   fCont[idx] = 0;
   // recalculate array size
   if (idx == fLast)
      do {
         fLast--;
      } while (fLast >= 0 && fCont[fLast] == 0);
   Changed();
   return ob;
}

//______________________________________________________________________________
void TObjArray::RemoveRange(Int_t idx1, Int_t idx2)
{
   // Remove objects from index idx1 to idx2 included.

   if (!BoundsOk("RemoveRange", idx1)) return;
   if (!BoundsOk("RemoveRange", idx2)) return;

   idx1 -= fLowerBound;
   idx2 -= fLowerBound;

   Bool_t change = kFALSE;
   for (TObject **obj = fCont+idx1; obj <= fCont+idx2; obj++) {
      if (*obj) {
         *obj = 0;
         change = kTRUE;
      }
   }

   // recalculate array size
   if (change) Changed();
   if (idx1 < fLast || fLast > idx2) return;
   do { fLast--; } while (fLast >= 0 && fCont[fLast] == 0);
}

//______________________________________________________________________________
void TObjArray::SetLast(Int_t last)
{
   // Set index of last object in array, effectively truncating the
   // array. Use carefully since whenever last position has to be
   // recalculated, e.g. after a Remove() or Sort() it will be reset
   // to the last non-empty slot. If last is -2 this will force the
   // recalculation of the last used slot.
   // If last is -1, this effectively truncate the array completely.

   if (last == -2 || last == -1)
      fLast = last;
   else if (BoundsOk("SetLast", last))
      fLast = last - fLowerBound;
}

//______________________________________________________________________________
void TObjArray::Randomize(Int_t ntimes)
{
   // Randomize objects inside the array, i.e. permute randomly objects.
   // With fLast being the index of the last entry in the array, the following
   // algorithm is applied to the array:
   //   - for each entry j between 0 and fLast, another entry k is chosen
   //     randomly between 0 and fLast.
   //   - the objects at j and k are swapped.
   //   - this process is repeated ntimes (ntimes = 1 by default).

   for (Int_t i = 0; i < ntimes; i++) {
      for (Int_t j = 0; j < fLast; j++) {
#ifdef R__WIN32
         Int_t k = (Int_t)(0.5+fLast*Double_t(rand())/Double_t((RAND_MAX+1.0)));
#else
         Int_t k = (Int_t)(0.5+fLast*Double_t(random())/Double_t((RAND_MAX+1.0)));
#endif
         if (k == j) continue;
         TObject *obj = fCont[j];
         fCont[j] = fCont[k];
         fCont[k] = obj;
      }
   }
}

//______________________________________________________________________________
void TObjArray::Sort(Int_t upto)
{
   // If objects in array are sortable (i.e. IsSortable() returns true
   // for all objects) then sort array.

   if (GetAbsLast() == -1 || fSorted) return;
   for (Int_t i = 0; i < fSize; i++)
      if (fCont[i]) {
         if (!fCont[i]->IsSortable()) {
            Error("Sort", "objects in array are not sortable");
            return;
         }
      }

   QSort(fCont, 0, TMath::Min(fSize, upto-fLowerBound));

   fLast   = -2;
   fSorted = kTRUE;
}

//______________________________________________________________________________
Int_t TObjArray::BinarySearch(TObject *op, Int_t upto)
{
   // Find object using a binary search. Array must first have been sorted.
   // Search can be limited by setting upto to desired index.

   Int_t   base, position, last, result = 0;
   TObject *op2;

   if (!op) return -1;

   if (!fSorted) {
      Error("BinarySearch", "array must first be sorted");
      return -1;
   }

   base = 0;
   last = TMath::Min(fSize, upto-fLowerBound) - 1;

   while (last >= base) {
      position = (base+last) / 2;
      op2 = fCont[position];
      if (op2 && (result = op->Compare(op2)) == 0)
         return position + fLowerBound;
      if (!op2 || result < 0)
         last = position-1;
      else
         base = position+1;
   }
   return -1;
}


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TObjArrayIter                                                        //
//                                                                      //
// Iterator of object array.                                            //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

ClassImp(TObjArrayIter)

//______________________________________________________________________________
TObjArrayIter::TObjArrayIter(const TObjArray *arr, Bool_t dir)
{
   // Create array iterator. By default the iteration direction
   // is kIterForward. To go backward use kIterBackward.

   fArray     = arr;
   fDirection = dir;
   Reset();
}

//______________________________________________________________________________
TObjArrayIter::TObjArrayIter(const TObjArrayIter &iter) : TIterator(iter)
{
   // Copy ctor.

   fArray     = iter.fArray;
   fDirection = iter.fDirection;
   fCursor    = iter.fCursor;
   fCurCursor = iter.fCurCursor;
}

//______________________________________________________________________________
TIterator &TObjArrayIter::operator=(const TIterator &rhs)
{
   // Overridden assignment operator.

   if (this != &rhs && rhs.IsA() == TObjArrayIter::Class()) {
      const TObjArrayIter &rhs1 = (const TObjArrayIter &)rhs;
      fArray     = rhs1.fArray;
      fDirection = rhs1.fDirection;
      fCursor    = rhs1.fCursor;
      fCurCursor = rhs1.fCurCursor;
   }
   return *this;
}

//______________________________________________________________________________
TObjArrayIter &TObjArrayIter::operator=(const TObjArrayIter &rhs)
{
   // Overloaded assignment operator.

   if (this != &rhs) {
      fArray     = rhs.fArray;
      fDirection = rhs.fDirection;
      fCursor    = rhs.fCursor;
      fCurCursor = rhs.fCurCursor;
   }
   return *this;
}

//______________________________________________________________________________
TObject *TObjArrayIter::Next()
{
   // Return next object in array. Returns 0 when no more objects in array.

   if (fDirection == kIterForward) {
      for ( ; fCursor < fArray->Capacity() && fArray->fCont[fCursor] == 0;
              fCursor++) { }

      fCurCursor = fCursor;
      if (fCursor < fArray->Capacity()) {
         return fArray->fCont[fCursor++];
      }
   } else {
      for ( ; fCursor >= 0 && fArray->fCont[fCursor] == 0;
              fCursor--) { }

      fCurCursor = fCursor;
      if (fCursor >= 0) {
         return fArray->fCont[fCursor--];
      }
   }
   return 0;
}

//______________________________________________________________________________
void TObjArrayIter::Reset()
{
   // Reset array iterator.

   if (fDirection == kIterForward)
      fCursor = 0;
   else
      fCursor = fArray->Capacity() - 1;

   fCurCursor = fCursor;
}

//______________________________________________________________________________
Bool_t TObjArrayIter::operator!=(const TIterator &aIter) const
{
   // This operator compares two TIterator objects.

   if (aIter.IsA() == TObjArrayIter::Class()) {
      const TObjArrayIter &iter(dynamic_cast<const TObjArrayIter &>(aIter));
      return (fCurCursor != iter.fCurCursor);
   }
   return false; // for base class we don't implement a comparison
}

//______________________________________________________________________________
Bool_t TObjArrayIter::operator!=(const TObjArrayIter &aIter) const
{
   // This operator compares two TObjArrayIter objects.

   return (fCurCursor != aIter.fCurCursor);
}

//______________________________________________________________________________
TObject *TObjArrayIter::operator*() const
{
   // Return current object or nullptr.

   return (((fCurCursor >= 0) && (fCurCursor < fArray->Capacity())) ?
           fArray->fCont[fCurCursor] : nullptr);
}
 TObjArray.cxx:1
 TObjArray.cxx:2
 TObjArray.cxx:3
 TObjArray.cxx:4
 TObjArray.cxx:5
 TObjArray.cxx:6
 TObjArray.cxx:7
 TObjArray.cxx:8
 TObjArray.cxx:9
 TObjArray.cxx:10
 TObjArray.cxx:11
 TObjArray.cxx:12
 TObjArray.cxx:13
 TObjArray.cxx:14
 TObjArray.cxx:15
 TObjArray.cxx:16
 TObjArray.cxx:17
 TObjArray.cxx:18
 TObjArray.cxx:19
 TObjArray.cxx:20
 TObjArray.cxx:21
 TObjArray.cxx:22
 TObjArray.cxx:23
 TObjArray.cxx:24
 TObjArray.cxx:25
 TObjArray.cxx:26
 TObjArray.cxx:27
 TObjArray.cxx:28
 TObjArray.cxx:29
 TObjArray.cxx:30
 TObjArray.cxx:31
 TObjArray.cxx:32
 TObjArray.cxx:33
 TObjArray.cxx:34
 TObjArray.cxx:35
 TObjArray.cxx:36
 TObjArray.cxx:37
 TObjArray.cxx:38
 TObjArray.cxx:39
 TObjArray.cxx:40
 TObjArray.cxx:41
 TObjArray.cxx:42
 TObjArray.cxx:43
 TObjArray.cxx:44
 TObjArray.cxx:45
 TObjArray.cxx:46
 TObjArray.cxx:47
 TObjArray.cxx:48
 TObjArray.cxx:49
 TObjArray.cxx:50
 TObjArray.cxx:51
 TObjArray.cxx:52
 TObjArray.cxx:53
 TObjArray.cxx:54
 TObjArray.cxx:55
 TObjArray.cxx:56
 TObjArray.cxx:57
 TObjArray.cxx:58
 TObjArray.cxx:59
 TObjArray.cxx:60
 TObjArray.cxx:61
 TObjArray.cxx:62
 TObjArray.cxx:63
 TObjArray.cxx:64
 TObjArray.cxx:65
 TObjArray.cxx:66
 TObjArray.cxx:67
 TObjArray.cxx:68
 TObjArray.cxx:69
 TObjArray.cxx:70
 TObjArray.cxx:71
 TObjArray.cxx:72
 TObjArray.cxx:73
 TObjArray.cxx:74
 TObjArray.cxx:75
 TObjArray.cxx:76
 TObjArray.cxx:77
 TObjArray.cxx:78
 TObjArray.cxx:79
 TObjArray.cxx:80
 TObjArray.cxx:81
 TObjArray.cxx:82
 TObjArray.cxx:83
 TObjArray.cxx:84
 TObjArray.cxx:85
 TObjArray.cxx:86
 TObjArray.cxx:87
 TObjArray.cxx:88
 TObjArray.cxx:89
 TObjArray.cxx:90
 TObjArray.cxx:91
 TObjArray.cxx:92
 TObjArray.cxx:93
 TObjArray.cxx:94
 TObjArray.cxx:95
 TObjArray.cxx:96
 TObjArray.cxx:97
 TObjArray.cxx:98
 TObjArray.cxx:99
 TObjArray.cxx:100
 TObjArray.cxx:101
 TObjArray.cxx:102
 TObjArray.cxx:103
 TObjArray.cxx:104
 TObjArray.cxx:105
 TObjArray.cxx:106
 TObjArray.cxx:107
 TObjArray.cxx:108
 TObjArray.cxx:109
 TObjArray.cxx:110
 TObjArray.cxx:111
 TObjArray.cxx:112
 TObjArray.cxx:113
 TObjArray.cxx:114
 TObjArray.cxx:115
 TObjArray.cxx:116
 TObjArray.cxx:117
 TObjArray.cxx:118
 TObjArray.cxx:119
 TObjArray.cxx:120
 TObjArray.cxx:121
 TObjArray.cxx:122
 TObjArray.cxx:123
 TObjArray.cxx:124
 TObjArray.cxx:125
 TObjArray.cxx:126
 TObjArray.cxx:127
 TObjArray.cxx:128
 TObjArray.cxx:129
 TObjArray.cxx:130
 TObjArray.cxx:131
 TObjArray.cxx:132
 TObjArray.cxx:133
 TObjArray.cxx:134
 TObjArray.cxx:135
 TObjArray.cxx:136
 TObjArray.cxx:137
 TObjArray.cxx:138
 TObjArray.cxx:139
 TObjArray.cxx:140
 TObjArray.cxx:141
 TObjArray.cxx:142
 TObjArray.cxx:143
 TObjArray.cxx:144
 TObjArray.cxx:145
 TObjArray.cxx:146
 TObjArray.cxx:147
 TObjArray.cxx:148
 TObjArray.cxx:149
 TObjArray.cxx:150
 TObjArray.cxx:151
 TObjArray.cxx:152
 TObjArray.cxx:153
 TObjArray.cxx:154
 TObjArray.cxx:155
 TObjArray.cxx:156
 TObjArray.cxx:157
 TObjArray.cxx:158
 TObjArray.cxx:159
 TObjArray.cxx:160
 TObjArray.cxx:161
 TObjArray.cxx:162
 TObjArray.cxx:163
 TObjArray.cxx:164
 TObjArray.cxx:165
 TObjArray.cxx:166
 TObjArray.cxx:167
 TObjArray.cxx:168
 TObjArray.cxx:169
 TObjArray.cxx:170
 TObjArray.cxx:171
 TObjArray.cxx:172
 TObjArray.cxx:173
 TObjArray.cxx:174
 TObjArray.cxx:175
 TObjArray.cxx:176
 TObjArray.cxx:177
 TObjArray.cxx:178
 TObjArray.cxx:179
 TObjArray.cxx:180
 TObjArray.cxx:181
 TObjArray.cxx:182
 TObjArray.cxx:183
 TObjArray.cxx:184
 TObjArray.cxx:185
 TObjArray.cxx:186
 TObjArray.cxx:187
 TObjArray.cxx:188
 TObjArray.cxx:189
 TObjArray.cxx:190
 TObjArray.cxx:191
 TObjArray.cxx:192
 TObjArray.cxx:193
 TObjArray.cxx:194
 TObjArray.cxx:195
 TObjArray.cxx:196
 TObjArray.cxx:197
 TObjArray.cxx:198
 TObjArray.cxx:199
 TObjArray.cxx:200
 TObjArray.cxx:201
 TObjArray.cxx:202
 TObjArray.cxx:203
 TObjArray.cxx:204
 TObjArray.cxx:205
 TObjArray.cxx:206
 TObjArray.cxx:207
 TObjArray.cxx:208
 TObjArray.cxx:209
 TObjArray.cxx:210
 TObjArray.cxx:211
 TObjArray.cxx:212
 TObjArray.cxx:213
 TObjArray.cxx:214
 TObjArray.cxx:215
 TObjArray.cxx:216
 TObjArray.cxx:217
 TObjArray.cxx:218
 TObjArray.cxx:219
 TObjArray.cxx:220
 TObjArray.cxx:221
 TObjArray.cxx:222
 TObjArray.cxx:223
 TObjArray.cxx:224
 TObjArray.cxx:225
 TObjArray.cxx:226
 TObjArray.cxx:227
 TObjArray.cxx:228
 TObjArray.cxx:229
 TObjArray.cxx:230
 TObjArray.cxx:231
 TObjArray.cxx:232
 TObjArray.cxx:233
 TObjArray.cxx:234
 TObjArray.cxx:235
 TObjArray.cxx:236
 TObjArray.cxx:237
 TObjArray.cxx:238
 TObjArray.cxx:239
 TObjArray.cxx:240
 TObjArray.cxx:241
 TObjArray.cxx:242
 TObjArray.cxx:243
 TObjArray.cxx:244
 TObjArray.cxx:245
 TObjArray.cxx:246
 TObjArray.cxx:247
 TObjArray.cxx:248
 TObjArray.cxx:249
 TObjArray.cxx:250
 TObjArray.cxx:251
 TObjArray.cxx:252
 TObjArray.cxx:253
 TObjArray.cxx:254
 TObjArray.cxx:255
 TObjArray.cxx:256
 TObjArray.cxx:257
 TObjArray.cxx:258
 TObjArray.cxx:259
 TObjArray.cxx:260
 TObjArray.cxx:261
 TObjArray.cxx:262
 TObjArray.cxx:263
 TObjArray.cxx:264
 TObjArray.cxx:265
 TObjArray.cxx:266
 TObjArray.cxx:267
 TObjArray.cxx:268
 TObjArray.cxx:269
 TObjArray.cxx:270
 TObjArray.cxx:271
 TObjArray.cxx:272
 TObjArray.cxx:273
 TObjArray.cxx:274
 TObjArray.cxx:275
 TObjArray.cxx:276
 TObjArray.cxx:277
 TObjArray.cxx:278
 TObjArray.cxx:279
 TObjArray.cxx:280
 TObjArray.cxx:281
 TObjArray.cxx:282
 TObjArray.cxx:283
 TObjArray.cxx:284
 TObjArray.cxx:285
 TObjArray.cxx:286
 TObjArray.cxx:287
 TObjArray.cxx:288
 TObjArray.cxx:289
 TObjArray.cxx:290
 TObjArray.cxx:291
 TObjArray.cxx:292
 TObjArray.cxx:293
 TObjArray.cxx:294
 TObjArray.cxx:295
 TObjArray.cxx:296
 TObjArray.cxx:297
 TObjArray.cxx:298
 TObjArray.cxx:299
 TObjArray.cxx:300
 TObjArray.cxx:301
 TObjArray.cxx:302
 TObjArray.cxx:303
 TObjArray.cxx:304
 TObjArray.cxx:305
 TObjArray.cxx:306
 TObjArray.cxx:307
 TObjArray.cxx:308
 TObjArray.cxx:309
 TObjArray.cxx:310
 TObjArray.cxx:311
 TObjArray.cxx:312
 TObjArray.cxx:313
 TObjArray.cxx:314
 TObjArray.cxx:315
 TObjArray.cxx:316
 TObjArray.cxx:317
 TObjArray.cxx:318
 TObjArray.cxx:319
 TObjArray.cxx:320
 TObjArray.cxx:321
 TObjArray.cxx:322
 TObjArray.cxx:323
 TObjArray.cxx:324
 TObjArray.cxx:325
 TObjArray.cxx:326
 TObjArray.cxx:327
 TObjArray.cxx:328
 TObjArray.cxx:329
 TObjArray.cxx:330
 TObjArray.cxx:331
 TObjArray.cxx:332
 TObjArray.cxx:333
 TObjArray.cxx:334
 TObjArray.cxx:335
 TObjArray.cxx:336
 TObjArray.cxx:337
 TObjArray.cxx:338
 TObjArray.cxx:339
 TObjArray.cxx:340
 TObjArray.cxx:341
 TObjArray.cxx:342
 TObjArray.cxx:343
 TObjArray.cxx:344
 TObjArray.cxx:345
 TObjArray.cxx:346
 TObjArray.cxx:347
 TObjArray.cxx:348
 TObjArray.cxx:349
 TObjArray.cxx:350
 TObjArray.cxx:351
 TObjArray.cxx:352
 TObjArray.cxx:353
 TObjArray.cxx:354
 TObjArray.cxx:355
 TObjArray.cxx:356
 TObjArray.cxx:357
 TObjArray.cxx:358
 TObjArray.cxx:359
 TObjArray.cxx:360
 TObjArray.cxx:361
 TObjArray.cxx:362
 TObjArray.cxx:363
 TObjArray.cxx:364
 TObjArray.cxx:365
 TObjArray.cxx:366
 TObjArray.cxx:367
 TObjArray.cxx:368
 TObjArray.cxx:369
 TObjArray.cxx:370
 TObjArray.cxx:371
 TObjArray.cxx:372
 TObjArray.cxx:373
 TObjArray.cxx:374
 TObjArray.cxx:375
 TObjArray.cxx:376
 TObjArray.cxx:377
 TObjArray.cxx:378
 TObjArray.cxx:379
 TObjArray.cxx:380
 TObjArray.cxx:381
 TObjArray.cxx:382
 TObjArray.cxx:383
 TObjArray.cxx:384
 TObjArray.cxx:385
 TObjArray.cxx:386
 TObjArray.cxx:387
 TObjArray.cxx:388
 TObjArray.cxx:389
 TObjArray.cxx:390
 TObjArray.cxx:391
 TObjArray.cxx:392
 TObjArray.cxx:393
 TObjArray.cxx:394
 TObjArray.cxx:395
 TObjArray.cxx:396
 TObjArray.cxx:397
 TObjArray.cxx:398
 TObjArray.cxx:399
 TObjArray.cxx:400
 TObjArray.cxx:401
 TObjArray.cxx:402
 TObjArray.cxx:403
 TObjArray.cxx:404
 TObjArray.cxx:405
 TObjArray.cxx:406
 TObjArray.cxx:407
 TObjArray.cxx:408
 TObjArray.cxx:409
 TObjArray.cxx:410
 TObjArray.cxx:411
 TObjArray.cxx:412
 TObjArray.cxx:413
 TObjArray.cxx:414
 TObjArray.cxx:415
 TObjArray.cxx:416
 TObjArray.cxx:417
 TObjArray.cxx:418
 TObjArray.cxx:419
 TObjArray.cxx:420
 TObjArray.cxx:421
 TObjArray.cxx:422
 TObjArray.cxx:423
 TObjArray.cxx:424
 TObjArray.cxx:425
 TObjArray.cxx:426
 TObjArray.cxx:427
 TObjArray.cxx:428
 TObjArray.cxx:429
 TObjArray.cxx:430
 TObjArray.cxx:431
 TObjArray.cxx:432
 TObjArray.cxx:433
 TObjArray.cxx:434
 TObjArray.cxx:435
 TObjArray.cxx:436
 TObjArray.cxx:437
 TObjArray.cxx:438
 TObjArray.cxx:439
 TObjArray.cxx:440
 TObjArray.cxx:441
 TObjArray.cxx:442
 TObjArray.cxx:443
 TObjArray.cxx:444
 TObjArray.cxx:445
 TObjArray.cxx:446
 TObjArray.cxx:447
 TObjArray.cxx:448
 TObjArray.cxx:449
 TObjArray.cxx:450
 TObjArray.cxx:451
 TObjArray.cxx:452
 TObjArray.cxx:453
 TObjArray.cxx:454
 TObjArray.cxx:455
 TObjArray.cxx:456
 TObjArray.cxx:457
 TObjArray.cxx:458
 TObjArray.cxx:459
 TObjArray.cxx:460
 TObjArray.cxx:461
 TObjArray.cxx:462
 TObjArray.cxx:463
 TObjArray.cxx:464
 TObjArray.cxx:465
 TObjArray.cxx:466
 TObjArray.cxx:467
 TObjArray.cxx:468
 TObjArray.cxx:469
 TObjArray.cxx:470
 TObjArray.cxx:471
 TObjArray.cxx:472
 TObjArray.cxx:473
 TObjArray.cxx:474
 TObjArray.cxx:475
 TObjArray.cxx:476
 TObjArray.cxx:477
 TObjArray.cxx:478
 TObjArray.cxx:479
 TObjArray.cxx:480
 TObjArray.cxx:481
 TObjArray.cxx:482
 TObjArray.cxx:483
 TObjArray.cxx:484
 TObjArray.cxx:485
 TObjArray.cxx:486
 TObjArray.cxx:487
 TObjArray.cxx:488
 TObjArray.cxx:489
 TObjArray.cxx:490
 TObjArray.cxx:491
 TObjArray.cxx:492
 TObjArray.cxx:493
 TObjArray.cxx:494
 TObjArray.cxx:495
 TObjArray.cxx:496
 TObjArray.cxx:497
 TObjArray.cxx:498
 TObjArray.cxx:499
 TObjArray.cxx:500
 TObjArray.cxx:501
 TObjArray.cxx:502
 TObjArray.cxx:503
 TObjArray.cxx:504
 TObjArray.cxx:505
 TObjArray.cxx:506
 TObjArray.cxx:507
 TObjArray.cxx:508
 TObjArray.cxx:509
 TObjArray.cxx:510
 TObjArray.cxx:511
 TObjArray.cxx:512
 TObjArray.cxx:513
 TObjArray.cxx:514
 TObjArray.cxx:515
 TObjArray.cxx:516
 TObjArray.cxx:517
 TObjArray.cxx:518
 TObjArray.cxx:519
 TObjArray.cxx:520
 TObjArray.cxx:521
 TObjArray.cxx:522
 TObjArray.cxx:523
 TObjArray.cxx:524
 TObjArray.cxx:525
 TObjArray.cxx:526
 TObjArray.cxx:527
 TObjArray.cxx:528
 TObjArray.cxx:529
 TObjArray.cxx:530
 TObjArray.cxx:531
 TObjArray.cxx:532
 TObjArray.cxx:533
 TObjArray.cxx:534
 TObjArray.cxx:535
 TObjArray.cxx:536
 TObjArray.cxx:537
 TObjArray.cxx:538
 TObjArray.cxx:539
 TObjArray.cxx:540
 TObjArray.cxx:541
 TObjArray.cxx:542
 TObjArray.cxx:543
 TObjArray.cxx:544
 TObjArray.cxx:545
 TObjArray.cxx:546
 TObjArray.cxx:547
 TObjArray.cxx:548
 TObjArray.cxx:549
 TObjArray.cxx:550
 TObjArray.cxx:551
 TObjArray.cxx:552
 TObjArray.cxx:553
 TObjArray.cxx:554
 TObjArray.cxx:555
 TObjArray.cxx:556
 TObjArray.cxx:557
 TObjArray.cxx:558
 TObjArray.cxx:559
 TObjArray.cxx:560
 TObjArray.cxx:561
 TObjArray.cxx:562
 TObjArray.cxx:563
 TObjArray.cxx:564
 TObjArray.cxx:565
 TObjArray.cxx:566
 TObjArray.cxx:567
 TObjArray.cxx:568
 TObjArray.cxx:569
 TObjArray.cxx:570
 TObjArray.cxx:571
 TObjArray.cxx:572
 TObjArray.cxx:573
 TObjArray.cxx:574
 TObjArray.cxx:575
 TObjArray.cxx:576
 TObjArray.cxx:577
 TObjArray.cxx:578
 TObjArray.cxx:579
 TObjArray.cxx:580
 TObjArray.cxx:581
 TObjArray.cxx:582
 TObjArray.cxx:583
 TObjArray.cxx:584
 TObjArray.cxx:585
 TObjArray.cxx:586
 TObjArray.cxx:587
 TObjArray.cxx:588
 TObjArray.cxx:589
 TObjArray.cxx:590
 TObjArray.cxx:591
 TObjArray.cxx:592
 TObjArray.cxx:593
 TObjArray.cxx:594
 TObjArray.cxx:595
 TObjArray.cxx:596
 TObjArray.cxx:597
 TObjArray.cxx:598
 TObjArray.cxx:599
 TObjArray.cxx:600
 TObjArray.cxx:601
 TObjArray.cxx:602
 TObjArray.cxx:603
 TObjArray.cxx:604
 TObjArray.cxx:605
 TObjArray.cxx:606
 TObjArray.cxx:607
 TObjArray.cxx:608
 TObjArray.cxx:609
 TObjArray.cxx:610
 TObjArray.cxx:611
 TObjArray.cxx:612
 TObjArray.cxx:613
 TObjArray.cxx:614
 TObjArray.cxx:615
 TObjArray.cxx:616
 TObjArray.cxx:617
 TObjArray.cxx:618
 TObjArray.cxx:619
 TObjArray.cxx:620
 TObjArray.cxx:621
 TObjArray.cxx:622
 TObjArray.cxx:623
 TObjArray.cxx:624
 TObjArray.cxx:625
 TObjArray.cxx:626
 TObjArray.cxx:627
 TObjArray.cxx:628
 TObjArray.cxx:629
 TObjArray.cxx:630
 TObjArray.cxx:631
 TObjArray.cxx:632
 TObjArray.cxx:633
 TObjArray.cxx:634
 TObjArray.cxx:635
 TObjArray.cxx:636
 TObjArray.cxx:637
 TObjArray.cxx:638
 TObjArray.cxx:639
 TObjArray.cxx:640
 TObjArray.cxx:641
 TObjArray.cxx:642
 TObjArray.cxx:643
 TObjArray.cxx:644
 TObjArray.cxx:645
 TObjArray.cxx:646
 TObjArray.cxx:647
 TObjArray.cxx:648
 TObjArray.cxx:649
 TObjArray.cxx:650
 TObjArray.cxx:651
 TObjArray.cxx:652
 TObjArray.cxx:653
 TObjArray.cxx:654
 TObjArray.cxx:655
 TObjArray.cxx:656
 TObjArray.cxx:657
 TObjArray.cxx:658
 TObjArray.cxx:659
 TObjArray.cxx:660
 TObjArray.cxx:661
 TObjArray.cxx:662
 TObjArray.cxx:663
 TObjArray.cxx:664
 TObjArray.cxx:665
 TObjArray.cxx:666
 TObjArray.cxx:667
 TObjArray.cxx:668
 TObjArray.cxx:669
 TObjArray.cxx:670
 TObjArray.cxx:671
 TObjArray.cxx:672
 TObjArray.cxx:673
 TObjArray.cxx:674
 TObjArray.cxx:675
 TObjArray.cxx:676
 TObjArray.cxx:677
 TObjArray.cxx:678
 TObjArray.cxx:679
 TObjArray.cxx:680
 TObjArray.cxx:681
 TObjArray.cxx:682
 TObjArray.cxx:683
 TObjArray.cxx:684
 TObjArray.cxx:685
 TObjArray.cxx:686
 TObjArray.cxx:687
 TObjArray.cxx:688
 TObjArray.cxx:689
 TObjArray.cxx:690
 TObjArray.cxx:691
 TObjArray.cxx:692
 TObjArray.cxx:693
 TObjArray.cxx:694
 TObjArray.cxx:695
 TObjArray.cxx:696
 TObjArray.cxx:697
 TObjArray.cxx:698
 TObjArray.cxx:699
 TObjArray.cxx:700
 TObjArray.cxx:701
 TObjArray.cxx:702
 TObjArray.cxx:703
 TObjArray.cxx:704
 TObjArray.cxx:705
 TObjArray.cxx:706
 TObjArray.cxx:707
 TObjArray.cxx:708
 TObjArray.cxx:709
 TObjArray.cxx:710
 TObjArray.cxx:711
 TObjArray.cxx:712
 TObjArray.cxx:713
 TObjArray.cxx:714
 TObjArray.cxx:715
 TObjArray.cxx:716
 TObjArray.cxx:717
 TObjArray.cxx:718
 TObjArray.cxx:719
 TObjArray.cxx:720
 TObjArray.cxx:721
 TObjArray.cxx:722
 TObjArray.cxx:723
 TObjArray.cxx:724
 TObjArray.cxx:725
 TObjArray.cxx:726
 TObjArray.cxx:727
 TObjArray.cxx:728
 TObjArray.cxx:729
 TObjArray.cxx:730
 TObjArray.cxx:731
 TObjArray.cxx:732
 TObjArray.cxx:733
 TObjArray.cxx:734
 TObjArray.cxx:735
 TObjArray.cxx:736
 TObjArray.cxx:737
 TObjArray.cxx:738
 TObjArray.cxx:739
 TObjArray.cxx:740
 TObjArray.cxx:741
 TObjArray.cxx:742
 TObjArray.cxx:743
 TObjArray.cxx:744
 TObjArray.cxx:745
 TObjArray.cxx:746
 TObjArray.cxx:747
 TObjArray.cxx:748
 TObjArray.cxx:749
 TObjArray.cxx:750
 TObjArray.cxx:751
 TObjArray.cxx:752
 TObjArray.cxx:753
 TObjArray.cxx:754
 TObjArray.cxx:755
 TObjArray.cxx:756
 TObjArray.cxx:757
 TObjArray.cxx:758
 TObjArray.cxx:759
 TObjArray.cxx:760
 TObjArray.cxx:761
 TObjArray.cxx:762
 TObjArray.cxx:763
 TObjArray.cxx:764
 TObjArray.cxx:765
 TObjArray.cxx:766
 TObjArray.cxx:767
 TObjArray.cxx:768
 TObjArray.cxx:769
 TObjArray.cxx:770
 TObjArray.cxx:771
 TObjArray.cxx:772
 TObjArray.cxx:773
 TObjArray.cxx:774
 TObjArray.cxx:775
 TObjArray.cxx:776
 TObjArray.cxx:777
 TObjArray.cxx:778
 TObjArray.cxx:779
 TObjArray.cxx:780
 TObjArray.cxx:781
 TObjArray.cxx:782
 TObjArray.cxx:783
 TObjArray.cxx:784
 TObjArray.cxx:785
 TObjArray.cxx:786
 TObjArray.cxx:787
 TObjArray.cxx:788
 TObjArray.cxx:789
 TObjArray.cxx:790
 TObjArray.cxx:791
 TObjArray.cxx:792
 TObjArray.cxx:793
 TObjArray.cxx:794
 TObjArray.cxx:795
 TObjArray.cxx:796
 TObjArray.cxx:797
 TObjArray.cxx:798
 TObjArray.cxx:799
 TObjArray.cxx:800
 TObjArray.cxx:801
 TObjArray.cxx:802
 TObjArray.cxx:803
 TObjArray.cxx:804
 TObjArray.cxx:805
 TObjArray.cxx:806
 TObjArray.cxx:807
 TObjArray.cxx:808
 TObjArray.cxx:809
 TObjArray.cxx:810
 TObjArray.cxx:811
 TObjArray.cxx:812
 TObjArray.cxx:813
 TObjArray.cxx:814
 TObjArray.cxx:815
 TObjArray.cxx:816
 TObjArray.cxx:817
 TObjArray.cxx:818
 TObjArray.cxx:819
 TObjArray.cxx:820
 TObjArray.cxx:821
 TObjArray.cxx:822
 TObjArray.cxx:823
 TObjArray.cxx:824
 TObjArray.cxx:825
 TObjArray.cxx:826
 TObjArray.cxx:827
 TObjArray.cxx:828
 TObjArray.cxx:829
 TObjArray.cxx:830
 TObjArray.cxx:831
 TObjArray.cxx:832
 TObjArray.cxx:833
 TObjArray.cxx:834
 TObjArray.cxx:835
 TObjArray.cxx:836
 TObjArray.cxx:837
 TObjArray.cxx:838
 TObjArray.cxx:839
 TObjArray.cxx:840
 TObjArray.cxx:841
 TObjArray.cxx:842
 TObjArray.cxx:843
 TObjArray.cxx:844
 TObjArray.cxx:845
 TObjArray.cxx:846
 TObjArray.cxx:847
 TObjArray.cxx:848
 TObjArray.cxx:849
 TObjArray.cxx:850
 TObjArray.cxx:851
 TObjArray.cxx:852
 TObjArray.cxx:853
 TObjArray.cxx:854
 TObjArray.cxx:855
 TObjArray.cxx:856
 TObjArray.cxx:857
 TObjArray.cxx:858
 TObjArray.cxx:859
 TObjArray.cxx:860
 TObjArray.cxx:861
 TObjArray.cxx:862
 TObjArray.cxx:863
 TObjArray.cxx:864
 TObjArray.cxx:865
 TObjArray.cxx:866
 TObjArray.cxx:867
 TObjArray.cxx:868
 TObjArray.cxx:869
 TObjArray.cxx:870
 TObjArray.cxx:871
 TObjArray.cxx:872
 TObjArray.cxx:873
 TObjArray.cxx:874
 TObjArray.cxx:875
 TObjArray.cxx:876
 TObjArray.cxx:877
 TObjArray.cxx:878
 TObjArray.cxx:879
 TObjArray.cxx:880
 TObjArray.cxx:881
 TObjArray.cxx:882
 TObjArray.cxx:883
 TObjArray.cxx:884
 TObjArray.cxx:885
 TObjArray.cxx:886
 TObjArray.cxx:887
 TObjArray.cxx:888
 TObjArray.cxx:889
 TObjArray.cxx:890
 TObjArray.cxx:891
 TObjArray.cxx:892
 TObjArray.cxx:893
 TObjArray.cxx:894
 TObjArray.cxx:895
 TObjArray.cxx:896
 TObjArray.cxx:897
 TObjArray.cxx:898
 TObjArray.cxx:899
 TObjArray.cxx:900
 TObjArray.cxx:901
 TObjArray.cxx:902
 TObjArray.cxx:903
 TObjArray.cxx:904
 TObjArray.cxx:905
 TObjArray.cxx:906
 TObjArray.cxx:907
 TObjArray.cxx:908
 TObjArray.cxx:909
 TObjArray.cxx:910
 TObjArray.cxx:911
 TObjArray.cxx:912
 TObjArray.cxx:913
 TObjArray.cxx:914
 TObjArray.cxx:915
 TObjArray.cxx:916
 TObjArray.cxx:917