31 static TStreamerElement* &CurrentElement()
36 TTHREAD_TLS(TStreamerElement*) fgElement(0);
45 TStreamerElement *TStreamerInfo::GetCurrentElement()
47 return CurrentElement();
52 #define DOLOOP for(Int_t k=0; k<narr; ++k)
54 #define ReadBasicTypeElem(name,index) \
56 name *x=(name*)(arr[index]+ioffset); \
60 #define ReadBasicType(name) \
62 ReadBasicTypeElem(name,0); \
65 #define ReadBasicTypeLoop(name) \
67 for(Int_t k=0; k<narr; ++k) ReadBasicTypeElem(name,k); \
70 #define ReadBasicArrayElem(name,index) \
72 name *x=(name*)(arr[index]+ioffset); \
73 b.ReadFastArray(x,compinfo[i]->fLength); \
76 #define ReadBasicArray(name) \
78 ReadBasicArrayElem(name,0); \
81 #define ReadBasicArrayLoop(name) \
83 for(Int_t k=0; k<narr; ++k) ReadBasicArrayElem(name,k) \
86 #define ReadBasicPointerElem(name,index) \
90 Int_t *l = (Int_t*)(arr[index]+imethod); \
91 if (*l < 0 || *l > b.BufferSize()) continue; \
92 name **f = (name**)(arr[index]+ioffset); \
94 if (isArray) for(j=0;j<compinfo[i]->fLength;j++) { \
96 f[j] = 0; if (*l <=0) continue; \
97 f[j] = new name[*l]; \
98 b.ReadFastArray(f[j],*l); \
100 else for(j=0;j<compinfo[i]->fLength;j++) { \
106 #define ReadBasicPointer(name) \
108 const int imethod = compinfo[i]->fMethod+eoffset; \
109 ReadBasicPointerElem(name,0); \
112 #define ReadBasicPointerLoop(name) \
114 int imethod = compinfo[i]->fMethod+eoffset; \
115 for(int k=0; k<narr; ++k) { \
116 ReadBasicPointerElem(name,k); \
120 #define SkipCBasicType(name) \
123 DOLOOP{ b >> dummy; } \
127 #define SkipCFloat16(name) \
130 DOLOOP { b.ReadFloat16(&dummy,aElement); } \
134 #define SkipCDouble32(name) \
137 DOLOOP { b.ReadDouble32(&dummy,aElement); }\
141 #define SkipCBasicArray(name,ReadArrayFunc) \
143 name* readbuf = new name[compinfo->fLength]; \
145 b.ReadArrayFunc(readbuf, compinfo->fLength); \
151 #define SkipCBasicPointer(name,ReadArrayFunc) \
153 Int_t addCounter = -111; \
154 if ((imethod>0) && (compinfo->fMethod>0)) addCounter = -1; \
155 if((addCounter<-1) && (aElement!=0) && (aElement->IsA()==TStreamerBasicPointer::Class())) { \
156 TStreamerElement* elemCounter = (TStreamerElement*) thisVar->GetElements()->FindObject(((TStreamerBasicPointer*)aElement)->GetCountName()); \
157 if (elemCounter) addCounter = elemCounter->GetTObjectOffset(); \
159 if (addCounter>=-1) { \
160 int len = aElement->GetArrayDim()?aElement->GetArrayLength():1; \
164 char *arr_k = arr[k]; \
165 Int_t *l = (addCounter==-1 && arr_k) ? (Int_t*)(arr_k+imethod) : &addCounter; \
167 name* readbuf = new name[*l]; \
168 for (int j=0;j<len;j++) \
169 b.ReadArrayFunc(readbuf, *l); \
181 Int_t TStreamerInfo::ReadBufferSkip(TBuffer &b,
const T &arr,
const TCompInfo *compinfo, Int_t kase,
182 TStreamerElement *aElement, Int_t narr,
185 TStreamerInfo* thisVar =
this;
189 TClass* cle = compinfo->fClass;
191 Int_t imethod = compinfo->fMethod+eoffset;
196 case TStreamerInfo::kSkip + TStreamerInfo::kBool: SkipCBasicType(Bool_t);
197 case TStreamerInfo::kSkip + TStreamerInfo::kChar: SkipCBasicType(Char_t);
198 case TStreamerInfo::kSkip + TStreamerInfo::kShort: SkipCBasicType(Short_t);
199 case TStreamerInfo::kSkip + TStreamerInfo::kInt: SkipCBasicType(Int_t);
200 case TStreamerInfo::kSkip + TStreamerInfo::kLong: SkipCBasicType(Long_t);
201 case TStreamerInfo::kSkip + TStreamerInfo::kLong64: SkipCBasicType(Long64_t);
202 case TStreamerInfo::kSkip + TStreamerInfo::kFloat: SkipCBasicType(Float_t);
203 case TStreamerInfo::kSkip + TStreamerInfo::kFloat16: SkipCFloat16(Float_t);
204 case TStreamerInfo::kSkip + TStreamerInfo::kDouble: SkipCBasicType(Double_t);
205 case TStreamerInfo::kSkip + TStreamerInfo::kDouble32: SkipCDouble32(Double32_t)
206 case TStreamerInfo::kSkip + TStreamerInfo::kUChar: SkipCBasicType(UChar_t);
207 case TStreamerInfo::kSkip + TStreamerInfo::kUShort: SkipCBasicType(UShort_t);
208 case TStreamerInfo::kSkip + TStreamerInfo::kUInt: SkipCBasicType(UInt_t);
209 case TStreamerInfo::kSkip + TStreamerInfo::kULong: SkipCBasicType(ULong_t);
210 case TStreamerInfo::kSkip + TStreamerInfo::kULong64: SkipCBasicType(ULong64_t);
211 case TStreamerInfo::kSkip + TStreamerInfo::kBits: {
215 if ((dummy & kIsReferenced) != 0) {
224 case TStreamerInfo::kSkipL + TStreamerInfo::kBool: SkipCBasicArray(Bool_t,ReadFastArray);
225 case TStreamerInfo::kSkipL + TStreamerInfo::kChar: SkipCBasicArray(Char_t,ReadFastArray);
226 case TStreamerInfo::kSkipL + TStreamerInfo::kShort: SkipCBasicArray(Short_t,ReadFastArray);
227 case TStreamerInfo::kSkipL + TStreamerInfo::kInt: SkipCBasicArray(Int_t,ReadFastArray);
228 case TStreamerInfo::kSkipL + TStreamerInfo::kLong: SkipCBasicArray(Long_t,ReadFastArray);
229 case TStreamerInfo::kSkipL + TStreamerInfo::kLong64: SkipCBasicArray(Long64_t,ReadFastArray);
230 case TStreamerInfo::kSkipL + TStreamerInfo::kFloat16: SkipCBasicArray(Float_t,ReadFastArrayFloat16);
231 case TStreamerInfo::kSkipL + TStreamerInfo::kFloat: SkipCBasicArray(Float_t,ReadFastArray);
232 case TStreamerInfo::kSkipL + TStreamerInfo::kDouble32: SkipCBasicArray(Double_t,ReadFastArrayDouble32)
233 case TStreamerInfo::kSkipL + TStreamerInfo::kDouble: SkipCBasicArray(Double_t,ReadFastArray);
234 case TStreamerInfo::kSkipL + TStreamerInfo::kUChar: SkipCBasicArray(UChar_t,ReadFastArray);
235 case TStreamerInfo::kSkipL + TStreamerInfo::kUShort: SkipCBasicArray(UShort_t,ReadFastArray);
236 case TStreamerInfo::kSkipL + TStreamerInfo::kUInt: SkipCBasicArray(UInt_t,ReadFastArray);
237 case TStreamerInfo::kSkipL + TStreamerInfo::kULong: SkipCBasicArray(ULong_t,ReadFastArray);
238 case TStreamerInfo::kSkipL + TStreamerInfo::kULong64: SkipCBasicArray(ULong64_t,ReadFastArray);
241 case TStreamerInfo::kSkipP + TStreamerInfo::kBool: SkipCBasicPointer(Bool_t,ReadFastArray);
242 case TStreamerInfo::kSkipP + TStreamerInfo::kChar: SkipCBasicPointer(Char_t,ReadFastArray);
243 case TStreamerInfo::kSkipP + TStreamerInfo::kShort: SkipCBasicPointer(Short_t,ReadFastArray);
244 case TStreamerInfo::kSkipP + TStreamerInfo::kInt: SkipCBasicPointer(Int_t,ReadFastArray);
245 case TStreamerInfo::kSkipP + TStreamerInfo::kLong: SkipCBasicPointer(Long_t,ReadFastArray);
246 case TStreamerInfo::kSkipP + TStreamerInfo::kLong64: SkipCBasicPointer(Long64_t,ReadFastArray);
247 case TStreamerInfo::kSkipP + TStreamerInfo::kFloat: SkipCBasicPointer(Float_t,ReadFastArray);
248 case TStreamerInfo::kSkipP + TStreamerInfo::kFloat16: SkipCBasicPointer(Float_t,ReadFastArrayFloat16);
249 case TStreamerInfo::kSkipP + TStreamerInfo::kDouble: SkipCBasicPointer(Double_t,ReadFastArray);
250 case TStreamerInfo::kSkipP + TStreamerInfo::kDouble32: SkipCBasicPointer(Double_t,ReadFastArrayDouble32)
251 case TStreamerInfo::kSkipP + TStreamerInfo::kUChar: SkipCBasicPointer(UChar_t,ReadFastArray);
252 case TStreamerInfo::kSkipP + TStreamerInfo::kUShort: SkipCBasicPointer(UShort_t,ReadFastArray);
253 case TStreamerInfo::kSkipP + TStreamerInfo::kUInt: SkipCBasicPointer(UInt_t,ReadFastArray);
254 case TStreamerInfo::kSkipP + TStreamerInfo::kULong: SkipCBasicPointer(ULong_t,ReadFastArray);
255 case TStreamerInfo::kSkipP + TStreamerInfo::kULong64: SkipCBasicPointer(ULong64_t,ReadFastArray);
258 case TStreamerInfo::kSkip + TStreamerInfo::kCharStar: {
262 char* readbuf =
new char[nch];
263 b.ReadFastArray(readbuf,nch);
271 case TStreamerInfo::kSkip + TStreamerInfo::kObjectP: {
273 for (Int_t j=0;j<compinfo->fLength;j++) {
281 case TStreamerInfo::kSkip + TStreamerInfo::kCounter: {
283 Int_t dummy; b >> dummy;
284 aElement->SetTObjectOffset(dummy);
291 case TStreamerInfo::kSkip + TStreamerInfo::kObjectp:
292 case TStreamerInfo::kSkip + TStreamerInfo::kObject: {
293 if (cle == TRef::Class()) {
295 DOLOOP{ refjunk.Streamer(b);}
305 case TStreamerInfo::kSkip + TStreamerInfo::kTString: {
312 case TStreamerInfo::kSkip + TStreamerInfo::kTObject: {
319 case TStreamerInfo::kSkip + TStreamerInfo::kTNamed: {
328 case TStreamerInfo::kSkip + TStreamerInfo::kAnyp: {
336 case TStreamerInfo::kSkip + TStreamerInfo::kAnyP: {
338 for (Int_t j=0;j<compinfo->fLength;j++) {
346 case TStreamerInfo::kSkip + TStreamerInfo::kAny: {
354 case TStreamerInfo::kSkip + TStreamerInfo::kSTLp:
355 case TStreamerInfo::kSkip + TStreamerInfo::kSTLp + TStreamerInfo::kOffsetL:
356 case TStreamerInfo::kSkip + TStreamerInfo::kSTL: {
357 if (fOldVersion<3)
return 0;
363 case TStreamerInfo::kSkip + TStreamerInfo::kBase: {
370 case TStreamerInfo::kSkip + TStreamerInfo::kStreamLoop:
371 case TStreamerInfo::kSkip + TStreamerInfo::kStreamer: {
384 #define ConvCBasicType(name,stream) \
389 switch(compinfo->fNewType) { \
390 case TStreamerInfo::kBool: {Bool_t *x=(Bool_t*)(arr[k]+ioffset); *x = (Bool_t)u; break;} \
391 case TStreamerInfo::kChar: {Char_t *x=(Char_t*)(arr[k]+ioffset); *x = (Char_t)u; break;} \
392 case TStreamerInfo::kShort: {Short_t *x=(Short_t*)(arr[k]+ioffset); *x = (Short_t)u; break;} \
393 case TStreamerInfo::kInt: {Int_t *x=(Int_t*)(arr[k]+ioffset); *x = (Int_t)u; break;} \
394 case TStreamerInfo::kLong: {Long_t *x=(Long_t*)(arr[k]+ioffset); *x = (Long_t)u; break;} \
395 case TStreamerInfo::kLong64: {Long64_t *x=(Long64_t*)(arr[k]+ioffset); *x = (Long64_t)u; break;} \
396 case TStreamerInfo::kFloat: {Float_t *x=(Float_t*)(arr[k]+ioffset); *x = (Float_t)u; break;} \
397 case TStreamerInfo::kFloat16: {Float_t *x=(Float_t*)(arr[k]+ioffset); *x = (Float_t)u; break;} \
398 case TStreamerInfo::kDouble: {Double_t *x=(Double_t*)(arr[k]+ioffset); *x = (Double_t)u; break;} \
399 case TStreamerInfo::kDouble32:{Double_t *x=(Double_t*)(arr[k]+ioffset); *x = (Double_t)u; break;} \
400 case TStreamerInfo::kUChar: {UChar_t *x=(UChar_t*)(arr[k]+ioffset); *x = (UChar_t)u; break;} \
401 case TStreamerInfo::kUShort: {UShort_t *x=(UShort_t*)(arr[k]+ioffset); *x = (UShort_t)u; break;} \
402 case TStreamerInfo::kUInt: {UInt_t *x=(UInt_t*)(arr[k]+ioffset); *x = (UInt_t)u; break;} \
403 case TStreamerInfo::kULong: {ULong_t *x=(ULong_t*)(arr[k]+ioffset); *x = (ULong_t)u; break;} \
404 case TStreamerInfo::kULong64: {ULong64_t*x=(ULong64_t*)(arr[k]+ioffset);*x = (ULong64_t)u;break;} \
409 #define ConvCBasicArrayTo(newtype) \
411 newtype *f=(newtype*)(arr[k]+ioffset); \
412 for (j=0;j<len;j++) f[j] = (newtype)readbuf[j]; \
416 #define ConvCBasicArray(name,ReadArrayFunc) \
418 int j, len = compinfo->fLength; \
419 name* readbuf = new name[len]; \
420 int newtype = compinfo->fNewType%20; \
422 b.ReadArrayFunc(readbuf, len); \
424 case TStreamerInfo::kBool: ConvCBasicArrayTo(Bool_t); \
425 case TStreamerInfo::kChar: ConvCBasicArrayTo(Char_t); \
426 case TStreamerInfo::kShort: ConvCBasicArrayTo(Short_t); \
427 case TStreamerInfo::kInt: ConvCBasicArrayTo(Int_t); \
428 case TStreamerInfo::kLong: ConvCBasicArrayTo(Long_t); \
429 case TStreamerInfo::kLong64: ConvCBasicArrayTo(Long64_t); \
430 case TStreamerInfo::kFloat: ConvCBasicArrayTo(Float_t); \
431 case TStreamerInfo::kFloat16: ConvCBasicArrayTo(Float_t); \
432 case TStreamerInfo::kDouble: ConvCBasicArrayTo(Double_t); \
433 case TStreamerInfo::kDouble32: ConvCBasicArrayTo(Double_t); \
434 case TStreamerInfo::kUChar: ConvCBasicArrayTo(UChar_t); \
435 case TStreamerInfo::kUShort: ConvCBasicArrayTo(UShort_t); \
436 case TStreamerInfo::kUInt: ConvCBasicArrayTo(UInt_t); \
437 case TStreamerInfo::kULong: ConvCBasicArrayTo(ULong_t); \
438 case TStreamerInfo::kULong64: ConvCBasicArrayTo(ULong64_t); \
445 #define ConvCBasicPointerToOutOfRange(newtype,ReadArrayFunc) \
447 newtype **f=(newtype**)(arr[k]+ioffset); \
448 for (j=0;j<len;j++) { \
455 #define ConvCBasicPointerTo(newtype,ReadArrayFunc) \
457 newtype **f=(newtype**)(arr[k]+ioffset); \
458 for (j=0;j<len;j++) { \
460 f[j] = new newtype[*l]; \
461 newtype *af = f[j]; \
462 b.ReadArrayFunc(readbuf, *l); \
463 for (jj=0;jj<*l;jj++) af[jj] = (newtype)readbuf[jj]; \
468 #define ConvCBasicPointer(name,ReadArrayFunc) \
471 int j, jj, len = aElement->GetArrayDim()?aElement->GetArrayLength():1; \
473 int newtype = compinfo->fNewType %20; \
474 Int_t imethod = compinfo->fMethod+eoffset; \
477 Int_t *l = (Int_t*)(arr[k]+imethod); \
478 if (*l>0 && *l < b.BufferSize()) { \
479 readbuf = new name[*l]; \
481 case TStreamerInfo::kBool: ConvCBasicPointerTo(Bool_t,ReadArrayFunc); \
482 case TStreamerInfo::kChar: ConvCBasicPointerTo(Char_t,ReadArrayFunc); \
483 case TStreamerInfo::kShort: ConvCBasicPointerTo(Short_t,ReadArrayFunc); \
484 case TStreamerInfo::kInt: ConvCBasicPointerTo(Int_t,ReadArrayFunc); \
485 case TStreamerInfo::kLong: ConvCBasicPointerTo(Long_t,ReadArrayFunc); \
486 case TStreamerInfo::kLong64: ConvCBasicPointerTo(Long64_t,ReadArrayFunc); \
487 case TStreamerInfo::kFloat: ConvCBasicPointerTo(Float_t,ReadArrayFunc); \
488 case TStreamerInfo::kFloat16: ConvCBasicPointerTo(Float_t,ReadArrayFunc); \
489 case TStreamerInfo::kDouble: ConvCBasicPointerTo(Double_t,ReadArrayFunc); \
490 case TStreamerInfo::kDouble32: ConvCBasicPointerTo(Double_t,ReadArrayFunc); \
491 case TStreamerInfo::kUChar: ConvCBasicPointerTo(UChar_t,ReadArrayFunc); \
492 case TStreamerInfo::kUShort: ConvCBasicPointerTo(UShort_t,ReadArrayFunc); \
493 case TStreamerInfo::kUInt: ConvCBasicPointerTo(UInt_t,ReadArrayFunc); \
494 case TStreamerInfo::kULong: ConvCBasicPointerTo(ULong_t,ReadArrayFunc); \
495 case TStreamerInfo::kULong64: ConvCBasicPointerTo(ULong64_t,ReadArrayFunc); \
500 case TStreamerInfo::kBool: ConvCBasicPointerToOutOfRange(Bool_t,ReadArrayFunc); \
501 case TStreamerInfo::kChar: ConvCBasicPointerToOutOfRange(Char_t,ReadArrayFunc); \
502 case TStreamerInfo::kShort: ConvCBasicPointerToOutOfRange(Short_t,ReadArrayFunc); \
503 case TStreamerInfo::kInt: ConvCBasicPointerToOutOfRange(Int_t,ReadArrayFunc); \
504 case TStreamerInfo::kLong: ConvCBasicPointerToOutOfRange(Long_t,ReadArrayFunc); \
505 case TStreamerInfo::kLong64: ConvCBasicPointerToOutOfRange(Long64_t,ReadArrayFunc); \
506 case TStreamerInfo::kFloat: ConvCBasicPointerToOutOfRange(Float_t,ReadArrayFunc); \
507 case TStreamerInfo::kFloat16: ConvCBasicPointerToOutOfRange(Float_t,ReadArrayFunc); \
508 case TStreamerInfo::kDouble: ConvCBasicPointerToOutOfRange(Double_t,ReadArrayFunc); \
509 case TStreamerInfo::kDouble32: ConvCBasicPointerToOutOfRange(Double_t,ReadArrayFunc); \
510 case TStreamerInfo::kUChar: ConvCBasicPointerToOutOfRange(UChar_t,ReadArrayFunc); \
511 case TStreamerInfo::kUShort: ConvCBasicPointerToOutOfRange(UShort_t,ReadArrayFunc); \
512 case TStreamerInfo::kUInt: ConvCBasicPointerToOutOfRange(UInt_t,ReadArrayFunc); \
513 case TStreamerInfo::kULong: ConvCBasicPointerToOutOfRange(ULong_t,ReadArrayFunc); \
514 case TStreamerInfo::kULong64: ConvCBasicPointerToOutOfRange(ULong64_t,ReadArrayFunc); \
525 Int_t TStreamerInfo::ReadBufferArtificial(TBuffer &b,
const T &arr,
526 TStreamerElement *aElement, Int_t narr,
529 TStreamerArtificial *artElement = (TStreamerArtificial*)aElement;
530 ROOT::TSchemaRule::ReadRawFuncPtr_t rawfunc = artElement->GetReadRawFunc();
533 for(Int_t k=0; k<narr; ++k) {
534 rawfunc( arr[k], b );
539 ROOT::TSchemaRule::ReadFuncPtr_t readfunc = artElement->GetReadFunc();
542 TVirtualObject obj(0);
543 TVirtualArray *objarr = ((TBufferFile&)b).PeekDataCache();
545 obj.fClass = objarr->fClass;
547 for(Int_t k=0; k<narr; ++k) {
548 obj.fObject = objarr->GetObjectAt(k);
549 readfunc(arr[k]+eoffset, &obj);
553 for(Int_t k=0; k<narr; ++k) {
554 readfunc(arr[k]+eoffset, &obj);
567 Int_t TStreamerInfo::ReadBufferConv(TBuffer &b,
const T &arr,
const TCompInfo *compinfo, Int_t kase,
568 TStreamerElement *aElement, Int_t narr,
571 Int_t ioffset = eoffset+compinfo->fOffset;
576 case TStreamerInfo::kConv + TStreamerInfo::kBool: ConvCBasicType(Bool_t,b >> u);
577 case TStreamerInfo::kConv + TStreamerInfo::kChar: ConvCBasicType(Char_t,b >> u);
578 case TStreamerInfo::kConv + TStreamerInfo::kShort: ConvCBasicType(Short_t,b >> u);
579 case TStreamerInfo::kConv + TStreamerInfo::kInt: ConvCBasicType(Int_t,b >> u);
580 case TStreamerInfo::kConv + TStreamerInfo::kLong:
if (compinfo->fNewType==TStreamerInfo::kLong64 || compinfo->fNewType==TStreamerInfo::kULong64) {
581 ConvCBasicType(Long64_t,b >> u);
583 ConvCBasicType(Long_t,b >> u);
585 case TStreamerInfo::kConv + TStreamerInfo::kLong64: ConvCBasicType(Long64_t,b >> u);
586 case TStreamerInfo::kConv + TStreamerInfo::kFloat: ConvCBasicType(Float_t,b >> u);
587 case TStreamerInfo::kConv + TStreamerInfo::kFloat16: ConvCBasicType(Float_t,b.ReadFloat16(&u,aElement));
588 case TStreamerInfo::kConv + TStreamerInfo::kDouble: ConvCBasicType(Double_t,b >> u);
589 case TStreamerInfo::kConv + TStreamerInfo::kDouble32:ConvCBasicType(Double_t,b.ReadDouble32(&u,aElement));
590 case TStreamerInfo::kConv + TStreamerInfo::kUChar: ConvCBasicType(UChar_t,b >> u);
591 case TStreamerInfo::kConv + TStreamerInfo::kUShort: ConvCBasicType(UShort_t,b >> u);
592 case TStreamerInfo::kConv + TStreamerInfo::kUInt: ConvCBasicType(UInt_t,b >> u);
593 case TStreamerInfo::kConv + TStreamerInfo::kULong:
if (compinfo->fNewType==TStreamerInfo::kLong64 || compinfo->fNewType==TStreamerInfo::kULong64) {
594 #if defined(_MSC_VER) && (_MSC_VER <= 1200)
595 ConvCBasicType(Long64_t,b >> u);
597 ConvCBasicType(ULong64_t,b >> u);
600 ConvCBasicType(ULong_t,b >> u);
602 #if defined(_MSC_VER) && (_MSC_VER <= 1200)
603 case TStreamerInfo::kConv + TStreamerInfo::kULong64: ConvCBasicType(Long64_t,b >> u)
605 case TStreamerInfo::kConv + TStreamerInfo::kULong64: ConvCBasicType(ULong64_t,b >> u)
607 case TStreamerInfo::kConv + TStreamerInfo::kBits: {
611 if ((u & kIsReferenced) != 0) {
614 pidf += b.GetPidOffset();
615 TProcessID *pid = b.ReadProcessID(pidf);
617 TObject *obj = (TObject*)(arr[k]+eoffset);
618 UInt_t gpid = pid->GetUniqueID();
621 uid = obj->GetUniqueID() | 0xff000000;
623 uid = ( obj->GetUniqueID() & 0xffffff) + (gpid<<24);
625 obj->SetUniqueID(uid);
626 pid->PutObjectWithID(obj);
629 switch(compinfo->fNewType) {
630 case TStreamerInfo::kBool: {Bool_t *x=(Bool_t*)(arr[k]+ioffset); *x = (Bool_t)u;
break;}
631 case TStreamerInfo::kChar: {Char_t *x=(Char_t*)(arr[k]+ioffset); *x = (Char_t)u;
break;}
632 case TStreamerInfo::kShort: {Short_t *x=(Short_t*)(arr[k]+ioffset); *x = (Short_t)u;
break;}
633 case TStreamerInfo::kInt: {Int_t *x=(Int_t*)(arr[k]+ioffset); *x = (Int_t)u;
break;}
634 case TStreamerInfo::kLong: {Long_t *x=(Long_t*)(arr[k]+ioffset); *x = (Long_t)u;
break;}
635 case TStreamerInfo::kLong64: {Long64_t *x=(Long64_t*)(arr[k]+ioffset); *x = (Long64_t)u;
break;}
636 case TStreamerInfo::kFloat: {Float_t *x=(Float_t*)(arr[k]+ioffset); *x = (Float_t)u;
break;}
637 case TStreamerInfo::kFloat16: {Float_t *x=(Float_t*)(arr[k]+ioffset); *x = (Float_t)u;
break;}
638 case TStreamerInfo::kDouble: {Double_t *x=(Double_t*)(arr[k]+ioffset); *x = (Double_t)u;
break;}
639 case TStreamerInfo::kDouble32:{Double_t *x=(Double_t*)(arr[k]+ioffset); *x = (Double_t)u;
break;}
640 case TStreamerInfo::kUChar: {UChar_t *x=(UChar_t*)(arr[k]+ioffset); *x = (UChar_t)u;
break;}
641 case TStreamerInfo::kUShort: {UShort_t *x=(UShort_t*)(arr[k]+ioffset); *x = (UShort_t)u;
break;}
642 case TStreamerInfo::kUInt: {UInt_t *x=(UInt_t*)(arr[k]+ioffset); *x = (UInt_t)u;
break;}
643 case TStreamerInfo::kULong: {ULong_t *x=(ULong_t*)(arr[k]+ioffset); *x = (ULong_t)u;
break;}
644 case TStreamerInfo::kULong64: {ULong64_t*x=(ULong64_t*)(arr[k]+ioffset);*x = (ULong64_t)u;
break;}
650 case TStreamerInfo::kConvL + TStreamerInfo::kBool: ConvCBasicArray(Bool_t,ReadFastArray);
651 case TStreamerInfo::kConvL + TStreamerInfo::kChar: ConvCBasicArray(Char_t,ReadFastArray);
652 case TStreamerInfo::kConvL + TStreamerInfo::kShort: ConvCBasicArray(Short_t,ReadFastArray);
653 case TStreamerInfo::kConvL + TStreamerInfo::kInt: ConvCBasicArray(Int_t,ReadFastArray);
654 case TStreamerInfo::kConvL + TStreamerInfo::kLong:
655 if (compinfo->fNewType==TStreamerInfo::kLong64 || compinfo->fNewType==TStreamerInfo::kULong64) {
656 ConvCBasicArray(Long64_t,ReadFastArray);
658 ConvCBasicArray(Long_t,ReadFastArray);
660 case TStreamerInfo::kConvL + TStreamerInfo::kLong64: ConvCBasicArray(Long64_t,ReadFastArray);
661 case TStreamerInfo::kConvL + TStreamerInfo::kFloat: ConvCBasicArray(Float_t,ReadFastArray);
662 case TStreamerInfo::kConvL + TStreamerInfo::kFloat16: ConvCBasicArray(Float_t,ReadFastArrayFloat16);
663 case TStreamerInfo::kConvL + TStreamerInfo::kDouble: ConvCBasicArray(Double_t,ReadFastArray);
664 case TStreamerInfo::kConvL + TStreamerInfo::kDouble32:ConvCBasicArray(Double_t,ReadFastArrayDouble32);
665 case TStreamerInfo::kConvL + TStreamerInfo::kUChar: ConvCBasicArray(UChar_t,ReadFastArray);
666 case TStreamerInfo::kConvL + TStreamerInfo::kUShort: ConvCBasicArray(UShort_t,ReadFastArray);
667 case TStreamerInfo::kConvL + TStreamerInfo::kUInt: ConvCBasicArray(UInt_t,ReadFastArray);
668 case TStreamerInfo::kConvL + TStreamerInfo::kULong:
669 if (compinfo->fNewType==TStreamerInfo::kLong64 || compinfo->fNewType==TStreamerInfo::kULong64) {
670 #if defined(_MSC_VER) && (_MSC_VER <= 1200)
671 ConvCBasicArray(Long64_t,ReadFastArray)
673 ConvCBasicArray(ULong64_t,ReadFastArray)
676 ConvCBasicArray(ULong_t,ReadFastArray);
678 #if defined(_MSC_VER) && (_MSC_VER <= 1200)
679 case TStreamerInfo::kConvL + TStreamerInfo::kULong64: ConvCBasicArray(Long64_t,ReadFastArray)
681 case TStreamerInfo::kConvL + TStreamerInfo::kULong64: ConvCBasicArray(ULong64_t,ReadFastArray)
685 case TStreamerInfo::kConvP + TStreamerInfo::kBool: ConvCBasicPointer(Bool_t,ReadFastArray);
686 case TStreamerInfo::kConvP + TStreamerInfo::kChar: ConvCBasicPointer(Char_t,ReadFastArray);
687 case TStreamerInfo::kConvP + TStreamerInfo::kShort: ConvCBasicPointer(Short_t,ReadFastArray);
688 case TStreamerInfo::kConvP + TStreamerInfo::kInt: ConvCBasicPointer(Int_t,ReadFastArray);
689 case TStreamerInfo::kConvP + TStreamerInfo::kLong:
690 if (compinfo->fNewType==TStreamerInfo::kLong64 || compinfo->fNewType==TStreamerInfo::kULong64) {
691 ConvCBasicPointer(Long64_t,ReadFastArray);
693 ConvCBasicPointer(Long_t,ReadFastArray);
695 case TStreamerInfo::kConvP + TStreamerInfo::kLong64: ConvCBasicPointer(Long64_t,ReadFastArray);
696 case TStreamerInfo::kConvP + TStreamerInfo::kFloat: ConvCBasicPointer(Float_t,ReadFastArray);
697 case TStreamerInfo::kConvP + TStreamerInfo::kFloat16: ConvCBasicPointer(Float_t,ReadFastArrayFloat16);
698 case TStreamerInfo::kConvP + TStreamerInfo::kDouble: ConvCBasicPointer(Double_t,ReadFastArray);
699 case TStreamerInfo::kConvP + TStreamerInfo::kDouble32:ConvCBasicPointer(Double_t,ReadFastArrayDouble32);
700 case TStreamerInfo::kConvP + TStreamerInfo::kUChar: ConvCBasicPointer(UChar_t,ReadFastArray);
701 case TStreamerInfo::kConvP + TStreamerInfo::kUShort: ConvCBasicPointer(UShort_t,ReadFastArray);
702 case TStreamerInfo::kConvP + TStreamerInfo::kUInt: ConvCBasicPointer(UInt_t,ReadFastArray);
703 case TStreamerInfo::kConvP + TStreamerInfo::kULong:
704 if (compinfo->fNewType==TStreamerInfo::kLong64 || compinfo->fNewType==TStreamerInfo::kULong64) {
705 #if defined(_MSC_VER) && (_MSC_VER <= 1200)
706 ConvCBasicPointer(Long64_t,ReadFastArray)
708 ConvCBasicPointer(ULong64_t,ReadFastArray)
711 ConvCBasicPointer(ULong_t,ReadFastArray);
713 #if defined(_MSC_VER) && (_MSC_VER <= 1200)
714 case TStreamerInfo::kConvP + TStreamerInfo::kULong64: ConvCBasicPointer(Long64_t,ReadFastArray)
716 case TStreamerInfo::kConvP + TStreamerInfo::kULong64: ConvCBasicPointer(ULong64_t,ReadFastArray)
730 template <
class T> Bool_t R__TestUseCache(TStreamerElement *element)
732 return element->TestBit(TStreamerElement::kCache);
735 template <> Bool_t R__TestUseCache<TVirtualArray>(TStreamerElement*)
751 Int_t TStreamerInfo::ReadBuffer(TBuffer &b,
const T &arr,
752 TCompInfo *
const*
const compinfo, Int_t first, Int_t last,
753 Int_t narr, Int_t eoffset, Int_t arrayMode)
755 TStreamerInfo *thisVar =
this;
756 Bool_t needIncrement = !( arrayMode & 2 );
757 arrayMode = arrayMode & (~2);
759 if (needIncrement) b.IncrementLevel(thisVar);
766 static const int kHaveLoop = 1024;
767 const Int_t typeOffset = arrayMode ? kHaveLoop : 0;
771 TMemberStreamer *pstreamer=0;
772 Int_t isPreAlloc = 0;
773 for (Int_t i=first;i<last;i++) {
774 TStreamerElement * aElement = (TStreamerElement*)compinfo[i]->fElem;
775 CurrentElement() = aElement;
777 if (needIncrement) b.SetStreamerElementNumber(aElement,compinfo[i]->fType);
779 if (aElement->TestBit(TStreamerElement::kWrite))
continue;
781 if (R__TestUseCache<T>(aElement)) {
782 Int_t bufpos = b.Length();
783 if (((TBufferFile&)b).PeekDataCache()==0) {
784 Warning(
"ReadBuffer",
"Skipping %s::%s because the cache is missing.",thisVar->GetName(),aElement->GetName());
785 thisVar->ReadBufferSkip(b,arr,compinfo[i],compinfo[i]->fType+TStreamerInfo::kSkip,aElement,narr,eoffset);
788 printf(
"ReadBuffer, class:%s, name=%s, fType[%d]=%d,"
789 " %s, bufpos=%d, arr=%p, eoffset=%d, Redirect=%p\n",
790 fClass->GetName(),aElement->GetName(),i,compinfo[i]->fType,
791 aElement->ClassName(),b.Length(),arr[0], eoffset,((TBufferFile&)b).PeekDataCache()->GetObjectAt(0));
793 thisVar->ReadBuffer(b,*((TBufferFile&)b).PeekDataCache(),compinfo,i,i+1,narr,eoffset, arrayMode);
795 if (aElement->TestBit(TStreamerElement::kRepeat)) { b.SetBufferOffset(bufpos); }
798 const Int_t ioffset = compinfo[i]->fOffset+eoffset;
801 printf(
"ReadBuffer, class:%s, name=%s, fType[%d]=%d,"
802 " %s, bufpos=%d, arr=%p, offset=%d\n",
803 fClass->GetName(),aElement->GetName(),i,compinfo[i]->fType,
804 aElement->ClassName(),b.Length(),arr[0], ioffset);
807 Int_t kase = compinfo[i]->fType;
809 switch (kase + typeOffset) {
812 case TStreamerInfo::kBool: ReadBasicType(Bool_t);
continue;
813 case TStreamerInfo::kChar: ReadBasicType(Char_t);
continue;
814 case TStreamerInfo::kShort: ReadBasicType(Short_t);
continue;
815 case TStreamerInfo::kInt: ReadBasicType(Int_t);
continue;
816 case TStreamerInfo::kLong: ReadBasicType(Long_t);
continue;
817 case TStreamerInfo::kLong64: ReadBasicType(Long64_t);
continue;
818 case TStreamerInfo::kFloat: ReadBasicType(Float_t);
continue;
819 case TStreamerInfo::kDouble: ReadBasicType(Double_t);
continue;
820 case TStreamerInfo::kUChar: ReadBasicType(UChar_t);
continue;
821 case TStreamerInfo::kUShort: ReadBasicType(UShort_t);
continue;
822 case TStreamerInfo::kUInt: ReadBasicType(UInt_t);
continue;
823 case TStreamerInfo::kULong: ReadBasicType(ULong_t);
continue;
824 case TStreamerInfo::kULong64: ReadBasicType(ULong64_t);
continue;
825 case TStreamerInfo::kFloat16: {
826 Float_t *x=(Float_t*)(arr[0]+ioffset);
827 b.ReadFloat16(x,aElement);
830 case TStreamerInfo::kDouble32: {
831 Double_t *x=(Double_t*)(arr[0]+ioffset);
832 b.ReadDouble32(x,aElement);
836 case TStreamerInfo::kBool + kHaveLoop: ReadBasicTypeLoop(Bool_t);
continue;
837 case TStreamerInfo::kChar + kHaveLoop: ReadBasicTypeLoop(Char_t);
continue;
838 case TStreamerInfo::kShort + kHaveLoop: ReadBasicTypeLoop(Short_t);
continue;
839 case TStreamerInfo::kInt + kHaveLoop: ReadBasicTypeLoop(Int_t);
continue;
840 case TStreamerInfo::kLong + kHaveLoop: ReadBasicTypeLoop(Long_t);
continue;
841 case TStreamerInfo::kLong64 + kHaveLoop: ReadBasicTypeLoop(Long64_t);
continue;
842 case TStreamerInfo::kFloat + kHaveLoop: ReadBasicTypeLoop(Float_t);
continue;
843 case TStreamerInfo::kDouble + kHaveLoop: ReadBasicTypeLoop(Double_t);
continue;
844 case TStreamerInfo::kUChar + kHaveLoop: ReadBasicTypeLoop(UChar_t);
continue;
845 case TStreamerInfo::kUShort + kHaveLoop: ReadBasicTypeLoop(UShort_t);
continue;
846 case TStreamerInfo::kUInt + kHaveLoop: ReadBasicTypeLoop(UInt_t);
continue;
847 case TStreamerInfo::kULong + kHaveLoop: ReadBasicTypeLoop(ULong_t);
continue;
848 case TStreamerInfo::kULong64+ kHaveLoop: ReadBasicTypeLoop(ULong64_t);
continue;
849 case TStreamerInfo::kFloat16 + kHaveLoop: {
850 for(Int_t k=0; k<narr; ++k) {
851 Float_t *x=(Float_t*)(arr[k]+ioffset);
852 b.ReadFloat16(x,aElement);
856 case TStreamerInfo::kDouble32 + kHaveLoop: {
857 for(Int_t k=0; k<narr; ++k) {
858 Double_t *x=(Double_t*)(arr[k]+ioffset);
859 b.ReadDouble32(x,aElement);
865 case TStreamerInfo::kOffsetL + TStreamerInfo::kBool: ReadBasicArray(Bool_t);
continue;
866 case TStreamerInfo::kOffsetL + TStreamerInfo::kChar: ReadBasicArray(Char_t);
continue;
867 case TStreamerInfo::kOffsetL + TStreamerInfo::kShort: ReadBasicArray(Short_t);
continue;
868 case TStreamerInfo::kOffsetL + TStreamerInfo::kInt: ReadBasicArray(Int_t);
continue;
869 case TStreamerInfo::kOffsetL + TStreamerInfo::kLong: ReadBasicArray(Long_t);
continue;
870 case TStreamerInfo::kOffsetL + TStreamerInfo::kLong64: ReadBasicArray(Long64_t);
continue;
871 case TStreamerInfo::kOffsetL + TStreamerInfo::kFloat: ReadBasicArray(Float_t);
continue;
872 case TStreamerInfo::kOffsetL + TStreamerInfo::kDouble: ReadBasicArray(Double_t);
continue;
873 case TStreamerInfo::kOffsetL + TStreamerInfo::kUChar: ReadBasicArray(UChar_t);
continue;
874 case TStreamerInfo::kOffsetL + TStreamerInfo::kUShort: ReadBasicArray(UShort_t);
continue;
875 case TStreamerInfo::kOffsetL + TStreamerInfo::kUInt: ReadBasicArray(UInt_t);
continue;
876 case TStreamerInfo::kOffsetL + TStreamerInfo::kULong: ReadBasicArray(ULong_t);
continue;
877 case TStreamerInfo::kOffsetL + TStreamerInfo::kULong64:ReadBasicArray(ULong64_t);
continue;
878 case TStreamerInfo::kOffsetL + TStreamerInfo::kFloat16: {
879 b.ReadFastArrayFloat16((Float_t*)(arr[0]+ioffset),compinfo[i]->fLength,aElement);
882 case TStreamerInfo::kOffsetL + TStreamerInfo::kDouble32: {
883 b.ReadFastArrayDouble32((Double_t*)(arr[0]+ioffset),compinfo[i]->fLength,aElement);
887 case TStreamerInfo::kOffsetL + TStreamerInfo::kBool + kHaveLoop: ReadBasicArrayLoop(Bool_t);
continue;
888 case TStreamerInfo::kOffsetL + TStreamerInfo::kChar + kHaveLoop: ReadBasicArrayLoop(Char_t);
continue;
889 case TStreamerInfo::kOffsetL + TStreamerInfo::kShort + kHaveLoop: ReadBasicArrayLoop(Short_t);
continue;
890 case TStreamerInfo::kOffsetL + TStreamerInfo::kInt + kHaveLoop: ReadBasicArrayLoop(Int_t);
continue;
891 case TStreamerInfo::kOffsetL + TStreamerInfo::kLong + kHaveLoop: ReadBasicArrayLoop(Long_t);
continue;
892 case TStreamerInfo::kOffsetL + TStreamerInfo::kLong64 + kHaveLoop: ReadBasicArrayLoop(Long64_t);
continue;
893 case TStreamerInfo::kOffsetL + TStreamerInfo::kFloat + kHaveLoop: ReadBasicArrayLoop(Float_t);
continue;
894 case TStreamerInfo::kOffsetL + TStreamerInfo::kDouble + kHaveLoop: ReadBasicArrayLoop(Double_t);
continue;
895 case TStreamerInfo::kOffsetL + TStreamerInfo::kUChar + kHaveLoop: ReadBasicArrayLoop(UChar_t);
continue;
896 case TStreamerInfo::kOffsetL + TStreamerInfo::kUShort + kHaveLoop: ReadBasicArrayLoop(UShort_t);
continue;
897 case TStreamerInfo::kOffsetL + TStreamerInfo::kUInt + kHaveLoop: ReadBasicArrayLoop(UInt_t);
continue;
898 case TStreamerInfo::kOffsetL + TStreamerInfo::kULong + kHaveLoop: ReadBasicArrayLoop(ULong_t);
continue;
899 case TStreamerInfo::kOffsetL + TStreamerInfo::kULong64 + kHaveLoop: ReadBasicArrayLoop(ULong64_t);
continue;
900 case TStreamerInfo::kOffsetL + TStreamerInfo::kFloat16 + kHaveLoop: {
901 for(Int_t k=0; k<narr; ++k) {
902 b.ReadFastArrayFloat16((Float_t*)(arr[k]+ioffset),compinfo[i]->fLength,aElement);
906 case TStreamerInfo::kOffsetL + TStreamerInfo::kDouble32+ kHaveLoop: {
907 for(Int_t k=0; k<narr; ++k) {
908 b.ReadFastArrayDouble32((Double_t*)(arr[k]+ioffset),compinfo[i]->fLength,aElement);
914 case TStreamerInfo::kOffsetP + TStreamerInfo::kBool: ReadBasicPointer(Bool_t);
continue;
915 case TStreamerInfo::kOffsetP + TStreamerInfo::kChar: ReadBasicPointer(Char_t);
continue;
916 case TStreamerInfo::kOffsetP + TStreamerInfo::kShort: ReadBasicPointer(Short_t);
continue;
917 case TStreamerInfo::kOffsetP + TStreamerInfo::kInt: ReadBasicPointer(Int_t);
continue;
918 case TStreamerInfo::kOffsetP + TStreamerInfo::kLong: ReadBasicPointer(Long_t);
continue;
919 case TStreamerInfo::kOffsetP + TStreamerInfo::kLong64: ReadBasicPointer(Long64_t);
continue;
920 case TStreamerInfo::kOffsetP + TStreamerInfo::kFloat: ReadBasicPointer(Float_t);
continue;
921 case TStreamerInfo::kOffsetP + TStreamerInfo::kDouble: ReadBasicPointer(Double_t);
continue;
922 case TStreamerInfo::kOffsetP + TStreamerInfo::kUChar: ReadBasicPointer(UChar_t);
continue;
923 case TStreamerInfo::kOffsetP + TStreamerInfo::kUShort: ReadBasicPointer(UShort_t);
continue;
924 case TStreamerInfo::kOffsetP + TStreamerInfo::kUInt: ReadBasicPointer(UInt_t);
continue;
925 case TStreamerInfo::kOffsetP + TStreamerInfo::kULong: ReadBasicPointer(ULong_t);
continue;
926 case TStreamerInfo::kOffsetP + TStreamerInfo::kULong64:ReadBasicPointer(ULong64_t);
continue;
927 case TStreamerInfo::kOffsetP + TStreamerInfo::kFloat16: {
930 const int imethod = compinfo[i]->fMethod+eoffset;
931 Int_t *l = (Int_t*)(arr[0]+imethod);
932 Float_t **f = (Float_t**)(arr[0]+ioffset);
934 for(j=0;j<compinfo[i]->fLength;j++) {
936 f[j] = 0;
if (*l <=0)
continue;
937 f[j] =
new Float_t[*l];
938 b.ReadFastArrayFloat16(f[j],*l,aElement);
942 case TStreamerInfo::kOffsetP + TStreamerInfo::kDouble32: {
945 const int imethod = compinfo[i]->fMethod+eoffset;
946 Int_t *l = (Int_t*)(arr[0]+imethod);
947 Double_t **f = (Double_t**)(arr[0]+ioffset);
949 for(j=0;j<compinfo[i]->fLength;j++) {
951 f[j] = 0;
if (*l <=0)
continue;
952 f[j] =
new Double_t[*l];
953 b.ReadFastArrayDouble32(f[j],*l,aElement);
958 case TStreamerInfo::kOffsetP + TStreamerInfo::kBool + kHaveLoop: ReadBasicPointerLoop(Bool_t);
continue;
959 case TStreamerInfo::kOffsetP + TStreamerInfo::kChar + kHaveLoop: ReadBasicPointerLoop(Char_t);
continue;
960 case TStreamerInfo::kOffsetP + TStreamerInfo::kShort + kHaveLoop: ReadBasicPointerLoop(Short_t);
continue;
961 case TStreamerInfo::kOffsetP + TStreamerInfo::kInt + kHaveLoop: ReadBasicPointerLoop(Int_t);
continue;
962 case TStreamerInfo::kOffsetP + TStreamerInfo::kLong + kHaveLoop: ReadBasicPointerLoop(Long_t);
continue;
963 case TStreamerInfo::kOffsetP + TStreamerInfo::kLong64 + kHaveLoop: ReadBasicPointerLoop(Long64_t);
continue;
964 case TStreamerInfo::kOffsetP + TStreamerInfo::kFloat + kHaveLoop: ReadBasicPointerLoop(Float_t);
continue;
965 case TStreamerInfo::kOffsetP + TStreamerInfo::kDouble + kHaveLoop: ReadBasicPointerLoop(Double_t);
continue;
966 case TStreamerInfo::kOffsetP + TStreamerInfo::kUChar + kHaveLoop: ReadBasicPointerLoop(UChar_t);
continue;
967 case TStreamerInfo::kOffsetP + TStreamerInfo::kUShort + kHaveLoop: ReadBasicPointerLoop(UShort_t);
continue;
968 case TStreamerInfo::kOffsetP + TStreamerInfo::kUInt + kHaveLoop: ReadBasicPointerLoop(UInt_t);
continue;
969 case TStreamerInfo::kOffsetP + TStreamerInfo::kULong + kHaveLoop: ReadBasicPointerLoop(ULong_t);
continue;
970 case TStreamerInfo::kOffsetP + TStreamerInfo::kULong64 + kHaveLoop: ReadBasicPointerLoop(ULong64_t);
continue;
971 case TStreamerInfo::kOffsetP + TStreamerInfo::kFloat16 + kHaveLoop: {
972 const int imethod = compinfo[i]->fMethod+eoffset;
973 for(Int_t k=0; k<narr; ++k) {
976 Int_t *l = (Int_t*)(arr[k]+imethod);
977 Float_t **f = (Float_t**)(arr[k]+ioffset);
979 for(j=0;j<compinfo[i]->fLength;j++) {
981 f[j] = 0;
if (*l <=0)
continue;
982 f[j] =
new Float_t[*l];
983 b.ReadFastArrayFloat16(f[j],*l,aElement);
988 case TStreamerInfo::kOffsetP + TStreamerInfo::kDouble32+ kHaveLoop: {
989 const int imethod = compinfo[i]->fMethod+eoffset;
990 for(Int_t k=0; k<narr; ++k) {
993 Int_t *l = (Int_t*)(arr[k]+imethod);
994 Double_t **f = (Double_t**)(arr[k]+ioffset);
996 for(j=0;j<compinfo[i]->fLength;j++) {
998 f[j] = 0;
if (*l <=0)
continue;
999 f[j] =
new Double_t[*l];
1000 b.ReadFastArrayDouble32(f[j],*l,aElement);
1010 case TStreamerInfo::kCharStar: {
1012 char **f = (
char**)(arr[k]+ioffset);
1019 case TStreamerInfo::kBits: {
1021 UInt_t *x=(UInt_t*)(arr[k]+ioffset); b >> *x;
1022 if ((*x & kIsReferenced) != 0) {
1025 pidf += b.GetPidOffset();
1026 TProcessID *pid = b.ReadProcessID(pidf);
1028 TObject *obj = (TObject*)(arr[k]+eoffset);
1029 UInt_t gpid = pid->GetUniqueID();
1032 uid = obj->GetUniqueID() | 0xff000000;
1034 uid = ( obj->GetUniqueID() & 0xffffff) + (gpid<<24);
1036 obj->SetUniqueID(uid);
1037 pid->PutObjectWithID(obj);
1045 case TStreamerInfo::kCounter: {
1047 Int_t *x=(Int_t*)(arr[k]+ioffset);
1055 case TStreamerInfo::kTString: { DOLOOP { ((TString*)(arr[k]+ioffset))->Streamer(b); } }
continue;
1056 case TStreamerInfo::kTObject: { DOLOOP { ((TObject*)(arr[k]+ioffset))->TObject::Streamer(b);} }
continue;
1057 case TStreamerInfo::kTNamed: { DOLOOP { ((TNamed*) (arr[k]+ioffset))->TNamed::Streamer(b) ;} }
continue;
1063 cle = compinfo[i]->fClass;
1064 newCle = compinfo[i]->fNewClass;
1065 pstreamer = compinfo[i]->fStreamer;
1069 case TStreamerInfo::kAnyp:
1070 case TStreamerInfo::kAnyp+TStreamerInfo::kOffsetL:
1071 case TStreamerInfo::kObjectp:
1072 case TStreamerInfo::kObjectp+TStreamerInfo::kOffsetL:
1075 case TStreamerInfo::kObjectP:
1076 case TStreamerInfo::kObjectP+TStreamerInfo::kOffsetL:
1077 case TStreamerInfo::kAnyP:
1078 case TStreamerInfo::kAnyP+TStreamerInfo::kOffsetL: {
1080 b.ReadFastArray((
void**)(arr[k]+ioffset),cle,compinfo[i]->fLength,isPreAlloc,pstreamer);
1131 case TStreamerInfo::kSTLp:
1132 case TStreamerInfo::kSTLp + TStreamerInfo::kOffsetL:
1135 Version_t vers = b.ReadVersion(&start, &count, cle);
1137 if ( vers & TBufferFile::kStreamedMemberWise ) {
1140 vers &= ~( TBufferFile::kStreamedMemberWise );
1142 TClass *newClass = aElement->GetNewClass();
1143 TClass *oldClass = aElement->GetClassPointer();
1144 if( vers < 9 && newClass && newClass!=oldClass ) {
1145 Error(
"ReadBuffer",
"Unfortunately, version %d of TStreamerInfo (used in %s) did not record enough information to convert a %s into a %s.",
1146 vers, b.GetParent() ? b.GetParent()->GetName() :
"memory/socket", oldClass->GetName(), newClass->GetName() );
1150 Version_t vClVersion = 0;
1152 vClVersion = b.ReadVersionForMemberWise( cle->GetCollectionProxy()->GetValueClass() );
1155 TVirtualCollectionProxy *newProxy = (newClass ? newClass->GetCollectionProxy() : 0);
1156 TVirtualCollectionProxy *oldProxy = oldClass->GetCollectionProxy();
1157 TStreamerInfo *subinfo = 0;
1161 subinfo = (TStreamerInfo*)newProxy->GetValueClass()->GetConversionStreamerInfo( oldProxy->GetValueClass(), vClVersion );
1163 subinfo = (TStreamerInfo*)oldProxy->GetValueClass()->GetStreamerInfo( vClVersion );
1164 newProxy = oldProxy;
1169 void **contp = (
void**)(arr[k]+ioffset);
1171 for(j=0;j<compinfo[i]->fLength;j++) {
1172 void *cont = contp[j];
1174 contp[j] = cle->New();
1177 TVirtualCollectionProxy::TPushPop helper( newProxy, cont );
1180 env = newProxy->Allocate(nobjects,
true);
1181 subinfo->ReadBufferSTL(b,newProxy,nobjects, 0, vers>=7 );
1182 newProxy->Commit(env);
1186 b.CheckByteCount(start,count,aElement->GetFullName());
1189 if (pstreamer == 0) {
1191 void **contp = (
void**)(arr[k]+ioffset);
1193 for(j=0;j<compinfo[i]->fLength;j++) {
1194 void *cont = contp[j];
1200 contp[j] = cle->New();
1203 cle->Streamer( cont, b );
1207 DOLOOP {(*pstreamer)(b,arr[k]+ioffset,compinfo[i]->fLength);}
1209 b.CheckByteCount(start,count,aElement->GetFullName());
1213 case TStreamerInfo::kSTL:
1214 case TStreamerInfo::kSTL + TStreamerInfo::kOffsetL:
1216 UInt_t start, count;
1217 Version_t vers = b.ReadVersion(&start, &count, cle);
1219 if ( vers & TBufferFile::kStreamedMemberWise ) {
1221 vers &= ~( TBufferFile::kStreamedMemberWise );
1223 TClass *newClass = aElement->GetNewClass();
1224 TClass *oldClass = aElement->GetClassPointer();
1226 if( vers < 8 && newClass && newClass!=oldClass ) {
1227 Error(
"ReadBuffer",
"Unfortunately, version %d of TStreamerInfo (used in %s) did not record enough information to convert a %s into a %s.",
1228 vers, b.GetParent() ? b.GetParent()->GetName() :
"memory/socket", oldClass->GetName(), newClass->GetName() );
1231 TVirtualCollectionProxy *oldProxy = oldClass->GetCollectionProxy();
1232 TClass *valueClass = oldProxy ? oldProxy->GetValueClass() : 0;
1233 Version_t vClVersion = 0;
1235 vClVersion = b.ReadVersionForMemberWise( valueClass );
1238 if (valueClass == 0) {
1244 b.SetBufferOffset(start+count+
sizeof(UInt_t));
1248 TVirtualCollectionProxy *newProxy = (newClass ? newClass->GetCollectionProxy() : 0);
1249 TStreamerInfo *subinfo = 0;
1253 subinfo = (TStreamerInfo*)newProxy->GetValueClass()->GetConversionStreamerInfo( oldProxy->GetValueClass(), vClVersion );
1255 subinfo = (TStreamerInfo*)valueClass->GetStreamerInfo( vClVersion );
1256 newProxy = oldProxy;
1260 int objectSize = cle->Size();
1261 char *obj = arr[k]+ioffset;
1262 char *end = obj + compinfo[i]->fLength*objectSize;
1264 for(; obj<end; obj+=objectSize) {
1265 TVirtualCollectionProxy::TPushPop helper( newProxy, obj );
1268 void* env = newProxy->Allocate(nobjects,
true);
1269 subinfo->ReadBufferSTL(b,newProxy,nobjects, 0, vers >= 7);
1270 newProxy->Commit(env);
1274 b.CheckByteCount(start,count,aElement->GetTypeName());
1280 if (aElement->IsBase() && aElement->IsA()!=TStreamerBase::Class()) {
1281 b.SetBufferOffset(start);
1282 }
else if (vers==0) {
1283 b.SetBufferOffset(start);
1286 if (pstreamer == 0) {
1292 b.ReadFastArray((
void*)(arr[k]+ioffset),newCle,compinfo[i]->fLength,(TMemberStreamer*)0, cle );
1295 DOLOOP {(*pstreamer)(b,arr[k]+ioffset,compinfo[i]->fLength);}
1297 b.CheckByteCount(start,count,aElement->GetTypeName());
1301 case TStreamerInfo::kObject:
1302 if (cle->IsStartingWithTObject() && cle->GetState() > TClass::kEmulated) {
1303 DOLOOP {((TObject*)(arr[k]+ioffset))->Streamer(b);}
1308 case TStreamerInfo::kAny:
1310 DOLOOP {(*pstreamer)(b,arr[k]+ioffset,0);}
1313 DOLOOP { newCle->Streamer( arr[k]+ioffset, b, cle ); }
1315 DOLOOP { cle->Streamer(arr[k]+ioffset,b);}
1319 case TStreamerInfo::kObject+TStreamerInfo::kOffsetL: {
1320 TFile *file = (TFile*)b.GetParent();
1321 if (file && file->GetVersion() < 30208) {
1324 kase = TStreamerInfo::kStreamer;
1331 case TStreamerInfo::kAny+TStreamerInfo::kOffsetL: {
1333 b.ReadFastArray((
void*)(arr[k]+ioffset),cle,compinfo[i]->fLength,pstreamer);
1339 case TStreamerInfo::kBase:
1340 if (!(arrayMode&1)) {
1341 if(pstreamer) {kase = TStreamerInfo::kStreamer;
goto SWIT;}
1342 DOLOOP { ((TStreamerBase*)aElement)->ReadBuffer(b,arr[k]);}
1348 TStreamerInfo *binfo = ((TStreamerInfo*)((TStreamerBase*)aElement)->GetBaseStreamerInfo());
1349 binfo->ReadBuffer(b,arr,binfo->fCompFull,0,binfo->fNfulldata,narr,ioffset,arrayMode);
1353 case TStreamerInfo::kOffsetL + TStreamerInfo::kTString:
1354 case TStreamerInfo::kOffsetL + TStreamerInfo::kTObject:
1355 case TStreamerInfo::kOffsetL + TStreamerInfo::kTNamed:
1360 Version_t v = b.ReadVersion(&start, &count, cle);
1362 if (count<= 0 || v != fOldVersion) {
1363 b.SetBufferOffset(start);
1368 b.ReadFastArray((
void*)(arr[k]+ioffset),cle,compinfo[i]->fLength,pstreamer);
1370 b.CheckByteCount(start,count,aElement->GetFullName());
1375 case TStreamerInfo::kStreamer:{
1379 Version_t v = b.ReadVersion(&start, &count, cle);
1381 if (aElement->IsBase() && aElement->IsA()!=TStreamerBase::Class()) {
1382 b.SetBufferOffset(start);
1383 }
else if (kase == TStreamerInfo::kSTL || kase == TStreamerInfo::kSTL+TStreamerInfo::kOffsetL ||
1384 count<= 0 || v != fOldVersion) {
1385 b.SetBufferOffset(start);
1389 if (pstreamer == 0) {
1390 Error(
"ReadBuffer",
"Streamer for %s is null\n",aElement->GetName());
1392 aElement->ls();
continue;
1395 DOLOOP {(*pstreamer)(b,arr[k]+ioffset,compinfo[i]->fLength);}
1397 b.CheckByteCount(start,count,aElement->GetFullName());
1401 case TStreamerInfo::kStreamLoop:
1406 case TStreamerInfo::kStreamLoop + TStreamerInfo::kOffsetL:
1413 TClass* cl = compinfo[i]->fClass;
1415 Bool_t isPtrPtr = (strstr(aElement->GetTypeName(),
"**") != 0);
1422 b.ReadVersion(&start, &count, cl);
1424 for (Int_t k = 0; k < narr; ++k) {
1425 Int_t* counter = (Int_t*) (arr[k] + eoffset + compinfo[i]->fMethod );
1427 (*pstreamer)(b, arr[k] + ioffset , *counter);
1429 b.CheckByteCount(start, count, aElement->GetFullName());
1435 TFile* file = (TFile*) b.GetParent();
1437 Int_t fileVersion = kMaxInt;
1439 fileVersion = file->GetVersion();
1444 b.ReadVersion(&start, &count, cl);
1445 if (fileVersion > 51508) {
1448 for (Int_t k = 0; k < narr; ++k) {
1450 Int_t vlen = *((Int_t*) (arr[k] + eoffset + compinfo[i]->fMethod ));
1457 char** pp = (
char**) (arr[k] + ioffset );
1462 for (Int_t ndx = 0; ndx < compinfo[i]->fLength; ++ndx) {
1470 cl->DeleteArray(pp[ndx]);
1503 pp[ndx] = (
char*) cl->NewArray(vlen);
1505 Error(
"ReadBuffer",
"Memory allocation failed!\n");
1512 pp[ndx] = (
char*)
new char*[vlen];
1514 Error(
"ReadBuffer",
"Memory allocation failed!\n");
1518 memset(pp[ndx], 0, vlen *
sizeof(
char*));
1522 b.ReadFastArray(pp[ndx], cl, vlen, 0);
1526 b.ReadFastArray((
void**) pp[ndx], cl, vlen, kFALSE, 0);
1534 for (Int_t k = 0; k < narr; ++k) {
1536 Int_t vlen = *((Int_t*) (arr[k] + eoffset + compinfo[i]->fMethod ));
1543 char** pp = (
char**) (arr[k] + ioffset );
1548 for (Int_t ndx = 0; ndx < compinfo[i]->fLength; ++ndx) {
1556 cl->DeleteArray(pp[ndx]);
1589 pp[ndx] = (
char*) cl->NewArray(vlen);
1591 Error(
"ReadBuffer",
"Memory allocation failed!\n");
1598 pp[ndx] = (
char*)
new char*[vlen];
1600 Error(
"ReadBuffer",
"Memory allocation failed!\n");
1604 memset(pp[ndx], 0, vlen *
sizeof(
char*));
1609 for (Int_t v = 0; v < vlen; ++v) {
1611 cl->Streamer(pp[ndx] + (v * cl->Size()), b);
1617 char** r = (
char**) pp[ndx];
1619 for (Int_t v = 0; v < vlen; ++v) {
1621 r[v] = (
char*) cl->New();
1628 cl->Streamer(r[v], b);
1634 b.CheckByteCount(start, count, aElement->GetFullName());
1638 case TStreamerInfo::kCacheNew:
1639 ((TBufferFile&)b).PushDataCache(
new TVirtualArray( aElement->GetClassPointer(), narr ) );
1641 case TStreamerInfo::kCacheDelete:
1642 delete ((TBufferFile&)b).PopDataCache();
1652 if (TStreamerInfo::kCache <= kase && kase < TStreamerInfo::kArtificial) {
1662 if (kase >= TStreamerInfo::kConv)
1663 ans = thisVar->ReadBufferConv(b,arr,compinfo[i],kase,aElement,narr,eoffset);
1664 if (ans==0)
continue;
1666 if (kase >= TStreamerInfo::kSkip)
1667 ans = thisVar->ReadBufferSkip(b,arr,compinfo[i],kase,aElement,narr,eoffset);
1668 if (ans==0)
continue;
1670 if (kase >= TStreamerInfo::kArtificial) {
1671 ans = thisVar->ReadBufferArtificial(b,arr,aElement,narr,eoffset);
1673 if (ans==0)
continue;
1676 Error(
"ReadBuffer",
"The element %s::%s type %d (%s) is not supported yet\n",
1677 thisVar->GetName(),aElement->GetFullName(),kase,aElement->GetTypeName());
1679 Error(
"ReadBuffer",
"The TStreamerElement for %s %d is missing!\n",
1680 thisVar->GetName(),i);
1685 if (needIncrement) b.DecrementLevel(thisVar);
1689 template Int_t TStreamerInfo::ReadBufferSkip<char**>(TBuffer &b,
char**
const &arr,
const TCompInfo *compinfo, Int_t kase,
1690 TStreamerElement *aElement, Int_t narr,
1692 template Int_t TStreamerInfo::ReadBufferSkip<TVirtualCollectionProxy>(TBuffer &b,
const TVirtualCollectionProxy &arr,
const TCompInfo *compinfo, Int_t kase,
1693 TStreamerElement *aElement, Int_t narr,
1695 template Int_t TStreamerInfo::ReadBufferSkip<TVirtualArray>(TBuffer &b,
const TVirtualArray &arr,
const TCompInfo *compinfo, Int_t kase,
1696 TStreamerElement *aElement, Int_t narr,
1699 template Int_t TStreamerInfo::ReadBufferConv<char**>(TBuffer &b,
char**
const &arr,
const TCompInfo *compinfo, Int_t kase,
1700 TStreamerElement *aElement, Int_t narr,
1702 template Int_t TStreamerInfo::ReadBufferConv<TVirtualCollectionProxy>(TBuffer &b,
const TVirtualCollectionProxy &arr,
const TCompInfo *compinfo, Int_t kase,
1703 TStreamerElement *aElement, Int_t narr,
1705 template Int_t TStreamerInfo::ReadBufferConv<TVirtualArray>(TBuffer &b,
const TVirtualArray &arr,
const TCompInfo *compinfo, Int_t kase,
1706 TStreamerElement *aElement, Int_t narr,
1709 template Int_t TStreamerInfo::ReadBufferArtificial<char**>(TBuffer &b,
char**
const &arr,
1710 TStreamerElement *aElement, Int_t narr,
1712 template Int_t TStreamerInfo::ReadBufferArtificial<TVirtualCollectionProxy>(TBuffer &b,
const TVirtualCollectionProxy &arr,
1713 TStreamerElement *aElement, Int_t narr,
1715 template Int_t TStreamerInfo::ReadBufferArtificial<TVirtualArray>(TBuffer &b,
const TVirtualArray &arr,
1716 TStreamerElement *aElement, Int_t narr,
1719 template Int_t TStreamerInfo::ReadBuffer<char**>(TBuffer &b,
char**
const &arr,
1720 TCompInfo *
const*
const compinfo, Int_t first, Int_t last,
1721 Int_t narr, Int_t eoffset, Int_t arrayMode);
1722 template Int_t TStreamerInfo::ReadBuffer<TVirtualCollectionProxy>(TBuffer &b,
const TVirtualCollectionProxy &arr,
1723 TCompInfo *
const*
const compinfo, Int_t first, Int_t last,
1724 Int_t narr, Int_t eoffset, Int_t arrayMode);
1725 template Int_t TStreamerInfo::ReadBuffer<TVirtualArray>(TBuffer &b,
const TVirtualArray &arr,
1726 TCompInfo *
const*
const compinfo, Int_t first, Int_t last,
1727 Int_t narr, Int_t eoffset, Int_t arrayMode);
1732 Int_t TStreamerInfo::ReadBufferSTL(TBuffer &b, TVirtualCollectionProxy *cont,
1733 Int_t nc, Int_t eoffset, Bool_t v7 )
1735 if (!nc && v7)
return 0;
1736 int ret = ReadBuffer(b, *cont,fCompFull,0,fNfulldata,nc,eoffset,1);
1744 Int_t TStreamerInfo::ReadBufferClones(TBuffer &b, TClonesArray *clones,
1745 Int_t nc, Int_t first, Int_t eoffset)
1747 char **arr = (
char **)clones->GetObjectRef(0);
1748 return ReadBuffer(b,arr,fCompFull,first==-1?0:first,first==-1?fNfulldata:first+1,nc,eoffset,1);