// @(#)root/io:$Id$
// Author: Markus Frank 28/10/04

/*************************************************************************
 * 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.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TEmulatedCollectionProxy
//
// Streamer around an arbitrary container, which implements basic
// functionality and iteration.
//
// In particular this is used to implement splitting and abstract
// element access of any container. Access to compiled code is necessary
// to implement the abstract iteration sequence and functionality like
// size(), clear(), resize(). resize() may be a void operation.
//
//////////////////////////////////////////////////////////////////////////

#include "TEmulatedCollectionProxy.h"
#include "TStreamerElement.h"
#include "TStreamerInfo.h"
#include "TClassEdit.h"
#include "TError.h"
#include "TROOT.h"
#include "Riostream.h"

#include "TVirtualMutex.h" // For R__LOCKGUARD
#include "TInterpreter.h"  // For gInterpreterMutex

//
// Utility function to allow the creation of a TClass for a std::pair without
// a dictionary (See end of file for implementation
//

static TStreamerElement* R__CreateEmulatedElement(const char *dmName, const char *dmFull, Int_t offset);
static TStreamerInfo *R__GenerateTClassForPair(const std::string &f, const std::string &s);

TEmulatedCollectionProxy::TEmulatedCollectionProxy(const TEmulatedCollectionProxy& copy)
   : TGenCollectionProxy(copy)
{
   // Build a Streamer for an emulated vector whose type is 'name'.
   fProperties |= kIsEmulated;
}

TEmulatedCollectionProxy::TEmulatedCollectionProxy(const char* cl_name, Bool_t silent)
   : TGenCollectionProxy(typeid(std::vector<char>), sizeof(std::vector<char>::iterator))
{
   // Build a Streamer for a collection whose type is described by 'collectionClass'.

   fName = cl_name;
   if ( this->TEmulatedCollectionProxy::InitializeEx(silent) ) {
      fCreateEnv = TGenCollectionProxy::Env_t::Create;
   }
   fProperties |= kIsEmulated;
}

TEmulatedCollectionProxy::~TEmulatedCollectionProxy()
{
   // Standard destructor
   if ( fEnv && fEnv->fObject ) {
      Clear();
   }
}

TVirtualCollectionProxy* TEmulatedCollectionProxy::Generate() const
{
   // Virtual copy constructor

   if ( !fClass ) Initialize(kFALSE);
   return new TEmulatedCollectionProxy(*this);
}

void TEmulatedCollectionProxy::Destructor(void* p, Bool_t dtorOnly) const
{
   // Virtual destructor

   if (!p) return;
   if (!fEnv || fEnv->fObject != p) { // Envoid the cost of TPushPop if we don't need it
      // FIXME: This is not thread safe.
      TVirtualCollectionProxy::TPushPop env(const_cast<TEmulatedCollectionProxy*>(this), p);
      const_cast<TEmulatedCollectionProxy*>(this)->Clear("force");
   } else {
      const_cast<TEmulatedCollectionProxy*>(this)->Clear("force");
   }
   if (dtorOnly) {
      ((Cont_t*)p)->~Cont_t();
   } else {
      delete (Cont_t*) p;
   }
}

void TEmulatedCollectionProxy::DeleteArray(void* p, Bool_t dtorOnly) const
{
   // Virtual array destructor

   // Cannot implement this properly, we do not know
   // how many elements are in the array.
   Warning("DeleteArray", "Cannot properly delete emulated array of %s at %p, I don't know how many elements it has!", fClass->GetName(), p);
   if (!dtorOnly) {
      delete[] (Cont_t*) p;
   }
}

TGenCollectionProxy *TEmulatedCollectionProxy::InitializeEx(Bool_t silent)
{
   // Proxy initializer
   R__LOCKGUARD2(gInterpreterMutex);
   if (fClass) return this;


   TClass *cl = TClass::GetClass(fName.c_str());
   fEnv = 0;
   fKey = 0;
   if ( cl )  {
      int nested = 0;
      std::vector<std::string> inside;
      fPointers  = false;
      int num = TClassEdit::GetSplit(fName.c_str(),inside,nested);
      if ( num > 1 )  {
         std::string nam;
         if ( inside[0].find("stdext::hash_") != std::string::npos ) {
            inside[0].replace(3,10,"::");
         }
         if ( inside[0].find("__gnu_cxx::hash_") != std::string::npos ) {
            inside[0].replace(0,16,"std::");
         }
         fSTL_type = TClassEdit::STLKind(inside[0].c_str());
         // Note: an emulated collection proxy is never really associative
         // since under-neath is actually an array.

         // std::cout << "Initialized " << typeid(*this).name() << ":" << fName << std::endl;
         int slong = sizeof(void*);
         switch ( fSTL_type )  {
            case ROOT::kSTLmap:
            case ROOT::kSTLmultimap:
               nam = "pair<"+inside[1]+","+inside[2];
               nam += (nam[nam.length()-1]=='>') ? " >" : ">";
               if (0==TClass::GetClass(nam.c_str())) {
                  // We need to emulate the pair
                  R__GenerateTClassForPair(inside[1],inside[2]);
               }
               fValue = new Value(nam,silent);
               fKey   = new Value(inside[1],silent);
               fVal   = new Value(inside[2],silent);
               if ( !(*fValue).IsValid() || !fKey->IsValid() || !fVal->IsValid() ) {
                  return 0;
               }
               fPointers |= 0 != (fKey->fCase&kIsPointer);
               if (fPointers || (0 != (fKey->fProperties&kNeedDelete))) {
                  fProperties |= kNeedDelete;
               }
               if ( 0 == fValDiff )  {
                  fValDiff = fKey->fSize + fVal->fSize;
                  fValDiff += (slong - fKey->fSize%slong)%slong;
                  fValDiff += (slong - fValDiff%slong)%slong;
               }
               if ( 0 == fValOffset )  {
                  fValOffset  = fKey->fSize;
                  fValOffset += (slong - fKey->fSize%slong)%slong;
               }
               break;
            case ROOT::kSTLbitset:
               inside[1] = "bool";
               // Intentional fall through
            default:
               fValue = new Value(inside[1],silent);
               fVal   = new Value(*fValue);
               if ( !(*fValue).IsValid() || !fVal->IsValid() ) {
                  return 0;
               }
               if ( 0 == fValDiff )  {
                  fValDiff  = fVal->fSize;
                  if (fVal->fCase != kIsFundamental) {
                     fValDiff += (slong - fValDiff%slong)%slong;
                  }
               }
               break;
         }
         fPointers |= 0 != (fVal->fCase&kIsPointer);
         if (fPointers || (0 != (fVal->fProperties&kNeedDelete))) {
            fProperties |= kNeedDelete;
         }
         fClass = cl;
         return this;
      }
      Fatal("TEmulatedCollectionProxy","Components of %s not analysed!",cl->GetName());
   }
   Fatal("TEmulatedCollectionProxy","Collection class %s not found!",fTypeinfo.name());
   return 0;
}

Bool_t TEmulatedCollectionProxy::IsValid() const
{
   // Return true if the collection proxy was well initialized.
   return  (0 != fCreateEnv.call);
}

UInt_t TEmulatedCollectionProxy::Size() const
{
   // Return the current size of the container

   if ( fEnv && fEnv->fObject )   {
      return fEnv->fSize = PCont_t(fEnv->fObject)->size()/fValDiff;
   }
   Fatal("TEmulatedCollectionProxy","Size> Logic error - no proxy object set.");
   return 0;
}

void TEmulatedCollectionProxy::Clear(const char* opt)
{
   // Clear the emulated collection.
   Resize(0, opt && *opt=='f');
}

void TEmulatedCollectionProxy::Shrink(UInt_t nCurr, UInt_t left, Bool_t force )
{
   // Shrink the container

   typedef std::string  String_t;
   PCont_t c   = PCont_t(fEnv->fObject);
   char* addr  = ((char*)fEnv->fStart) + fValDiff*left;
   size_t i;

   switch ( fSTL_type )  {
      case ROOT::kSTLmap:
      case ROOT::kSTLmultimap:
         addr = ((char*)fEnv->fStart) + fValDiff*left;
         switch(fKey->fCase)  {
            case kIsFundamental:  // Only handle primitives this way
            case kIsEnum:
               break;
            case kIsClass:
               for( i= fKey->fType ? left : nCurr; i<nCurr; ++i, addr += fValDiff ) {
                  // Call emulation in case non-compiled content
                  fKey->fType->Destructor(addr, kTRUE);
               }
               break;
            case kBIT_ISSTRING:
               for( i=left; i<nCurr; ++i, addr += fValDiff ) {
                  ((std::string*)addr)->~String_t();
               }
               break;
            case kIsPointer|kIsClass:
               for( i=left; i<nCurr; ++i, addr += fValDiff )  {
                  StreamHelper* h = (StreamHelper*)addr;
                  //Eventually we'll need to delete this
                  //(but only when needed).
                  void* ptr = h->ptr();
                  if (force) fKey->fType->Destructor(ptr);
                  h->set(0);
               }
               break;
            case kIsPointer|kBIT_ISSTRING:
               for( i=nCurr; i<left; ++i, addr += fValDiff )   {
                  StreamHelper* h = (StreamHelper*)addr;
                  //Eventually we'll need to delete this
                  //(but only when needed).
                  if (force) delete (std::string*)h->ptr();
                  h->set(0);
               }
               break;
            case kIsPointer|kBIT_ISTSTRING|kIsClass:
               for( i=nCurr; i<left; ++i, addr += fValDiff )   {
                  StreamHelper* h = (StreamHelper*)addr;
                  if (force) delete (TString*)h->ptr();
                  h->set(0);
               }
               break;
         }
         addr = ((char*)fEnv->fStart)+fValOffset+fValDiff*left;
         // DO NOT break; just continue

         // General case for all values
      default:
         switch( fVal->fCase )  {
            case kIsFundamental:  // Only handle primitives this way
            case kIsEnum:
               break;
            case kIsClass:
               for( i=left; i<nCurr; ++i, addr += fValDiff )  {
                  // Call emulation in case non-compiled content
                  fVal->fType->Destructor(addr,kTRUE);
               }
               break;
            case kBIT_ISSTRING:
               for( i=left; i<nCurr; ++i, addr += fValDiff )
                  ((std::string*)addr)->~String_t();
               break;
            case kIsPointer|kIsClass:
               for( i=left; i<nCurr; ++i, addr += fValDiff )  {
                  StreamHelper* h = (StreamHelper*)addr;
                  void* p = h->ptr();
                  if ( p && force )  {
                     fVal->fType->Destructor(p);
                  }
                  h->set(0);
               }
               break;
            case kIsPointer|kBIT_ISSTRING:
               for( i=nCurr; i<left; ++i, addr += fValDiff )   {
                  StreamHelper* h = (StreamHelper*)addr;
                  if (force) delete (std::string*)h->ptr();
                  h->set(0);
               }
               break;
            case kIsPointer|kBIT_ISTSTRING|kIsClass:
               for( i=nCurr; i<left; ++i, addr += fValDiff )   {
                  StreamHelper* h = (StreamHelper*)addr;
                  if (force) delete (TString*)h->ptr();
                  h->set(0);
               }
               break;
         }
   }
   c->resize(left*fValDiff,0);
   fEnv->fStart = left>0 ? &(*c->begin()) : 0;
   return;
}

void TEmulatedCollectionProxy::Expand(UInt_t nCurr, UInt_t left)
{
   // Expand the container
   size_t i;
   PCont_t c   = PCont_t(fEnv->fObject);
   c->resize(left*fValDiff,0);
   void *oldstart = fEnv->fStart;
   fEnv->fStart = left>0 ? &(*c->begin()) : 0;

   char* addr = ((char*)fEnv->fStart) + fValDiff*nCurr;
   switch ( fSTL_type )  {
      case ROOT::kSTLmap:
      case ROOT::kSTLmultimap:
         switch(fKey->fCase)  {
            case kIsFundamental:  // Only handle primitives this way
            case kIsEnum:
               break;
            case kIsClass:
               if (oldstart && oldstart != fEnv->fStart) {
                  Long_t offset = 0;
                  for( i=0; i<=nCurr; ++i, offset += fValDiff ) {
                     // For now 'Move' only register the change of location
                     // so per se this is wrong since the object are copied via memcpy
                     // rather than a copy (or move) constructor.
                     fKey->fType->Move(((char*)oldstart)+offset,((char*)fEnv->fStart)+offset);
                  }
               }
               for( i=nCurr; i<left; ++i, addr += fValDiff )
                  fKey->fType->New(addr);
               break;
            case kBIT_ISSTRING:
               for( i=nCurr; i<left; ++i, addr += fValDiff )
                  ::new(addr) std::string();
               break;
            case kIsPointer|kIsClass:
            case kIsPointer|kBIT_ISSTRING:
            case kIsPointer|kBIT_ISTSTRING|kIsClass:
               for( i=nCurr; i<left; ++i, addr += fValDiff )
                  *(void**)addr = 0;
               break;
         }
         addr = ((char*)fEnv->fStart)+fValOffset+fValDiff*nCurr;
         // DO NOT break; just continue

         // General case for all values
      default:
         switch(fVal->fCase)  {
            case kIsFundamental:  // Only handle primitives this way
            case kIsEnum:
               break;
            case kIsClass:
               if (oldstart && oldstart != fEnv->fStart) {
                  Long_t offset = 0;
                  for( i=0; i<=nCurr; ++i, offset += fValDiff ) {
                     // For now 'Move' only register the change of location
                     // so per se this is wrong since the object are copied via memcpy
                     // rather than a copy (or move) constructor.
                     fVal->fType->Move(((char*)oldstart)+offset,((char*)fEnv->fStart)+offset);
                  }
               }
               for( i=nCurr; i<left; ++i, addr += fValDiff ) {
                  fVal->fType->New(addr);
               }
               break;
            case kBIT_ISSTRING:
               for( i=nCurr; i<left; ++i, addr += fValDiff )
                  ::new(addr) std::string();
               break;
            case kIsPointer|kIsClass:
            case kIsPointer|kBIT_ISSTRING:
            case kIsPointer|kBIT_ISTSTRING|kIsClass:
               for( i=nCurr; i<left; ++i, addr += fValDiff )
                  *(void**)addr = 0;
               break;
         }
         break;
   }
}

void TEmulatedCollectionProxy::Resize(UInt_t left, Bool_t force)
{
   // Resize the container

   if ( fEnv && fEnv->fObject )   {
      size_t nCurr = Size();
      PCont_t c = PCont_t(fEnv->fObject);
      fEnv->fStart = nCurr>0 ? &(*c->begin()) : 0;
      if ( left == nCurr )  {
         return;
      }
      else if ( left < nCurr )  {
         Shrink(nCurr, left, force);
         return;
      }
      Expand(nCurr, left);
      return;
   }
   Fatal("TEmulatedCollectionProxy","Resize> Logic error - no proxy object set.");
}

void* TEmulatedCollectionProxy::At(UInt_t idx)
{
   // Return the address of the value at index 'idx'
   if ( fEnv && fEnv->fObject )   {
      PCont_t c = PCont_t(fEnv->fObject);
      size_t  s = c->size();
      if ( idx >= (s/fValDiff) )  {
         return 0;
      }
      return idx<(s/fValDiff) ? ((char*)&(*c->begin()))+idx*fValDiff : 0;
   }
   Fatal("TEmulatedCollectionProxy","At> Logic error - no proxy object set.");
   return 0;
}

void* TEmulatedCollectionProxy::Allocate(UInt_t n, Bool_t forceDelete)
{
   // Allocate the necessary space.

   Resize(n, forceDelete);
   return fEnv->fObject;
}

//______________________________________________________________________________
void TEmulatedCollectionProxy::Insert(const void * /* data */, void * /*container*/, size_t /*size*/)
{
   // Insert data into the container where data is a C-style array of the actual type contained in the collection
   // of the given size.   For associative container (map, etc.), the data type is the pair<key,value>.

   Fatal("Insert","Not yet implemented, require copy of objects.");
}

