34 TGenCollectionStreamer::TGenCollectionStreamer(
const TGenCollectionStreamer& copy)
35 : TGenCollectionProxy(copy), fReadBufferFunc(&TGenCollectionStreamer::ReadBufferDefault)
40 TGenCollectionStreamer::TGenCollectionStreamer(Info_t info,
size_t iter_size)
41 : TGenCollectionProxy(info, iter_size), fReadBufferFunc(&TGenCollectionStreamer::ReadBufferDefault)
46 TGenCollectionStreamer::TGenCollectionStreamer(const ::ROOT::TCollectionProxyInfo &info, TClass *cl)
47 : TGenCollectionProxy(info, cl), fReadBufferFunc(&TGenCollectionStreamer::ReadBufferDefault)
52 TGenCollectionStreamer::~TGenCollectionStreamer()
57 TVirtualCollectionProxy* TGenCollectionStreamer::Generate()
const
60 if (!fValue.load()) Initialize(kFALSE);
61 return new TGenCollectionStreamer(*
this);
65 static T* getaddress(TGenCollectionProxy::StreamHelper &itm);
68 bool* getaddress<bool>(TGenCollectionProxy::StreamHelper &itm)
74 Char_t* getaddress<Char_t>(TGenCollectionProxy::StreamHelper &itm)
80 Short_t* getaddress<Short_t>(TGenCollectionProxy::StreamHelper &itm)
86 Int_t* getaddress<Int_t>(TGenCollectionProxy::StreamHelper &itm)
92 Long_t* getaddress<Long_t>(TGenCollectionProxy::StreamHelper &itm)
98 Long64_t* getaddress<Long64_t>(TGenCollectionProxy::StreamHelper &itm)
100 return &itm.s_longlong;
104 Float_t* getaddress<Float_t>(TGenCollectionProxy::StreamHelper &itm)
110 Double_t* getaddress<Double_t>(TGenCollectionProxy::StreamHelper &itm)
116 UChar_t* getaddress<UChar_t>(TGenCollectionProxy::StreamHelper &itm)
122 UShort_t* getaddress<UShort_t>(TGenCollectionProxy::StreamHelper &itm)
128 UInt_t* getaddress<UInt_t>(TGenCollectionProxy::StreamHelper &itm)
134 ULong_t* getaddress<ULong_t>(TGenCollectionProxy::StreamHelper &itm)
140 ULong64_t* getaddress<ULong64_t>(TGenCollectionProxy::StreamHelper &itm)
142 return &itm.u_longlong;
145 template <
typename From,
typename To>
146 void ConvertArray(TGenCollectionProxy::StreamHelper *read, TGenCollectionProxy::StreamHelper *write,
int nElements)
148 From *r = getaddress<From>( *read );
149 To *w = getaddress<To>( *write );
150 for(
int i = 0; i < nElements; ++i) {
156 template <
typename From>
157 void DispatchConvertArray(
int writeType, TGenCollectionProxy::StreamHelper *read, TGenCollectionProxy::StreamHelper *write,
int nElements)
161 ConvertArray<From,bool>(read,write,nElements);
164 ConvertArray<From,Char_t>(read,write,nElements);
167 ConvertArray<From,Short_t>(read,write,nElements);
170 ConvertArray<From,Int_t>(read,write,nElements);
173 ConvertArray<From,Long64_t>(read,write,nElements);
176 ConvertArray<From,Long64_t>(read,write,nElements);
179 ConvertArray<From,Float_t>(read,write,nElements);
182 ConvertArray<From,Float16_t>(read,write,nElements);
185 ConvertArray<From,Double_t>(read,write,nElements);
188 ConvertArray<From,UChar_t>(read,write,nElements);
191 ConvertArray<From,UShort_t>(read,write,nElements);
194 ConvertArray<From,UInt_t>(read,write,nElements);
197 ConvertArray<From,ULong_t>(read,write,nElements);
200 ConvertArray<From,ULong64_t>(read,write,nElements);
203 ConvertArray<From,Double32_t>(read,write,nElements);
208 Error(
"TGenCollectionStreamer",
"fType %d is not supported yet!\n", writeType);
212 void TGenCollectionStreamer::ReadPrimitives(
int nElements, TBuffer &b,
const TClass *onFileClass)
215 size_t len = fValDiff * nElements;
219 StreamHelper* itmstore = 0;
220 StreamHelper* itmconv = 0;
221 fEnv->fSize = nElements;
223 case ROOT::kSTLvector:
224 if (fVal->fKind != kBool_t) {
225 fResize(fEnv->fObject,fEnv->fSize);
228 TVirtualVectorIterators iterators(fFunctionCreateIterators);
229 iterators.CreateIterators(fEnv->fObject);
230 itmstore = (StreamHelper*)iterators.fBegin;
231 fEnv->fStart = itmstore;
236 itmstore = (StreamHelper*)(len <
sizeof(buffer) ? buffer : memory =::operator
new(len));
239 fEnv->fStart = itmstore;
241 StreamHelper *itmread;
244 readkind = onFileClass->GetCollectionProxy()->GetType();
245 itmconv = (StreamHelper*) ::
operator new( nElements * onFileClass->GetCollectionProxy()->GetIncrement() );
249 readkind = fVal->fKind;
253 b.ReadFastArray(&itmread->boolean , nElements);
256 b.ReadFastArray(&itmread->s_char , nElements);
259 b.ReadFastArray(&itmread->s_short , nElements);
262 b.ReadFastArray(&itmread->s_int , nElements);
265 b.ReadFastArray(&itmread->s_long , nElements);
268 b.ReadFastArray(&itmread->s_longlong, nElements);
271 b.ReadFastArray(&itmread->flt , nElements);
274 b.ReadFastArrayFloat16(&itmread->flt, nElements);
277 b.ReadFastArray(&itmread->dbl , nElements);
280 b.ReadFastArray(&itmread->u_char , nElements);
283 b.ReadFastArray(&itmread->u_short , nElements);
286 b.ReadFastArray(&itmread->u_int , nElements);
289 b.ReadFastArray(&itmread->u_long , nElements);
292 b.ReadFastArray(&itmread->u_longlong, nElements);
295 b.ReadFastArrayDouble32(&itmread->dbl, nElements);
300 Error(
"TGenCollectionStreamer",
"fType %d is not supported yet!\n", readkind);
305 DispatchConvertArray<bool>(fVal->fKind, itmread, itmstore, nElements);
308 DispatchConvertArray<Char_t>(fVal->fKind, itmread, itmstore, nElements);
311 DispatchConvertArray<Short_t>(fVal->fKind, itmread, itmstore, nElements);
314 DispatchConvertArray<Int_t>(fVal->fKind, itmread, itmstore, nElements);
317 DispatchConvertArray<Long_t>(fVal->fKind, itmread, itmstore, nElements);
320 DispatchConvertArray<Long64_t>(fVal->fKind, itmread, itmstore, nElements);
323 DispatchConvertArray<Float_t>(fVal->fKind, itmread, itmstore, nElements);
326 DispatchConvertArray<Float16_t>(fVal->fKind, itmread, itmstore, nElements);
329 DispatchConvertArray<Double_t>(fVal->fKind, itmread, itmstore, nElements);
332 DispatchConvertArray<UChar_t>(fVal->fKind, itmread, itmstore, nElements);
335 DispatchConvertArray<UShort_t>(fVal->fKind, itmread, itmstore, nElements);
338 DispatchConvertArray<UInt_t>(fVal->fKind, itmread, itmstore, nElements);
341 DispatchConvertArray<ULong_t>(fVal->fKind, itmread, itmstore, nElements);
344 DispatchConvertArray<ULong64_t>(fVal->fKind, itmread, itmstore, nElements);
347 DispatchConvertArray<Double_t>(fVal->fKind, itmread, itmstore, nElements);
352 Error(
"TGenCollectionStreamer",
"fType %d is not supported yet!\n", readkind);
354 ::operator
delete((
void*)itmconv);
357 fEnv->fStart = fFeed(itmstore,fEnv->fObject,fEnv->fSize);
359 ::operator
delete(memory);
364 void TGenCollectionStreamer::ReadObjects(
int nElements, TBuffer &b,
const TClass *onFileClass)
367 Bool_t vsn3 = b.GetInfo() && b.GetInfo()->GetOldVersion() <= 3;
368 size_t len = fValDiff * nElements;
369 StreamHelper* itm = 0;
373 TClass* onFileValClass = (onFileClass ? onFileClass->GetCollectionProxy()->GetValueClass() : 0);
375 fEnv->fSize = nElements;
378 case ROOT::kSTLvector:
379 #define DOLOOP(x) {int idx=0; while(idx<nElements) {StreamHelper* i=(StreamHelper*)(((char*)itm) + fValDiff*idx); { x ;} ++idx;} break;}
380 fResize(fEnv->fObject,fEnv->fSize);
384 TVirtualVectorIterators iterators(fFunctionCreateIterators);
385 iterators.CreateIterators(fEnv->fObject);
386 itm = (StreamHelper*)iterators.fBegin;
389 switch (fVal->fCase) {
391 DOLOOP(b.StreamObject(i, fVal->fType, onFileValClass ));
392 case EProperty(kBIT_ISSTRING):
393 DOLOOP(i->read_std_string(b));
394 case EProperty(kIsPointer | kIsClass):
395 DOLOOP(i->set(b.ReadObjectAny(fVal->fType)));
396 case EProperty(kIsPointer | kBIT_ISSTRING):
397 DOLOOP(i->read_std_string_pointer(b));
398 case EProperty(kIsPointer | kBIT_ISTSTRING | kIsClass):
399 DOLOOP(i->read_tstring_pointer(vsn3, b));
407 case ROOT::kSTLforwardlist:
408 case ROOT::kSTLdeque:
409 #define DOLOOP(x) {int idx=0; while(idx<nElements) {StreamHelper* i=(StreamHelper*)TGenCollectionProxy::At(idx); { x ;} ++idx;} break;}
410 fResize(fEnv->fObject,fEnv->fSize);
413 switch (fVal->fCase) {
415 DOLOOP(b.StreamObject(i, fVal->fType, onFileValClass));
417 DOLOOP(i->read_std_string(b));
418 case kIsPointer | kIsClass:
419 DOLOOP(i->set(b.ReadObjectAny(fVal->fType)));
420 case kIsPointer | kBIT_ISSTRING:
421 DOLOOP(i->read_std_string_pointer(b));
422 case kIsPointer | kBIT_ISTSTRING | kIsClass:
423 DOLOOP(i->read_tstring_pointer(vsn3, b));
430 case ROOT::kSTLmultiset:
432 case ROOT::kSTLunorderedset:
433 case ROOT::kSTLunorderedmultiset:
434 #define DOLOOP(x) {int idx=0; while(idx<nElements) {StreamHelper* i=(StreamHelper*)(((char*)itm) + fValDiff*idx); { x ;} ++idx;}}
435 fEnv->fStart = itm = (StreamHelper*)(len <
sizeof(buffer) ? buffer : memory =::operator
new(len));
436 fConstruct(itm,nElements);
437 switch (fVal->fCase) {
439 DOLOOP(b.StreamObject(i, fVal->fType, onFileValClass));
440 fFeed(fEnv->fStart,fEnv->fObject,fEnv->fSize);
441 fDestruct(fEnv->fStart,fEnv->fSize);
443 case EProperty(kBIT_ISSTRING):
444 DOLOOP(i->read_std_string(b))
445 fFeed(fEnv->fStart,fEnv->fObject,fEnv->fSize);
446 fDestruct(fEnv->fStart,fEnv->fSize);
448 case EProperty(kIsPointer | kIsClass):
449 DOLOOP(i->set(b.ReadObjectAny(fVal->fType)));
450 fFeed(fEnv->fStart,fEnv->fObject,fEnv->fSize);
452 case EProperty(kIsPointer | kBIT_ISSTRING):
453 DOLOOP(i->read_std_string_pointer(b))
454 fFeed(fEnv->fStart,fEnv->fObject,fEnv->fSize);
456 case EProperty(kIsPointer | kBIT_ISTSTRING | kIsClass):
457 DOLOOP(i->read_tstring_pointer(vsn3, b));
458 fFeed(fEnv->fStart,fEnv->fObject,fEnv->fSize);
467 ::operator
delete(memory);
471 void TGenCollectionStreamer::ReadPairFromMap(
int nElements, TBuffer &b)
475 Bool_t vsn3 = b.GetInfo() && b.GetInfo()->GetOldVersion() <= 3;
476 size_t len = fValDiff * nElements;
477 StreamHelper* itm = 0;
481 TStreamerInfo *pinfo = (TStreamerInfo*)fVal->fType->GetStreamerInfo();
483 R__ASSERT(fVal->fCase == kIsClass);
486 std::vector<std::string> inside;
487 TClassEdit::GetSplit(pinfo->GetName(), inside, nested);
488 Value first(inside[1],kFALSE);
489 Value second(inside[2],kFALSE);
490 fValOffset = ((TStreamerElement*)pinfo->GetElements()->At(1))->GetOffset();
492 fEnv->fSize = nElements;
495 case ROOT::kSTLvector:
496 #define DOLOOP(x) {int idx=0; while(idx<nElements) {StreamHelper* i=(StreamHelper*)(((char*)itm) + fValDiff*idx); { x ;} ++idx;} break;}
497 fResize(fEnv->fObject,fEnv->fSize);
501 TVirtualVectorIterators iterators(fFunctionCreateIterators);
502 iterators.CreateIterators(fEnv->fObject);
503 itm = (StreamHelper*)iterators.fBegin;
506 switch (fVal->fCase) {
509 ReadMapHelper(i, &first, vsn3, b);
510 ReadMapHelper((StreamHelper*)(((
char*)i) + fValOffset), &second, vsn3, b)
519 case ROOT::kSTLforwardlist:
520 case ROOT::kSTLdeque:
521 #define DOLOOP(x) {int idx=0; while(idx<nElements) {StreamHelper* i=(StreamHelper*)TGenCollectionProxy::At(idx); { x ;} ++idx;} break;}
522 fResize(fEnv->fObject,fEnv->fSize);
525 TVirtualVectorIterators iterators(fFunctionCreateIterators);
526 iterators.CreateIterators(fEnv->fObject);
527 fEnv->fStart = iterators.fBegin;
529 switch (fVal->fCase) {
532 char **where = (
char**)(
void*) & i;
533 b.ApplySequence(*(pinfo->GetReadObjectWiseActions()), where);
541 case ROOT::kSTLmultiset:
543 case ROOT::kSTLunorderedset:
544 case ROOT::kSTLunorderedmultiset:
545 #define DOLOOP(x) {int idx=0; while(idx<nElements) {StreamHelper* i=(StreamHelper*)(((char*)itm) + fValDiff*idx); { x ;} ++idx;}}
546 fEnv->fStart = itm = (StreamHelper*)(len <
sizeof(buffer) ? buffer : memory =::operator
new(len));
547 fConstruct(itm,nElements);
548 switch (fVal->fCase) {
551 char **where = (
char**)(
void*) & i;
552 b.ApplySequence(*(pinfo->GetReadObjectWiseActions()), where);
554 fFeed(fEnv->fStart,fEnv->fObject,fEnv->fSize);
555 fDestruct(fEnv->fStart,fEnv->fSize);
564 ::operator
delete(memory);
569 void TGenCollectionStreamer::ReadMapHelper(StreamHelper *i, Value *v, Bool_t vsn3, TBuffer &b)
578 switch (
int(v->fKind)) {
629 Error(
"TGenCollectionStreamer",
"fType %d is not supported yet!\n", v->fKind);
633 b.StreamObject(i, v->fType);
636 i->read_std_string(b);
638 case kIsPointer | kIsClass:
639 i->set(b.ReadObjectAny(v->fType));
641 case kIsPointer | kBIT_ISSTRING:
642 i->read_std_string_pointer(b);
644 case kIsPointer | kBIT_ISTSTRING | kIsClass:
645 i->read_tstring_pointer(vsn3, b);
650 template <
typename To>
651 To readOneValue(TBuffer &b,
int readtype) {
652 TGenCollectionProxy::StreamHelper itm;
653 TGenCollectionProxy::StreamHelper *i = &itm;
657 return (To)i->boolean;
661 return (To)i->s_char;
665 return (To)i->s_short;
673 return (To)i->s_long;
677 return (To)i->s_longlong;
693 return (To)i->u_char;
697 return (To)i->u_short;
705 return (To)i->u_long;
709 return (To)i->u_longlong;
721 Error(
"TGenCollectionStreamer",
"fType %d is not supported yet!\n", readtype);
727 void TGenCollectionStreamer::ReadMap(
int nElements, TBuffer &b,
const TClass *onFileClass)
730 Bool_t vsn3 = b.GetInfo() && b.GetInfo()->GetOldVersion() <= 3;
731 size_t len = fValDiff * nElements;
733 char buffer[8096], *addr, *temp;
737 fEnv->fSize = nElements;
738 fEnv->fStart = (len <
sizeof(buffer) ? buffer : memory =::
operator new(len));
739 addr = temp = (
char*)fEnv->fStart;
740 fConstruct(addr,nElements);
742 int onFileValueKind[2];
744 TClass *onFileValueClass = onFileClass->GetCollectionProxy()->GetValueClass();
745 TVirtualStreamerInfo *sourceInfo = onFileValueClass->GetStreamerInfo();
746 onFileValueKind[0] = ((TStreamerElement*)sourceInfo->GetElements()->At(0))->GetType();
747 onFileValueKind[1] = ((TStreamerElement*)sourceInfo->GetElements()->At(1))->GetType();
749 for (
int loop, idx = 0; idx < nElements; ++idx) {
750 addr = temp + fValDiff * idx;
752 for (loop = 0; loop < 2; loop++) {
753 i = (StreamHelper*)addr;
758 int readtype = (int)(onFileValueKind[loop]);
759 switch (
int(v->fKind)) {
761 i->boolean = readOneValue<bool>(b,readtype);
764 i->s_char = readOneValue<Char_t>(b,readtype);
767 i->s_short = readOneValue<Short_t>(b,readtype);
770 i->s_int = readOneValue<Int_t>(b,readtype);
773 i->s_long = readOneValue<Long_t>(b,readtype);
776 i->s_longlong = readOneValue<Long64_t>(b,readtype);
779 i->flt = readOneValue<Float_t>(b,readtype);
782 i->flt = readOneValue<Float16_t>(b,readtype);
785 i->dbl = readOneValue<Double_t>(b,readtype);
788 i->u_char = readOneValue<UChar_t>(b,readtype);
791 i->u_short = readOneValue<UShort_t>(b,readtype);
794 i->u_int = readOneValue<UInt_t>(b,readtype);
797 i->u_long = readOneValue<ULong_t>(b,readtype);
800 i->u_longlong = readOneValue<ULong64_t>(b,readtype);
803 i->dbl = readOneValue<Double32_t>(b,readtype);
808 Error(
"TGenCollectionStreamer",
"fType %d is not supported yet!\n", v->fKind);
811 switch (
int(v->fKind)) {
862 Error(
"TGenCollectionStreamer",
"fType %d is not supported yet!\n", v->fKind);
867 b.StreamObject(i, v->fType);
869 case EProperty(kBIT_ISSTRING):
870 i->read_std_string(b);
872 case EProperty(kIsPointer | kIsClass):
873 i->set(b.ReadObjectAny(v->fType));
875 case EProperty(kIsPointer | kBIT_ISSTRING):
876 i->read_std_string_pointer(b);
878 case EProperty(kIsPointer | kBIT_ISTSTRING | kIsClass):
879 i->read_tstring_pointer(vsn3, b);
886 fFeed(fEnv->fStart,fEnv->fObject,fEnv->fSize);
887 fDestruct(fEnv->fStart,fEnv->fSize);
889 ::operator
delete(memory);
893 void TGenCollectionStreamer::WritePrimitives(
int nElements, TBuffer &b)
896 size_t len = fValDiff * nElements;
899 StreamHelper* itm = 0;
901 case ROOT::kSTLvector:
902 if (fVal->fKind != kBool_t) {
903 itm = (StreamHelper*)(fEnv->fStart = fFirst.invoke(fEnv));
907 fEnv->fStart = itm = (StreamHelper*)(len <
sizeof(buffer) ? buffer : memory =::operator
new(len));
908 fCollect(fEnv->fObject,itm);
911 switch (
int(fVal->fKind)) {
913 b.WriteFastArray(&itm->boolean , nElements);
916 b.WriteFastArray(&itm->s_char , nElements);
919 b.WriteFastArray(&itm->s_short , nElements);
922 b.WriteFastArray(&itm->s_int , nElements);
925 b.WriteFastArray(&itm->s_long , nElements);
928 b.WriteFastArray(&itm->s_longlong, nElements);
931 b.WriteFastArray(&itm->flt , nElements);
934 b.WriteFastArrayFloat16(&itm->flt, nElements);
937 b.WriteFastArray(&itm->dbl , nElements);
940 b.WriteFastArray(&itm->u_char , nElements);
943 b.WriteFastArray(&itm->u_short , nElements);
946 b.WriteFastArray(&itm->u_int , nElements);
949 b.WriteFastArray(&itm->u_long , nElements);
952 b.WriteFastArray(&itm->u_longlong, nElements);
955 b.WriteFastArrayDouble32(&itm->dbl, nElements);
960 Error(
"TGenCollectionStreamer",
"fType %d is not supported yet!\n", fVal->fKind);
963 ::operator
delete(memory);
967 void TGenCollectionStreamer::WriteObjects(
int nElements, TBuffer &b)
970 StreamHelper* itm = 0;
973 case ROOT::kSTLvector:
974 #define DOLOOP(x) {int idx=0; while(idx<nElements) {StreamHelper* i=(StreamHelper*)(((char*)itm) + fValDiff*idx); { x ;} ++idx;} break;}
975 itm = (StreamHelper*)fFirst.invoke(fEnv);
976 switch (fVal->fCase) {
978 DOLOOP(b.StreamObject(i, fVal->fType));
981 DOLOOP(TString(i->c_str()).Streamer(b));
983 case kIsPointer | kIsClass:
984 DOLOOP(b.WriteObjectAny(i->ptr(), fVal->fType));
986 case kBIT_ISSTRING | kIsPointer:
987 DOLOOP(i->write_std_string_pointer(b));
989 case kBIT_ISTSTRING | kIsClass | kIsPointer:
990 DOLOOP(i->write_tstring_pointer(b));
999 case ROOT::kSTLforwardlist:
1000 case ROOT::kSTLdeque:
1001 case ROOT::kSTLmultiset:
1003 case ROOT::kSTLunorderedset:
1004 case ROOT::kSTLunorderedmultiset:
1005 #define DOLOOP(x) {int idx=0; while(idx<nElements) {StreamHelper* i=(StreamHelper*)TGenCollectionProxy::At(idx); { x ;} ++idx;} break;}
1006 switch (fVal->fCase) {
1008 DOLOOP(b.StreamObject(i, fVal->fType));
1010 DOLOOP(TString(i->c_str()).Streamer(b));
1011 case kIsPointer | kIsClass:
1012 DOLOOP(b.WriteObjectAny(i->ptr(), fVal->fType));
1013 case kBIT_ISSTRING | kIsPointer:
1014 DOLOOP(i->write_std_string_pointer(b));
1015 case kBIT_ISTSTRING | kIsClass | kIsPointer:
1016 DOLOOP(i->write_tstring_pointer(b));
1025 void TGenCollectionStreamer::WriteMap(
int nElements, TBuffer &b)
1031 for (
int loop, idx = 0; idx < nElements; ++idx) {
1032 char* addr = (
char*)TGenCollectionProxy::At(idx);
1034 for (loop = 0; loop < 2; ++loop) {
1035 i = (StreamHelper*)addr;
1037 case kIsFundamental:
1039 switch (
int(v->fKind)) {
1088 Error(
"TGenCollectionStreamer",
"fType %d is not supported yet!\n", v->fKind);
1092 b.StreamObject(i, v->fType);
1095 TString(i->c_str()).Streamer(b);
1097 case kIsPointer | kIsClass:
1098 b.WriteObjectAny(i->ptr(), v->fType);
1100 case kBIT_ISSTRING | kIsPointer:
1101 i->write_std_string_pointer(b);
1103 case kBIT_ISTSTRING | kIsClass | kIsPointer:
1104 i->write_tstring_pointer(b);
1113 template <
typename From,
typename To>
1114 void TGenCollectionStreamer::ConvertBufferVectorPrimitives(TBuffer &b,
void *obj, Int_t nElements)
1116 From *temp =
new From[nElements];
1117 b.ReadFastArray(temp, nElements);
1118 std::vector<To> *
const vec = (std::vector<To>*)(obj);
1119 for(Int_t ind = 0; ind < nElements; ++ind) {
1120 (*vec)[ind] = (To)temp[ind];
1125 template <
typename To>
1126 void TGenCollectionStreamer::ConvertBufferVectorPrimitivesFloat16(TBuffer &b,
void *obj, Int_t nElements)
1128 Float16_t *temp =
new Float16_t[nElements];
1129 b.ReadFastArrayFloat16(temp, nElements);
1130 std::vector<To> *
const vec = (std::vector<To>*)(obj);
1131 for(Int_t ind = 0; ind < nElements; ++ind) {
1132 (*vec)[ind] = (To)temp[ind];
1137 template <
typename To>
1138 void TGenCollectionStreamer::ConvertBufferVectorPrimitivesDouble32(TBuffer &b,
void *obj, Int_t nElements)
1140 Double32_t *temp =
new Double32_t[nElements];
1141 b.ReadFastArrayDouble32(temp, nElements);
1142 std::vector<To> *
const vec = (std::vector<To>*)(obj);
1143 for(Int_t ind = 0; ind < nElements; ++ind) {
1144 (*vec)[ind] = (To)temp[ind];
1149 template <
typename To>
1150 void TGenCollectionStreamer::DispatchConvertBufferVectorPrimitives(TBuffer &b,
void *obj, Int_t nElements,
const TVirtualCollectionProxy *onFileProxy)
1152 switch ((TStreamerInfo::EReadWrite)onFileProxy->GetType()) {
1153 case TStreamerInfo::kBool: ConvertBufferVectorPrimitives<Bool_t ,To>(b,obj,nElements);
break;
1154 case TStreamerInfo::kChar: ConvertBufferVectorPrimitives<Char_t ,To>(b,obj,nElements);
break;
1155 case TStreamerInfo::kShort: ConvertBufferVectorPrimitives<Short_t ,To>(b,obj,nElements);
break;
1156 case TStreamerInfo::kInt: ConvertBufferVectorPrimitives<Int_t ,To>(b,obj,nElements);
break;
1157 case TStreamerInfo::kLong: ConvertBufferVectorPrimitives<Long_t ,To>(b,obj,nElements);
break;
1158 case TStreamerInfo::kLong64: ConvertBufferVectorPrimitives<Long64_t ,To>(b,obj,nElements);
break;
1159 case TStreamerInfo::kFloat: ConvertBufferVectorPrimitives<Float_t ,To>(b,obj,nElements);
break;
1160 case TStreamerInfo::kFloat16: ConvertBufferVectorPrimitives<Float16_t ,To>(b,obj,nElements);
break;
1161 case TStreamerInfo::kDouble: ConvertBufferVectorPrimitives<Double_t ,To>(b,obj,nElements);
break;
1162 case TStreamerInfo::kDouble32: ConvertBufferVectorPrimitives<Double32_t,To>(b,obj,nElements);
break;
1163 case TStreamerInfo::kUChar: ConvertBufferVectorPrimitives<UChar_t ,To>(b,obj,nElements);
break;
1164 case TStreamerInfo::kUShort: ConvertBufferVectorPrimitives<UShort_t ,To>(b,obj,nElements);
break;
1165 case TStreamerInfo::kUInt: ConvertBufferVectorPrimitives<UInt_t ,To>(b,obj,nElements);
break;
1166 case TStreamerInfo::kULong: ConvertBufferVectorPrimitives<ULong_t ,To>(b,obj,nElements);
break;
1167 case TStreamerInfo::kULong64: ConvertBufferVectorPrimitives<ULong64_t ,To>(b,obj,nElements);
break;
1172 template <
typename basictype>
1173 void TGenCollectionStreamer::ReadBufferVectorPrimitives(TBuffer &b,
void *obj,
const TClass *onFileClass)
1177 fResize(obj,nElements);
1180 DispatchConvertBufferVectorPrimitives<basictype>(b,obj,nElements,onFileClass->GetCollectionProxy());
1182 TVirtualVectorIterators iterators(fFunctionCreateIterators);
1183 iterators.CreateIterators(obj);
1184 b.ReadFastArray((basictype*)iterators.fBegin, nElements);
1188 void TGenCollectionStreamer::ReadBufferVectorPrimitivesFloat16(TBuffer &b,
void *obj,
const TClass *onFileClass)
1192 fResize(obj,nElements);
1195 DispatchConvertBufferVectorPrimitives<Float16_t>(b,obj,nElements,onFileClass->GetCollectionProxy());
1197 TVirtualVectorIterators iterators(fFunctionCreateIterators);
1198 iterators.CreateIterators(obj);
1199 b.ReadFastArrayFloat16((Float16_t*)iterators.fBegin, nElements);
1203 void TGenCollectionStreamer::ReadBufferVectorPrimitivesDouble32(TBuffer &b,
void *obj,
const TClass *onFileClass)
1207 fResize(obj,nElements);
1210 DispatchConvertBufferVectorPrimitives<Double32_t>(b,obj,nElements,onFileClass->GetCollectionProxy());
1212 TVirtualVectorIterators iterators(fFunctionCreateIterators);
1213 iterators.CreateIterators(obj);
1214 b.ReadFastArrayDouble32((Double32_t*)iterators.fBegin, nElements);
1220 void TGenCollectionStreamer::ReadBuffer(TBuffer &b,
void *obj,
const TClass *onFileClass)
1225 (this->*fReadBufferFunc)(b,obj,onFileClass);
1228 void TGenCollectionStreamer::ReadBuffer(TBuffer &b,
void *obj)
1233 (this->*fReadBufferFunc)(b,obj,0);
1236 void TGenCollectionStreamer::ReadBufferDefault(TBuffer &b,
void *obj,
const TClass *onFileClass)
1239 fReadBufferFunc = &TGenCollectionStreamer::ReadBufferGeneric;
1242 if ( !fValue.load() ) InitializeEx(kFALSE);
1243 if (!GetFunctionCreateIterators()) {
1244 Fatal(
"TGenCollectionStreamer::ReadBufferDefault",
"No CreateIterators function for %s",fName.c_str());
1246 if (fSTL_type == ROOT::kSTLvector && ( fVal->fCase == kIsFundamental || fVal->fCase == kIsEnum ) )
1249 switch (
int(fVal->fKind)) {
1254 fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<Char_t>;
1257 fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<Short_t>;
1260 fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<Int_t>;
1263 fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<Long_t>;
1266 fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<Long64_t>;
1269 fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<Float_t>;
1272 fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitivesFloat16;
1275 fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<Double_t>;
1278 fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<UChar_t>;
1281 fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<UShort_t>;
1284 fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<UInt_t>;
1287 fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<ULong_t>;
1290 fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitives<ULong64_t>;
1293 fReadBufferFunc = &TGenCollectionStreamer::ReadBufferVectorPrimitivesDouble32;
1302 (this->*fReadBufferFunc)(b,obj,onFileClass);
1305 void TGenCollectionStreamer::ReadBufferGeneric(TBuffer &b,
void *obj,
const TClass *onFileClass)
1307 TVirtualCollectionProxy::TPushPop env(
this, obj);
1312 if (nElements == 0) {
1314 TGenCollectionProxy::Clear(
"force");
1316 }
else if (nElements > 0) {
1317 switch (fSTL_type) {
1318 case ROOT::kSTLbitset:
1320 if (fProperties & kNeedDelete) {
1321 TGenCollectionProxy::Clear(
"force");
1323 fClear.invoke(fEnv);
1326 ReadPrimitives(nElements, b, onFileClass);
1328 case ROOT::kSTLvector:
1330 if (fProperties & kNeedDelete) {
1331 TGenCollectionProxy::Clear(
"force");
1333 else if (fVal->fKind == kBool_t) {
1334 fClear.invoke(fEnv);
1337 switch (fVal->fCase) {
1338 case kIsFundamental:
1340 ReadPrimitives(nElements, b, onFileClass);
1343 ReadObjects(nElements, b, onFileClass);
1347 case ROOT::kSTLlist:
1348 case ROOT::kSTLforwardlist:
1349 case ROOT::kSTLdeque:
1350 case ROOT::kSTLmultiset:
1352 case ROOT::kSTLunorderedset:
1353 case ROOT::kSTLunorderedmultiset:
1355 if (fProperties & kNeedDelete) {
1356 TGenCollectionProxy::Clear(
"force");
1358 fClear.invoke(fEnv);
1361 switch (fVal->fCase) {
1362 case kIsFundamental:
1364 ReadPrimitives(nElements, b, onFileClass);
1367 ReadObjects(nElements, b, onFileClass);
1372 case ROOT::kSTLmultimap:
1373 case ROOT::kSTLunorderedmap:
1374 case ROOT::kSTLunorderedmultimap:
1376 if (fProperties & kNeedDelete) {
1377 TGenCollectionProxy::Clear(
"force");
1379 fClear.invoke(fEnv);
1382 ReadMap(nElements, b, onFileClass);
1388 void TGenCollectionStreamer::Streamer(TBuffer &b)
1391 if (b.IsReading()) {
1394 if (fEnv->fObject) {
1395 TGenCollectionProxy::Clear(
"force");
1397 if (nElements > 0) {
1398 switch (fSTL_type) {
1399 case ROOT::kSTLbitset:
1400 ReadPrimitives(nElements, b, fOnFileClass);
1402 case ROOT::kSTLvector:
1403 case ROOT::kSTLlist:
1404 case ROOT::kSTLdeque:
1405 case ROOT::kSTLmultiset:
1407 case ROOT::kSTLunorderedset:
1408 case ROOT::kSTLunorderedmultiset:
1409 switch (fVal->fCase) {
1410 case kIsFundamental:
1412 ReadPrimitives(nElements, b, fOnFileClass);
1415 ReadObjects(nElements, b, fOnFileClass);
1420 case ROOT::kSTLmultimap:
1421 case ROOT::kSTLunorderedmap:
1422 case ROOT::kSTLunorderedmultimap:
1423 ReadMap(nElements, b, fOnFileClass);
1428 int nElements = fEnv->fObject ? *(
size_t*)fSize.invoke(fEnv) : 0;
1430 if (nElements > 0) {
1431 switch (fSTL_type) {
1432 case ROOT::kSTLbitset:
1433 WritePrimitives(nElements, b);
1435 case ROOT::kSTLvector:
1436 case ROOT::kSTLlist:
1437 case ROOT::kSTLforwardlist:
1438 case ROOT::kSTLdeque:
1439 case ROOT::kSTLmultiset:
1441 case ROOT::kSTLunorderedset:
1442 case ROOT::kSTLunorderedmultiset:
1443 switch (fVal->fCase) {
1444 case kIsFundamental:
1446 WritePrimitives(nElements, b);
1449 WriteObjects(nElements, b);
1454 case ROOT::kSTLmultimap:
1455 case ROOT::kSTLunorderedmap:
1456 case ROOT::kSTLunorderedmultimap:
1457 WriteMap(nElements, b);
1464 void TGenCollectionStreamer::StreamerAsMap(TBuffer &b)
1467 if (b.IsReading()) {
1470 if (fEnv->fObject) {
1471 TGenCollectionProxy::Clear(
"force");
1473 if (nElements > 0) {
1474 switch (fSTL_type) {
1476 case ROOT::kSTLmultimap:
1477 case ROOT::kSTLunorderedmap:
1478 case ROOT::kSTLunorderedmultimap:
1479 ReadMap(nElements, b, fOnFileClass);
1481 case ROOT::kSTLvector:
1482 case ROOT::kSTLlist:
1483 case ROOT::kSTLforwardlist:
1484 case ROOT::kSTLdeque:
1485 case ROOT::kSTLmultiset:
1487 case ROOT::kSTLunorderedset:
1488 case ROOT::kSTLunorderedmultiset:{
1489 ReadPairFromMap(nElements, b);