29 static const Int_t kRegrouped = TStreamerInfo::kOffsetL;
37 using namespace TStreamerInfoActions;
40 # define INLINE_TEMPLATE_ARGS
42 # define INLINE_TEMPLATE_ARGS inline
46 namespace TStreamerInfoActions
48 bool IsDefaultVector(TVirtualCollectionProxy &proxy)
50 const auto props = proxy.GetProperties();
51 const bool isVector = proxy.GetCollectionType() == ROOT::kSTLvector;
52 const bool hasDefaultAlloc = !(props & TVirtualCollectionProxy::kCustomAlloc);
53 const bool isEmulated = props & TVirtualCollectionProxy::kIsEmulated;
55 return isEmulated || (isVector && hasDefaultAlloc);
58 template <
typename From>
59 struct WithFactorMarker {
63 template <
typename From>
64 struct NoFactorMarker {
69 typedef UInt_t Value_t;
72 void TConfiguration::AddToOffset(Int_t delta)
77 if (fOffset != TVirtualStreamerInfo::kMissing)
81 void TConfiguration::SetMissing()
86 fOffset = TVirtualStreamerInfo::kMissing;
89 void TConfiguredAction::PrintDebug(TBuffer &buf,
void *addr)
const
94 if (fConfiguration) fConfiguration->PrintDebug(buf,addr);
97 void TConfiguration::Print()
const
101 TStreamerInfo *info = (TStreamerInfo*)fInfo;
102 TStreamerElement *aElement = fCompInfo->fElem;
103 TString sequenceType;
104 aElement->GetSequenceType(sequenceType);
106 printf(
"StreamerInfoAction, class:%s, name=%s, fType[%d]=%d,"
107 " %s, offset=%d (%s)\n",
108 info->GetClass()->GetName(), aElement->GetName(), fElemId, fCompInfo->fType,
109 aElement->ClassName(), fOffset, sequenceType.Data());
112 void TConfiguration::PrintDebug(TBuffer &buf,
void *addr)
const
118 TStreamerInfo *info = (TStreamerInfo*)fInfo;
119 TStreamerElement *aElement = fCompInfo->fElem;
120 TString sequenceType;
121 aElement->GetSequenceType(sequenceType);
123 printf(
"StreamerInfoAction, class:%s, name=%s, fType[%d]=%d,"
124 " %s, bufpos=%d, arr=%p, offset=%d (%s)\n",
125 info->GetClass()->GetName(), aElement->GetName(), fElemId, fCompInfo->fType,
126 aElement->ClassName(), buf.Length(), addr, fOffset, sequenceType.Data());
130 void TLoopConfiguration::Print()
const
134 printf(
"TLoopConfiguration: unconfigured\n");
138 struct TGenericConfiguration : TConfiguration {
142 TGenericConfiguration(TVirtualStreamerInfo *info, UInt_t
id, TCompInfo_t *compinfo, Int_t offset = 0) : TConfiguration(info,id,compinfo,offset) {};
143 void PrintDebug(TBuffer &,
void *)
const {
147 virtual TConfiguration *Copy() {
return new TGenericConfiguration(*
this); }
150 struct TBitsConfiguration : TConfiguration {
158 TBitsConfiguration(TVirtualStreamerInfo *info, UInt_t
id, TCompInfo_t *compinfo, Int_t offset = 0) : TConfiguration(info,id,compinfo,offset),fObjectOffset(0) {};
159 void PrintDebug(TBuffer &,
void *)
const {
160 TStreamerInfo *info = (TStreamerInfo*)fInfo;
161 TStreamerElement *aElement = fCompInfo->fElem;
162 TString sequenceType;
163 aElement->GetSequenceType(sequenceType);
165 printf(
"StreamerInfoAction, class:%s, name=%s, fType[%d]=%d,"
166 " %s, offset=%d (%s)\n",
167 info->GetClass()->GetName(), aElement->GetName(), fElemId, fCompInfo->fType,
168 aElement->ClassName(), fOffset, sequenceType.Data());
171 void AddToOffset(Int_t delta)
176 if (fOffset != TVirtualStreamerInfo::kMissing)
183 fOffset = TVirtualStreamerInfo::kMissing;
187 virtual TConfiguration *Copy() {
return new TBitsConfiguration(*
this); }
191 Int_t GenericReadAction(TBuffer &buf,
void *addr,
const TConfiguration *config)
193 char *obj = (
char*)addr;
194 TGenericConfiguration *conf = (TGenericConfiguration*)config;
195 return ((TStreamerInfo*)conf->fInfo)->ReadBuffer(buf, &obj, &(conf->fCompInfo), 0, 1, 1, config->fOffset, 2);
198 Int_t GenericWriteAction(TBuffer &buf,
void *addr,
const TConfiguration *config)
200 char *obj = (
char*)addr;
201 TGenericConfiguration *conf = (TGenericConfiguration*)config;
202 return ((TStreamerInfo*)conf->fInfo)->WriteBufferAux(buf, &obj, &(conf->fCompInfo), 0, 1, 1, config->fOffset, 2);
205 template <
typename T>
206 INLINE_TEMPLATE_ARGS Int_t ReadBasicType(TBuffer &buf,
void *addr,
const TConfiguration *config)
208 T *x = (T*)( ((
char*)addr) + config->fOffset );
214 void HandleReferencedTObject(TBuffer &buf,
void *addr,
const TConfiguration *config) {
215 TBitsConfiguration *conf = (TBitsConfiguration*)config;
218 pidf += buf.GetPidOffset();
219 TProcessID *pid = buf.ReadProcessID(pidf);
221 TObject *obj = (TObject*)( ((
char*)addr) + conf->fObjectOffset);
222 UInt_t gpid = pid->GetUniqueID();
225 uid = obj->GetUniqueID() | 0xff000000;
227 uid = ( obj->GetUniqueID() & 0xffffff) + (gpid<<24);
229 obj->SetUniqueID(uid);
230 pid->PutObjectWithID(obj);
235 INLINE_TEMPLATE_ARGS Int_t ReadBasicType<BitsMarker>(TBuffer &buf,
void *addr,
const TConfiguration *config)
237 UInt_t *x = (UInt_t*)( ((
char*)addr) + config->fOffset );
242 if ((*x & kIsReferenced) != 0) {
243 HandleReferencedTObject(buf,addr,config);
248 template <
typename T>
249 INLINE_TEMPLATE_ARGS Int_t WriteBasicType(TBuffer &buf,
void *addr,
const TConfiguration *config)
251 T *x = (T *)(((
char *)addr) + config->fOffset);
257 INLINE_TEMPLATE_ARGS Int_t WriteTextTNamed(TBuffer &buf,
void *addr,
const TConfiguration *config)
259 void *x = (
void *)(((
char *)addr) + config->fOffset);
261 buf.StreamObject(x, TNamed::Class(), TNamed::Class());
265 INLINE_TEMPLATE_ARGS Int_t WriteTextTObject(TBuffer &buf,
void *addr,
const TConfiguration *config)
267 void *x = (
void *)(((
char *)addr) + config->fOffset);
269 buf.StreamObject(x, TObject::Class(), TObject::Class());
273 INLINE_TEMPLATE_ARGS Int_t WriteTextBaseClass(TBuffer &buf,
void *addr,
const TConfiguration *config)
275 void *x = (
void *)(((
char *)addr) + config->fOffset);
277 ((TBufferText *)&buf)->WriteBaseClass(x, (TStreamerBase *)config->fCompInfo->fElem);
281 INLINE_TEMPLATE_ARGS Int_t WriteTextStreamer(TBuffer &buf,
void *addr,
const TConfiguration *config)
283 void *x = (
void *)(((
char *)addr) + config->fOffset);
284 TMemberStreamer *pstreamer = config->fCompInfo->fStreamer;
285 UInt_t pos = buf.WriteVersion(config->fInfo->IsA(), kTRUE);
286 (*pstreamer)(buf, x, config->fCompInfo->fLength);
287 buf.SetByteCount(pos, kTRUE);
291 INLINE_TEMPLATE_ARGS Int_t ReadTextObject(TBuffer &buf,
void *addr,
const TConfiguration *config)
293 void *x = (
void *)(((
char *)addr) + config->fOffset);
294 buf.ReadFastArray(x, config->fCompInfo->fClass, config->fCompInfo->fLength, config->fCompInfo->fStreamer);
298 INLINE_TEMPLATE_ARGS Int_t ReadTextTObject(TBuffer &buf,
void *addr,
const TConfiguration *config)
300 void *x = (
void *)(((
char *)addr) + config->fOffset);
301 buf.StreamObject(x, TObject::Class(), TObject::Class());
305 INLINE_TEMPLATE_ARGS Int_t ReadTextBaseClass(TBuffer &buf,
void *addr,
const TConfiguration *config)
307 void *x = (
void *)(((
char *)addr) + config->fOffset);
309 ((TBufferText *)&buf)->ReadBaseClass(x, (TStreamerBase *)config->fCompInfo->fElem);
313 INLINE_TEMPLATE_ARGS Int_t ReadTextStreamer(TBuffer &buf,
void *addr,
const TConfiguration *config)
315 void *x = (
void *)(((
char *)addr) + config->fOffset);
316 TMemberStreamer *pstreamer = config->fCompInfo->fStreamer;
319 buf.ReadVersion(&start, &count, config->fCompInfo->fClass);
320 (*pstreamer)(buf, x, config->fCompInfo->fLength);
321 buf.CheckByteCount(start, count, config->fCompInfo->fElem->GetFullName());
325 INLINE_TEMPLATE_ARGS Int_t ReadTextTObjectBase(TBuffer &buf,
void *addr,
const TConfiguration *config)
328 void *x = (
void *)(((
char *)addr) + config->fOffset);
329 buf.ReadClassBuffer(TObject::Class(), x, TObject::Class());
333 INLINE_TEMPLATE_ARGS Int_t ReadTextTNamed(TBuffer &buf,
void *addr,
const TConfiguration *config)
335 void *x = (
void *)(((
char *)addr) + config->fOffset);
336 buf.StreamObject(x, TNamed::Class(), TNamed::Class());
342 template<
bool kIsTextT>
343 INLINE_TEMPLATE_ARGS Int_t WriteSTLp(TBuffer &buf,
void *addr,
const TConfiguration *config)
345 TClass *cl = config->fCompInfo->fClass;
346 TMemberStreamer *pstreamer = config->fCompInfo->fStreamer;
347 TVirtualCollectionProxy *proxy = cl->GetCollectionProxy();
348 TClass* vClass = proxy ? proxy->GetValueClass() : 0;
350 UInt_t ioffset = eoffset + config->fOffset;
352 if (!buf.TestBit(TBuffer::kCannotHandleMemberWiseStreaming)
354 && config->fInfo->GetStreamMemberWise()
356 && !(strspn(config->fCompInfo->fElem->GetTitle(),
"||") == 2)
357 && !(vClass->TestBit(TClass::kHasCustomStreamerMember)) ) {
360 UInt_t pos = buf.WriteVersionMemberWise(config->fInfo->IsA(),kTRUE);
361 buf.WriteVersion( vClass, kFALSE );
367 char **contp = (
char **)((
char *)addr + ioffset);
368 for(
int j=0;j<config->fCompInfo->fLength;++j) {
369 char *cont = contp[j];
370 TVirtualCollectionProxy::TPushPop helper( proxy, cont );
371 Int_t nobjects = cont ? proxy->Size() : 0;
378 buf.SetByteCount(pos,kTRUE);
381 UInt_t pos = buf.WriteVersion(config->fInfo->IsA(), kTRUE);
384 buf.WriteFastArray((
void **)((
char *)addr + ioffset), cl, config->fCompInfo->fLength, kFALSE, pstreamer);
385 }
else if (pstreamer ==
nullptr) {
387 char **contp = (
char **)((
char *)addr + ioffset);
388 for (
int j = 0; j < config->fCompInfo->fLength; ++j) {
389 char *cont = contp[j];
390 cl->Streamer(cont, buf);
395 (*pstreamer)(buf, (
char *)addr + ioffset, config->fCompInfo->fLength);
398 buf.SetByteCount(pos, kTRUE);
405 template<
bool kIsTextT>
406 INLINE_TEMPLATE_ARGS Int_t ReadSTLp(TBuffer &buf,
void *addr,
const TConfiguration *config)
408 TClass *cle = config->fCompInfo->fClass;
409 TStreamerElement * aElement = (TStreamerElement*) config->fCompInfo->fElem;
410 TMemberStreamer *pstreamer = config->fCompInfo->fStreamer;
415 UInt_t ioffset = eoffset + config->fOffset;
419 Version_t vers = buf.ReadVersion(&start, &count, cle);
421 if (!kIsTextT && (vers & TBufferFile::kStreamedMemberWise) ) {
424 vers &= ~( TBufferFile::kStreamedMemberWise );
426 TClass *newClass = aElement->GetNewClass();
427 TClass *oldClass = aElement->GetClassPointer();
428 if( vers < 9 && newClass && newClass!=oldClass ) {
429 Error(
"ReadBuffer",
"Unfortunately, version %d of TStreamerInfo (used in %s) did not record enough information to convert a %s into a %s.",
430 vers, buf.GetParent() ? buf.GetParent()->GetName() :
"memory/socket", oldClass->GetName(), newClass->GetName() );
434 Version_t vClVersion = 0;
436 vClVersion = buf.ReadVersionForMemberWise( cle->GetCollectionProxy()->GetValueClass() );
439 TVirtualCollectionProxy *newProxy = (newClass ? newClass->GetCollectionProxy() :
nullptr);
440 TVirtualCollectionProxy *oldProxy = oldClass->GetCollectionProxy();
441 TStreamerInfo *subinfo =
nullptr;
445 subinfo = (TStreamerInfo*)newProxy->GetValueClass()->GetConversionStreamerInfo( oldProxy->GetValueClass(), vClVersion );
447 subinfo = (TStreamerInfo*)oldProxy->GetValueClass()->GetStreamerInfo( vClVersion );
453 void **contp = (
void**)((
char *) addr + ioffset);
454 for(
int j=0;j<config->fCompInfo->fLength;j++) {
455 void *cont = contp[j];
457 contp[j] = cle->New();
460 TVirtualCollectionProxy::TPushPop helper( newProxy, cont );
463 env = newProxy->Allocate(nobjects,
true);
464 subinfo->ReadBufferSTL(buf,newProxy,nobjects, 0, vers>=7 );
465 newProxy->Commit(env);
469 buf.CheckByteCount(start,count,aElement->GetFullName());
475 buf.ReadFastArray((
void **)((
char *)addr + ioffset), cle, config->fCompInfo->fLength, kFALSE, pstreamer);
476 }
else if (pstreamer ==
nullptr) {
478 void **contp = (
void **)((
char *)addr + ioffset);
479 for (
int j = 0; j < config->fCompInfo->fLength; j++) {
480 void *cont = contp[j];
481 if (cont ==
nullptr) {
486 contp[j] = cle->New();
489 cle->Streamer(cont, buf);
493 (*pstreamer)(buf, (
char *)addr + ioffset, config->fCompInfo->fLength);
495 buf.CheckByteCount(start, count, aElement->GetFullName());
502 template<
bool kIsTextT>
503 INLINE_TEMPLATE_ARGS Int_t WriteStreamerLoop(TBuffer &buf,
void *addr,
const TConfiguration *config)
506 UInt_t ioffset = eoffset + config->fOffset;
508 if (!kIsTextT && config->fCompInfo->fStreamer) {
510 TMemberStreamer* pstreamer = config->fCompInfo->fStreamer;
512 UInt_t pos = buf.WriteVersion(config->fInfo->IsA(), kTRUE);
516 Int_t* counter = (Int_t*) ((
char *) addr + eoffset + config->fCompInfo->fMethod );
519 (*pstreamer)(buf, (
char *) addr + ioffset , *counter);
521 buf.SetByteCount(pos, kTRUE);
527 TClass* cl = config->fCompInfo->fClass;
529 Bool_t isPtrPtr = (strstr(config->fCompInfo->fElem->GetTypeName(),
"**") != 0);
532 Int_t fileVersion = kMaxInt;
537 TFile* file = (TFile*) buf.GetParent();
539 fileVersion = file->GetVersion();
543 UInt_t pos = buf.WriteVersion(config->fInfo->IsA(), kTRUE);
544 if (fileVersion > 51508) {
549 Int_t vlen = *((Int_t*) ((
char *) addr + eoffset + config->fCompInfo->fMethod ));
554 char** pp = (
char**) ((
char *) addr + ioffset );
556 for (Int_t ndx = 0; ndx < config->fCompInfo->fLength; ++ndx) {
561 printf(
"WriteStreamerLoop - The pointer to element %s::%s type %d (%s) is null\n", config->fInfo->GetName(), config->fCompInfo->fElem->GetFullName(), config->fCompInfo->fType, config->fCompInfo->fElem->GetTypeName());
568 buf.WriteFastArray(pp[ndx], cl, vlen,
nullptr);
573 buf.WriteFastArray((
void **)pp[ndx], cl, vlen, kFALSE,
nullptr);
579 for (Int_t ndx = 0; ndx < config->fCompInfo->fLength; ++ndx)
580 buf.WriteFastArray((
void *)
nullptr, cl, -1,
nullptr);
589 Int_t vlen = *((Int_t*) ((
char *) addr + eoffset + config->fCompInfo->fMethod ));
593 char** pp = (
char**) ((
char *) addr + ioffset );
596 for (Int_t ndx = 0; ndx < config->fCompInfo->fLength; ++ndx) {
601 printf(
"WriteStreamerLoop - The pointer to element %s::%s type %d (%s) is null\n", config->fInfo->GetName(), config->fCompInfo->fElem->GetFullName(), config->fCompInfo->fType, config->fCompInfo->fElem->GetTypeName());
607 for (Int_t v = 0; v < vlen; ++v) {
609 cl->Streamer(pp[ndx] + (v * cl->Size()), buf);
615 for (Int_t v = 0; v < vlen; ++v) {
617 char** r = (
char**) pp[ndx];
619 cl->Streamer(r[v], buf);
627 buf.SetByteCount(pos, kTRUE);
635 template<
bool kIsTextT>
636 INLINE_TEMPLATE_ARGS Int_t ReadStreamerLoop(TBuffer &buf,
void *addr,
const TConfiguration *config)
639 UInt_t ioffset = eoffset + config->fOffset;
642 TClass* cl = config->fCompInfo->fClass;
645 if (!kIsTextT && config->fCompInfo->fStreamer) {
647 TMemberStreamer* pstreamer = config->fCompInfo->fStreamer;
652 buf.ReadVersion(&start, &count, cl);
656 Int_t* counter = (Int_t*) ((
char *) addr + eoffset + config->fCompInfo->fMethod );
658 (*pstreamer)(buf, (
char *) addr + ioffset , *counter);
661 buf.CheckByteCount(start, count, config->fCompInfo->fElem->GetFullName());
667 Bool_t isPtrPtr = (strstr(config->fCompInfo->fElem->GetTypeName(),
"**") != 0);
670 Int_t fileVersion = kMaxInt;
674 TFile* file = (TFile*) buf.GetParent();
676 fileVersion = file->GetVersion();
682 buf.ReadVersion(&start, &count, cl);
683 if (fileVersion > 51508) {
688 Int_t vlen = *((Int_t *)((
char *)addr + eoffset +
689 config->fCompInfo->fMethod ));
696 char **pp = (
char **)((
char *)addr + ioffset );
703 for (Int_t ndx = 0; ndx < config->fCompInfo->fLength; ++ndx) {
712 cl->DeleteArray(pp[ndx]);
739 buf.ReadFastArray((
void *)
nullptr, cl, -1,
nullptr);
749 pp[ndx] = (
char *)cl->NewArray(vlen);
751 Error(
"ReadBuffer",
"Memory allocation failed!\n");
758 pp[ndx] = (
char *)
new char *[vlen];
760 Error(
"ReadBuffer",
"Memory allocation failed!\n");
764 memset(pp[ndx], 0, vlen *
sizeof(
char *));
769 buf.ReadFastArray(pp[ndx], cl, vlen,
nullptr);
772 buf.ReadFastArray((
void **)pp[ndx], cl, vlen, kFALSE,
nullptr);
781 Int_t vlen = *((Int_t *)((
char *)addr + eoffset +
782 config->fCompInfo->fMethod ));
789 char **pp = (
char **)((
char *)addr + ioffset );
797 for (Int_t ndx = 0; ndx < config->fCompInfo->fLength; ++ndx) {
806 cl->DeleteArray(pp[ndx]);
839 pp[ndx] = (
char *)cl->NewArray(vlen);
841 Error(
"ReadBuffer",
"Memory allocation failed!\n");
848 pp[ndx] = (
char *)
new char *[vlen];
850 Error(
"ReadBuffer",
"Memory allocation failed!\n");
854 memset(pp[ndx], 0, vlen *
sizeof(
char *));
860 for (Int_t v = 0; v < vlen; ++v) {
862 cl->Streamer(pp[ndx] + (v * cl->Size()), buf);
867 char **r = (
char **)pp[ndx];
869 for (Int_t v = 0; v < vlen; ++v) {
871 r[v] = (
char *)cl->New();
878 cl->Streamer(r[v], buf);
884 buf.CheckByteCount(start, count, config->fCompInfo->fElem->GetFullName());
888 class TConfWithFactor :
public TConfiguration {
893 TConfWithFactor(TVirtualStreamerInfo *info, UInt_t
id, TCompInfo_t *compinfo, Int_t offset, Double_t factor, Double_t xmin) : TConfiguration(info,id,compinfo,offset),fFactor(factor),fXmin(xmin) {};
894 virtual TConfiguration *Copy() {
return new TConfWithFactor(*
this); }
897 template <
typename T>
898 INLINE_TEMPLATE_ARGS Int_t ReadBasicType_WithFactor(TBuffer &buf,
void *addr,
const TConfiguration *config)
903 TConfWithFactor *conf = (TConfWithFactor *)config;
904 buf.ReadWithFactor((T*)( ((
char*)addr) + config->fOffset ), conf->fFactor, conf->fXmin);
908 class TConfNoFactor :
public TConfiguration {
912 TConfNoFactor(TVirtualStreamerInfo *info, UInt_t
id, TCompInfo_t *compinfo, Int_t offset, Int_t nbits) : TConfiguration(info,id,compinfo,offset),fNbits(nbits) {};
913 virtual TConfiguration *Copy() {
return new TConfNoFactor(*
this); }
916 template <
typename T>
917 INLINE_TEMPLATE_ARGS Int_t ReadBasicType_NoFactor(TBuffer &buf,
void *addr,
const TConfiguration *config)
921 TConfNoFactor *conf = (TConfNoFactor *)config;
922 Int_t nbits = conf->fNbits;
924 buf.ReadWithNbits( (T*)( ((
char*)addr) + config->fOffset ), nbits );
928 INLINE_TEMPLATE_ARGS Int_t ReadTString(TBuffer &buf,
void *addr,
const TConfiguration *config)
934 ((TString*)(((
char*)addr)+config->fOffset))->TString::Streamer(buf);
938 INLINE_TEMPLATE_ARGS Int_t ReadTObject(TBuffer &buf,
void *addr,
const TConfiguration *config)
944 ((TObject*)(((
char*)addr)+config->fOffset))->TObject::Streamer(buf);
948 INLINE_TEMPLATE_ARGS Int_t ReadTNamed(TBuffer &buf,
void *addr,
const TConfiguration *config)
956 static const TClass *TNamed_cl = TNamed::Class();
957 return buf.ReadClassBuffer(TNamed_cl,(((
char*)addr)+config->fOffset));
960 class TConfigSTL :
public TConfiguration {
964 TVirtualCollectionProxy *proxy = fNewClass->GetCollectionProxy();
966 fCreateIterators = proxy->GetFunctionCreateIterators();
967 fCopyIterator = proxy->GetFunctionCopyIterator();
968 fDeleteIterator = proxy->GetFunctionDeleteIterator();
969 fDeleteTwoIterators = proxy->GetFunctionDeleteTwoIterators();
976 TMemberStreamer *fStreamer;
977 const char *fTypeName;
980 TVirtualCollectionProxy::CreateIterators_t fCreateIterators;
981 TVirtualCollectionProxy::CopyIterator_t fCopyIterator;
982 TVirtualCollectionProxy::DeleteIterator_t fDeleteIterator;
983 TVirtualCollectionProxy::DeleteTwoIterators_t fDeleteTwoIterators;
985 TConfigSTL(TVirtualStreamerInfo *info, UInt_t
id, TCompInfo_t *compinfo, Int_t offset, UInt_t length, TClass *oldClass,
const char *type_name, Bool_t isbase) :
986 TConfiguration(info,id,compinfo,offset,length), fOldClass(oldClass), fNewClass(oldClass), fStreamer(0), fTypeName(type_name), fIsSTLBase(isbase),
987 fCreateIterators(0), fCopyIterator(0), fDeleteIterator(0), fDeleteTwoIterators(0) { Init(); }
989 TConfigSTL(TVirtualStreamerInfo *info, UInt_t
id, TCompInfo_t *compinfo, Int_t offset, UInt_t length, TClass *oldClass, TClass *newClass,
const char *type_name, Bool_t isbase) :
990 TConfiguration(info,id,compinfo,offset,length), fOldClass(oldClass), fNewClass(newClass), fStreamer(0), fTypeName(type_name), fIsSTLBase(isbase),
991 fCreateIterators(0), fCopyIterator(0), fDeleteIterator(0), fDeleteTwoIterators(0) { Init(); }
993 TConfigSTL(TVirtualStreamerInfo *info, UInt_t
id, TCompInfo_t *compinfo, Int_t offset, UInt_t length, TClass *oldClass, TMemberStreamer* streamer,
const char *type_name, Bool_t isbase) :
994 TConfiguration(info,id,compinfo,offset,length), fOldClass(oldClass), fNewClass(oldClass), fStreamer(streamer), fTypeName(type_name), fIsSTLBase(isbase),
995 fCreateIterators(0), fCopyIterator(0), fDeleteIterator(0), fDeleteTwoIterators(0) { Init(); }
997 TConfigSTL(TVirtualStreamerInfo *info, UInt_t
id, TCompInfo_t *compinfo, Int_t offset, UInt_t length, TClass *oldClass, TClass *newClass, TMemberStreamer* streamer,
const char *type_name, Bool_t isbase) :
998 TConfiguration(info,id,compinfo,offset,length), fOldClass(oldClass), fNewClass(newClass), fStreamer(streamer), fTypeName(type_name), fIsSTLBase(isbase),
999 fCreateIterators(0), fCopyIterator(0), fDeleteIterator(0), fDeleteTwoIterators(0) { Init(); }
1001 virtual TConfiguration *Copy() {
return new TConfigSTL(*
this); }
1004 class TConfSTLWithFactor :
public TConfigSTL {
1009 TConfSTLWithFactor(TConfigSTL *orig, Double_t factor, Double_t xmin) : TConfigSTL(*orig),fFactor(factor),fXmin(xmin) {};
1010 virtual TConfiguration *Copy() {
return new TConfSTLWithFactor(*
this); }
1013 class TConfSTLNoFactor :
public TConfigSTL {
1017 TConfSTLNoFactor(TConfigSTL *orig, Int_t nbits) : TConfigSTL(*orig),fNbits(nbits) {};
1018 virtual TConfiguration *Copy() {
return new TConfSTLNoFactor(*
this); }
1021 class TVectorLoopConfig :
public TLoopConfiguration {
1027 TVectorLoopConfig(TVirtualCollectionProxy *proxy, Long_t increment, Bool_t ) : TLoopConfiguration(proxy), fIncrement(increment) {};
1029 virtual ~TVectorLoopConfig() {};
1032 printf(
"TVectorLoopConfig: increment=%ld\n",fIncrement);
1035 void* GetFirstAddress(
void *start,
const void * )
const
1042 virtual TLoopConfiguration* Copy()
const {
return new TVectorLoopConfig(*
this); }
1045 class TAssocLoopConfig :
public TLoopConfiguration {
1048 TAssocLoopConfig(TVirtualCollectionProxy *proxy, Bool_t ) : TLoopConfiguration(proxy) {};
1050 virtual ~TAssocLoopConfig() {};
1053 printf(
"TAssocLoopConfig: proxy=%s\n",fProxy->GetCollectionClass()->GetName());
1055 virtual TLoopConfiguration* Copy()
const {
return new TAssocLoopConfig(*
this); }
1057 void* GetFirstAddress(
void *start,
const void * )
const
1072 class TGenericLoopConfig :
public TLoopConfiguration {
1075 void Init(Bool_t read) {
1077 if (fProxy->HasPointers()) {
1078 fNext = TVirtualCollectionPtrIterators::Next;
1079 fCopyIterator = TVirtualCollectionPtrIterators::CopyIterator;
1080 fDeleteIterator = TVirtualCollectionPtrIterators::DeleteIterator;
1082 fNext = fProxy->GetFunctionNext(read);
1083 fCopyIterator = fProxy->GetFunctionCopyIterator(read);
1084 fDeleteIterator = fProxy->GetFunctionDeleteIterator(read);
1089 TVirtualCollectionProxy::Next_t fNext;
1090 TVirtualCollectionProxy::CopyIterator_t fCopyIterator;
1091 TVirtualCollectionProxy::DeleteIterator_t fDeleteIterator;
1093 TGenericLoopConfig(TVirtualCollectionProxy *proxy, Bool_t read) : TLoopConfiguration(proxy), fNext(0), fCopyIterator(0), fDeleteIterator(0)
1097 virtual ~TGenericLoopConfig() {};
1100 printf(
"TGenericLoopConfig: proxy=%s\n",fProxy->GetCollectionClass()->GetName());
1102 virtual TLoopConfiguration* Copy()
const {
return new TGenericLoopConfig(*
this); }
1104 void* GetFirstAddress(
void *start_collection,
const void *end_collection)
const
1108 char iterator[TVirtualCollectionProxy::fgIteratorArenaSize];
1109 void *iter = fCopyIterator(&iterator,start_collection);
1110 void *arr0 = fNext(iter,end_collection);
1111 if (iter != &iterator[0]) {
1112 fDeleteIterator(iter);
1118 INLINE_TEMPLATE_ARGS
void ReadSTLMemberWiseSameClass(TBuffer &buf,
void *addr,
const TConfiguration *conf, Version_t vers)
1122 TConfigSTL *config = (TConfigSTL*)conf;
1123 vers &= ~( TBufferFile::kStreamedMemberWise );
1127 TClass *oldClass = config->fOldClass;
1129 TVirtualCollectionProxy *oldProxy = oldClass->GetCollectionProxy();
1134 TClass *valueClass = oldProxy->GetValueClass();
1135 Version_t vClVersion = buf.ReadVersionForMemberWise( valueClass );
1137 TVirtualCollectionProxy::TPushPop helper( oldProxy, (
char*)addr );
1139 buf.ReadInt(nobjects);
1140 void* alternative = oldProxy->Allocate(nobjects,
true);
1142 TActionSequence *actions = oldProxy->GetReadMemberWiseActions( vClVersion );
1144 char startbuf[TVirtualCollectionProxy::fgIteratorArenaSize];
1145 char endbuf[TVirtualCollectionProxy::fgIteratorArenaSize];
1146 void *begin = &(startbuf[0]);
1147 void *end = &(endbuf[0]);
1148 config->fCreateIterators(alternative, &begin, &end, oldProxy);
1151 buf.ApplySequence(*actions, begin, end);
1152 if (begin != &(startbuf[0])) {
1154 config->fDeleteTwoIterators(begin,end);
1157 oldProxy->Commit(alternative);
1161 TClass *oldClass = config->fOldClass;
1163 TVirtualCollectionProxy *oldProxy = oldClass->GetCollectionProxy();
1169 TVirtualCollectionProxy::TPushPop helper( oldProxy, (
char*)addr );
1171 buf.ReadInt(nobjects);
1172 void* env = oldProxy->Allocate(nobjects,
true);
1174 if (nobjects || vers < 7 ) {
1176 TStreamerInfo *subinfo = (TStreamerInfo*)oldProxy->GetValueClass()->GetStreamerInfo( 0 );
1178 subinfo->ReadBufferSTL(buf, oldProxy, nobjects, 0, kFALSE);
1180 oldProxy->Commit(env);
1184 INLINE_TEMPLATE_ARGS
void ReadArraySTLMemberWiseSameClass(TBuffer &buf,
void *addr,
const TConfiguration *conf, Version_t vers)
1188 TConfigSTL *config = (TConfigSTL*)conf;
1189 vers &= ~( TBufferFile::kStreamedMemberWise );
1193 TClass *oldClass = config->fOldClass;
1195 TVirtualCollectionProxy *oldProxy = oldClass->GetCollectionProxy();
1200 TClass *valueClass = oldProxy->GetValueClass();
1201 Version_t vClVersion = buf.ReadVersionForMemberWise( valueClass );
1203 TActionSequence *actions = oldProxy->GetReadMemberWiseActions( vClVersion );
1205 int objectSize = oldClass->Size();
1206 char *obj = (
char*)addr;
1207 char *endobj = obj + conf->fLength*objectSize;
1209 for(; obj<endobj; obj+=objectSize) {
1211 buf.ReadInt(nobjects);
1212 TVirtualCollectionProxy::TPushPop helper( oldProxy, (
char*)obj );
1213 void* alternative = oldProxy->Allocate(nobjects,
true);
1215 char startbuf[TVirtualCollectionProxy::fgIteratorArenaSize];
1216 char endbuf[TVirtualCollectionProxy::fgIteratorArenaSize];
1217 void *begin = &(startbuf[0]);
1218 void *end = &(endbuf[0]);
1219 config->fCreateIterators(alternative, &begin, &end, oldProxy);
1222 buf.ApplySequence(*actions, begin, end);
1223 if (begin != &(startbuf[0])) {
1225 config->fDeleteTwoIterators(begin,end);
1228 oldProxy->Commit(alternative);
1233 TClass *oldClass = config->fOldClass;
1235 TVirtualCollectionProxy *oldProxy = oldClass->GetCollectionProxy();
1241 int objectSize = oldClass->Size();
1242 char *obj = (
char*)addr;
1243 char *endobj = obj + conf->fLength*objectSize;
1245 for(; obj<endobj; obj+=objectSize) {
1246 TVirtualCollectionProxy::TPushPop helper( oldProxy, (
char*)obj );
1248 buf.ReadInt(nobjects);
1249 void* env = oldProxy->Allocate(nobjects,
true);
1251 if (nobjects || vers < 7 ) {
1253 TStreamerInfo *subinfo = (TStreamerInfo*)oldProxy->GetValueClass()->GetStreamerInfo( 0 );
1255 subinfo->ReadBufferSTL(buf, oldProxy, nobjects, 0, kFALSE);
1257 oldProxy->Commit(env);
1262 INLINE_TEMPLATE_ARGS
void ReadSTLMemberWiseChangedClass(TBuffer &buf,
void *addr,
const TConfiguration *conf, Version_t vers)
1266 TConfigSTL *config = (TConfigSTL*)conf;
1268 vers &= ~( TBufferFile::kStreamedMemberWise );
1270 TClass *newClass = config->fNewClass;
1271 TClass *oldClass = config->fOldClass;
1274 Error(
"ReadSTLMemberWiseChangedClass",
"Unfortunately, version %d of TStreamerInfo (used in %s) did not record enough information to convert a %s into a %s.",
1275 vers, buf.GetParent() ? buf.GetParent()->GetName() :
"memory/socket", oldClass->GetName(), newClass->GetName() );
1278 Version_t vClVersion = buf.ReadVersionForMemberWise( oldClass->GetCollectionProxy()->GetValueClass() );
1280 TVirtualCollectionProxy *newProxy = newClass->GetCollectionProxy();
1281 TVirtualCollectionProxy *oldProxy = oldClass->GetCollectionProxy();
1283 TVirtualCollectionProxy::TPushPop helper( newProxy, (
char*)addr );
1285 buf.ReadInt(nobjects);
1286 void* alternative = newProxy->Allocate(nobjects,
true);
1288 TActionSequence *actions = newProxy->GetConversionReadMemberWiseActions( oldProxy->GetValueClass(), vClVersion );
1289 char startbuf[TVirtualCollectionProxy::fgIteratorArenaSize];
1290 char endbuf[TVirtualCollectionProxy::fgIteratorArenaSize];
1291 void *begin = &(startbuf[0]);
1292 void *end = &(endbuf[0]);
1293 config->fCreateIterators( alternative, &begin, &end, newProxy);
1296 buf.ApplySequence(*actions, begin, end);
1297 if (begin != &(startbuf[0])) {
1299 config->fDeleteTwoIterators(begin,end);
1302 newProxy->Commit(alternative);
1306 INLINE_TEMPLATE_ARGS
void ReadArraySTLMemberWiseChangedClass(TBuffer &buf,
void *addr,
const TConfiguration *conf, Version_t vers)
1310 TConfigSTL *config = (TConfigSTL*)conf;
1312 vers &= ~( TBufferFile::kStreamedMemberWise );
1314 TClass *newClass = config->fNewClass;
1315 TClass *oldClass = config->fOldClass;
1318 Error(
"ReadSTLMemberWiseChangedClass",
"Unfortunately, version %d of TStreamerInfo (used in %s) did not record enough information to convert a %s into a %s.",
1319 vers, buf.GetParent() ? buf.GetParent()->GetName() :
"memory/socket", oldClass->GetName(), newClass->GetName() );
1322 Version_t vClVersion = buf.ReadVersionForMemberWise( oldClass->GetCollectionProxy()->GetValueClass() );
1324 TVirtualCollectionProxy *newProxy = newClass->GetCollectionProxy();
1325 TVirtualCollectionProxy *oldProxy = oldClass->GetCollectionProxy();
1327 int objectSize = newClass->Size();
1328 char *obj = (
char*)addr;
1329 char *endobj = obj + conf->fLength*objectSize;
1331 for(; obj<endobj; obj+=objectSize) {
1332 TVirtualCollectionProxy::TPushPop helper( newProxy, (
char*)obj );
1334 buf.ReadInt(nobjects);
1335 void* alternative = newProxy->Allocate(nobjects,
true);
1337 TActionSequence *actions = newProxy->GetConversionReadMemberWiseActions( oldProxy->GetValueClass(), vClVersion );
1338 char startbuf[TVirtualCollectionProxy::fgIteratorArenaSize];
1339 char endbuf[TVirtualCollectionProxy::fgIteratorArenaSize];
1340 void *begin = &(startbuf[0]);
1341 void *end = &(endbuf[0]);
1342 config->fCreateIterators( alternative, &begin, &end, newProxy);
1345 buf.ApplySequence(*actions, begin, end);
1346 if (begin != &(startbuf[0])) {
1348 config->fDeleteTwoIterators(begin,end);
1351 newProxy->Commit(alternative);
1357 INLINE_TEMPLATE_ARGS
void ReadSTLObjectWiseFastArray(TBuffer &buf,
void *addr,
const TConfiguration *conf, Version_t , UInt_t )
1359 TConfigSTL *config = (TConfigSTL*)conf;
1361 buf.ReadFastArray(addr,config->fNewClass,conf->fLength,(TMemberStreamer*)0,config->fOldClass);
1363 INLINE_TEMPLATE_ARGS
void ReadSTLObjectWiseStreamer(TBuffer &buf,
void *addr,
const TConfiguration *conf, Version_t , UInt_t )
1365 TConfigSTL *config = (TConfigSTL*)conf;
1366 (*config->fStreamer)(buf,addr,conf->fLength);
1368 INLINE_TEMPLATE_ARGS
void ReadSTLObjectWiseFastArrayV2(TBuffer &buf,
void *addr,
const TConfiguration *conf, Version_t vers, UInt_t start)
1372 TConfigSTL *config = (TConfigSTL*)conf;
1375 if (config->fIsSTLBase || vers == 0) {
1376 buf.SetBufferOffset(start);
1379 buf.ReadFastArray(addr,config->fNewClass,conf->fLength,(TMemberStreamer*)0,config->fOldClass);
1381 INLINE_TEMPLATE_ARGS
void ReadSTLObjectWiseStreamerV2(TBuffer &buf,
void *addr,
const TConfiguration *conf, Version_t vers, UInt_t start)
1385 TConfigSTL *config = (TConfigSTL*)conf;
1388 if (config->fIsSTLBase || vers == 0) {
1389 buf.SetBufferOffset(start);
1391 (*config->fStreamer)(buf,addr,conf->fLength);
1394 template <void (*memberwise)(TBuffer&,
void *,
const TConfiguration*, Version_t),
1395 void (*objectwise)(TBuffer&,
void *,
const TConfiguration*, Version_t, UInt_t)>
1396 INLINE_TEMPLATE_ARGS Int_t ReadSTL(TBuffer &buf,
void *addr,
const TConfiguration *conf)
1398 TConfigSTL *config = (TConfigSTL*)conf;
1399 UInt_t start, count;
1400 Version_t vers = buf.ReadVersion(&start, &count, config->fOldClass);
1401 if ( vers & TBufferFile::kStreamedMemberWise ) {
1402 memberwise(buf,((
char*)addr)+config->fOffset,config, vers);
1404 objectwise(buf,((
char*)addr)+config->fOffset,config, vers, start);
1406 buf.CheckByteCount(start,count,config->fTypeName);
1410 template <
typename From,
typename To>
1411 struct ConvertBasicType {
1412 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *addr,
const TConfiguration *config)
1417 *(To*)( ((
char*)addr) + config->fOffset ) = (To)temp;
1422 template <
typename To>
1423 struct ConvertBasicType<BitsMarker,To> {
1424 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *addr,
const TConfiguration *config)
1430 if ((temp & kIsReferenced) != 0) {
1431 HandleReferencedTObject(buf,addr,config);
1434 *(To*)( ((
char*)addr) + config->fOffset ) = (To)temp;
1439 template <
typename From,
typename To>
1440 struct ConvertBasicType<WithFactorMarker<From>,To> {
1441 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *addr,
const TConfiguration *config)
1444 TConfWithFactor *conf = (TConfWithFactor *)config;
1446 buf.ReadWithFactor(&temp, conf->fFactor, conf->fXmin);
1447 *(To*)( ((
char*)addr) + config->fOffset ) = (To)temp;
1452 template <
typename From,
typename To>
1453 struct ConvertBasicType<NoFactorMarker<From>,To> {
1454 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *addr,
const TConfiguration *config)
1457 TConfNoFactor *conf = (TConfNoFactor *)config;
1459 buf.ReadWithNbits(&temp, conf->fNbits);
1460 *(To*)( ((
char*)addr) + config->fOffset ) = (To)temp;
1465 class TConfigurationPushDataCache :
public TConfiguration {
1468 TVirtualArray *fOnfileObject;
1470 TConfigurationPushDataCache(TVirtualStreamerInfo *info, TVirtualArray *onfileObject, Int_t offset) :
1471 TConfiguration(info, -1, nullptr, offset), fOnfileObject(onfileObject)
1474 virtual void Print()
const {
1475 TStreamerInfo *info = (TStreamerInfo*)fInfo;
1477 printf(
"StreamerInfoAction, class:%s, PushDataCache offset=%d\n",
1478 info->GetClass()->GetName(), fOffset);
1480 printf(
"StreamerInfoAction, class:%s, PopDataCache offset=%d\n",
1481 info->GetClass()->GetName(), fOffset);
1483 virtual void PrintDebug(TBuffer &buffer,
void *
object)
const {
1485 TStreamerInfo *info = (TStreamerInfo*)fInfo;
1486 printf(
"StreamerInfoAction, class:%s, %sDataCache, bufpos=%d, arr=%p, offset=%d, onfileObject=%p\n",
1487 info->GetClass()->GetName(), fOnfileObject ?
"Push" :
"Pop", buffer.Length(), object, fOffset, fOnfileObject);
1493 Int_t PushDataCache(TBuffer &b,
void *,
const TConfiguration *conf)
1495 TConfigurationPushDataCache *config = (TConfigurationPushDataCache*)conf;
1496 auto onfileObject = config->fOnfileObject;
1499 b.PushDataCache( onfileObject );
1504 Int_t PushDataCacheGenericCollection(TBuffer &b,
void *,
const void *,
const TLoopConfiguration *loopconfig,
const TConfiguration *conf)
1506 TConfigurationPushDataCache *config = (TConfigurationPushDataCache*)conf;
1507 auto onfileObject = config->fOnfileObject;
1509 TVirtualCollectionProxy *proxy = ((TGenericLoopConfig*)loopconfig)->fProxy;
1510 UInt_t n = proxy->Size();
1512 onfileObject->SetSize(n);
1513 b.PushDataCache( onfileObject );
1518 Int_t PopDataCache(TBuffer &b,
void *,
const TConfiguration *)
1524 Int_t PopDataCacheGenericCollection(TBuffer &b,
void *,
const void *,
const TLoopConfiguration *,
const TConfiguration *)
1530 class TConfigurationUseCache :
public TConfiguration {
1533 TConfiguredAction fAction;
1536 TConfigurationUseCache(TVirtualStreamerInfo *info, TConfiguredAction &action, Bool_t repeat) :
1537 TConfiguration(info,action.fConfiguration->fElemId,action.fConfiguration->fCompInfo,action.fConfiguration->fOffset),fAction(action),fNeedRepeat(repeat) {};
1538 virtual void PrintDebug(TBuffer &b,
void *addr)
const
1542 TStreamerInfo *info = (TStreamerInfo*)fInfo;
1543 TStreamerElement *aElement = fCompInfo->fElem;
1544 fprintf(stdout,
"StreamerInfoAction, class:%s, name=%s, fType[%d]=%d,"
1545 " %s, bufpos=%d, arr=%p, eoffset=%d, Redirect=%p\n",
1546 info->GetClass()->GetName(),aElement->GetName(),fElemId,fCompInfo->fType,
1547 aElement->ClassName(),b.Length(),addr, 0,b.PeekDataCache() ? b.PeekDataCache()->GetObjectAt(0) : 0);
1551 virtual ~TConfigurationUseCache() {};
1552 virtual TConfiguration *Copy() {
1553 TConfigurationUseCache *copy =
new TConfigurationUseCache(*
this);
1554 fAction.fConfiguration = copy->fAction.fConfiguration->Copy();
1559 INLINE_TEMPLATE_ARGS Int_t UseCache(TBuffer &b,
void *addr,
const TConfiguration *conf)
1561 TConfigurationUseCache *config = (TConfigurationUseCache*)conf;
1563 Int_t bufpos = b.Length();
1564 TVirtualArray *cached = b.PeekDataCache();
1566 TStreamerElement *aElement = conf->fCompInfo->fElem;
1567 TStreamerInfo *info = (TStreamerInfo*)conf->fInfo;
1568 Warning(
"ReadBuffer",
"Skipping %s::%s because the cache is missing.",info->GetName(),aElement->GetName());
1569 char *ptr = (
char*)addr;
1570 info->ReadBufferSkip(b,&ptr,config->fCompInfo,config->fCompInfo->fType+TStreamerInfo::kSkip,aElement,1,0);
1572 config->fAction(b, (*cached)[0]);
1575 if (config->fNeedRepeat) {
1576 b.SetBufferOffset(bufpos);
1581 INLINE_TEMPLATE_ARGS Int_t UseCacheVectorPtrLoop(TBuffer &b,
void *start,
const void *end,
const TConfiguration *conf)
1583 TConfigurationUseCache *config = (TConfigurationUseCache*)conf;
1584 Int_t bufpos = b.Length();
1586 TVirtualArray *cached = b.PeekDataCache();
1588 TStreamerElement *aElement = config->fCompInfo->fElem;
1589 TStreamerInfo *info = (TStreamerInfo*)config->fInfo;
1590 Warning(
"ReadBuffer",
"Skipping %s::%s because the cache is missing.",info->GetName(),aElement->GetName());
1591 char *ptr = (
char*)start;
1592 UInt_t n = (((
void**)end)-((
void**)start));
1593 info->ReadBufferSkip(b,&ptr,config->fCompInfo,conf->fCompInfo->fType+TStreamerInfo::kSkip,aElement,n,0);
1595 TVectorLoopConfig cached_config(
nullptr, cached->fClass->Size(), kTRUE );
1596 void *cached_start = (*cached)[0];
1597 void *cached_end = ((
char*)cached_start) + cached->fSize * cached_config.fIncrement;
1598 config->fAction(b,cached_start,cached_end,&cached_config);
1601 if (config->fNeedRepeat) {
1602 b.SetBufferOffset(bufpos);
1607 INLINE_TEMPLATE_ARGS Int_t UseCacheVectorLoop(TBuffer &b,
void *start,
const void *end,
const TLoopConfiguration *loopconf,
const TConfiguration *conf)
1609 TConfigurationUseCache *config = (TConfigurationUseCache*)conf;
1611 Int_t bufpos = b.Length();
1612 TVirtualArray *cached = b.PeekDataCache();
1614 TStreamerElement *aElement = config->fCompInfo->fElem;
1615 TStreamerInfo *info = (TStreamerInfo*)config->fInfo;
1616 Warning(
"ReadBuffer",
"Skipping %s::%s because the cache is missing.",info->GetName(),aElement->GetName());
1617 char *ptr = (
char*)start;
1618 UInt_t n = (((
char*)end)-((
char*)start))/((TVectorLoopConfig*)loopconf)->fIncrement;
1619 info->ReadBufferSkip(b,&ptr,config->fCompInfo,config->fCompInfo->fType+TStreamerInfo::kSkip,aElement,n,0);
1621 TVectorLoopConfig cached_config(
nullptr, cached->fClass->Size(), kTRUE );
1622 void *cached_start = (*cached)[0];
1623 void *cached_end = ((
char*)cached_start) + cached->fSize * cached_config.fIncrement;
1624 config->fAction(b,cached_start,cached_end,&cached_config);
1627 if (config->fNeedRepeat) {
1628 b.SetBufferOffset(bufpos);
1633 INLINE_TEMPLATE_ARGS Int_t UseCacheGenericCollection(TBuffer &b,
void *,
const void *,
const TLoopConfiguration *loopconfig,
const TConfiguration *conf)
1635 TConfigurationUseCache *config = (TConfigurationUseCache*)conf;
1637 Int_t bufpos = b.Length();
1638 TVirtualArray *cached = b.PeekDataCache();
1640 TStreamerElement *aElement = config->fCompInfo->fElem;
1641 TStreamerInfo *info = (TStreamerInfo*)config->fInfo;
1643 TVirtualCollectionProxy *proxy = ((TGenericLoopConfig*)loopconfig)->fProxy;
1644 Warning(
"ReadBuffer",
"Skipping %s::%s because the cache is missing.",info->GetName(),aElement->GetName());
1645 UInt_t n = proxy->Size();
1646 info->ReadBufferSkip(b, *proxy,config->fCompInfo,config->fCompInfo->fType+TStreamerInfo::kSkip,aElement,n,0);
1648 TVectorLoopConfig cached_config(
nullptr, cached->fClass->Size(), kTRUE );
1649 void *cached_start = (*cached)[0];
1650 void *cached_end = ((
char*)cached_start) + cached->fSize * cached_config.fIncrement;
1651 config->fAction(b,cached_start,cached_end,&cached_config);
1654 if (config->fNeedRepeat) {
1655 b.SetBufferOffset(bufpos);
1662 Int_t ReadLoopInvalid(TBuffer &,
void *,
const void *,
const TConfiguration *config)
1664 Fatal(
"ApplySequence",
"The sequence of actions to read %s:%d member-wise was not initialized.",config->fInfo->GetName(),config->fInfo->GetClassVersion());
1668 Int_t WriteLoopInvalid(TBuffer &,
void *,
const void *,
const TConfiguration *config)
1670 Fatal(
"ApplySequence",
"The sequence of actions to write %s:%d member-wise was not initialized.",config->fInfo->GetName(),config->fInfo->GetClassVersion());
1674 enum ESelectLooper { kVectorLooper, kVectorPtrLooper, kAssociativeLooper, kGenericLooper };
1676 ESelectLooper SelectLooper(TVirtualCollectionProxy &proxy)
1678 if ( (proxy.GetCollectionType() == ROOT::kSTLvector) || (proxy.GetProperties() & TVirtualCollectionProxy::kIsEmulated) ) {
1679 if (proxy.GetProperties() & TVirtualCollectionProxy::kCustomAlloc)
1680 return kGenericLooper;
1682 return kVectorLooper;
1683 }
else if (proxy.GetCollectionType() == ROOT::kSTLset || proxy.GetCollectionType() == ROOT::kSTLunorderedset
1684 || proxy.GetCollectionType() == ROOT::kSTLmultiset || proxy.GetCollectionType() == ROOT::kSTLunorderedmultiset
1685 || proxy.GetCollectionType() == ROOT::kSTLmap || proxy.GetCollectionType() == ROOT::kSTLmultimap
1686 || proxy.GetCollectionType() == ROOT::kSTLunorderedmap || proxy.GetCollectionType() == ROOT::kSTLunorderedmultimap
1687 || proxy.GetCollectionType() == ROOT::kSTLbitset) {
1688 return kAssociativeLooper;
1690 return kGenericLooper;
1694 struct VectorLooper {
1696 template <
typename T>
1697 static INLINE_TEMPLATE_ARGS Int_t ReadBasicType(TBuffer &buf,
void *iter,
const void *end,
const TLoopConfiguration *loopconfig,
const TConfiguration *config)
1699 const Int_t incr = ((TVectorLoopConfig*)loopconfig)->fIncrement;
1700 iter = (
char*)iter + config->fOffset;
1701 end = (
char*)end + config->fOffset;
1702 for(; iter != end; iter = (
char*)iter + incr ) {
1703 T *x = (T*) ((
char*) iter);
1709 template <
typename From,
typename To>
1710 struct ConvertBasicType {
1711 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *iter,
const void *end,
const TLoopConfiguration *loopconfig,
const TConfiguration *config)
1715 const Int_t incr = ((TVectorLoopConfig*)loopconfig)->fIncrement;
1716 iter = (
char*)iter + config->fOffset;
1717 end = (
char*)end + config->fOffset;
1718 for(; iter != end; iter = (
char*)iter + incr ) {
1720 *(To*)( ((
char*)iter) ) = (To)temp;
1726 template <
typename To>
1727 struct ConvertBasicType<BitsMarker,To> {
1728 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *iter,
const void *end,
const TLoopConfiguration *loopconfig,
const TConfiguration *config)
1732 const Int_t incr = ((TVectorLoopConfig*)loopconfig)->fIncrement;
1733 iter = (
char*)iter + config->fOffset;
1734 end = (
char*)end + config->fOffset;
1735 for(; iter != end; iter = (
char*)iter + incr ) {
1738 if ((temp & kIsReferenced) != 0) {
1739 HandleReferencedTObject(buf, (
char*)iter - config->fOffset, config);
1742 *(To*)( ((
char*)iter) ) = (To)temp;
1748 template <
typename From,
typename To>
1749 struct ConvertBasicType<WithFactorMarker<From>,To> {
1750 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *iter,
const void *end,
const TLoopConfiguration *loopconfig,
const TConfiguration *config)
1753 TConfWithFactor *conf = (TConfWithFactor *)config;
1755 const Int_t incr = ((TVectorLoopConfig*)loopconfig)->fIncrement;
1756 iter = (
char*)iter + config->fOffset;
1757 end = (
char*)end + config->fOffset;
1758 for(; iter != end; iter = (
char*)iter + incr ) {
1759 buf.ReadWithFactor(&temp, conf->fFactor, conf->fXmin);
1760 *(To*)( ((
char*)iter) ) = (To)temp;
1766 template <
typename From,
typename To>
1767 struct ConvertBasicType<NoFactorMarker<From>,To> {
1768 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *iter,
const void *end,
const TLoopConfiguration *loopconfig,
const TConfiguration *config)
1771 TConfNoFactor *conf = (TConfNoFactor *)config;
1773 const Int_t incr = ((TVectorLoopConfig*)loopconfig)->fIncrement;
1774 iter = (
char*)iter + config->fOffset;
1775 end = (
char*)end + config->fOffset;
1776 for(; iter != end; iter = (
char*)iter + incr ) {
1777 buf.ReadWithNbits(&temp, conf->fNbits);
1778 *(To*)( ((
char*)iter) ) = (To)temp;
1784 template <
typename T>
1785 static INLINE_TEMPLATE_ARGS Int_t WriteBasicType(TBuffer &buf,
void *iter,
const void *end,
const TLoopConfiguration *loopconfig,
const TConfiguration *config)
1787 const Int_t incr = ((TVectorLoopConfig*)loopconfig)->fIncrement;
1788 iter = (
char*)iter + config->fOffset;
1789 end = (
char*)end + config->fOffset;
1790 for(; iter != end; iter = (
char*)iter + incr ) {
1791 T *x = (T*) ((
char*) iter);
1797 template <Int_t (*iter_action)(TBuffer&,
void *,const TConfiguration*)>
1798 static INLINE_TEMPLATE_ARGS Int_t ReadAction(TBuffer &buf,
void *start,
const void *end,
const TLoopConfiguration *loopconfig,
const TConfiguration *config)
1800 const Int_t incr = ((TVectorLoopConfig*)loopconfig)->fIncrement;
1803 for(
void *iter = start; iter != end; iter = (
char*)iter + incr ) {
1804 iter_action(buf, iter, config);
1809 static INLINE_TEMPLATE_ARGS Int_t ReadBase(TBuffer &buf,
void *start,
const void *end,
const TLoopConfiguration * loopconfig,
const TConfiguration *config)
1814 UInt_t incr = ((TVectorLoopConfig*)loopconfig)->fIncrement;
1815 UInt_t n = (((
char*)end)-((
char*)start))/incr;
1816 char **arrptr =
new char*[n];
1818 for(
void *iter = start; iter != end; iter = (
char*)iter + incr, ++i ) {
1819 arrptr[i] = (
char*)iter;
1821 ((TStreamerInfo*)config->fInfo)->ReadBuffer(buf, arrptr, &(config->fCompInfo), 0, 1, n, config->fOffset, 1|2 );
1847 static INLINE_TEMPLATE_ARGS Int_t GenericRead(TBuffer &buf,
void *start,
const void *end,
const TLoopConfiguration * loopconfig,
const TConfiguration *config)
1851 UInt_t incr = ((TVectorLoopConfig*)loopconfig)->fIncrement;
1852 UInt_t n = (((
char*)end)-((
char*)start))/incr;
1853 char **arrptr =
new char*[n];
1855 for(
void *iter = start; iter != end; iter = (
char*)iter + incr, ++i ) {
1856 arrptr[i] = (
char*)iter;
1858 ((TStreamerInfo*)config->fInfo)->ReadBuffer(buf, arrptr, &(config->fCompInfo), 0, 1, n, config->fOffset, 1|2 );
1863 static INLINE_TEMPLATE_ARGS Int_t GenericWrite(TBuffer &buf,
void *start,
const void *end,
const TLoopConfiguration * loopconfig,
const TConfiguration *config)
1867 UInt_t incr = ((TVectorLoopConfig*)loopconfig)->fIncrement;
1868 UInt_t n = (((
char*)end)-((
char*)start))/incr;
1869 char **arrptr =
new char*[n];
1871 for(
void *iter = start; iter != end; iter = (
char*)iter + incr, ++i ) {
1872 arrptr[i] = (
char*)iter;
1874 ((TStreamerInfo*)config->fInfo)->WriteBufferAux(buf, arrptr, &(config->fCompInfo), 0, 1, n, config->fOffset, 1|2 );
1879 template <
typename T>
1880 static INLINE_TEMPLATE_ARGS Int_t ReadCollectionBasicType(TBuffer &buf,
void *addr,
const TConfiguration *conf)
1884 TConfigSTL *config = (TConfigSTL*)conf;
1885 UInt_t start, count;
1886 buf.ReadVersion(&start, &count, config->fOldClass);
1888 std::vector<T> *
const vec = (std::vector<T>*)(((
char*)addr)+config->fOffset);
1890 buf.ReadInt(nvalues);
1891 vec->resize(nvalues);
1893 #ifdef R__VISUAL_CPLUSPLUS
1895 buf.CheckByteCount(start,count,config->fTypeName);
1899 T *begin = &(*vec->begin());
1900 buf.ReadFastArray(begin, nvalues);
1902 buf.CheckByteCount(start,count,config->fTypeName);
1906 static INLINE_TEMPLATE_ARGS Int_t ReadCollectionBool(TBuffer &buf,
void *addr,
const TConfiguration *conf)
1910 TConfigSTL *config = (TConfigSTL*)conf;
1911 UInt_t start, count;
1912 buf.ReadVersion(&start, &count, config->fOldClass);
1914 std::vector<bool> *
const vec = (std::vector<bool>*)(((
char*)addr)+config->fOffset);
1916 buf.ReadInt(nvalues);
1917 vec->resize(nvalues);
1919 bool *items =
new bool[nvalues];
1920 buf.ReadFastArray(items, nvalues);
1921 for(Int_t i = 0 ; i < nvalues; ++i) {
1922 (*vec)[i] = items[i];
1933 buf.CheckByteCount(start,count,config->fTypeName);
1937 static INLINE_TEMPLATE_ARGS Int_t ReadCollectionFloat16(TBuffer &buf,
void *addr,
const TConfiguration *conf)
1941 TConfigSTL *config = (TConfigSTL*)conf;
1942 UInt_t start, count;
1943 buf.ReadVersion(&start, &count, config->fOldClass);
1945 std::vector<float> *
const vec = (std::vector<float>*)(((
char*)addr)+config->fOffset);
1947 buf.ReadInt(nvalues);
1948 vec->resize(nvalues);
1950 #ifdef R__VISUAL_CPLUSPLUS
1952 buf.CheckByteCount(start,count,config->fTypeName);
1956 float *begin = &(*vec->begin());
1957 buf.ReadFastArrayFloat16(begin, nvalues);
1959 buf.CheckByteCount(start,count,config->fTypeName);
1963 static INLINE_TEMPLATE_ARGS Int_t ReadCollectionDouble32(TBuffer &buf,
void *addr,
const TConfiguration *conf)
1967 TConfigSTL *config = (TConfigSTL*)conf;
1968 UInt_t start, count;
1969 buf.ReadVersion(&start, &count, config->fOldClass);
1971 std::vector<double> *
const vec = (std::vector<double>*)(((
char*)addr)+config->fOffset);
1973 buf.ReadInt(nvalues);
1974 vec->resize(nvalues);
1976 #ifdef R__VISUAL_CPLUSPLUS
1978 buf.CheckByteCount(start,count,config->fTypeName);
1982 double *begin = &(*vec->begin());
1983 buf.ReadFastArrayDouble32(begin, nvalues);
1985 buf.CheckByteCount(start,count,config->fTypeName);
1989 template <
typename From,
typename To>
1990 struct ConvertCollectionBasicType {
1991 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *addr,
const TConfiguration *conf)
1995 TConfigSTL *config = (TConfigSTL*)conf;
1996 UInt_t start, count;
1997 buf.ReadVersion(&start, &count, config->fOldClass);
1999 std::vector<To> *
const vec = (std::vector<To>*)(((
char*)addr)+config->fOffset);
2001 buf.ReadInt(nvalues);
2002 vec->resize(nvalues);
2004 From *temp =
new From[nvalues];
2005 buf.ReadFastArray(temp, nvalues);
2006 for(Int_t ind = 0; ind < nvalues; ++ind) {
2007 (*vec)[ind] = (To)temp[ind];
2011 buf.CheckByteCount(start,count,config->fTypeName);
2016 template <
typename From,
typename To>
2017 struct ConvertCollectionBasicType<NoFactorMarker<From>,To> {
2018 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *addr,
const TConfiguration *conf)
2022 TConfigSTL *config = (TConfigSTL*)conf;
2023 UInt_t start, count;
2024 buf.ReadVersion(&start, &count, config->fOldClass);
2026 std::vector<To> *
const vec = (std::vector<To>*)(((
char*)addr)+config->fOffset);
2028 buf.ReadInt(nvalues);
2029 vec->resize(nvalues);
2031 From *temp =
new From[nvalues];
2032 buf.ReadFastArrayWithNbits(temp, nvalues, 0);
2033 for(Int_t ind = 0; ind < nvalues; ++ind) {
2034 (*vec)[ind] = (To)temp[ind];
2038 buf.CheckByteCount(start,count,config->fTypeName);
2043 template <
typename To>
2044 static INLINE_TEMPLATE_ARGS Int_t ConvertCollectionDouble32(TBuffer &buf,
void *addr,
const TConfiguration *conf)
2048 TConfigSTL *config = (TConfigSTL*)conf;
2049 UInt_t start, count;
2050 buf.ReadVersion(&start, &count, config->fOldClass);
2052 std::vector<To> *
const vec = (std::vector<To>*)(((
char*)addr)+config->fOffset);
2054 buf.ReadInt(nvalues);
2055 vec->resize(nvalues);
2057 Double32_t *temp =
new Double32_t[nvalues];
2058 buf.ReadFastArrayDouble32(temp, nvalues);
2059 for(Int_t ind = 0; ind < nvalues; ++ind) {
2060 (*vec)[ind] = (To)temp[ind];
2064 buf.CheckByteCount(start,count,config->fTypeName);
2070 struct VectorPtrLooper {
2072 template <
typename T>
2073 static INLINE_TEMPLATE_ARGS Int_t ReadBasicType(TBuffer &buf,
void *iter,
const void *end,
const TConfiguration *config)
2075 const Int_t offset = config->fOffset;
2077 for(; iter != end; iter = (
char*)iter +
sizeof(
void*) ) {
2078 T *x = (T*)( ((
char*) (*(
void**)iter) ) + offset );
2084 template <
typename From,
typename To>
2085 struct ConvertBasicType {
2086 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *iter,
const void *end,
const TConfiguration *config)
2090 const Int_t offset = config->fOffset;
2091 for(; iter != end; iter = (
char*)iter +
sizeof(
void*) ) {
2093 To *x = (To*)( ((
char*) (*(
void**)iter) ) + offset );
2100 template <
typename To>
2101 struct ConvertBasicType<BitsMarker,To> {
2102 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *iter,
const void *end,
const TConfiguration *config)
2106 const Int_t offset = config->fOffset;
2107 for(; iter != end; iter = (
char*)iter +
sizeof(
void*) ) {
2110 if ((temp & kIsReferenced) != 0) {
2111 HandleReferencedTObject(buf,*(
void**)iter,config);
2114 To *x = (To*)( ((
char*) (*(
void**)iter) ) + offset );
2121 template <
typename From,
typename To>
2122 struct ConvertBasicType<WithFactorMarker<From>,To> {
2123 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *iter,
const void *end,
const TConfiguration *config)
2126 TConfWithFactor *conf = (TConfWithFactor *)config;
2128 const Int_t offset = config->fOffset;
2129 for(; iter != end; iter = (
char*)iter +
sizeof(
void*) ) {
2130 buf.ReadWithFactor(&temp, conf->fFactor, conf->fXmin);
2131 To *x = (To*)( ((
char*) (*(
void**)iter) ) + offset );
2138 template <
typename From,
typename To>
2139 struct ConvertBasicType<NoFactorMarker<From>,To> {
2140 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *iter,
const void *end,
const TConfiguration *config)
2143 TConfNoFactor *conf = (TConfNoFactor *)config;
2145 const Int_t offset = config->fOffset;
2146 for(; iter != end; iter = (
char*)iter +
sizeof(
void*) ) {
2147 buf.ReadWithNbits(&temp, conf->fNbits);
2148 To *x = (To*)( ((
char*) (*(
void**)iter) ) + offset );
2155 template <
typename T>
2156 static INLINE_TEMPLATE_ARGS Int_t WriteBasicType(TBuffer &buf,
void *iter,
const void *end,
const TConfiguration *config)
2158 const Int_t offset = config->fOffset;
2160 for(; iter != end; iter = (
char*)iter +
sizeof(
void*) ) {
2161 T *x = (T*)( ((
char*) (*(
void**)iter) ) + offset );
2167 template <Int_t (*action)(TBuffer&,
void *,const TConfiguration*)>
2168 static INLINE_TEMPLATE_ARGS Int_t ReadAction(TBuffer &buf,
void *start,
const void *end,
const TConfiguration *config)
2170 for(
void *iter = start; iter != end; iter = (
char*)iter +
sizeof(
void*) ) {
2171 action(buf, *(
void**)iter, config);
2176 static INLINE_TEMPLATE_ARGS Int_t ReadBase(TBuffer &buf,
void *start,
const void *end,
const TConfiguration *config)
2181 return GenericRead(buf,start,end,config);
2184 static INLINE_TEMPLATE_ARGS Int_t GenericRead(TBuffer &buf,
void *iter,
const void *end,
const TConfiguration *config)
2186 Int_t n = ( ((
void**)end) - ((
void**)iter) );
2187 char **arr = (
char**)iter;
2188 return ((TStreamerInfo*)config->fInfo)->ReadBuffer(buf, arr, &(config->fCompInfo), 0, 1, n, config->fOffset, 1|2 );
2191 static INLINE_TEMPLATE_ARGS Int_t GenericWrite(TBuffer &buf,
void *iter,
const void *end,
const TConfiguration *config)
2193 Int_t n = ( ((
void**)end) - ((
void**)iter) );
2194 char **arr = (
char**)iter;
2195 return ((TStreamerInfo*)config->fInfo)->WriteBufferAux(buf, arr, &(config->fCompInfo), 0, 1, n, config->fOffset, 1|2 );
2200 struct AssociativeLooper {
2202 template <
typename T>
2203 static INLINE_TEMPLATE_ARGS
void SimpleRead(TBuffer &buf,
void *addr, Int_t nvalues)
2205 buf.ReadFastArray((T*)addr, nvalues);
2208 static INLINE_TEMPLATE_ARGS
void SimpleReadFloat16(TBuffer &buf,
void *addr, Int_t nvalues)
2210 buf.ReadFastArrayFloat16((
float*)addr, nvalues);
2213 static INLINE_TEMPLATE_ARGS
void SimpleReadDouble32(TBuffer &buf,
void *addr, Int_t nvalues)
2215 buf.ReadFastArrayDouble32((
double*)addr, nvalues);
2218 template <
typename T,
void (*action)(TBuffer&,
void *,Int_t)>
2219 static INLINE_TEMPLATE_ARGS Int_t ReadNumericalCollection(TBuffer &buf,
void *addr,
const TConfiguration *conf)
2223 TConfigSTL *config = (TConfigSTL*)conf;
2224 UInt_t start, count;
2225 buf.ReadVersion(&start, &count, config->fOldClass);
2227 TClass *newClass = config->fNewClass;
2228 TVirtualCollectionProxy *newProxy = newClass->GetCollectionProxy();
2229 TVirtualCollectionProxy::TPushPop helper( newProxy, ((
char*)addr)+config->fOffset );
2232 buf.ReadInt(nvalues);
2233 void* alternative = newProxy->Allocate(nvalues,
true);
2235 char startbuf[TVirtualCollectionProxy::fgIteratorArenaSize];
2236 char endbuf[TVirtualCollectionProxy::fgIteratorArenaSize];
2237 void *begin = &(startbuf[0]);
2238 void *end = &(endbuf[0]);
2239 config->fCreateIterators(alternative, &begin, &end, newProxy);
2243 action(buf,begin,nvalues);
2245 if (begin != &(startbuf[0])) {
2247 config->fDeleteTwoIterators(begin,end);
2250 newProxy->Commit(alternative);
2252 buf.CheckByteCount(start,count,config->fTypeName);
2256 static INLINE_TEMPLATE_ARGS Int_t ReadCollectionBool(TBuffer &buf,
void *addr,
const TConfiguration *conf)
2258 return ReadNumericalCollection<bool,SimpleRead<bool> >(buf,addr,conf);
2261 static INLINE_TEMPLATE_ARGS Int_t ReadCollectionFloat16(TBuffer &buf,
void *addr,
const TConfiguration *conf)
2263 return ReadNumericalCollection<Float_t,SimpleReadFloat16 >(buf,addr,conf);
2266 static INLINE_TEMPLATE_ARGS Int_t ReadCollectionDouble32(TBuffer &buf,
void *addr,
const TConfiguration *conf)
2268 return ReadNumericalCollection<Double_t,SimpleReadDouble32 >(buf,addr,conf);
2271 template <
typename T>
2272 static INLINE_TEMPLATE_ARGS Int_t ReadCollectionBasicType(TBuffer &buf,
void *addr,
const TConfiguration *conf)
2274 return ReadNumericalCollection<T,SimpleRead<T> >(buf,addr,conf);
2277 template <
typename From,
typename To>
2278 struct ConvertRead {
2279 static INLINE_TEMPLATE_ARGS
void Action(TBuffer &buf,
void *addr, Int_t nvalues)
2281 From *temp =
new From[nvalues];
2282 buf.ReadFastArray(temp, nvalues);
2283 To *vec = (To*)addr;
2284 for(Int_t ind = 0; ind < nvalues; ++ind) {
2285 vec[ind] = (To)temp[ind];
2291 template <
typename From,
typename To>
2292 struct ConvertRead<NoFactorMarker<From>,To> {
2293 static INLINE_TEMPLATE_ARGS
void Action(TBuffer &buf,
void *addr, Int_t nvalues)
2295 From *temp =
new From[nvalues];
2296 buf.ReadFastArrayWithNbits(temp, nvalues,0);
2297 To *vec = (To*)addr;
2298 for(Int_t ind = 0; ind < nvalues; ++ind) {
2299 vec[ind] = (To)temp[ind];
2305 template <
typename From,
typename To>
2306 struct ConvertRead<WithFactorMarker<From>,To> {
2307 static INLINE_TEMPLATE_ARGS
void Action(TBuffer &buf,
void *addr, Int_t nvalues)
2309 From *temp =
new From[nvalues];
2311 buf.ReadFastArrayWithFactor(temp, nvalues, factor, min);
2312 To *vec = (To*)addr;
2313 for(Int_t ind = 0; ind < nvalues; ++ind) {
2314 vec[ind] = (To)temp[ind];
2320 template <
typename From,
typename To>
2321 struct ConvertCollectionBasicType {
2322 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *addr,
const TConfiguration *conf)
2324 return ReadNumericalCollection<To,ConvertRead<From,To>::Action >(buf,addr,conf);
2330 struct GenericLooper {
2332 template <
typename T>
2333 static INLINE_TEMPLATE_ARGS Int_t ReadBasicType(TBuffer &buf,
void *start,
const void *end,
const TLoopConfiguration *loopconf,
const TConfiguration *config)
2335 TGenericLoopConfig *loopconfig = (TGenericLoopConfig*)loopconf;
2337 Next_t next = loopconfig->fNext;
2338 const Int_t offset = config->fOffset;
2340 char iterator[TVirtualCollectionProxy::fgIteratorArenaSize];
2341 void *iter = loopconfig->fCopyIterator(iterator,start);
2343 while( (addr = next(iter,end)) ) {
2344 T *x = (T*)( ((
char*)addr) + offset );
2347 if (iter != &iterator[0]) {
2348 loopconfig->fDeleteIterator(iter);
2353 template <
typename T>
2354 static INLINE_TEMPLATE_ARGS Int_t WriteBasicType(TBuffer &buf,
void *start,
const void *end,
const TLoopConfiguration *loopconf,
const TConfiguration *config)
2356 TGenericLoopConfig *loopconfig = (TGenericLoopConfig*)loopconf;
2358 Next_t next = loopconfig->fNext;
2359 const Int_t offset = config->fOffset;
2361 char iterator[TVirtualCollectionProxy::fgIteratorArenaSize];
2362 void *iter = loopconfig->fCopyIterator(iterator,start);
2364 while( (addr = next(iter,end)) ) {
2365 T *x = (T*)( ((
char*)addr) + offset );
2368 if (iter != &iterator[0]) {
2369 loopconfig->fDeleteIterator(iter);
2374 template <Int_t (*iter_action)(TBuffer&,
void *,const TConfiguration*)>
2375 static INLINE_TEMPLATE_ARGS Int_t ReadAction(TBuffer &buf,
void *start,
const void *end,
const TLoopConfiguration *loopconf,
const TConfiguration *config)
2377 TGenericLoopConfig *loopconfig = (TGenericLoopConfig*)loopconf;
2380 Next_t next = loopconfig->fNext;
2382 char iterator[TVirtualCollectionProxy::fgIteratorArenaSize];
2383 void *iter = loopconfig->fCopyIterator(&iterator,start);
2385 while( (addr = next(iter,end)) ) {
2386 iter_action(buf, addr, config);
2388 if (iter != &iterator[0]) {
2389 loopconfig->fDeleteIterator(iter);
2394 template <
typename From,
typename To>
2396 static void ConvertAction(From *items,
void *start,
const void *end,
const TLoopConfiguration *loopconf,
const TConfiguration *config)
2398 TGenericLoopConfig *loopconfig = (TGenericLoopConfig*)loopconf;
2400 const Int_t offset = config->fOffset;
2401 Next_t next = loopconfig->fNext;
2403 char iterator[TVirtualCollectionProxy::fgIteratorArenaSize];
2404 void *iter = loopconfig->fCopyIterator(&iterator,start);
2406 while( (addr = next(iter,end)) ) {
2407 To *x = (To*)( ((
char*)addr) + offset );
2411 if (iter != &iterator[0]) {
2412 loopconfig->fDeleteIterator(iter);
2417 template <
typename From,
typename To>
2419 static void ConvertAction(From *items,
void *start,
const void *end,
const TLoopConfiguration *loopconf,
const TConfiguration * )
2424 TGenericLoopConfig *loopconfig = (TGenericLoopConfig*)loopconf;
2425 Next_t next = loopconfig->fNext;
2429 while( (addr = next(iter,end)) ) {
2430 To *x = (To*)(addr);
2437 template <
typename From,
typename To,
template <
typename F,
typename T>
class Converter = Generic >
2438 struct ConvertBasicType {
2439 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *start,
const void *end,
const TLoopConfiguration *loopconf,
const TConfiguration *config)
2443 TGenericLoopConfig *loopconfig = (TGenericLoopConfig*)loopconf;
2444 TVirtualCollectionProxy *proxy = loopconfig->fProxy;
2445 Int_t nvalues = proxy->Size();
2447 From *items =
new From[nvalues];
2448 buf.ReadFastArray(items, nvalues);
2449 Converter<From,To>::ConvertAction(items,start,end,loopconfig,config);
2455 template <
typename To>
2456 struct ConvertBasicType<BitsMarker, To, Generic> {
2457 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *start,
const void *end,
const TLoopConfiguration *loopconf,
const TConfiguration *config)
2461 TGenericLoopConfig *loopconfig = (TGenericLoopConfig*)loopconf;
2462 TVirtualCollectionProxy *proxy = loopconfig->fProxy;
2463 Int_t nvalues = proxy->Size();
2465 UInt_t *items_storage =
new UInt_t[nvalues];
2466 UInt_t *items = items_storage;
2468 const Int_t offset = config->fOffset;
2469 Next_t next = loopconfig->fNext;
2471 char iterator[TVirtualCollectionProxy::fgIteratorArenaSize];
2472 void *iter = loopconfig->fCopyIterator(&iterator,start);
2474 while( (addr = next(iter,end)) ) {
2476 if (((*items) & kIsReferenced) != 0) {
2477 HandleReferencedTObject(buf, addr, config);
2479 To *x = (To*)( ((
char*)addr) + offset );
2483 if (iter != &iterator[0]) {
2484 loopconfig->fDeleteIterator(iter);
2487 delete [] items_storage;
2492 template <
typename From,
typename To,
template <
typename F,
typename T>
class Converter >
2493 struct ConvertBasicType<WithFactorMarker<From>,To,Converter > {
2494 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *start,
const void *end,
const TLoopConfiguration *loopconf,
const TConfiguration *config)
2498 TGenericLoopConfig *loopconfig = (TGenericLoopConfig*)loopconf;
2499 TVirtualCollectionProxy *proxy = loopconfig->fProxy;
2500 Int_t nvalues = proxy->Size();
2502 TConfSTLWithFactor *conf = (TConfSTLWithFactor *)config;
2504 From *items =
new From[nvalues];
2505 buf.ReadFastArrayWithFactor(items, nvalues, conf->fFactor, conf->fXmin);
2506 Converter<From,To>::ConvertAction(items,start,end,loopconfig,config);
2512 template <
typename From,
typename To,
template <
typename F,
typename T>
class Converter >
2513 struct ConvertBasicType<NoFactorMarker<From>,To,Converter > {
2514 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *start,
const void *end,
const TLoopConfiguration *loopconf,
const TConfiguration *config)
2518 TGenericLoopConfig *loopconfig = (TGenericLoopConfig*)loopconf;
2519 TVirtualCollectionProxy *proxy = loopconfig->fProxy;
2520 Int_t nvalues = proxy->Size();
2522 TConfSTLNoFactor *conf = (TConfSTLNoFactor *)config;
2524 From *items =
new From[nvalues];
2525 buf.ReadFastArrayWithNbits(items, nvalues, conf->fNbits);
2526 Converter<From,To>::ConvertAction(items,start,end,loopconfig,config);
2532 static INLINE_TEMPLATE_ARGS Int_t ReadBase(TBuffer &buf,
void *start,
const void *end,
const TLoopConfiguration * loopconfig,
const TConfiguration *config)
2537 return GenericRead(buf,start,end,loopconfig, config);
2540 static INLINE_TEMPLATE_ARGS Int_t GenericRead(TBuffer &buf,
void *,
const void *,
const TLoopConfiguration * loopconf,
const TConfiguration *config)
2542 TGenericLoopConfig *loopconfig = (TGenericLoopConfig*)loopconf;
2543 TVirtualCollectionProxy *proxy = loopconfig->fProxy;
2544 return ((TStreamerInfo*)config->fInfo)->ReadBuffer(buf, *proxy, &(config->fCompInfo), 0, 1, proxy->Size(), config->fOffset, 1|2 );
2547 static INLINE_TEMPLATE_ARGS Int_t GenericWrite(TBuffer &buf,
void *,
const void *,
const TLoopConfiguration * loopconf,
const TConfiguration *config)
2549 TGenericLoopConfig *loopconfig = (TGenericLoopConfig*)loopconf;
2550 TVirtualCollectionProxy *proxy = loopconfig->fProxy;
2551 return ((TStreamerInfo*)config->fInfo)->WriteBufferAux(buf, *proxy, &(config->fCompInfo), 0, 1, proxy->Size(), config->fOffset, 1|2 );
2554 template <
typename T>
2555 static INLINE_TEMPLATE_ARGS
void SimpleRead(TBuffer &buf,
void *addr)
2560 static INLINE_TEMPLATE_ARGS
void SimpleReadFloat16(TBuffer &buf,
void *addr)
2562 buf.ReadWithNbits((
float*)addr,12);
2565 static INLINE_TEMPLATE_ARGS
void SimpleReadDouble32(TBuffer &buf,
void *addr)
2570 *(
double*)addr = (Double_t)afloat;
2573 template <
typename ActionHolder>
2574 static INLINE_TEMPLATE_ARGS Int_t ReadNumericalCollection(TBuffer &buf,
void *addr,
const TConfiguration *conf)
2578 TConfigSTL *config = (TConfigSTL*)conf;
2579 UInt_t start, count;
2580 buf.ReadVersion(&start, &count, config->fOldClass);
2582 TClass *newClass = config->fNewClass;
2583 TVirtualCollectionProxy *newProxy = newClass->GetCollectionProxy();
2584 TVirtualCollectionProxy::TPushPop helper( newProxy, ((
char*)addr)+config->fOffset );
2587 buf.ReadInt(nvalues);
2588 void* alternative = newProxy->Allocate(nvalues,
true);
2590 char startbuf[TVirtualCollectionProxy::fgIteratorArenaSize];
2591 char endbuf[TVirtualCollectionProxy::fgIteratorArenaSize];
2592 void *begin = &(startbuf[0]);
2593 void *end = &(endbuf[0]);
2594 config->fCreateIterators(alternative, &begin, &end, newProxy);
2598 TGenericLoopConfig loopconf(newProxy, kTRUE);
2599 ActionHolder::Action(buf,begin,end,&loopconf,config);
2601 if (begin != &(startbuf[0])) {
2603 config->fDeleteTwoIterators(begin,end);
2606 newProxy->Commit(alternative);
2608 buf.CheckByteCount(start,count,config->fTypeName);
2612 static INLINE_TEMPLATE_ARGS Int_t ReadCollectionBool(TBuffer &buf,
void *addr,
const TConfiguration *conf)
2614 return ReadNumericalCollection<ConvertBasicType<bool,bool,Numeric > >(buf,addr,conf);
2617 static INLINE_TEMPLATE_ARGS Int_t ReadCollectionFloat16(TBuffer &buf,
void *addr,
const TConfiguration *conf)
2619 return ReadNumericalCollection<ConvertBasicType<NoFactorMarker<float>,float,Numeric > >(buf,addr,conf);
2622 static INLINE_TEMPLATE_ARGS Int_t ReadCollectionDouble32(TBuffer &buf,
void *addr,
const TConfiguration *conf)
2624 return ReadNumericalCollection<ConvertBasicType<float,double,Numeric > >(buf,addr,conf);
2629 template <
typename T>
2630 static INLINE_TEMPLATE_ARGS Int_t ReadCollectionBasicType(TBuffer &buf,
void *addr,
const TConfiguration *conf)
2632 return ReadNumericalCollection<ConvertBasicType<T,T,Numeric > >(buf,addr,conf);
2635 template <
typename From,
typename To>
2636 struct ConvertCollectionBasicType {
2637 static INLINE_TEMPLATE_ARGS Int_t Action(TBuffer &buf,
void *addr,
const TConfiguration *conf)
2640 return ReadNumericalCollection<ConvertBasicType<From,To,Numeric > >(buf,addr,conf);
2647 template <
typename Looper,
typename From>
2648 static TConfiguredAction GetCollectionReadConvertAction(Int_t newtype, TConfiguration *conf)
2651 case TStreamerInfo::kBool:
return TConfiguredAction( Looper::template ConvertBasicType<From,bool>::Action, conf );
break;
2652 case TStreamerInfo::kChar:
return TConfiguredAction( Looper::template ConvertBasicType<From,char>::Action, conf );
break;
2653 case TStreamerInfo::kShort:
return TConfiguredAction( Looper::template ConvertBasicType<From,short>::Action, conf );
break;
2654 case TStreamerInfo::kInt:
return TConfiguredAction( Looper::template ConvertBasicType<From,Int_t>::Action, conf );
break;
2655 case TStreamerInfo::kLong:
return TConfiguredAction( Looper::template ConvertBasicType<From,Long_t>::Action, conf );
break;
2656 case TStreamerInfo::kLong64:
return TConfiguredAction( Looper::template ConvertBasicType<From,Long64_t>::Action, conf );
break;
2657 case TStreamerInfo::kFloat:
return TConfiguredAction( Looper::template ConvertBasicType<From,float>::Action, conf );
break;
2658 case TStreamerInfo::kFloat16:
return TConfiguredAction( Looper::template ConvertBasicType<From,float>::Action, conf );
break;
2659 case TStreamerInfo::kDouble:
return TConfiguredAction( Looper::template ConvertBasicType<From,double>::Action, conf );
break;
2660 case TStreamerInfo::kDouble32:
return TConfiguredAction( Looper::template ConvertBasicType<From,double>::Action, conf );
break;
2661 case TStreamerInfo::kUChar:
return TConfiguredAction( Looper::template ConvertBasicType<From,UChar_t>::Action, conf );
break;
2662 case TStreamerInfo::kUShort:
return TConfiguredAction( Looper::template ConvertBasicType<From,UShort_t>::Action, conf );
break;
2663 case TStreamerInfo::kUInt:
return TConfiguredAction( Looper::template ConvertBasicType<From,UInt_t>::Action, conf );
break;
2664 case TStreamerInfo::kULong:
return TConfiguredAction( Looper::template ConvertBasicType<From,ULong_t>::Action, conf );
break;
2665 case TStreamerInfo::kULong64:
return TConfiguredAction( Looper::template ConvertBasicType<From,ULong64_t>::Action, conf );
break;
2666 case TStreamerInfo::kBits:
return TConfiguredAction( Looper::template ConvertBasicType<From,UInt_t>::Action, conf );
break;
2668 return TConfiguredAction( Looper::GenericRead, conf );
2672 return TConfiguredAction();
2675 template <
class Looper>
2676 static TConfiguredAction GetNumericCollectionReadAction(Int_t type, TConfigSTL *conf)
2682 case TStreamerInfo::kBool:
return TConfiguredAction( Looper::ReadCollectionBool, conf );
break;
2683 case TStreamerInfo::kChar:
return TConfiguredAction( Looper::template ReadCollectionBasicType<Char_t>, conf );
break;
2684 case TStreamerInfo::kShort:
return TConfiguredAction( Looper::template ReadCollectionBasicType<Short_t>,conf );
break;
2685 case TStreamerInfo::kInt:
return TConfiguredAction( Looper::template ReadCollectionBasicType<Int_t>, conf );
break;
2686 case TStreamerInfo::kLong:
return TConfiguredAction( Looper::template ReadCollectionBasicType<Long_t>, conf );
break;
2687 case TStreamerInfo::kLong64:
return TConfiguredAction( Looper::template ReadCollectionBasicType<Long64_t>, conf );
break;
2688 case TStreamerInfo::kFloat:
return TConfiguredAction( Looper::template ReadCollectionBasicType<Float_t>, conf );
break;
2689 case TStreamerInfo::kDouble:
return TConfiguredAction( Looper::template ReadCollectionBasicType<Double_t>, conf );
break;
2690 case TStreamerInfo::kUChar:
return TConfiguredAction( Looper::template ReadCollectionBasicType<UChar_t>, conf );
break;
2691 case TStreamerInfo::kUShort:
return TConfiguredAction( Looper::template ReadCollectionBasicType<UShort_t>, conf );
break;
2692 case TStreamerInfo::kUInt:
return TConfiguredAction( Looper::template ReadCollectionBasicType<UInt_t>, conf );
break;
2693 case TStreamerInfo::kULong:
return TConfiguredAction( Looper::template ReadCollectionBasicType<ULong_t>, conf );
break;
2694 case TStreamerInfo::kULong64:
return TConfiguredAction( Looper::template ReadCollectionBasicType<ULong64_t>, conf );
break;
2695 case TStreamerInfo::kBits: Error(
"GetNumericCollectionReadAction",
"There is no support for kBits outside of a TObject.");
break;
2696 case TStreamerInfo::kFloat16: {
2697 TConfigSTL *alternate =
new TConfSTLNoFactor(conf,12);
2699 return TConfiguredAction( Looper::ReadCollectionFloat16, alternate );
2709 case TStreamerInfo::kDouble32: {
2710 TConfigSTL *alternate =
new TConfSTLNoFactor(conf,0);
2712 return TConfiguredAction( Looper::ReadCollectionDouble32, alternate );
2726 Fatal(
"GetNumericCollectionReadAction",
"Is confused about %d",type);
2728 return TConfiguredAction();
2731 template <
typename Looper,
typename From>
2732 static TConfiguredAction GetConvertCollectionReadActionFrom(Int_t newtype, TConfiguration *conf)
2735 case TStreamerInfo::kBool:
return TConfiguredAction( Looper::template ConvertCollectionBasicType<From,bool>::Action, conf );
break;
2736 case TStreamerInfo::kChar:
return TConfiguredAction( Looper::template ConvertCollectionBasicType<From,char>::Action, conf );
break;
2737 case TStreamerInfo::kShort:
return TConfiguredAction( Looper::template ConvertCollectionBasicType<From,short>::Action, conf );
break;
2738 case TStreamerInfo::kInt:
return TConfiguredAction( Looper::template ConvertCollectionBasicType<From,Int_t>::Action, conf );
break;
2739 case TStreamerInfo::kLong:
return TConfiguredAction( Looper::template ConvertCollectionBasicType<From,Long_t>::Action, conf );
break;
2740 case TStreamerInfo::kLong64:
return TConfiguredAction( Looper::template ConvertCollectionBasicType<From,Long64_t>::Action, conf );
break;
2741 case TStreamerInfo::kFloat:
return TConfiguredAction( Looper::template ConvertCollectionBasicType<From,float>::Action, conf );
break;
2742 case TStreamerInfo::kFloat16:
return TConfiguredAction( Looper::template ConvertCollectionBasicType<From,float>::Action, conf );
break;
2743 case TStreamerInfo::kDouble:
return TConfiguredAction( Looper::template ConvertCollectionBasicType<From,double>::Action, conf );
break;
2744 case TStreamerInfo::kDouble32:
return TConfiguredAction( Looper::template ConvertCollectionBasicType<From,double>::Action, conf );
break;
2745 case TStreamerInfo::kUChar:
return TConfiguredAction( Looper::template ConvertCollectionBasicType<From,UChar_t>::Action, conf );
break;
2746 case TStreamerInfo::kUShort:
return TConfiguredAction( Looper::template ConvertCollectionBasicType<From,UShort_t>::Action, conf );
break;
2747 case TStreamerInfo::kUInt:
return TConfiguredAction( Looper::template ConvertCollectionBasicType<From,UInt_t>::Action, conf );
break;
2748 case TStreamerInfo::kULong:
return TConfiguredAction( Looper::template ConvertCollectionBasicType<From,ULong_t>::Action, conf );
break;
2749 case TStreamerInfo::kULong64:
return TConfiguredAction( Looper::template ConvertCollectionBasicType<From,ULong64_t>::Action, conf );
break;
2750 case TStreamerInfo::kBits:
return TConfiguredAction( Looper::template ConvertCollectionBasicType<From,UInt_t>::Action, conf );
break;
2755 return TConfiguredAction();
2758 template <
typename Looper>
2759 static TConfiguredAction GetConvertCollectionReadAction(Int_t oldtype, Int_t newtype, TConfiguration *conf)
2762 case TStreamerInfo::kBool:
2763 return GetConvertCollectionReadActionFrom<Looper,Bool_t>(newtype, conf );
2765 case TStreamerInfo::kChar:
2766 return GetConvertCollectionReadActionFrom<Looper,Char_t>(newtype, conf );
2768 case TStreamerInfo::kShort:
2769 return GetConvertCollectionReadActionFrom<Looper,Short_t>(newtype, conf );
2771 case TStreamerInfo::kInt:
2772 return GetConvertCollectionReadActionFrom<Looper,Int_t>(newtype, conf );
2774 case TStreamerInfo::kLong:
2775 return GetConvertCollectionReadActionFrom<Looper,Long_t>(newtype, conf );
2777 case TStreamerInfo::kLong64:
2778 return GetConvertCollectionReadActionFrom<Looper,Long64_t>(newtype, conf );
2780 case TStreamerInfo::kFloat:
2781 return GetConvertCollectionReadActionFrom<Looper,Float_t>( newtype, conf );
2783 case TStreamerInfo::kDouble:
2784 return GetConvertCollectionReadActionFrom<Looper,Double_t>(newtype, conf );
2786 case TStreamerInfo::kUChar:
2787 return GetConvertCollectionReadActionFrom<Looper,UChar_t>(newtype, conf );
2789 case TStreamerInfo::kUShort:
2790 return GetConvertCollectionReadActionFrom<Looper,UShort_t>(newtype, conf );
2792 case TStreamerInfo::kUInt:
2793 return GetConvertCollectionReadActionFrom<Looper,UInt_t>(newtype, conf );
2795 case TStreamerInfo::kULong:
2796 return GetConvertCollectionReadActionFrom<Looper,ULong_t>(newtype, conf );
2798 case TStreamerInfo::kULong64:
2799 return GetConvertCollectionReadActionFrom<Looper,ULong64_t>(newtype, conf );
2801 case TStreamerInfo::kFloat16:
2802 return GetConvertCollectionReadActionFrom<Looper,NoFactorMarker<Float16_t> >( newtype, conf );
2804 case TStreamerInfo::kDouble32:
2805 return GetConvertCollectionReadActionFrom<Looper,NoFactorMarker<Double32_t> >( newtype, conf );
2807 case TStreamerInfo::kBits:
2808 Error(
"GetConvertCollectionReadAction",
"There is no support for kBits outside of a TObject.");
2814 return TConfiguredAction();
2817 template <
class Looper>
2818 static TConfiguredAction GetCollectionReadAction(TVirtualStreamerInfo *info, TStreamerElement *element, Int_t type, UInt_t i, TStreamerInfo::TCompInfo_t *compinfo, Int_t offset)
2822 case TStreamerInfo::kBool:
return TConfiguredAction( Looper::template ReadBasicType<Bool_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2823 case TStreamerInfo::kChar:
return TConfiguredAction( Looper::template ReadBasicType<Char_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2824 case TStreamerInfo::kShort:
return TConfiguredAction( Looper::template ReadBasicType<Short_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2825 case TStreamerInfo::kInt:
return TConfiguredAction( Looper::template ReadBasicType<Int_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2826 case TStreamerInfo::kLong:
return TConfiguredAction( Looper::template ReadBasicType<Long_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2827 case TStreamerInfo::kLong64:
return TConfiguredAction( Looper::template ReadBasicType<Long64_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2828 case TStreamerInfo::kFloat:
return TConfiguredAction( Looper::template ReadBasicType<Float_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2829 case TStreamerInfo::kDouble:
return TConfiguredAction( Looper::template ReadBasicType<Double_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2830 case TStreamerInfo::kUChar:
return TConfiguredAction( Looper::template ReadBasicType<UChar_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2831 case TStreamerInfo::kUShort:
return TConfiguredAction( Looper::template ReadBasicType<UShort_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2832 case TStreamerInfo::kUInt:
return TConfiguredAction( Looper::template ReadBasicType<UInt_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2833 case TStreamerInfo::kULong:
return TConfiguredAction( Looper::template ReadBasicType<ULong_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2834 case TStreamerInfo::kULong64:
return TConfiguredAction( Looper::template ReadBasicType<ULong64_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2835 case TStreamerInfo::kBits:
return TConfiguredAction( Looper::template ReadAction<TStreamerInfoActions::ReadBasicType<BitsMarker> > ,
new TBitsConfiguration(info,i,compinfo,offset) );
break;
2836 case TStreamerInfo::kFloat16: {
2837 if (element->GetFactor() != 0) {
2838 return TConfiguredAction( Looper::template ReadAction<ReadBasicType_WithFactor<float> >,
new TConfWithFactor(info,i,compinfo,offset,element->GetFactor(),element->GetXmin()) );
2840 Int_t nbits = (Int_t)element->GetXmin();
2841 if (!nbits) nbits = 12;
2842 return TConfiguredAction( Looper::template ReadAction<ReadBasicType_NoFactor<float> >,
new TConfNoFactor(info,i,compinfo,offset,nbits) );
2846 case TStreamerInfo::kDouble32: {
2847 if (element->GetFactor() != 0) {
2848 return TConfiguredAction( Looper::template ReadAction<ReadBasicType_WithFactor<double> >,
new TConfWithFactor(info,i,compinfo,offset,element->GetFactor(),element->GetXmin()) );
2850 Int_t nbits = (Int_t)element->GetXmin();
2852 return TConfiguredAction( Looper::template ReadAction<ConvertBasicType<float,double>::Action >,
new TConfiguration(info,i,compinfo,offset) );
2854 return TConfiguredAction( Looper::template ReadAction<ReadBasicType_NoFactor<double> >,
new TConfNoFactor(info,i,compinfo,offset,nbits) );
2859 case TStreamerInfo::kTNamed:
return TConfiguredAction( Looper::template ReadAction<ReadTNamed >,
new TConfiguration(info,i,compinfo,offset) );
break;
2862 case TStreamerInfo::kTObject:
return TConfiguredAction( Looper::template ReadAction<ReadTObject >,
new TConfiguration(info,i,compinfo,offset) );
break;
2863 case TStreamerInfo::kTString:
return TConfiguredAction( Looper::template ReadAction<ReadTString >,
new TConfiguration(info,i,compinfo,offset) );
break;
2864 case TStreamerInfo::kArtificial:
2865 case TStreamerInfo::kCacheNew:
2866 case TStreamerInfo::kCacheDelete:
2867 case TStreamerInfo::kSTL:
return TConfiguredAction( Looper::GenericRead,
new TGenericConfiguration(info,i,compinfo) );
break;
2868 case TStreamerInfo::kBase:
return TConfiguredAction( Looper::ReadBase,
new TGenericConfiguration(info,i,compinfo) );
break;
2871 case TStreamerInfo::kConv + TStreamerInfo::kBool:
2872 return GetCollectionReadConvertAction<Looper,Bool_t>(element->GetNewType(),
new TConfiguration(info,i,compinfo,offset) );
2874 case TStreamerInfo::kConv + TStreamerInfo::kChar:
2875 return GetCollectionReadConvertAction<Looper,Char_t>(element->GetNewType(),
new TConfiguration(info,i,compinfo,offset) );
2877 case TStreamerInfo::kConv + TStreamerInfo::kShort:
2878 return GetCollectionReadConvertAction<Looper,Short_t>(element->GetNewType(),
new TConfiguration(info,i,compinfo,offset) );
2880 case TStreamerInfo::kConv + TStreamerInfo::kInt:
2881 return GetCollectionReadConvertAction<Looper,Int_t>(element->GetNewType(),
new TConfiguration(info,i,compinfo,offset) );
2883 case TStreamerInfo::kConv + TStreamerInfo::kLong:
2884 return GetCollectionReadConvertAction<Looper,Long_t>(element->GetNewType(),
new TConfiguration(info,i,compinfo,offset) );
2886 case TStreamerInfo::kConv + TStreamerInfo::kLong64:
2887 return GetCollectionReadConvertAction<Looper,Long64_t>(element->GetNewType(),
new TConfiguration(info,i,compinfo,offset) );
2889 case TStreamerInfo::kConv + TStreamerInfo::kFloat:
2890 return GetCollectionReadConvertAction<Looper,Float_t>( element->GetNewType(),
new TConfiguration(info,i,compinfo,offset) );
2892 case TStreamerInfo::kConv + TStreamerInfo::kDouble:
2893 return GetCollectionReadConvertAction<Looper,Double_t>(element->GetNewType(),
new TConfiguration(info,i,compinfo,offset) );
2895 case TStreamerInfo::kConv + TStreamerInfo::kUChar:
2896 return GetCollectionReadConvertAction<Looper,UChar_t>(element->GetNewType(),
new TConfiguration(info,i,compinfo,offset) );
2898 case TStreamerInfo::kConv + TStreamerInfo::kUShort:
2899 return GetCollectionReadConvertAction<Looper,UShort_t>(element->GetNewType(),
new TConfiguration(info,i,compinfo,offset) );
2901 case TStreamerInfo::kConv + TStreamerInfo::kUInt:
2902 return GetCollectionReadConvertAction<Looper,UInt_t>(element->GetNewType(),
new TConfiguration(info,i,compinfo,offset) );
2904 case TStreamerInfo::kConv + TStreamerInfo::kULong:
2905 return GetCollectionReadConvertAction<Looper,ULong_t>(element->GetNewType(),
new TConfiguration(info,i,compinfo,offset) );
2907 case TStreamerInfo::kConv + TStreamerInfo::kULong64:
2908 return GetCollectionReadConvertAction<Looper,ULong64_t>(element->GetNewType(),
new TConfiguration(info,i,compinfo,offset) );
2910 case TStreamerInfo::kConv + TStreamerInfo::kBits:
2911 return GetCollectionReadConvertAction<Looper,BitsMarker>(element->GetNewType(),
new TBitsConfiguration(info,i,compinfo,offset) );
2913 case TStreamerInfo::kConv + TStreamerInfo::kFloat16: {
2914 if (element->GetFactor() != 0) {
2915 return GetCollectionReadConvertAction<Looper,WithFactorMarker<float> >(element->GetNewType(),
new TConfWithFactor(info,i,compinfo,offset,element->GetFactor(),element->GetXmin()) );
2917 Int_t nbits = (Int_t)element->GetXmin();
2918 if (!nbits) nbits = 12;
2919 return GetCollectionReadConvertAction<Looper,NoFactorMarker<float> >(element->GetNewType(),
new TConfNoFactor(info,i,compinfo,offset,nbits) );
2923 case TStreamerInfo::kConv + TStreamerInfo::kDouble32: {
2924 if (element->GetFactor() != 0) {
2925 return GetCollectionReadConvertAction<Looper,WithFactorMarker<double> >(element->GetNewType(),
new TConfWithFactor(info,i,compinfo,offset,element->GetFactor(),element->GetXmin()) );
2927 Int_t nbits = (Int_t)element->GetXmin();
2929 return GetCollectionReadConvertAction<Looper,Float_t>(element->GetNewType(),
new TConfiguration(info,i,compinfo,offset) );
2931 return GetCollectionReadConvertAction<Looper,NoFactorMarker<double> >(element->GetNewType(),
new TConfNoFactor(info,i,compinfo,offset,nbits) );
2937 return TConfiguredAction( Looper::GenericRead,
new TGenericConfiguration(info,i,compinfo) );
2941 return TConfiguredAction();
2944 template <
class Looper>
2945 static TConfiguredAction GetCollectionWriteAction(TVirtualStreamerInfo *info, TStreamerElement * , Int_t type, UInt_t i, TStreamerInfo::TCompInfo_t *compinfo, Int_t offset) {
2948 case TStreamerInfo::kBool:
return TConfiguredAction( Looper::template WriteBasicType<Bool_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2949 case TStreamerInfo::kChar:
return TConfiguredAction( Looper::template WriteBasicType<Char_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2950 case TStreamerInfo::kShort:
return TConfiguredAction( Looper::template WriteBasicType<Short_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2951 case TStreamerInfo::kInt:
return TConfiguredAction( Looper::template WriteBasicType<Int_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2952 case TStreamerInfo::kLong:
return TConfiguredAction( Looper::template WriteBasicType<Long_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2953 case TStreamerInfo::kLong64:
return TConfiguredAction( Looper::template WriteBasicType<Long64_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2954 case TStreamerInfo::kFloat:
return TConfiguredAction( Looper::template WriteBasicType<Float_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2955 case TStreamerInfo::kDouble:
return TConfiguredAction( Looper::template WriteBasicType<Double_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2956 case TStreamerInfo::kUChar:
return TConfiguredAction( Looper::template WriteBasicType<UChar_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2957 case TStreamerInfo::kUShort:
return TConfiguredAction( Looper::template WriteBasicType<UShort_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2958 case TStreamerInfo::kUInt:
return TConfiguredAction( Looper::template WriteBasicType<UInt_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2959 case TStreamerInfo::kULong:
return TConfiguredAction( Looper::template WriteBasicType<ULong_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2960 case TStreamerInfo::kULong64:
return TConfiguredAction( Looper::template WriteBasicType<ULong64_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
2963 return TConfiguredAction( Looper::GenericWrite,
new TConfiguration(info,i,compinfo,0 ) );
2966 return TConfiguredAction();
2976 void TStreamerInfo::Compile()
2982 R__LOCKGUARD(gInterpreterMutex);
2987 fOptimized = kFALSE;
2991 TObjArray* infos = (TObjArray*) gROOT->GetListOfStreamerInfo();
2996 if (fNumber >= infos->GetSize()) {
2997 infos->AddAtAndExpand(
this, fNumber);
2999 if (!infos->At(fNumber)) {
3000 infos->AddAt(
this, fNumber);
3004 assert(fComp == 0 && fCompFull == 0 && fCompOpt == 0);
3007 Int_t ndata = fElements->GetEntries();
3010 if (fReadObjectWise) fReadObjectWise->fActions.clear();
3011 else fReadObjectWise =
new TStreamerInfoActions::TActionSequence(
this,ndata);
3013 if (fWriteObjectWise) fWriteObjectWise->fActions.clear();
3014 else fWriteObjectWise =
new TStreamerInfoActions::TActionSequence(
this,ndata);
3016 if (fReadMemberWise) fReadMemberWise->fActions.clear();
3017 else fReadMemberWise =
new TStreamerInfoActions::TActionSequence(
this,ndata);
3019 if (fReadText) fReadText->fActions.clear();
3020 else fReadText =
new TStreamerInfoActions::TActionSequence(
this,ndata);
3022 if (fWriteMemberWise) fWriteMemberWise->fActions.clear();
3023 else fWriteMemberWise =
new TStreamerInfoActions::TActionSequence(
this,ndata);
3025 if (fReadMemberWiseVecPtr) fReadMemberWiseVecPtr->fActions.clear();
3026 else fReadMemberWiseVecPtr =
new TStreamerInfoActions::TActionSequence(
this,ndata);
3028 if (fWriteMemberWiseVecPtr) fWriteMemberWiseVecPtr->fActions.clear();
3029 else fWriteMemberWiseVecPtr =
new TStreamerInfoActions::TActionSequence(
this,ndata);
3031 if (fWriteText) fWriteText->fActions.clear();
3032 else fWriteText =
new TStreamerInfoActions::TActionSequence(
this,ndata);
3037 if (fClass->TestBit(TClass::kIsEmulation) && fNVirtualInfoLoc!=0) {
3038 fSize =
sizeof(TStreamerInfo*);
3040 fComp =
new TCompInfo[1];
3041 fCompFull =
new TCompInfo*[1];
3042 fCompOpt =
new TCompInfo*[1];
3043 fCompOpt[0] = fCompFull[0] = &(fComp[0]);
3051 fNslots = ndata + ndata/2 + 1;
3054 fComp =
new TCompInfo[fNslots];
3055 fCompFull =
new TCompInfo*[ndata];
3056 fCompOpt =
new TCompInfo*[ndata];
3058 TStreamerElement* element;
3059 TStreamerElement* previous = 0;
3063 if (!CanOptimize()) {
3064 SetBit(kCannotOptimize);
3067 Bool_t isOptimized = kFALSE;
3068 Bool_t previousOptimized = kFALSE;
3070 for (i = 0; i < ndata; ++i) {
3071 element = (TStreamerElement*) fElements->At(i);
3076 Int_t asize = element->GetSize();
3077 if (element->GetArrayLength()) {
3078 asize /= element->GetArrayLength();
3080 fComp[fNdata].fType = element->GetType();
3081 fComp[fNdata].fNewType = element->GetNewType();
3082 fComp[fNdata].fOffset = element->GetOffset();
3083 fComp[fNdata].fLength = element->GetArrayLength();
3084 fComp[fNdata].fElem = element;
3085 fComp[fNdata].fMethod = element->GetMethod();
3086 fComp[fNdata].fClass = element->GetClassPointer();
3087 fComp[fNdata].fNewClass = element->GetNewClass();
3088 fComp[fNdata].fClassName = TString(element->GetTypeName()).Strip(TString::kTrailing,
'*');
3089 fComp[fNdata].fStreamer = element->GetStreamer();
3092 if (!TestBit(kCannotOptimize)
3094 && (element->GetType() > 0)
3095 && (element->GetType() < 10)
3096 && (fComp[fNdata].fType == fComp[fNdata].fNewType)
3097 && (fComp[keep].fMethod == 0)
3098 && (element->GetArrayDim() == 0)
3099 && (fComp[keep].fType < kObject)
3100 && (fComp[keep].fType != kCharStar)
3101 && (element->GetType() == (fComp[keep].fType%kRegrouped))
3102 && ((element->GetOffset()-fComp[keep].fOffset) == (fComp[keep].fLength)*asize)
3103 && ((fOldVersion<6) || !previous ||
3104 ((element->GetFactor() == previous->GetFactor())
3105 && (element->GetXmin() == previous->GetXmin())
3106 && (element->GetXmax() == previous->GetXmax())
3109 && (element->TestBit(TStreamerElement::kCache) == previous->TestBit(TStreamerElement::kCache))
3110 && (element->TestBit(TStreamerElement::kWrite) == previous->TestBit(TStreamerElement::kWrite))
3114 if (!previousOptimized) {
3117 fComp[fNslots - (++optiOut) ] = fComp[keep];
3118 fCompFull[fNfulldata-1] = &(fComp[fNslots - optiOut]);
3120 fComp[fNslots - (++optiOut) ] = fComp[fNdata];
3121 fCompFull[fNfulldata] = &(fComp[fNslots - optiOut]);
3123 R__ASSERT( keep < (fNslots - optiOut) );
3125 if (fComp[keep].fLength == 0) {
3126 fComp[keep].fLength++;
3128 fComp[keep].fLength++;
3129 fComp[keep].fType = element->GetType() + kRegrouped;
3130 isOptimized = kTRUE;
3131 previousOptimized = kTRUE;
3132 }
else if (element->GetType() < 0) {
3142 fComp[fNslots - (++optiOut) ] = fComp[fNdata];
3143 fCompFull[fNfulldata] = &(fComp[fNslots - optiOut]);
3145 previousOptimized = kFALSE;
3148 if (fComp[fNdata].fNewType != fComp[fNdata].fType) {
3149 if (fComp[fNdata].fNewType > 0) {
3150 if ( (fComp[fNdata].fNewType == kObjectp || fComp[fNdata].fNewType == kAnyp
3151 || fComp[fNdata].fNewType == kObject || fComp[fNdata].fNewType == kAny
3152 || fComp[fNdata].fNewType == kTObject || fComp[fNdata].fNewType == kTNamed || fComp[fNdata].fNewType == kTString)
3153 && (fComp[fNdata].fType == kObjectp || fComp[fNdata].fType == kAnyp
3154 || fComp[fNdata].fType == kObject || fComp[fNdata].fType == kAny
3155 || fComp[fNdata].fType == kTObject || fComp[fNdata].fType == kTNamed || fComp[fNdata].fType == kTString )
3157 fComp[fNdata].fType = fComp[fNdata].fNewType;
3158 }
else if (fComp[fNdata].fType != kCounter) {
3159 fComp[fNdata].fType += kConv;
3162 if (fComp[fNdata].fType == kCounter) {
3163 Warning(
"Compile",
"Counter %s should not be skipped from class %s", element->GetName(), GetName());
3165 fComp[fNdata].fType += kSkip;
3168 fCompOpt[fNdata] = &(fComp[fNdata]);
3169 fCompFull[fNfulldata] = &(fComp[fNdata]);
3171 R__ASSERT( fNdata < (fNslots - optiOut) );
3174 if (fComp[keep].fLength == 0) {
3175 fComp[keep].fLength = 1;
3178 previousOptimized = kFALSE;
3183 if (element->HasCounter()) keep = -1;
3188 for (i = 0; i < fNdata; ++i) {
3189 if (!fCompOpt[i]->fElem || fCompOpt[i]->fElem->GetType()< 0) {
3192 AddReadAction(fReadObjectWise, i, fCompOpt[i]);
3193 AddWriteAction(fWriteObjectWise, i, fCompOpt[i]);
3195 for (i = 0; i < fNfulldata; ++i) {
3196 if (!fCompFull[i]->fElem || fCompFull[i]->fElem->GetType()< 0) {
3199 AddReadAction(fReadMemberWise, i, fCompFull[i]);
3200 AddWriteAction(fWriteMemberWise, i, fCompFull[i]);
3201 AddReadMemberWiseVecPtrAction(fReadMemberWiseVecPtr, i, fCompFull[i]);
3202 AddWriteMemberWiseVecPtrAction(fWriteMemberWiseVecPtr, i, fCompFull[i]);
3204 AddReadTextAction(fReadText, i, fCompFull[i]);
3205 AddWriteTextAction(fWriteText, i, fCompFull[i]);
3209 fOptimized = isOptimized;
3217 template <
typename From>
3218 static void AddReadConvertAction(TStreamerInfoActions::TActionSequence *sequence, Int_t newtype, TConfiguration *conf)
3221 case TStreamerInfo::kBool: sequence->AddAction( ConvertBasicType<From,bool>::Action, conf );
break;
3222 case TStreamerInfo::kChar: sequence->AddAction( ConvertBasicType<From,char>::Action, conf );
break;
3223 case TStreamerInfo::kShort: sequence->AddAction( ConvertBasicType<From,short>::Action, conf );
break;
3224 case TStreamerInfo::kInt: sequence->AddAction( ConvertBasicType<From,Int_t>::Action, conf );
break;
3225 case TStreamerInfo::kLong: sequence->AddAction( ConvertBasicType<From,Long_t>::Action,conf );
break;
3226 case TStreamerInfo::kLong64: sequence->AddAction( ConvertBasicType<From,Long64_t>::Action, conf );
break;
3227 case TStreamerInfo::kFloat: sequence->AddAction( ConvertBasicType<From,float>::Action, conf );
break;
3228 case TStreamerInfo::kFloat16: sequence->AddAction( ConvertBasicType<From,float>::Action, conf );
break;
3229 case TStreamerInfo::kDouble: sequence->AddAction( ConvertBasicType<From,double>::Action, conf );
break;
3230 case TStreamerInfo::kDouble32:sequence->AddAction( ConvertBasicType<From,double>::Action, conf );
break;
3231 case TStreamerInfo::kUChar: sequence->AddAction( ConvertBasicType<From,UChar_t>::Action, conf );
break;
3232 case TStreamerInfo::kUShort: sequence->AddAction( ConvertBasicType<From,UShort_t>::Action, conf );
break;
3233 case TStreamerInfo::kUInt: sequence->AddAction( ConvertBasicType<From,UInt_t>::Action, conf );
break;
3234 case TStreamerInfo::kULong: sequence->AddAction( ConvertBasicType<From,ULong_t>::Action, conf );
break;
3235 case TStreamerInfo::kULong64: sequence->AddAction( ConvertBasicType<From,ULong64_t>::Action,conf );
break;
3236 case TStreamerInfo::kBits: sequence->AddAction( ConvertBasicType<From,UInt_t>::Action, conf );
break;
3243 void TStreamerInfo::AddReadAction(TStreamerInfoActions::TActionSequence *readSequence, Int_t i, TStreamerInfo::TCompInfo *compinfo)
3245 TStreamerElement *element = compinfo->fElem;
3247 if (element->TestBit(TStreamerElement::kWrite))
return;
3249 switch (compinfo->fType) {
3251 case TStreamerInfo::kBool: readSequence->AddAction( ReadBasicType<Bool_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3252 case TStreamerInfo::kChar: readSequence->AddAction( ReadBasicType<Char_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3253 case TStreamerInfo::kShort: readSequence->AddAction( ReadBasicType<Short_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3254 case TStreamerInfo::kInt: readSequence->AddAction( ReadBasicType<Int_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3255 case TStreamerInfo::kLong: readSequence->AddAction( ReadBasicType<Long_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3256 case TStreamerInfo::kLong64: readSequence->AddAction( ReadBasicType<Long64_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3257 case TStreamerInfo::kFloat: readSequence->AddAction( ReadBasicType<Float_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3258 case TStreamerInfo::kDouble: readSequence->AddAction( ReadBasicType<Double_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3259 case TStreamerInfo::kUChar: readSequence->AddAction( ReadBasicType<UChar_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3260 case TStreamerInfo::kUShort: readSequence->AddAction( ReadBasicType<UShort_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3261 case TStreamerInfo::kUInt: readSequence->AddAction( ReadBasicType<UInt_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3262 case TStreamerInfo::kULong: readSequence->AddAction( ReadBasicType<ULong_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3263 case TStreamerInfo::kULong64: readSequence->AddAction( ReadBasicType<ULong64_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3264 case TStreamerInfo::kBits: readSequence->AddAction( ReadBasicType<BitsMarker>,
new TBitsConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3265 case TStreamerInfo::kFloat16: {
3266 if (element->GetFactor() != 0) {
3267 readSequence->AddAction( ReadBasicType_WithFactor<float>,
new TConfWithFactor(
this,i,compinfo,compinfo->fOffset,element->GetFactor(),element->GetXmin()) );
3269 Int_t nbits = (Int_t)element->GetXmin();
3270 if (!nbits) nbits = 12;
3271 readSequence->AddAction( ReadBasicType_NoFactor<float>,
new TConfNoFactor(
this,i,compinfo,compinfo->fOffset,nbits) );
3275 case TStreamerInfo::kDouble32: {
3276 if (element->GetFactor() != 0) {
3277 readSequence->AddAction( ReadBasicType_WithFactor<double>,
new TConfWithFactor(
this,i,compinfo,compinfo->fOffset,element->GetFactor(),element->GetXmin()) );
3279 Int_t nbits = (Int_t)element->GetXmin();
3281 readSequence->AddAction( ConvertBasicType<float,double>::Action,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
3283 readSequence->AddAction( ReadBasicType_NoFactor<double>,
new TConfNoFactor(
this,i,compinfo,compinfo->fOffset,nbits) );
3288 case TStreamerInfo::kTNamed: readSequence->AddAction( ReadTNamed,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3291 case TStreamerInfo::kTObject: readSequence->AddAction( ReadTObject,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3292 case TStreamerInfo::kTString: readSequence->AddAction( ReadTString,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3293 case TStreamerInfo::kSTL: {
3294 TClass *newClass = element->GetNewClass();
3295 TClass *oldClass = element->GetClassPointer();
3296 Bool_t isSTLbase = element->IsBase() && element->IsA()!=TStreamerBase::Class();
3298 if (element->GetArrayLength() <= 1) {
3300 if (newClass && newClass != oldClass) {
3301 if (element->GetStreamer()) {
3302 readSequence->AddAction(ReadSTL<ReadSTLMemberWiseChangedClass,ReadSTLObjectWiseStreamerV2>,
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,1,oldClass,newClass,element->GetStreamer(),element->GetTypeName(),isSTLbase));
3304 readSequence->AddAction(ReadSTL<ReadSTLMemberWiseChangedClass,ReadSTLObjectWiseFastArrayV2>,
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,1,oldClass,newClass,element->GetTypeName(),isSTLbase));
3307 if (element->GetStreamer()) {
3308 readSequence->AddAction(ReadSTL<ReadSTLMemberWiseSameClass,ReadSTLObjectWiseStreamerV2>,
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,1,oldClass,element->GetStreamer(),element->GetTypeName(),isSTLbase));
3310 readSequence->AddAction(ReadSTL<ReadSTLMemberWiseSameClass,ReadSTLObjectWiseFastArrayV2>,
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,1,oldClass,element->GetTypeName(),isSTLbase));
3314 if (newClass && newClass != oldClass) {
3315 if (element->GetStreamer()) {
3316 readSequence->AddAction(ReadSTL<ReadSTLMemberWiseChangedClass,ReadSTLObjectWiseStreamer>,
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,1,oldClass,newClass,element->GetStreamer(),element->GetTypeName(),isSTLbase));
3318 if (oldClass->GetCollectionProxy() == 0 || oldClass->GetCollectionProxy()->GetValueClass() || oldClass->GetCollectionProxy()->HasPointers() ) {
3319 readSequence->AddAction(ReadSTL<ReadSTLMemberWiseChangedClass,ReadSTLObjectWiseFastArray>,
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,1,oldClass,newClass,element->GetTypeName(),isSTLbase));
3321 switch (SelectLooper(*newClass->GetCollectionProxy())) {
3323 readSequence->AddAction(GetConvertCollectionReadAction<VectorLooper>(oldClass->GetCollectionProxy()->GetType(), newClass->GetCollectionProxy()->GetType(),
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,1,oldClass,newClass,element->GetTypeName(),isSTLbase)));
3325 case kAssociativeLooper:
3326 readSequence->AddAction(GetConvertCollectionReadAction<AssociativeLooper>(oldClass->GetCollectionProxy()->GetType(), newClass->GetCollectionProxy()->GetType(),
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,1,oldClass,newClass,element->GetTypeName(),isSTLbase)));
3328 case kVectorPtrLooper:
3329 case kGenericLooper:
3332 readSequence->AddAction(GetConvertCollectionReadAction<GenericLooper>(oldClass->GetCollectionProxy()->GetType(), newClass->GetCollectionProxy()->GetType(),
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,1,oldClass,newClass,element->GetTypeName(),isSTLbase)));
3338 if (element->GetStreamer()) {
3339 readSequence->AddAction(ReadSTL<ReadSTLMemberWiseSameClass,ReadSTLObjectWiseStreamer>,
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,1,oldClass,element->GetStreamer(),element->GetTypeName(),isSTLbase));
3341 if (oldClass->GetCollectionProxy() == 0 || oldClass->GetCollectionProxy()->GetValueClass() || oldClass->GetCollectionProxy()->HasPointers() ) {
3342 readSequence->AddAction(ReadSTL<ReadSTLMemberWiseSameClass,ReadSTLObjectWiseFastArray>,
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,1,oldClass,element->GetTypeName(),isSTLbase));
3344 switch (SelectLooper(*oldClass->GetCollectionProxy())) {
3346 readSequence->AddAction(GetNumericCollectionReadAction<VectorLooper>(oldClass->GetCollectionProxy()->GetType(),
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,1,oldClass,element->GetTypeName(),isSTLbase)));
3348 case kAssociativeLooper:
3349 readSequence->AddAction(GetNumericCollectionReadAction<AssociativeLooper>(oldClass->GetCollectionProxy()->GetType(),
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,1,oldClass,element->GetTypeName(),isSTLbase)));
3351 case kVectorPtrLooper:
3352 case kGenericLooper:
3355 readSequence->AddAction(GetNumericCollectionReadAction<GenericLooper>(oldClass->GetCollectionProxy()->GetType(),
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,1,oldClass,element->GetTypeName(),isSTLbase)));
3364 if (newClass && newClass != oldClass) {
3365 if (element->GetStreamer()) {
3366 readSequence->AddAction(ReadSTL<ReadArraySTLMemberWiseChangedClass,ReadSTLObjectWiseStreamerV2>,
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,element->GetArrayLength(),oldClass,newClass,element->GetStreamer(),element->GetTypeName(),isSTLbase));
3368 readSequence->AddAction(ReadSTL<ReadArraySTLMemberWiseChangedClass,ReadSTLObjectWiseFastArrayV2>,
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,element->GetArrayLength(),oldClass,newClass,element->GetTypeName(),isSTLbase));
3371 if (element->GetStreamer()) {
3372 readSequence->AddAction(ReadSTL<ReadArraySTLMemberWiseSameClass,ReadSTLObjectWiseStreamerV2>,
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,element->GetArrayLength(),oldClass,element->GetStreamer(),element->GetTypeName(),isSTLbase));
3374 readSequence->AddAction(ReadSTL<ReadArraySTLMemberWiseSameClass,ReadSTLObjectWiseFastArrayV2>,
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,element->GetArrayLength(),oldClass,element->GetTypeName(),isSTLbase));
3378 if (newClass && newClass != oldClass) {
3379 if (element->GetStreamer()) {
3380 readSequence->AddAction(ReadSTL<ReadArraySTLMemberWiseChangedClass,ReadSTLObjectWiseStreamer>,
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,element->GetArrayLength(),oldClass,newClass,element->GetStreamer(),element->GetTypeName(),isSTLbase));
3382 readSequence->AddAction(ReadSTL<ReadArraySTLMemberWiseChangedClass,ReadSTLObjectWiseFastArray>,
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,element->GetArrayLength(),oldClass,newClass,element->GetTypeName(),isSTLbase));
3385 if (element->GetStreamer()) {
3386 readSequence->AddAction(ReadSTL<ReadArraySTLMemberWiseSameClass,ReadSTLObjectWiseStreamer>,
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,element->GetArrayLength(),oldClass,element->GetStreamer(),element->GetTypeName(),isSTLbase));
3388 readSequence->AddAction(ReadSTL<ReadArraySTLMemberWiseSameClass,ReadSTLObjectWiseFastArray>,
new TConfigSTL(
this,i,compinfo,compinfo->fOffset,element->GetArrayLength(),oldClass,element->GetTypeName(),isSTLbase));
3396 case TStreamerInfo::kConv + TStreamerInfo::kBool:
3397 AddReadConvertAction<Bool_t>(readSequence, compinfo->fNewType,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
3399 case TStreamerInfo::kConv + TStreamerInfo::kChar:
3400 AddReadConvertAction<Char_t>(readSequence, compinfo->fNewType,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
3402 case TStreamerInfo::kConv + TStreamerInfo::kShort:
3403 AddReadConvertAction<Short_t>(readSequence, compinfo->fNewType,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
3405 case TStreamerInfo::kConv + TStreamerInfo::kInt:
3406 AddReadConvertAction<Int_t>(readSequence, compinfo->fNewType,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
3408 case TStreamerInfo::kConv + TStreamerInfo::kLong:
3409 AddReadConvertAction<Long_t>(readSequence, compinfo->fNewType,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
3411 case TStreamerInfo::kConv + TStreamerInfo::kLong64:
3412 AddReadConvertAction<Long64_t>(readSequence, compinfo->fNewType,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
3414 case TStreamerInfo::kConv + TStreamerInfo::kFloat:
3415 AddReadConvertAction<Float_t>(readSequence, compinfo->fNewType,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
3417 case TStreamerInfo::kConv + TStreamerInfo::kDouble:
3418 AddReadConvertAction<Double_t>(readSequence, compinfo->fNewType,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
3420 case TStreamerInfo::kConv + TStreamerInfo::kUChar:
3421 AddReadConvertAction<UChar_t>(readSequence, compinfo->fNewType,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
3423 case TStreamerInfo::kConv + TStreamerInfo::kUShort:
3424 AddReadConvertAction<UShort_t>(readSequence, compinfo->fNewType,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
3426 case TStreamerInfo::kConv + TStreamerInfo::kUInt:
3427 AddReadConvertAction<UInt_t>(readSequence, compinfo->fNewType,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
3429 case TStreamerInfo::kConv + TStreamerInfo::kULong:
3430 AddReadConvertAction<ULong_t>(readSequence, compinfo->fNewType,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
3432 case TStreamerInfo::kConv + TStreamerInfo::kULong64:
3433 AddReadConvertAction<ULong64_t>(readSequence, compinfo->fNewType,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
3435 case TStreamerInfo::kConv + TStreamerInfo::kBits:
3436 AddReadConvertAction<BitsMarker>(readSequence, compinfo->fNewType,
new TBitsConfiguration(
this,i,compinfo,compinfo->fOffset) );
3438 case TStreamerInfo::kConv + TStreamerInfo::kFloat16: {
3439 if (element->GetFactor() != 0) {
3440 AddReadConvertAction<WithFactorMarker<float> >(readSequence, compinfo->fNewType,
new TConfWithFactor(
this,i,compinfo,compinfo->fOffset,element->GetFactor(),element->GetXmin()) );
3442 Int_t nbits = (Int_t)element->GetXmin();
3443 if (!nbits) nbits = 12;
3444 AddReadConvertAction<NoFactorMarker<float> >(readSequence, compinfo->fNewType,
new TConfNoFactor(
this,i,compinfo,compinfo->fOffset,nbits) );
3448 case TStreamerInfo::kConv + TStreamerInfo::kDouble32: {
3449 if (element->GetFactor() != 0) {
3450 AddReadConvertAction<WithFactorMarker<double> >(readSequence, compinfo->fNewType,
new TConfWithFactor(
this,i,compinfo,compinfo->fOffset,element->GetFactor(),element->GetXmin()) );
3452 Int_t nbits = (Int_t)element->GetXmin();
3454 AddReadConvertAction<Float_t>(readSequence, compinfo->fNewType,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
3456 AddReadConvertAction<NoFactorMarker<double> >(readSequence, compinfo->fNewType,
new TConfNoFactor(
this,i,compinfo,compinfo->fOffset,nbits) );
3462 readSequence->AddAction( GenericReadAction,
new TGenericConfiguration(
this,i,compinfo) );
3465 if (element->TestBit(TStreamerElement::kCache)) {
3466 TConfiguredAction action( readSequence->fActions.back() );
3467 readSequence->fActions.pop_back();
3468 readSequence->AddAction( UseCache,
new TConfigurationUseCache(
this,action,element->TestBit(TStreamerElement::kRepeat)) );
3475 void TStreamerInfo::AddReadTextAction(TStreamerInfoActions::TActionSequence *readSequence, Int_t i, TStreamerInfo::TCompInfo *compinfo)
3477 TStreamerElement *element = compinfo->fElem;
3479 if (element->TestBit(TStreamerElement::kWrite))
3482 Bool_t
generic = kFALSE, isBase = kFALSE;
3484 switch (compinfo->fType) {
3485 case TStreamerInfo::kTObject:
3486 if (element->IsBase())
3490 readSequence->AddAction(ReadTextTObject,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3493 case TStreamerInfo::kTNamed:
3494 if (element->IsBase())
3498 readSequence->AddAction(ReadTextTNamed,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3501 case TStreamerInfo::kObject:
3502 case TStreamerInfo::kAny:
3503 case TStreamerInfo::kOffsetL + TStreamerInfo::kObject:
3504 case TStreamerInfo::kAny + TStreamerInfo::kOffsetL:
3505 readSequence->AddAction(ReadTextObject,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3508 case TStreamerInfo::kSTLp:
3509 case TStreamerInfo::kSTLp +
3510 TStreamerInfo::kOffsetL:
3511 readSequence->AddAction(ReadSTLp<true>,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3514 case TStreamerInfo::kStreamLoop:
3515 case TStreamerInfo::kOffsetL + TStreamerInfo::kStreamLoop:
3516 readSequence->AddAction(ReadStreamerLoop<true>,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3519 case TStreamerInfo::kBase: isBase = kTRUE;
break;
3521 case TStreamerInfo::kStreamer:
3522 readSequence->AddAction(ReadTextStreamer,
new TGenericConfiguration(
this, i, compinfo));
3525 default:
generic = kTRUE;
break;
3529 if (compinfo->fStreamer) {
3530 readSequence->AddAction(ReadTextStreamer,
new TGenericConfiguration(
this, i, compinfo));
3532 readSequence->AddAction(ReadTextBaseClass,
new TGenericConfiguration(
this, i, compinfo));
3535 readSequence->AddAction(GenericReadAction,
new TGenericConfiguration(
this, i, compinfo));
3542 void TStreamerInfo::AddReadMemberWiseVecPtrAction(TStreamerInfoActions::TActionSequence *readSequence, Int_t i, TStreamerInfo::TCompInfo *compinfo)
3544 TStreamerElement *element = compinfo->fElem;
3546 if (element->TestBit(TStreamerElement::kWrite))
return;
3548 if (element->TestBit(TStreamerElement::kCache)) {
3549 TConfiguredAction action( GetCollectionReadAction<VectorLooper>(
this,element,compinfo->fType,i,compinfo,compinfo->fOffset) );
3550 readSequence->AddAction( UseCacheVectorPtrLoop,
new TConfigurationUseCache(
this,action,element->TestBit(TStreamerElement::kRepeat)) );
3552 readSequence->AddAction( GetCollectionReadAction<VectorPtrLooper>(
this,element,compinfo->fType,i,compinfo,compinfo->fOffset) );
3558 void TStreamerInfo::AddWriteAction(TStreamerInfoActions::TActionSequence *writeSequence, Int_t i, TStreamerInfo::TCompInfo *compinfo)
3560 TStreamerElement *element = compinfo->fElem;
3561 if (element->TestBit(TStreamerElement::kCache) && !element->TestBit(TStreamerElement::kWrite)) {
3565 if (element->GetType() >= kArtificial && !element->TestBit(TStreamerElement::kWrite)) {
3569 switch (compinfo->fType) {
3571 case TStreamerInfo::kBool: writeSequence->AddAction( WriteBasicType<Bool_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3572 case TStreamerInfo::kChar: writeSequence->AddAction( WriteBasicType<Char_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3573 case TStreamerInfo::kShort: writeSequence->AddAction( WriteBasicType<Short_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3574 case TStreamerInfo::kInt: writeSequence->AddAction( WriteBasicType<Int_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3575 case TStreamerInfo::kLong: writeSequence->AddAction( WriteBasicType<Long_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3576 case TStreamerInfo::kLong64: writeSequence->AddAction( WriteBasicType<Long64_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3577 case TStreamerInfo::kFloat: writeSequence->AddAction( WriteBasicType<Float_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3578 case TStreamerInfo::kDouble: writeSequence->AddAction( WriteBasicType<Double_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3579 case TStreamerInfo::kUChar: writeSequence->AddAction( WriteBasicType<UChar_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3580 case TStreamerInfo::kUShort: writeSequence->AddAction( WriteBasicType<UShort_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3581 case TStreamerInfo::kUInt: writeSequence->AddAction( WriteBasicType<UInt_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3582 case TStreamerInfo::kULong: writeSequence->AddAction( WriteBasicType<ULong_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3583 case TStreamerInfo::kULong64: writeSequence->AddAction( WriteBasicType<ULong64_t>,
new TConfiguration(
this,i,compinfo,compinfo->fOffset) );
break;
3650 writeSequence->AddAction( GenericWriteAction,
new TGenericConfiguration(
this,i,compinfo) );
3653 #if defined(CDJ_NO_COMPILE)
3654 if (element->TestBit(TStreamerElement::kCache)) {
3655 TConfiguredAction action( writeSequence->fActions.back() );
3656 writeSequence->fActions.pop_back();
3657 writeSequence->AddAction( UseCache,
new TConfigurationUseCache(
this,action,element->TestBit(TStreamerElement::kRepeat)) );
3664 void TStreamerInfo::AddWriteTextAction(TStreamerInfoActions::TActionSequence *writeSequence, Int_t i, TStreamerInfo::TCompInfo *compinfo)
3666 TStreamerElement *element = compinfo->fElem;
3667 if (element->TestBit(TStreamerElement::kCache) && !element->TestBit(TStreamerElement::kWrite)) {
3671 if (element->GetType() >= kArtificial && !element->TestBit(TStreamerElement::kWrite)) {
3676 Bool_t
generic = kFALSE, isBase = kFALSE;
3678 switch (compinfo->fType) {
3680 case TStreamerInfo::kBool:
3681 writeSequence->AddAction(WriteBasicType<Bool_t>,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3683 case TStreamerInfo::kChar:
3684 writeSequence->AddAction(WriteBasicType<Char_t>,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3686 case TStreamerInfo::kShort:
3687 writeSequence->AddAction(WriteBasicType<Short_t>,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3689 case TStreamerInfo::kInt:
3690 writeSequence->AddAction(WriteBasicType<Int_t>,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3692 case TStreamerInfo::kLong:
3693 writeSequence->AddAction(WriteBasicType<Long_t>,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3695 case TStreamerInfo::kLong64:
3696 writeSequence->AddAction(WriteBasicType<Long64_t>,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3698 case TStreamerInfo::kFloat:
3699 writeSequence->AddAction(WriteBasicType<Float_t>,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3701 case TStreamerInfo::kDouble:
3702 writeSequence->AddAction(WriteBasicType<Double_t>,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3704 case TStreamerInfo::kUChar:
3705 writeSequence->AddAction(WriteBasicType<UChar_t>,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3707 case TStreamerInfo::kUShort:
3708 writeSequence->AddAction(WriteBasicType<UShort_t>,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3710 case TStreamerInfo::kUInt:
3711 writeSequence->AddAction(WriteBasicType<UInt_t>,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3713 case TStreamerInfo::kULong:
3714 writeSequence->AddAction(WriteBasicType<ULong_t>,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3716 case TStreamerInfo::kULong64:
3717 writeSequence->AddAction(WriteBasicType<ULong64_t>,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3720 case TStreamerInfo::kTObject:
3721 if (element->IsBase())
3724 writeSequence->AddAction(WriteTextTObject,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3727 case TStreamerInfo::kTNamed:
3728 if (element->IsBase())
3731 writeSequence->AddAction(WriteTextTNamed,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3734 case TStreamerInfo::kSTLp:
3735 case TStreamerInfo::kSTLp +
3736 TStreamerInfo::kOffsetL:
3737 writeSequence->AddAction(WriteSTLp<true>,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3740 case TStreamerInfo::kStreamLoop:
3741 case TStreamerInfo::kOffsetL + TStreamerInfo::kStreamLoop:
3742 writeSequence->AddAction(WriteStreamerLoop<true>,
new TConfiguration(
this, i, compinfo, compinfo->fOffset));
3745 case TStreamerInfo::kBase: isBase = kTRUE;
break;
3747 case TStreamerInfo::kStreamer:
3748 writeSequence->AddAction(WriteTextStreamer,
new TGenericConfiguration(
this, i, compinfo));
3833 default:
generic = kTRUE;
break;
3837 if (compinfo->fStreamer) {
3838 writeSequence->AddAction(WriteTextStreamer,
new TGenericConfiguration(
this, i, compinfo));
3840 writeSequence->AddAction(WriteTextBaseClass,
new TGenericConfiguration(
this, i, compinfo));
3847 writeSequence->AddAction(GenericWriteAction,
new TGenericConfiguration(
this, i, compinfo));
3849 #if defined(CDJ_NO_COMPILE)
3850 if (element->TestBit(TStreamerElement::kCache)) {
3851 TConfiguredAction action(writeSequence->fActions.back());
3852 writeSequence->fActions.pop_back();
3853 writeSequence->AddAction(UseCache,
3854 new TConfigurationUseCache(
this, action, element->TestBit(TStreamerElement::kRepeat)));
3862 void TStreamerInfo::AddWriteMemberWiseVecPtrAction(TStreamerInfoActions::TActionSequence *writeSequence, Int_t i, TStreamerInfo::TCompInfo *compinfo)
3864 TStreamerElement *element = compinfo->fElem;
3865 if (element->TestBit(TStreamerElement::kCache) && !element->TestBit(TStreamerElement::kWrite)) {
3869 if (element->GetType() >= kArtificial && !element->TestBit(TStreamerElement::kWrite)) {
3874 #if defined(CDJ_NO_COMPILE)
3875 if (element->TestBit(TStreamerElement::kCache)) {
3876 TConfiguredAction action( GetCollectionWriteAction<VectorLooper>(
this,element,compinfo->fType,i,compinfo,compinfo->fOffset) );
3877 writeSequence->AddAction( UseCacheVectorPtrLoop,
new TConfigurationUseCache(
this,action,element->TestBit(TStreamerElement::kRepeat)) );
3879 writeSequence->Addaction( GetCollectionWriteAction<VectorPtrLooper>(
this,element,compinfo->fType,i,compinfo,compinfo->fOffset) );
3882 writeSequence->AddAction( VectorPtrLooper::GenericWrite,
new TGenericConfiguration(
this,i,compinfo) );
3890 TStreamerInfoActions::TActionSequence *TStreamerInfoActions::TActionSequence::CreateReadMemberWiseActions(TVirtualStreamerInfo *info, TVirtualCollectionProxy &proxy)
3893 return new TStreamerInfoActions::TActionSequence(0,0);
3896 TStreamerInfo *sinfo =
static_cast<TStreamerInfo*
>(info);
3898 UInt_t ndata = info->GetElements()->GetEntries();
3899 TStreamerInfoActions::TActionSequence *sequence =
new TStreamerInfoActions::TActionSequence(info,ndata);
3900 if (IsDefaultVector(proxy))
3902 if (proxy.HasPointers()) {
3906 sequence = sinfo->GetReadMemberWiseActions(kTRUE)->CreateCopy();
3912 Long_t increment = proxy.GetIncrement();
3913 sequence->fLoopConfig =
new TVectorLoopConfig(&proxy, increment, kTRUE);
3914 }
else if (proxy.GetCollectionType() == ROOT::kSTLset || proxy.GetCollectionType() == ROOT::kSTLunorderedset
3915 || proxy.GetCollectionType() == ROOT::kSTLmultiset || proxy.GetCollectionType() == ROOT::kSTLunorderedmultiset
3916 || proxy.GetCollectionType() == ROOT::kSTLmap || proxy.GetCollectionType() == ROOT::kSTLmultimap
3917 || proxy.GetCollectionType() == ROOT::kSTLunorderedmap || proxy.GetCollectionType() == ROOT::kSTLunorderedmultimap)
3919 Long_t increment = proxy.GetIncrement();
3920 sequence->fLoopConfig =
new TVectorLoopConfig(&proxy, increment, kTRUE);
3923 sequence->fLoopConfig =
new TGenericLoopConfig(&proxy, kTRUE);
3925 for (UInt_t i = 0; i < ndata; ++i) {
3926 TStreamerElement *element = (TStreamerElement*) info->GetElements()->At(i);
3930 if (element->GetType() < 0) {
3938 if (element->TestBit(TStreamerElement::kWrite)) {
3942 TStreamerBase *baseEl =
dynamic_cast<TStreamerBase*
>(element);
3944 if (!baseEl->TestBit(TStreamerElement::kWarned) && baseEl->GetErrorMessage()[0]) {
3949 ::Warning(
"CreateReadMemberWiseActions",
"%s",
3950 baseEl->GetErrorMessage());
3951 baseEl->SetBit(TStreamerElement::kWarned);
3955 TStreamerInfo::TCompInfo_t *compinfo = sinfo->fCompFull[i];
3957 Int_t asize = element->GetSize();
3958 if (element->GetArrayLength()) {
3959 asize /= element->GetArrayLength();
3961 Int_t oldType = element->GetType();
3962 Int_t newType = element->GetNewType();
3964 Int_t offset = element->GetOffset();
3965 if (newType != oldType) {
3967 if (oldType != TVirtualStreamerInfo::kCounter) {
3968 oldType += TVirtualStreamerInfo::kConv;
3971 oldType += TVirtualStreamerInfo::kSkip;
3974 switch (SelectLooper(proxy)) {
3975 case kAssociativeLooper:
3980 case kVectorPtrLooper:
3982 if (element->TestBit(TStreamerElement::kCache)) {
3983 TConfiguredAction action( GetCollectionReadAction<VectorLooper>(info,element,oldType,i,compinfo,offset) );
3984 sequence->AddAction( UseCacheVectorLoop,
new TConfigurationUseCache(info,action,element->TestBit(TStreamerElement::kRepeat)) );
3986 sequence->AddAction( GetCollectionReadAction<VectorLooper>(info,element,oldType,i,compinfo,offset));
3989 case kGenericLooper:
3992 if (element->TestBit(TStreamerElement::kCache)) {
3993 TConfiguredAction action( GetCollectionReadAction<VectorLooper>(info,element,oldType,i,compinfo,offset) );
3994 sequence->AddAction( UseCacheGenericCollection,
new TConfigurationUseCache(info,action,element->TestBit(TStreamerElement::kRepeat)) );
3996 sequence->AddAction( GetCollectionReadAction<GenericLooper>(info,element,oldType,i,compinfo,offset) );
4007 TStreamerInfoActions::TActionSequence *TStreamerInfoActions::TActionSequence::CreateWriteMemberWiseActions(TVirtualStreamerInfo *info, TVirtualCollectionProxy &proxy)
4010 return new TStreamerInfoActions::TActionSequence(0,0);
4013 UInt_t ndata = info->GetElements()->GetEntries();
4014 TStreamerInfo *sinfo =
static_cast<TStreamerInfo*
>(info);
4015 TStreamerInfoActions::TActionSequence *sequence =
new TStreamerInfoActions::TActionSequence(info,ndata);
4017 if (IsDefaultVector(proxy))
4019 if (proxy.HasPointers()) {
4023 sequence = sinfo->GetWriteMemberWiseActions(kTRUE)->CreateCopy();
4029 Long_t increment = proxy.GetIncrement();
4030 sequence->fLoopConfig =
new TVectorLoopConfig(&proxy, increment, kFALSE);
4038 sequence->fLoopConfig =
new TGenericLoopConfig(&proxy, kFALSE);
4040 for (UInt_t i = 0; i < ndata; ++i) {
4041 TStreamerElement *element = (TStreamerElement*) info->GetElements()->At(i);
4045 if (element->GetType() < 0) {
4053 if (element->TestBit(TStreamerElement::kCache) && !element->TestBit(TStreamerElement::kWrite)) {
4057 if (element->GetType() >= TVirtualStreamerInfo::kArtificial && !element->TestBit(TStreamerElement::kWrite)) {
4061 TStreamerInfo::TCompInfo *compinfo = sinfo->fCompFull[i];
4062 Int_t asize = element->GetSize();
4063 if (element->GetArrayLength()) {
4064 asize /= element->GetArrayLength();
4066 Int_t oldType = element->GetType();
4067 Int_t offset = element->GetOffset();
4068 #if defined(CDJ_NO_COMPILE)
4069 Int_t newType = element->GetNewType();
4071 if (newType != oldType) {
4073 if (oldType != TVirtualStreamerInfo::kCounter) {
4074 oldType += TVirtualStreamerInfo::kConv;
4077 oldType += TVirtualStreamerInfo::kSkip;
4080 if ( IsDefaultVector(proxy)
4086 if (element->TestBit(TStreamerElement::kCache)) {
4087 TConfiguredAction action( GetCollectionWriteAction<VectorLooper>(info,element,oldType,i,compinfo,offset) );
4088 sequence->AddAction( UseCacheVectorLoop,
new TConfigurationUseCache(info,action,element->TestBit(TStreamerElement::kRepeat)) );
4090 sequence->AddAction(GetCollectionWriteAction<VectorLooper>(info,element,oldType,i,compinfo,offset));
4098 if (element->TestBit(TStreamerElement::kCache)) {
4099 TConfiguredAction action( GetWriteAction<VectorLooper>(info,element,oldType,i,compinfo,offset) );
4100 sequence->AddAction( UseCacheGenericCollection,
new TConfigurationUseCache(info,action,element->TestBit(TStreamerElement::kRepeat)) );
4104 case TVirtualStreamerInfo::kBool: sequence->AddAction( WriteBasicTypeGenericLoop<Bool_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
4105 case TVirtualStreamerInfo::kChar: sequence->AddAction( WriteBasicTypeGenericLoop<Char_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
4106 case TVirtualStreamerInfo::kShort: sequence->AddAction( WriteBasicTypeGenericLoop<Short_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
4107 case TVirtualStreamerInfo::kInt: sequence->AddAction( WriteBasicTypeGenericLoop<Int_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
4108 case TVirtualStreamerInfo::kLong: sequence->AddAction( WriteBasicTypeGenericLoop<Long_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
4109 case TVirtualStreamerInfo::kLong64: sequence->AddAction( WriteBasicTypeGenericLoop<Long64_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
4110 case TVirtualStreamerInfo::kFloat: sequence->AddAction( WriteBasicTypeGenericLoop<Float_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
4111 case TVirtualStreamerInfo::kDouble: sequence->AddAction( WriteBasicTypeGenericLoop<Double_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
4112 case TVirtualStreamerInfo::kUChar: sequence->AddAction( WriteBasicTypeGenericLoop<UChar_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
4113 case TVirtualStreamerInfo::kUShort: sequence->AddAction( WriteBasicTypeGenericLoop<UShort_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
4114 case TVirtualStreamerInfo::kUInt: sequence->AddAction( WriteBasicTypeGenericLoop<UInt_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
4115 case TVirtualStreamerInfo::kULong: sequence->AddAction( WriteBasicTypeGenericLoop<ULong_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
4116 case TVirtualStreamerInfo::kULong64: sequence->AddAction( WriteBasicTypeGenericLoop<ULong64_t>,
new TConfiguration(info,i,compinfo,offset) );
break;
4118 case TVirtualStreamerInfo::kFloat16: {
4119 if (element->GetFactor() != 0) {
4120 sequence->AddAction( GenericLooper<WriteBasicType_WithFactor<float> >,
new TConfWithFactor(info,i,compinfo,offset,element->GetFactor(),element->GetXmin()) );
4122 Int_t nbits = (Int_t)element->GetXmin();
4123 if (!nbits) nbits = 12;
4124 sequence->AddAction( GenericLooper<WriteBasicType_NoFactor<float> >,
new TConfNoFactor(info,i,compinfo,offset,nbits) );
4128 case TVirtualStreamerInfo::kDouble32: {
4129 if (element->GetFactor() != 0) {
4130 sequence->AddAction( GenericLooper<WriteBasicType_WithFactor<double> >,
new TConfWithFactor(info,i,compinfo,offset,element->GetFactor(),element->GetXmin()) );
4132 Int_t nbits = (Int_t)element->GetXmin();
4134 sequence->AddAction( GenericLooper<ConvertBasicType<float,double> >,
new TConfiguration(info,i,compinfo,offset) );
4136 sequence->AddAction( GenericLooper<WriteBasicType_NoFactor<double> >,
new TConfNoFactor(info,i,compinfo,offset,nbits) );
4141 case TVirtualStreamerInfo::kTNamed: sequence->AddAction( GenericLooper<WriteTNamed >,
new TConfiguration(info,i,compinfo,offset) );
break;
4144 case TVirtualStreamerInfo::kTObject: sequence->AddAction( GenericLooper<WriteTObject >,
new TConfiguration(info,i,compinfo,offset) );
break;
4145 case TVirtualStreamerInfo::kTString: sequence->AddAction( GenericLooper<WriteTString >,
new TConfiguration(info,i,compinfo,offset) );
break;
4147 sequence->AddAction( GenericCollectionWriteAction,
new TConfigSTL(info,i,0 ,0,proxy.GetCollectionClass(),0,0) );
4153 if ( IsDefaultVector(proxy)
4157 sequence->AddAction( GetCollectionWriteAction<VectorLooper>(info,element,oldType,i,compinfo,offset) );
4163 sequence->AddAction( GenericLooper::GenericWrite,
new TConfigSTL(info,i,compinfo,0 ,0,proxy.GetCollectionClass(),0,0) );
4170 void TStreamerInfoActions::TActionSequence::AddToOffset(Int_t delta)
4175 TStreamerInfoActions::ActionContainer_t::iterator end = fActions.end();
4176 for(TStreamerInfoActions::ActionContainer_t::iterator iter = fActions.begin();
4180 if (!iter->fConfiguration->fInfo->GetElements()->At(iter->fConfiguration->fElemId)->TestBit(TStreamerElement::kCache))
4181 iter->fConfiguration->AddToOffset(delta);
4185 void TStreamerInfoActions::TActionSequence::SetMissing()
4190 TStreamerInfoActions::ActionContainer_t::iterator end = fActions.end();
4191 for(TStreamerInfoActions::ActionContainer_t::iterator iter = fActions.begin();
4195 if (!iter->fConfiguration->fInfo->GetElements()->At(iter->fConfiguration->fElemId)->TestBit(TStreamerElement::kCache))
4196 iter->fConfiguration->SetMissing();
4200 TStreamerInfoActions::TActionSequence *TStreamerInfoActions::TActionSequence::CreateCopy()
4204 TStreamerInfoActions::TActionSequence *sequence =
new TStreamerInfoActions::TActionSequence(fStreamerInfo,fActions.size());
4206 sequence->fLoopConfig = fLoopConfig ? fLoopConfig->Copy() : 0;
4208 TStreamerInfoActions::ActionContainer_t::iterator end = fActions.end();
4209 for(TStreamerInfoActions::ActionContainer_t::iterator iter = fActions.begin();
4213 TConfiguration *conf = iter->fConfiguration->Copy();
4214 sequence->AddAction( iter->fAction, conf );
4219 void TStreamerInfoActions::TActionSequence::AddToSubSequence(TStreamerInfoActions::TActionSequence *sequence,
4220 const TStreamerInfoActions::TIDs &element_ids,
4222 TStreamerInfoActions::TActionSequence::SequenceGetter_t create)
4224 for(UInt_t
id = 0;
id < element_ids.size(); ++id) {
4225 if ( element_ids[
id].fElemID < 0 ) {
4226 if (element_ids[
id].fNestedIDs) {
4227 auto original = create(element_ids[
id].fNestedIDs->fInfo,
4228 sequence->fLoopConfig ? sequence->fLoopConfig->GetCollectionProxy() :
nullptr,
4230 if (element_ids[
id].fNestedIDs->fOnfileObject) {
4231 auto conf =
new TConfigurationPushDataCache(element_ids[
id].fNestedIDs->fInfo, element_ids[
id].fNestedIDs->fOnfileObject, offset);
4232 if ( sequence->fLoopConfig )
4233 sequence->AddAction( PushDataCacheGenericCollection, conf );
4235 sequence->AddAction( PushDataCache, conf );
4238 original->AddToSubSequence(sequence, element_ids[
id].fNestedIDs->fIDs, element_ids[
id].fNestedIDs->fOffset, create);
4240 if (element_ids[
id].fNestedIDs->fOnfileObject)
4241 sequence->AddAction( PopDataCache,
4242 new TConfigurationPushDataCache(element_ids[
id].fNestedIDs->fInfo,
nullptr, element_ids[
id].fNestedIDs->fOffset) );
4244 TStreamerInfoActions::ActionContainer_t::iterator end = fActions.end();
4245 for(TStreamerInfoActions::ActionContainer_t::iterator iter = fActions.begin();
4249 TConfiguration *conf = iter->fConfiguration->Copy();
4250 if (!iter->fConfiguration->fInfo->GetElements()->At(iter->fConfiguration->fElemId)->TestBit(TStreamerElement::kCache))
4251 conf->AddToOffset(offset);
4252 sequence->AddAction( iter->fAction, conf );
4257 TStreamerInfoActions::ActionContainer_t::iterator end = fActions.end();
4258 for(TStreamerInfoActions::ActionContainer_t::iterator iter = fActions.begin();
4270 if ( iter->fConfiguration->fElemId == (UInt_t)element_ids[id].fElemID ) {
4271 TConfiguration *conf = iter->fConfiguration->Copy();
4272 if (!iter->fConfiguration->fInfo->GetElements()->At(iter->fConfiguration->fElemId)->TestBit(TStreamerElement::kCache))
4273 conf->AddToOffset(offset);
4274 sequence->AddAction( iter->fAction, conf );
4281 TStreamerInfoActions::TActionSequence *TStreamerInfoActions::TActionSequence::CreateSubSequence(
const TIDs &element_ids,
size_t offset,
4282 TStreamerInfoActions::TActionSequence::SequenceGetter_t create)
4287 TStreamerInfoActions::TActionSequence *sequence =
new TStreamerInfoActions::TActionSequence(fStreamerInfo,element_ids.size());
4289 sequence->fLoopConfig = fLoopConfig ? fLoopConfig->Copy() : 0;
4291 AddToSubSequence(sequence, element_ids, offset, create);
4296 TStreamerInfoActions::TActionSequence *TStreamerInfoActions::TActionSequence::CreateSubSequence(
const std::vector<Int_t> &element_ids,
size_t offset)
4301 TStreamerInfoActions::TActionSequence *sequence =
new TStreamerInfoActions::TActionSequence(fStreamerInfo,element_ids.size());
4303 sequence->fLoopConfig = fLoopConfig ? fLoopConfig->Copy() : 0;
4305 for(UInt_t
id = 0;
id < element_ids.size(); ++id) {
4306 if ( element_ids[
id] < 0 ) {
4307 TStreamerInfoActions::ActionContainer_t::iterator end = fActions.end();
4308 for(TStreamerInfoActions::ActionContainer_t::iterator iter = fActions.begin();
4312 TConfiguration *conf = iter->fConfiguration->Copy();
4313 if (!iter->fConfiguration->fInfo->GetElements()->At(iter->fConfiguration->fElemId)->TestBit(TStreamerElement::kCache))
4314 conf->AddToOffset(offset);
4315 sequence->AddAction( iter->fAction, conf );
4318 TStreamerInfoActions::ActionContainer_t::iterator end = fActions.end();
4319 for(TStreamerInfoActions::ActionContainer_t::iterator iter = fActions.begin();
4322 if ( iter->fConfiguration->fElemId == (UInt_t)element_ids[id] ) {
4323 TConfiguration *conf = iter->fConfiguration->Copy();
4324 if (!iter->fConfiguration->fInfo->GetElements()->At(iter->fConfiguration->fElemId)->TestBit(TStreamerElement::kCache))
4325 conf->AddToOffset(offset);
4326 sequence->AddAction( iter->fAction, conf );
4334 #if !defined(R__WIN32) && !defined(_AIX)
4340 typedef void (*voidfunc)();
4341 static const char *R__GetSymbolName(voidfunc func)
4343 #if defined(R__WIN32) || defined(__CYGWIN__) || defined(_AIX)
4344 return "not available on this platform";
4346 MEMORY_BASIC_INFORMATION mbi;
4347 if (!VirtualQuery (func, &mbi,
sizeof (mbi)))
4352 HMODULE hMod = (HMODULE) mbi.AllocationBase;
4353 static char moduleName[MAX_PATH];
4355 if (!GetModuleFileNameA (hMod, moduleName,
sizeof (moduleName)))
4363 if (dladdr((
void*)func,&info)==0) {
4365 return "name not found";
4368 return info.dli_sname;
4373 void TStreamerInfoActions::TActionSequence::Print(Option_t *opt)
const
4380 fLoopConfig->Print();
4382 TStreamerInfoActions::ActionContainer_t::const_iterator end = fActions.end();
4383 for(TStreamerInfoActions::ActionContainer_t::const_iterator iter = fActions.begin();
4387 iter->fConfiguration->Print();
4388 if (strstr(opt,
"func")) {
4389 printf(
"StreamerInfoAction func: %s\n",R__GetSymbolName((voidfunc)iter->fAction));