void TEmulatedCollectionProxy::Commit(void* /* env */ )
{
}

void TEmulatedCollectionProxy::ReadItems(int nElements, TBuffer &b)
{
   // Object input streamer
   Bool_t vsn3 = b.GetInfo() && b.GetInfo()->GetOldVersion()<=3;
   StreamHelper* itm = (StreamHelper*)At(0);
   switch (fVal->fCase) {
      case kIsFundamental:  //  Only handle primitives this way
      case kIsEnum:
         switch( int(fVal->fKind) )   {
            case kBool_t:    b.ReadFastArray(&itm->boolean   , nElements); break;
            case kChar_t:    b.ReadFastArray(&itm->s_char    , nElements); break;
            case kShort_t:   b.ReadFastArray(&itm->s_short   , nElements); break;
            case kInt_t:     b.ReadFastArray(&itm->s_int     , nElements); break;
            case kLong_t:    b.ReadFastArray(&itm->s_long    , nElements); break;
            case kLong64_t:  b.ReadFastArray(&itm->s_longlong, nElements); break;
            case kFloat_t:   b.ReadFastArray(&itm->flt       , nElements); break;
            case kFloat16_t: b.ReadFastArrayFloat16(&itm->flt, nElements); break;
            case kDouble_t:  b.ReadFastArray(&itm->dbl       , nElements); break;
            case kBOOL_t:    b.ReadFastArray(&itm->boolean   , nElements); break;
            case kUChar_t:   b.ReadFastArray(&itm->u_char    , nElements); break;
            case kUShort_t:  b.ReadFastArray(&itm->u_short   , nElements); break;
            case kUInt_t:    b.ReadFastArray(&itm->u_int     , nElements); break;
            case kULong_t:   b.ReadFastArray(&itm->u_long    , nElements); break;
            case kULong64_t: b.ReadFastArray(&itm->u_longlong, nElements); break;
            case kDouble32_t:b.ReadFastArrayDouble32(&itm->dbl,nElements); break;
            case kchar:
            case kNoType_t:
            case kOther_t:
               Error("TEmulatedCollectionProxy","fType %d is not supported yet!\n",fVal->fKind);
         }
         break;

#define DOLOOP(x) {int idx=0; while(idx<nElements) {StreamHelper* i=(StreamHelper*)(((char*)itm) + fValDiff*idx); { x ;} ++idx;} break;}

      case kIsClass:
         DOLOOP( b.StreamObject(i,fVal->fType) );
      case kBIT_ISSTRING:
         DOLOOP( i->read_std_string(b) );
      case kIsPointer|kIsClass:
         DOLOOP( i->read_any_object(fVal,b) );
      case kIsPointer|kBIT_ISSTRING:
         DOLOOP( i->read_std_string_pointer(b) );
      case kIsPointer|kBIT_ISTSTRING|kIsClass:
         DOLOOP( i->read_tstring_pointer(vsn3,b) );
   }

#undef DOLOOP

}

