30 #define DOLOOP for(int k=0; k<narr; ++k) 
   32 #define WriteBasicTypeElem(name,index)          \ 
   34       name *x=(name*)(arr[index]+ioffset);      \ 
   38 #define WriteBasicType(name)                    \ 
   40       WriteBasicTypeElem(name,0);               \ 
   43 #define WriteBasicTypeLoop(name)                            \ 
   45       for(int k=0; k<narr; ++k) WriteBasicTypeElem(name,k); \ 
   48 #define WriteBasicArrayElem(name,index)         \ 
   50       name *x=(name*)(arr[index]+ioffset);      \ 
   51       b.WriteFastArray(x,compinfo[i]->fLength);           \ 
   54 #define WriteBasicArray(name)                   \ 
   56       WriteBasicArrayElem(name,0);              \ 
   59 #define WriteBasicArrayLoop(name)                              \ 
   61       for(int k=0; k<narr; ++k) WriteBasicArrayElem(name,k);   \ 
   64 #define WriteBasicPointerElem(name,index)       \ 
   66       Int_t *l = (Int_t*)(arr[index]+imethod);  \ 
   67       name **f = (name**)(arr[index]+ioffset);  \ 
   69       if (af && *l)  b << Char_t(1);            \ 
   70       else          {b << Char_t(0); continue;} \ 
   72       for(j=0;j<compinfo[i]->fLength;j++) {               \ 
   73          b.WriteFastArray(f[j],*l);             \ 
   77 #define WriteBasicPointer(name)                 \ 
   79       int imethod = compinfo[i]->fMethod+eoffset;         \ 
   80       WriteBasicPointerElem(name,0);            \ 
   83 #define WriteBasicPointerLoop(name)             \ 
   85       int imethod = compinfo[i]->fMethod+eoffset;         \ 
   86       for(int k=0; k<narr; ++k) {               \ 
   87          WriteBasicPointerElem(name,k);         \ 
   93    template <
class T> Bool_t R__TestUseCache(TStreamerElement *element)
 
   95       return element->TestBit(TStreamerElement::kCache);
 
   98    template <> Bool_t R__TestUseCache<TVirtualArray>(TStreamerElement*)
 
  114 Int_t TStreamerInfo::WriteBufferAux(TBuffer &b, 
const T &arr,
 
  115                                     TCompInfo *
const*
const compinfo, Int_t first, Int_t last,
 
  116                                     Int_t narr, Int_t eoffset, Int_t arrayMode)
 
  118    Bool_t needIncrement = !( arrayMode & 2 );
 
  119    arrayMode = arrayMode & (~2);
 
  121    if (needIncrement) b.IncrementLevel(
this);
 
  124    b.TagStreamerInfo(
this);
 
  136    static const int kHaveLoop = 1024;
 
  137    const Int_t typeOffset = arrayMode ? kHaveLoop : 0;
 
  139    for (Int_t i=first;i<last;i++) {
 
  141       TStreamerElement *aElement = (TStreamerElement*)compinfo[i]->fElem;
 
  143       if (needIncrement) b.SetStreamerElementNumber(aElement,compinfo[i]->fType);
 
  145       Int_t ioffset = eoffset+compinfo[i]->fOffset;
 
  147       if (R__TestUseCache<T>(aElement)) {
 
  148          if (aElement->TestBit(TStreamerElement::kWrite)) {
 
  149             if (((TBufferFile&)b).PeekDataCache()==0) {
 
  150                Warning(
"WriteBuffer",
"Skipping %s::%s because the cache is missing.",GetName(),aElement->GetName());
 
  153                   printf(
"WriteBuffer, class:%s, name=%s, fType[%d]=%d," 
  154                          " %s, bufpos=%d, arr=%p, eoffset=%d, Redirect=%p\n",
 
  155                          fClass->GetName(),aElement->GetName(),i,compinfo[i]->fType,
 
  156                          aElement->ClassName(),b.Length(),arr[0], eoffset,((TBufferFile&)b).PeekDataCache()->GetObjectAt(0));
 
  158                WriteBufferAux(b,*((TBufferFile&)b).PeekDataCache(),compinfo,i,i+1,narr,eoffset, arrayMode);
 
  163                printf(
"WriteBuffer, class:%s, name=%s, fType[%d]=%d," 
  164                       " %s, bufpos=%d, arr=%p, eoffset=%d, not a write rule, skipping.\n",
 
  165                       fClass->GetName(),aElement->GetName(),i,compinfo[i]->fType,
 
  166                       aElement->ClassName(),b.Length(),arr[0], eoffset);
 
  170             if (aElement->TestBit(TStreamerElement::kRepeat)) 
continue;
 
  171             ioffset = eoffset+compinfo[i]->fOffset;
 
  177          printf(
"WriteBuffer, class:%s, name=%s, fType[%d]=%d, %s, " 
  178                "bufpos=%d, arr=%p, offset=%d\n",
 
  179                 fClass->GetName(),aElement->GetName(),i,compinfo[i]->fType,aElement->ClassName(),
 
  180                 b.Length(),arr[0],ioffset);
 
  183       switch (compinfo[i]->fType+typeOffset) {
 
  188          case TStreamerInfo::kBool:                WriteBasicType(Bool_t);    
continue;
 
  189          case TStreamerInfo::kChar:                WriteBasicType(Char_t);    
continue;
 
  190          case TStreamerInfo::kShort:               WriteBasicType(Short_t);   
continue;
 
  191          case TStreamerInfo::kInt:                 WriteBasicType(Int_t);     
continue;
 
  192          case TStreamerInfo::kLong:                WriteBasicType(Long_t);    
continue;
 
  193          case TStreamerInfo::kLong64:              WriteBasicType(Long64_t);  
continue;
 
  194          case TStreamerInfo::kFloat:               WriteBasicType(Float_t);   
continue;
 
  195          case TStreamerInfo::kDouble:              WriteBasicType(Double_t);  
continue;
 
  196          case TStreamerInfo::kUChar:               WriteBasicType(UChar_t);   
continue;
 
  197          case TStreamerInfo::kUShort:              WriteBasicType(UShort_t);  
continue;
 
  198          case TStreamerInfo::kUInt:                WriteBasicType(UInt_t);    
continue;
 
  199          case TStreamerInfo::kULong:               WriteBasicType(ULong_t);   
continue;
 
  200          case TStreamerInfo::kULong64:             WriteBasicType(ULong64_t); 
continue;
 
  201          case TStreamerInfo::kFloat16: {
 
  202             Float_t *x=(Float_t*)(arr[0]+ioffset);
 
  203             b.WriteFloat16(x,aElement);
 
  206          case TStreamerInfo::kDouble32: {
 
  207             Double_t *x=(Double_t*)(arr[0]+ioffset);
 
  208             b.WriteDouble32(x,aElement);
 
  212          case TStreamerInfo::kBool    + kHaveLoop: WriteBasicTypeLoop(Bool_t);    
continue;
 
  213          case TStreamerInfo::kChar    + kHaveLoop: WriteBasicTypeLoop(Char_t);    
continue;
 
  214          case TStreamerInfo::kShort   + kHaveLoop: WriteBasicTypeLoop(Short_t);   
continue;
 
  215          case TStreamerInfo::kInt     + kHaveLoop: WriteBasicTypeLoop(Int_t);     
continue;
 
  216          case TStreamerInfo::kLong    + kHaveLoop: WriteBasicTypeLoop(Long_t);    
continue;
 
  217          case TStreamerInfo::kLong64  + kHaveLoop: WriteBasicTypeLoop(Long64_t);  
continue;
 
  218          case TStreamerInfo::kFloat   + kHaveLoop: WriteBasicTypeLoop(Float_t);   
continue;
 
  219          case TStreamerInfo::kDouble  + kHaveLoop: WriteBasicTypeLoop(Double_t);  
continue;
 
  220          case TStreamerInfo::kUChar   + kHaveLoop: WriteBasicTypeLoop(UChar_t);   
continue;
 
  221          case TStreamerInfo::kUShort  + kHaveLoop: WriteBasicTypeLoop(UShort_t);  
continue;
 
  222          case TStreamerInfo::kUInt    + kHaveLoop: WriteBasicTypeLoop(UInt_t);    
continue;
 
  223          case TStreamerInfo::kULong   + kHaveLoop: WriteBasicTypeLoop(ULong_t);   
continue;
 
  224          case TStreamerInfo::kULong64 + kHaveLoop: WriteBasicTypeLoop(ULong64_t); 
continue;
 
  225          case TStreamerInfo::kFloat16+ kHaveLoop: {
 
  226             for(
int k=0; k<narr; ++k) {
 
  227                Float_t *x=(Float_t*)(arr[k]+ioffset);
 
  228                b.WriteFloat16(x,aElement);
 
  232          case TStreamerInfo::kDouble32+ kHaveLoop: {
 
  233             for(
int k=0; k<narr; ++k) {
 
  234                Double_t *x=(Double_t*)(arr[k]+ioffset);
 
  235                b.WriteDouble32(x,aElement);
 
  241          case TStreamerInfo::kOffsetL + TStreamerInfo::kBool:   WriteBasicArray(Bool_t);    
continue;
 
  242          case TStreamerInfo::kOffsetL + TStreamerInfo::kChar:   WriteBasicArray(Char_t);    
continue;
 
  243          case TStreamerInfo::kOffsetL + TStreamerInfo::kShort:  WriteBasicArray(Short_t);   
continue;
 
  244          case TStreamerInfo::kOffsetL + TStreamerInfo::kInt:    WriteBasicArray(Int_t);     
continue;
 
  245          case TStreamerInfo::kOffsetL + TStreamerInfo::kLong:   WriteBasicArray(Long_t);    
continue;
 
  246          case TStreamerInfo::kOffsetL + TStreamerInfo::kLong64: WriteBasicArray(Long64_t);  
continue;
 
  247          case TStreamerInfo::kOffsetL + TStreamerInfo::kFloat:  WriteBasicArray(Float_t);   
continue;
 
  248          case TStreamerInfo::kOffsetL + TStreamerInfo::kDouble: WriteBasicArray(Double_t);  
continue;
 
  249          case TStreamerInfo::kOffsetL + TStreamerInfo::kUChar:  WriteBasicArray(UChar_t);   
continue;
 
  250          case TStreamerInfo::kOffsetL + TStreamerInfo::kUShort: WriteBasicArray(UShort_t);  
continue;
 
  251          case TStreamerInfo::kOffsetL + TStreamerInfo::kUInt:   WriteBasicArray(UInt_t);    
continue;
 
  252          case TStreamerInfo::kOffsetL + TStreamerInfo::kULong:  WriteBasicArray(ULong_t);   
continue;
 
  253          case TStreamerInfo::kOffsetL + TStreamerInfo::kULong64:WriteBasicArray(ULong64_t); 
continue;
 
  254          case TStreamerInfo::kOffsetL + TStreamerInfo::kFloat16: {
 
  255             b.WriteFastArrayFloat16((Float_t*)(arr[0]+ioffset),compinfo[i]->fLength,aElement);
 
  258          case TStreamerInfo::kOffsetL + TStreamerInfo::kDouble32: {
 
  259             b.WriteFastArrayDouble32((Double_t*)(arr[0]+ioffset),compinfo[i]->fLength,aElement);
 
  263          case TStreamerInfo::kOffsetL + TStreamerInfo::kBool    + kHaveLoop: WriteBasicArrayLoop(Bool_t);    
continue;
 
  264          case TStreamerInfo::kOffsetL + TStreamerInfo::kChar    + kHaveLoop: WriteBasicArrayLoop(Char_t);    
continue;
 
  265          case TStreamerInfo::kOffsetL + TStreamerInfo::kShort   + kHaveLoop: WriteBasicArrayLoop(Short_t);   
continue;
 
  266          case TStreamerInfo::kOffsetL + TStreamerInfo::kInt     + kHaveLoop: WriteBasicArrayLoop(Int_t);     
continue;
 
  267          case TStreamerInfo::kOffsetL + TStreamerInfo::kLong    + kHaveLoop: WriteBasicArrayLoop(Long_t);    
continue;
 
  268          case TStreamerInfo::kOffsetL + TStreamerInfo::kLong64  + kHaveLoop: WriteBasicArrayLoop(Long64_t);  
continue;
 
  269          case TStreamerInfo::kOffsetL + TStreamerInfo::kFloat   + kHaveLoop: WriteBasicArrayLoop(Float_t);   
continue;
 
  270          case TStreamerInfo::kOffsetL + TStreamerInfo::kDouble  + kHaveLoop: WriteBasicArrayLoop(Double_t);  
continue;
 
  271          case TStreamerInfo::kOffsetL + TStreamerInfo::kUChar   + kHaveLoop: WriteBasicArrayLoop(UChar_t);   
continue;
 
  272          case TStreamerInfo::kOffsetL + TStreamerInfo::kUShort  + kHaveLoop: WriteBasicArrayLoop(UShort_t);  
continue;
 
  273          case TStreamerInfo::kOffsetL + TStreamerInfo::kUInt    + kHaveLoop: WriteBasicArrayLoop(UInt_t);    
continue;
 
  274          case TStreamerInfo::kOffsetL + TStreamerInfo::kULong   + kHaveLoop: WriteBasicArrayLoop(ULong_t);   
continue;
 
  275          case TStreamerInfo::kOffsetL + TStreamerInfo::kULong64 + kHaveLoop: WriteBasicArrayLoop(ULong64_t); 
continue;
 
  276          case TStreamerInfo::kOffsetL + TStreamerInfo::kFloat16+ kHaveLoop: {
 
  277             for(
int k=0; k<narr; ++k) {
 
  278                b.WriteFastArrayFloat16((Float_t*)(arr[k]+ioffset),compinfo[i]->fLength,aElement);
 
  282          case TStreamerInfo::kOffsetL + TStreamerInfo::kDouble32+ kHaveLoop: {
 
  283             for(
int k=0; k<narr; ++k) {
 
  284                b.WriteFastArrayDouble32((Double_t*)(arr[k]+ioffset),compinfo[i]->fLength,aElement);
 
  290          case TStreamerInfo::kOffsetP + TStreamerInfo::kBool:   WriteBasicPointer(Bool_t);    
continue;
 
  291          case TStreamerInfo::kOffsetP + TStreamerInfo::kChar:   WriteBasicPointer(Char_t);    
continue;
 
  292          case TStreamerInfo::kOffsetP + TStreamerInfo::kShort:  WriteBasicPointer(Short_t);   
continue;
 
  293          case TStreamerInfo::kOffsetP + TStreamerInfo::kInt:    WriteBasicPointer(Int_t);     
continue;
 
  294          case TStreamerInfo::kOffsetP + TStreamerInfo::kLong:   WriteBasicPointer(Long_t);    
continue;
 
  295          case TStreamerInfo::kOffsetP + TStreamerInfo::kLong64: WriteBasicPointer(Long64_t);  
continue;
 
  296          case TStreamerInfo::kOffsetP + TStreamerInfo::kFloat:  WriteBasicPointer(Float_t);   
continue;
 
  297          case TStreamerInfo::kOffsetP + TStreamerInfo::kDouble: WriteBasicPointer(Double_t);  
continue;
 
  298          case TStreamerInfo::kOffsetP + TStreamerInfo::kUChar:  WriteBasicPointer(UChar_t);   
continue;
 
  299          case TStreamerInfo::kOffsetP + TStreamerInfo::kUShort: WriteBasicPointer(UShort_t);  
continue;
 
  300          case TStreamerInfo::kOffsetP + TStreamerInfo::kUInt:   WriteBasicPointer(UInt_t);    
continue;
 
  301          case TStreamerInfo::kOffsetP + TStreamerInfo::kULong:  WriteBasicPointer(ULong_t);   
continue;
 
  302          case TStreamerInfo::kOffsetP + TStreamerInfo::kULong64:WriteBasicPointer(ULong64_t); 
continue;
 
  303          case TStreamerInfo::kOffsetP + TStreamerInfo::kFloat16: {
 
  304             int imethod = compinfo[i]->fMethod+eoffset;
 
  305             Int_t *l = (Int_t*)(arr[0]+imethod);
 
  306             Float_t **f = (Float_t**)(arr[0]+ioffset);
 
  308             if (af && *l)  b << Char_t(1);
 
  309             else          {b << Char_t(0); 
continue;}
 
  311             for(j=0;j<compinfo[i]->fLength;j++) {
 
  312                b.WriteFastArrayFloat16(f[j],*l,aElement);
 
  316          case TStreamerInfo::kOffsetP + TStreamerInfo::kDouble32: {
 
  317             int imethod = compinfo[i]->fMethod+eoffset;
 
  318             Int_t *l = (Int_t*)(arr[0]+imethod);
 
  319             Double_t **f = (Double_t**)(arr[0]+ioffset);
 
  321             if (af && *l)  b << Char_t(1);
 
  322             else          {b << Char_t(0); 
continue;}
 
  324             for(j=0;j<compinfo[i]->fLength;j++) {
 
  325                b.WriteFastArrayDouble32(f[j],*l,aElement);
 
  330          case TStreamerInfo::kOffsetP + TStreamerInfo::kBool    + kHaveLoop: WriteBasicPointerLoop(Bool_t);    
continue;
 
  331          case TStreamerInfo::kOffsetP + TStreamerInfo::kChar    + kHaveLoop: WriteBasicPointerLoop(Char_t);    
continue;
 
  332          case TStreamerInfo::kOffsetP + TStreamerInfo::kShort   + kHaveLoop: WriteBasicPointerLoop(Short_t);   
continue;
 
  333          case TStreamerInfo::kOffsetP + TStreamerInfo::kInt     + kHaveLoop: WriteBasicPointerLoop(Int_t);     
continue;
 
  334          case TStreamerInfo::kOffsetP + TStreamerInfo::kLong    + kHaveLoop: WriteBasicPointerLoop(Long_t);    
continue;
 
  335          case TStreamerInfo::kOffsetP + TStreamerInfo::kLong64  + kHaveLoop: WriteBasicPointerLoop(Long64_t);  
continue;
 
  336          case TStreamerInfo::kOffsetP + TStreamerInfo::kFloat   + kHaveLoop: WriteBasicPointerLoop(Float_t);   
continue;
 
  337          case TStreamerInfo::kOffsetP + TStreamerInfo::kDouble  + kHaveLoop: WriteBasicPointerLoop(Double_t);  
continue;
 
  338          case TStreamerInfo::kOffsetP + TStreamerInfo::kUChar   + kHaveLoop: WriteBasicPointerLoop(UChar_t);   
continue;
 
  339          case TStreamerInfo::kOffsetP + TStreamerInfo::kUShort  + kHaveLoop: WriteBasicPointerLoop(UShort_t);  
continue;
 
  340          case TStreamerInfo::kOffsetP + TStreamerInfo::kUInt    + kHaveLoop: WriteBasicPointerLoop(UInt_t);    
continue;
 
  341          case TStreamerInfo::kOffsetP + TStreamerInfo::kULong   + kHaveLoop: WriteBasicPointerLoop(ULong_t);   
continue;
 
  342          case TStreamerInfo::kOffsetP + TStreamerInfo::kULong64 + kHaveLoop: WriteBasicPointerLoop(ULong64_t); 
continue;
 
  343          case TStreamerInfo::kOffsetP + TStreamerInfo::kFloat16+ kHaveLoop: {
 
  344             int imethod = compinfo[i]->fMethod+eoffset;
 
  345             for(
int k=0; k<narr; ++k) {
 
  346                Int_t *l = (Int_t*)(arr[k]+imethod);
 
  347                Float_t **f = (Float_t**)(arr[k]+ioffset);
 
  349                if (af && *l)  b << Char_t(1);
 
  350                else          {b << Char_t(0); 
continue;}
 
  352                for(j=0;j<compinfo[i]->fLength;j++) {
 
  353                   b.WriteFastArrayFloat16(f[j],*l,aElement);
 
  358          case TStreamerInfo::kOffsetP + TStreamerInfo::kDouble32+ kHaveLoop: {
 
  359             int imethod = compinfo[i]->fMethod+eoffset;
 
  360             for(
int k=0; k<narr; ++k) {
 
  361                Int_t *l = (Int_t*)(arr[k]+imethod);
 
  362                Double_t **f = (Double_t**)(arr[k]+ioffset);
 
  364                if (af && *l)  b << Char_t(1);
 
  365                else          {b << Char_t(0); 
continue;}
 
  367                for(j=0;j<compinfo[i]->fLength;j++) {
 
  368                   b.WriteFastArrayDouble32(f[j],*l,aElement);
 
  374          case TStreamerInfo::kCounter: {
 
  375             Int_t *x=(Int_t*)(arr[0]+ioffset);
 
  378                if (needIncrement) b.DecrementLevel(
this);
 
  384          case TStreamerInfo::kCounter + kHaveLoop : {
 
  386                Int_t *x=(Int_t*)(arr[k]+ioffset);
 
  394       Bool_t isPreAlloc = 0;
 
  396       switch (compinfo[i]->fType) {
 
  399          case TStreamerInfo::kCharStar: { DOLOOP {
 
  400             char **f = (
char**)(arr[k]+ioffset);
 
  406          case TStreamerInfo::kBits: { DOLOOP {
 
  407             UInt_t *x=(UInt_t*)(arr[k]+ioffset); b << *x;
 
  408             if ((*x & kIsReferenced) != 0) {
 
  409                TObject *obj = (TObject*)(arr[k]+eoffset);
 
  410                TProcessID *pid = TProcessID::GetProcessWithUID(obj->GetUniqueID(),obj);
 
  411                TRefTable *table = TRefTable::GetRefTable();
 
  412                if(table) table->Add(obj->GetUniqueID(),pid);
 
  413                UShort_t pidf = b.WriteProcessID(pid);
 
  420          case TStreamerInfo::kTString: { DOLOOP{ ((TString*)(arr[k]+ioffset))->Streamer(b);         }; 
continue; }
 
  421          case TStreamerInfo::kTObject: { DOLOOP{ ((TObject*)(arr[k]+ioffset))->TObject::Streamer(b);}; 
continue; }
 
  422          case TStreamerInfo::kTNamed:  { DOLOOP{ ((TNamed *)(arr[k]+ioffset))->TNamed::Streamer(b); }; 
continue; }
 
  424          case TStreamerInfo::kAnyp:     
 
  425          case TStreamerInfo::kAnyp    + TStreamerInfo::kOffsetL:
 
  427          case TStreamerInfo::kObjectp:  
 
  428          case TStreamerInfo::kObjectp + TStreamerInfo::kOffsetL:
 
  433          case TStreamerInfo::kAnyP:         
 
  434          case TStreamerInfo::kAnyP    + TStreamerInfo::kOffsetL:
 
  436          case TStreamerInfo::kObjectP:  
 
  437          case TStreamerInfo::kObjectP + TStreamerInfo::kOffsetL: {
 
  438             TClass *cl                 = compinfo[i]->fClass;
 
  439             TMemberStreamer *pstreamer = compinfo[i]->fStreamer;
 
  441                Int_t res = b.WriteFastArray((
void**)(arr[k]+ioffset),cl,compinfo[i]->fLength,isPreAlloc,pstreamer);
 
  443                   Warning(
"WriteBuffer",
 
  444                           "The actual class of %s::%s is not available. Only the \"%s\" part will be written\n",
 
  445                           GetName(),aElement->GetName(),cl->GetName());
 
  451          case TStreamerInfo::kAnyPnoVT:     
 
  452          case TStreamerInfo::kAnyPnoVT    + TStreamerInfo::kOffsetL: {
 
  453             TClass *cl                 = compinfo[i]->fClass;
 
  454             TMemberStreamer *pstreamer = compinfo[i]->fStreamer;
 
  456                void **f = (
void**)(arr[k]+ioffset);
 
  458                for(j=0;j<compinfo[i]->fLength;j++) {
 
  460                   if (af)  b << Char_t(1);
 
  461                   else    {b << Char_t(0); 
continue;}
 
  462                   if (pstreamer) (*pstreamer)(b, af, 0);
 
  463                   else cl->Streamer( af, b );
 
  498          case TStreamerInfo::kSTLp:                
 
  499          case TStreamerInfo::kSTLp + TStreamerInfo::kOffsetL:     
 
  501                TClass *cl                 = compinfo[i]->fClass;
 
  502                TMemberStreamer *pstreamer = compinfo[i]->fStreamer;
 
  503                TVirtualCollectionProxy *proxy = cl->GetCollectionProxy();
 
  504                TClass* vClass = proxy ? proxy->GetValueClass() : 0;
 
  506                if (!b.TestBit(TBuffer::kCannotHandleMemberWiseStreaming)
 
  508                    && GetStreamMemberWise()
 
  510                    && !(strspn(aElement->GetTitle(),
"||") == 2)
 
  511                    && !(vClass->TestBit(TClass::kHasCustomStreamerMember)) ) {
 
  514                   UInt_t pos = b.WriteVersionMemberWise(this->IsA(),kTRUE);
 
  515                   b.WriteVersion( vClass, kFALSE );
 
  516                   TStreamerInfo *subinfo = (TStreamerInfo*)vClass->GetStreamerInfo();
 
  518                      char **contp = (
char**)(arr[k]+ioffset);
 
  519                      for(
int j=0;j<compinfo[i]->fLength;++j) {
 
  520                         char *cont = contp[j];
 
  521                         TVirtualCollectionProxy::TPushPop helper( proxy, cont );
 
  522                         Int_t nobjects = cont ? proxy->Size() : 0;
 
  524                         subinfo->WriteBufferSTL(b,proxy,nobjects);
 
  527                   b.SetByteCount(pos,kTRUE);
 
  530                UInt_t pos = b.WriteVersion(this->IsA(),kTRUE);
 
  531                if (pstreamer == 0) {
 
  533                      char **contp = (
char**)(arr[k]+ioffset);
 
  534                      for(
int j=0;j<compinfo[i]->fLength;++j) {
 
  535                         char *cont = contp[j];
 
  536                         cl->Streamer( cont, b );
 
  540                   DOLOOP{(*pstreamer)(b,arr[k]+ioffset,compinfo[i]->fLength);}
 
  542                b.SetByteCount(pos,kTRUE);
 
  546          case TStreamerInfo::kSTL:             
 
  547          case TStreamerInfo::kSTL + TStreamerInfo::kOffsetL:  
 
  549                TClass *cl                 = compinfo[i]->fClass;
 
  550                TMemberStreamer *pstreamer = compinfo[i]->fStreamer;
 
  551                TVirtualCollectionProxy *proxy = cl->GetCollectionProxy();
 
  552                TClass* vClass = proxy ? proxy->GetValueClass() : 0;
 
  553                if (!b.TestBit(TBuffer::kCannotHandleMemberWiseStreaming)
 
  555                    && GetStreamMemberWise() && cl->CanSplit()
 
  556                    && !(strspn(aElement->GetTitle(),
"||") == 2)
 
  557                    && !(vClass->TestBit(TClass::kHasCustomStreamerMember)) ) {
 
  560                   UInt_t pos = b.WriteVersionMemberWise(this->IsA(),kTRUE);
 
  561                   b.WriteVersion( vClass, kFALSE );
 
  562                   TStreamerInfo *subinfo = (TStreamerInfo*)vClass->GetStreamerInfo();
 
  564                      char *obj = (
char*)(arr[k]+ioffset);
 
  565                      Int_t n = compinfo[i]->fLength;
 
  567                      int size = cl->Size();
 
  569                      for(Int_t j=0; j<n; j++,obj+=size) {
 
  570                         TVirtualCollectionProxy::TPushPop helper( proxy, obj );
 
  571                         Int_t nobjects = proxy->Size();
 
  573                         subinfo->WriteBufferSTL(b,proxy,nobjects);
 
  576                   b.SetByteCount(pos,kTRUE);
 
  579                UInt_t pos = b.WriteVersion(this->IsA(),kTRUE);
 
  580                if (pstreamer == 0) {
 
  582                      b.WriteFastArray((
void*)(arr[k]+ioffset),cl,compinfo[i]->fLength,0);
 
  585                   DOLOOP{(*pstreamer)(b,arr[k]+ioffset,compinfo[i]->fLength);}
 
  587                b.SetByteCount(pos,kTRUE);
 
  592          case TStreamerInfo::kObject:   
 
  593          case TStreamerInfo::kAny:   
 
  594          case TStreamerInfo::kOffsetL + TStreamerInfo::kObject:
 
  595          case TStreamerInfo::kAny     + TStreamerInfo::kOffsetL: {
 
  596             TClass *cl                 = compinfo[i]->fClass;
 
  597             TMemberStreamer *pstreamer = compinfo[i]->fStreamer;
 
  599                {b.WriteFastArray((
void*)(arr[k]+ioffset),cl,compinfo[i]->fLength,pstreamer);}
 
  603          case TStreamerInfo::kOffsetL + TStreamerInfo::kTString:
 
  604          case TStreamerInfo::kOffsetL + TStreamerInfo::kTObject:
 
  605          case TStreamerInfo::kOffsetL + TStreamerInfo::kTNamed:
 
  607             TMemberStreamer *pstreamer = compinfo[i]->fStreamer;
 
  608             TClass *cl                 = compinfo[i]->fClass;
 
  610             UInt_t pos = b.WriteVersion(this->IsA(),kTRUE);
 
  611             DOLOOP {b.WriteFastArray((
void*)(arr[k]+ioffset),cl,compinfo[i]->fLength,pstreamer);}
 
  612             b.SetByteCount(pos,kTRUE);
 
  617          case TStreamerInfo::kBase:
 
  618             if (!(arrayMode&1)) {
 
  619                TMemberStreamer *pstreamer = compinfo[i]->fStreamer;
 
  622                   UInt_t pos = b.WriteVersion(this->IsA(),kTRUE);
 
  623                   DOLOOP{(*pstreamer)(b,arr[k]+ioffset,compinfo[i]->fLength);}
 
  624                   b.SetByteCount(pos,kTRUE);
 
  626                   DOLOOP { ((TStreamerBase*)aElement)->WriteBuffer(b,arr[k]);}
 
  629                TClass *cl                 = compinfo[i]->fClass;
 
  630                TStreamerInfo *binfo = ((TStreamerInfo*)cl->GetStreamerInfo());
 
  631                binfo->WriteBufferAux(b,arr,binfo->fCompFull,0,binfo->fNfulldata,narr,ioffset,arrayMode);
 
  635          case TStreamerInfo::kStreamer:
 
  637             TMemberStreamer *pstreamer = compinfo[i]->fStreamer;
 
  639             UInt_t pos = b.WriteVersion(this->IsA(),kTRUE);
 
  640             if (pstreamer == 0) {
 
  641                printf(
"ERROR, Streamer is null\n");
 
  642                aElement->ls();
continue;
 
  644                DOLOOP{(*pstreamer)(b,arr[k]+ioffset,compinfo[i]->fLength);}
 
  646             b.SetByteCount(pos,kTRUE);
 
  650          case TStreamerInfo::kStreamLoop:
 
  655          case TStreamerInfo::kOffsetL + TStreamerInfo::kStreamLoop:
 
  662             TClass* cl = compinfo[i]->fClass;
 
  664             TMemberStreamer* pstreamer = compinfo[i]->fStreamer;
 
  666             Bool_t isPtrPtr = (strstr(aElement->GetTypeName(), 
"**") != 0);
 
  669                UInt_t pos = b.WriteVersion(this->IsA(), kTRUE);
 
  671                for (
int k = 0; k < narr; ++k) {
 
  673                   Int_t* counter = (Int_t*) (arr[k]  + eoffset  + compinfo[i]->fMethod );
 
  675                   (*pstreamer)(b, arr[k]  + ioffset , *counter);
 
  677                b.SetByteCount(pos, kTRUE);
 
  683             TFile* file = (TFile*) b.GetParent();
 
  685             Int_t fileVersion = kMaxInt;
 
  687                fileVersion = file->GetVersion();
 
  690             UInt_t pos = b.WriteVersion(this->IsA(), kTRUE);
 
  691             if (fileVersion > 51508) {
 
  694                for (
int k = 0; k < narr; ++k) {
 
  696                   Int_t vlen = *((Int_t*) (arr[k]  + eoffset  + compinfo[i]->fMethod ));
 
  700                      char** pp = (
char**) (arr[k]  + ioffset );
 
  702                      for (Int_t ndx = 0; ndx < compinfo[i]->fLength; ++ndx) {
 
  705                            Error(
"WriteBufferAux", 
"The pointer to element %s::%s type %d (%s) is null\n", GetName(), aElement->GetFullName(), compinfo[i]->fType, aElement->GetTypeName());
 
  712                            b.WriteFastArray(pp[ndx], cl, vlen, 0);
 
  718                            b.WriteFastArray((
void**) pp[ndx], cl, vlen, kFALSE, 0);
 
  727                for (
int k = 0; k < narr; ++k) {
 
  729                   Int_t vlen = *((Int_t*) (arr[k]  + eoffset  + compinfo[i]->fMethod ));
 
  733                      char** pp = (
char**) (arr[k]  + ioffset );
 
  736                      for (Int_t ndx = 0; ndx < compinfo[i]->fLength; ++ndx) {
 
  739                            Error(
"WriteBufferAux", 
"The pointer to element %s::%s type %d (%s) is null\n", GetName(), aElement->GetFullName(), compinfo[i]->fType, aElement->GetTypeName());
 
  745                            for (Int_t v = 0; v < vlen; ++v) {
 
  747                               cl->Streamer(pp[ndx] + (v * cl->Size()), b);
 
  753                            for (Int_t v = 0; v < vlen; ++v) {
 
  755                               char** r = (
char**) pp[ndx];
 
  757                               cl->Streamer(r[v], b);
 
  765             b.SetByteCount(pos, kTRUE);
 
  769          case TStreamerInfo::kCacheNew:
 
  770             ((TBufferFile&)b).PushDataCache( 
new TVirtualArray( aElement->GetClassPointer(), narr ) );
 
  772          case TStreamerInfo::kCacheDelete:
 
  773             delete ((TBufferFile&)b).PopDataCache();
 
  775          case TStreamerInfo::kArtificial:
 
  777             ROOT::TSchemaRule::WriteFuncPtr_t writefunc = ((TStreamerArtificial*)aElement)->GetWriteFunc();
 
  779                DOLOOP( writefunc(arr[k]+eoffset, b) );
 
  787             Error(
"WriteBuffer",
"The element %s::%s type %d (%s) is not supported yet\n",GetName(),aElement->GetFullName(),compinfo[i]->fType,aElement->GetTypeName());
 
  792    if (needIncrement) b.DecrementLevel(
this);
 
  797 template Int_t TStreamerInfo::WriteBufferAux<char**>(TBuffer &b, 
char ** 
const &arr, TCompInfo *
const*
const compinfo, Int_t first, Int_t last, Int_t narr,Int_t eoffset,Int_t mode);
 
  802 Int_t TStreamerInfo::WriteBufferSTL(TBuffer &b, TVirtualCollectionProxy *cont, Int_t nc)
 
  805    R__ASSERT((
unsigned int)nc==cont->Size());
 
  808    int ret = WriteBufferAux(b,*cont,fCompFull,0,fNfulldata,nc, 0,1);
 
  816 Int_t TStreamerInfo::WriteBufferSTLPtrs(TBuffer &b, TVirtualCollectionProxy *cont, Int_t nc, Int_t first, Int_t eoffset )
 
  819    R__ASSERT((
unsigned int)nc==cont->Size());
 
  820    int ret = WriteBufferAux(b, TPointerCollectionAdapter(cont),fCompFull,first==-1?0:first,first==-1?fNfulldata:first+1,nc,eoffset,1);
 
  829 Int_t TStreamerInfo::WriteBuffer(TBuffer &b, 
char *ipointer, Int_t first)
 
  831    return WriteBufferAux(b,&ipointer,fCompOpt,first==-1?0:first,first==-1?fNdata:first+1,1,0,0);
 
  838 Int_t TStreamerInfo::WriteBufferClones(TBuffer &b, TClonesArray *clones,
 
  839                                        Int_t nc, Int_t first, Int_t eoffset)
 
  841    char **arr = 
reinterpret_cast<char**
>(clones->GetObjectRef(0));
 
  842    return WriteBufferAux(b,arr,fCompFull,first==-1?0:first,first==-1?fNfulldata:first+1,nc,eoffset,1);