37    const Int_t  kMapOffset = 2;
 
   43 TConvertClonesArrayToProxy::TConvertClonesArrayToProxy(
 
   44    TVirtualCollectionProxy *proxy,
 
   45    Bool_t isPointer, Bool_t isPrealloc) :
 
   46       fIsPointer(isPointer),
 
   47       fIsPrealloc(isPrealloc),
 
   48       fCollectionClass(proxy?proxy->GetCollectionClass():0)
 
   50    if (isPointer) fOffset = 
sizeof(TClonesArray*);
 
   51    else fOffset = 
sizeof(TClonesArray);
 
   57 TConvertClonesArrayToProxy::~TConvertClonesArrayToProxy()
 
   64 void TConvertClonesArrayToProxy::operator()(TBuffer &b, 
void *pmember, Int_t size)
 
   68    TVirtualCollectionProxy *proxy = fCollectionClass->GetCollectionProxy();
 
   69    TStreamerInfo *subinfo = (TStreamerInfo*)proxy->GetValueClass()->GetStreamerInfo();
 
   72    Int_t   nobjects, dummy;
 
   77    UInt_t start, bytecount;
 
   79    R__ASSERT(b.IsReading());
 
   81    Bool_t needAlloc = fIsPointer && !fIsPrealloc;
 
   84       char *addr = (
char*)pmember;
 
   85       for(Int_t k=0; k<size; ++k, addr += fOffset ) {
 
   86          if (*(
void**)addr && TStreamerInfo::CanDelete()) {
 
   87             proxy->GetValueClass()->Destructor(*(
void**)addr,kFALSE); 
 
   94    char *addr = (
char*)pmember;
 
   96    for(Int_t k=0; k<size; ++k, addr += fOffset ) {
 
  105          UInt_t startpos = b.Length();
 
  109          TClass *clRef = b.ReadClass(TClonesArray::Class(), &tag);
 
  113             if (b.GetBufferVersion() > 0) {
 
  114                tag += b.GetBufferDisplacement();
 
  116                if (tag > (UInt_t)b.GetMapCount()) {
 
  117                   Error(
"TConvertClonesArrayToProxy", 
"object tag too large, I/O buffer corrupted");
 
  122             b.GetMappedObject( tag, objptr, clRef);
 
  123             if ( objptr == (
void*)-1 ) {
 
  124                Error(
"TConvertClonesArrayToProxy",
 
  125                   "Object can not be found in the buffer's map (at %d)",tag);
 
  129                if (b.GetBufferVersion()==0) 
continue;
 
  133                b.MapObject(*(
void**)addr, fCollectionClass, 0);
 
  134                Int_t currentpos = b.Length();
 
  135                b.SetBufferOffset( tag - kMapOffset );
 
  137                (*this)(b,&objptr,1);
 
  138                b.SetBufferOffset( currentpos);
 
  140                if (objptr==0) 
continue;
 
  142                clRef = fCollectionClass;
 
  146             if (clRef==TClonesArray::Class()) {
 
  147                Error(
"TConvertClonesArrayToProxy",
 
  148                   "Object refered to has not been converted from TClonesArray to %s",
 
  149                   fCollectionClass->GetName());
 
  151             } 
else if (clRef!=fCollectionClass) {
 
  152                Error(
"TConvertClonesArrayToProxy",
 
  153                   "Object refered to is of type %s instead of %s",
 
  154                   clRef->GetName(),fCollectionClass->GetName());
 
  157             *(
void**)addr = objptr;
 
  160          } 
else if (clRef != TClonesArray::Class()) {
 
  161             Warning(
"TConvertClonesArrayToProxy",
 
  162                     "Only the TClonesArray part of %s will be read into %s!\n",
 
  163                     (clRef!=((TClass*)-1)&&clRef) ? clRef->GetName() : 
"N/A",
 
  164                     fCollectionClass->GetName());
 
  166             *(
void**)addr = proxy->New();
 
  167             if (b.GetBufferVersion()>0) {
 
  168                b.MapObject(*(
void**)addr, fCollectionClass, startpos+kMapOffset);
 
  170                b.MapObject(*(
void**)addr, fCollectionClass, b.GetMapCount() );
 
  175       if (fIsPointer) obj = *(
void**)addr;
 
  179       Version_t v = b.ReadVersion(&start, &bytecount);
 
  185       if (v > 2) objdummy.Streamer(b);
 
  187       if (v > 1) fName.Streamer(b);
 
  189       strncpy(classv,s.Data(),255);
 
  191       char *semicolon = strchr(classv,
';');
 
  196       TClass *cl = TClass::GetClass(classv);
 
  198          printf(
"TClonesArray::Streamer expecting class %s\n", classv);
 
  199          b.CheckByteCount(start, bytecount, TClonesArray::Class());
 
  204       if (nobjects < 0) nobjects = -nobjects;  
 
  206       if (cl != subinfo->GetClass()) {
 
  207          Error(
"TClonesArray::Conversion to vector",
"Bad class");
 
  209       TVirtualCollectionProxy::TPushPop helper( proxy, obj );
 
  210       env = proxy->Allocate(nobjects,
true);
 
  212       if (objdummy.TestBit(TClonesArray::kBypassStreamer)) {
 
  214          subinfo->ReadBufferSTL(b,proxy,nobjects,0);
 
  217          for (Int_t i = 0; i < nobjects; i++) {
 
  220                void* elem = proxy->At(i);
 
  221                b.StreamObject(elem,subinfo->GetClass());
 
  226       b.CheckByteCount(start, bytecount,TClonesArray::Class());
 
  233 TConvertMapToProxy::TConvertMapToProxy(TClassStreamer *streamer,
 
  234                                        Bool_t isPointer, Bool_t isPrealloc) :
 
  235    fIsPointer(isPointer),
 
  236    fIsPrealloc(isPrealloc),
 
  240    TCollectionClassStreamer *middleman = 
dynamic_cast<TCollectionClassStreamer*
>(streamer);
 
  242       TVirtualCollectionProxy *proxy = middleman->GetXYZ();
 
  243       TGenCollectionStreamer *collStreamer = 
dynamic_cast<TGenCollectionStreamer*
>(proxy);
 
  245       fCollectionClass = proxy->GetCollectionClass();
 
  247       if (isPointer) fSizeOf = 
sizeof(
void*);
 
  248       else fSizeOf = fCollectionClass->Size();
 
  250       if (proxy->GetValueClass()->GetStreamerInfo() == 0
 
  251           || proxy->GetValueClass()->GetStreamerInfo()->GetElements()->At(1) == 0 ) {
 
  255       if (!collStreamer) fCollectionClass = 0;
 
  264 void TConvertMapToProxy::operator()(TBuffer &b, 
void *pmember, Int_t size)
 
  266    R__ASSERT(b.IsReading());
 
  267    R__ASSERT(fCollectionClass);
 
  271    TCollectionClassStreamer *middleman = 
dynamic_cast<TCollectionClassStreamer*
>(fCollectionClass->GetStreamer());
 
  272    TVirtualCollectionProxy *proxy = middleman->GetXYZ();
 
  273    TGenCollectionStreamer *collStreamer = 
dynamic_cast<TGenCollectionStreamer*
>(proxy);
 
  275    Bool_t needAlloc = fIsPointer && !fIsPrealloc;
 
  277    R__ASSERT(!needAlloc); 
 
  280       char *addr = (
char*)pmember;
 
  281       for(Int_t k=0; k<size; ++k, addr += fSizeOf ) {
 
  282          if (*(
void**)addr && TStreamerInfo::CanDelete()) {
 
  283             proxy->GetValueClass()->Destructor(*(
void**)addr,kFALSE); 
 
  291    char *addr = (
char*)pmember;
 
  293    for(Int_t k=0; k<size; ++k, addr += fSizeOf) {
 
  302       if (fIsPointer) obj = *(
void**)addr;
 
  305       TVirtualCollectionProxy::TPushPop env(proxy, obj);
 
  306       collStreamer->StreamerAsMap(b);