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);