void TEmulatedCollectionProxy::WriteItems(int nElements, TBuffer &b)
{
   // Object output streamer
   StreamHelper* itm = (StreamHelper*)At(0);
   switch (fVal->fCase) {
      case kIsFundamental:  // Only handle primitives this way
      case kIsEnum:
         itm = (StreamHelper*)At(0);
            switch( int(fVal->fKind) )   {
            case kBool_t:    b.WriteFastArray(&itm->boolean   , nElements); break;
            case kChar_t:    b.WriteFastArray(&itm->s_char    , nElements); break;
            case kShort_t:   b.WriteFastArray(&itm->s_short   , nElements); break;
            case kInt_t:     b.WriteFastArray(&itm->s_int     , nElements); break;
            case kLong_t:    b.WriteFastArray(&itm->s_long    , nElements); break;
            case kLong64_t:  b.WriteFastArray(&itm->s_longlong, nElements); break;
            case kFloat_t:   b.WriteFastArray(&itm->flt       , nElements); break;
            case kFloat16_t: b.WriteFastArrayFloat16(&itm->flt, nElements); break;
            case kDouble_t:  b.WriteFastArray(&itm->dbl       , nElements); break;
            case kBOOL_t:    b.WriteFastArray(&itm->boolean   , nElements); break;
            case kUChar_t:   b.WriteFastArray(&itm->u_char    , nElements); break;
            case kUShort_t:  b.WriteFastArray(&itm->u_short   , nElements); break;
            case kUInt_t:    b.WriteFastArray(&itm->u_int     , nElements); break;
            case kULong_t:   b.WriteFastArray(&itm->u_long    , nElements); break;
            case kULong64_t: b.WriteFastArray(&itm->u_longlong, nElements); break;
            case kDouble32_t:b.WriteFastArrayDouble32(&itm->dbl,nElements); break;
            case kchar:
            case kNoType_t:
            case kOther_t:
               Error("TEmulatedCollectionProxy","fType %d is not supported yet!\n",fVal->fKind);
         }
         break;
#define DOLOOP(x) {int idx=0; while(idx<nElements) {StreamHelper* i=(StreamHelper*)(((char*)itm) + fValDiff*idx); { x ;} ++idx;} break;}
      case kIsClass:
         DOLOOP( b.StreamObject(i,fVal->fType) );
      case kBIT_ISSTRING:
         DOLOOP( TString(i->c_str()).Streamer(b) );
      case kIsPointer|kIsClass:
         DOLOOP( b.WriteObjectAny(i->ptr(),fVal->fType) );
      case kBIT_ISSTRING|kIsPointer:
         DOLOOP( i->write_std_string_pointer(b) );
      case kBIT_ISTSTRING|kIsClass|kIsPointer:
         DOLOOP( i->write_tstring_pointer(b) );
   }
#undef DOLOOP
}

void TEmulatedCollectionProxy::ReadBuffer(TBuffer &b, void *obj, const TClass *onfileClass)
{
   // Read portion of the streamer.

   SetOnFileClass((TClass*)onfileClass);
   ReadBuffer(b,obj);
}

void TEmulatedCollectionProxy::ReadBuffer(TBuffer &b, void *obj)
{
   // Read portion of the streamer.

   TPushPop env(this,obj);
   int nElements = 0;
   b >> nElements;
   if ( fEnv->fObject )  {
      Resize(nElements,true);
   }
   if ( nElements > 0 )  {
      ReadItems(nElements, b);
   }
}

void TEmulatedCollectionProxy::Streamer(TBuffer &b)
{
   // TClassStreamer IO overload
   if ( b.IsReading() ) {  //Read mode
      int nElements = 0;
      b >> nElements;
      if ( fEnv->fObject )  {
         Resize(nElements,true);
      }
      if ( nElements > 0 )  {
         ReadItems(nElements, b);
      }
   }
   else {     // Write case
      int nElements = fEnv->fObject ? Size() : 0;
      b << nElements;
      if ( nElements > 0 )  {
         WriteItems(nElements, b);
      }
   }
}

//
// Utility functions
//
static TStreamerElement* R__CreateEmulatedElement(const char *dmName, const char *dmFull, Int_t offset)
{
   // Create a TStreamerElement for the type 'dmFull' and whose data member name is 'dmName'.

   TString s1( TClassEdit::ShortType(dmFull,0) );
   TString dmType( TClassEdit::ShortType(dmFull,1) );
   Bool_t dmIsPtr = (s1 != dmType);
   const char *dmTitle = "Emulation";

   TDataType *dt = gROOT->GetType(dmType);
   if (dt && dt->GetType() > 0 ) {  // found a basic type
      Int_t dsize,dtype;
      dtype = dt->GetType();
      dsize = dt->Size();
      if (dmIsPtr && dtype != kCharStar) {
         Error("Pair Emulation Building","%s is not yet supported in pair emulation",
               dmFull);
         return 0;
      } else {
         TStreamerElement *el = new TStreamerBasicType(dmName,dmTitle,offset,dtype,dmFull);
         el->SetSize(dsize);
         return el;
      }
   } else {

      static const char *full_string_name = "basic_string<char,char_traits<char>,allocator<char> >";
      if (strcmp(dmType,"string") == 0 || strcmp(dmType,"std::string") == 0 || strcmp(dmType,full_string_name)==0 ) {
         return new TStreamerSTLstring(dmName,dmTitle,offset,dmFull,dmIsPtr);
      }
      if (TClassEdit::IsSTLCont(dmType)) {
         return new TStreamerSTL(dmName,dmTitle,offset,dmFull,dmFull,dmIsPtr);
      }
      TClass *clm = TClass::GetClass(dmType);
      if (!clm) {
         // either we have an Emulated enum or a really unknown class!
         // let's just claim its an enum :(
         Int_t dtype = kInt_t;
         return new TStreamerBasicType(dmName,dmTitle,offset,dtype,dmFull);
      }
      // a pointer to a class
      if ( dmIsPtr ) {
         if (clm->IsTObject()) {
            return new TStreamerObjectPointer(dmName,dmTitle,offset,dmFull);
         } else {
            return new TStreamerObjectAnyPointer(dmName,dmTitle,offset,dmFull);
         }
      }
      // a class
      if (clm->IsTObject()) {
         return new TStreamerObject(dmName,dmTitle,offset,dmFull);
      } else if(clm == TString::Class() && !dmIsPtr) {
         return new TStreamerString(dmName,dmTitle,offset);
      } else {
         return new TStreamerObjectAny(dmName,dmTitle,offset,dmFull);
      }
   }
}


static TStreamerInfo *R__GenerateTClassForPair(const std::string &fname, const std::string &sname)
{
   // Generate a TStreamerInfo for a std::pair<fname,sname>
   // This TStreamerInfo is then used as if it was read from a file to generate
   // and emulated TClass.

   TStreamerInfo *i = (TStreamerInfo*)TClass::GetClass("pair<const int,int>")->GetStreamerInfo()->Clone();
   std::string pname = "pair<"+fname+","+sname;
   pname += (pname[pname.length()-1]=='>') ? " >" : ">";
   i->SetName(pname.c_str());
   i->SetClass(0);
   i->GetElements()->Delete();
   TStreamerElement *fel = R__CreateEmulatedElement("first", fname.c_str(), 0);
   Int_t size = 0;
   if (fel) {
      i->GetElements()->Add( fel );

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