37 namespace std {}
using namespace std;
39 const Int_t kMaxLen = 1024;
41 static TString &IncludeNameBuffer() {
42 TTHREAD_TLS_DECL_ARG(TString,includeName,kMaxLen);
46 static TString ExtractClassName(
const TString &type_name)
48 TString className = type_name.Strip(TString::kTrailing,
'*');
49 if (className.Index(
"const ")==0) className.Remove(0,6);
58 static TStreamerBasicType *InitCounter(
const char *countClass,
const char *countName, TVirtualStreamerInfo *directive)
60 TStreamerBasicType *counter = 0;
62 TClass *cl = TClass::GetClass(countClass);
66 if (directive->GetClass() == cl) {
69 TStreamerElement *element = (TStreamerElement *)directive->GetElements()->FindObject(countName);
70 if (!element)
return 0;
71 if (element->IsA() != TStreamerBasicType::Class())
return 0;
72 counter = (TStreamerBasicType*)element;
75 if (directive->GetClass()->GetListOfRealData()) {
76 TRealData* rdCounter = (TRealData*) directive->GetClass()->GetListOfRealData()->FindObject(countName);
77 if (!rdCounter)
return 0;
78 TDataMember *dmCounter = rdCounter->GetDataMember();
79 cl = dmCounter->GetClass();
81 TStreamerElement *element = (TStreamerElement *)directive->GetElements()->FindObject(countName);
82 if (!element)
return 0;
83 if (element->IsA() != TStreamerBasicType::Class())
return 0;
84 cl = directive->GetClass();
87 counter = TVirtualStreamerInfo::GetElementCounter(countName,cl);
92 counter = TVirtualStreamerInfo::GetElementCounter(countName,cl);
97 if (counter->GetType() < TVirtualStreamerInfo::kCounter) counter->SetType(TVirtualStreamerInfo::kCounter);
116 static void GetRange(
const char *comments, Double_t &xmin, Double_t &xmax, Double_t &factor)
118 const Double_t kPi =3.14159265358979323846 ;
119 factor = xmin = xmax = 0;
120 if (!comments)
return;
121 const char *left = strstr(comments,
"[");
123 const char *right = strstr(left,
"]");
125 const char *comma = strstr(left,
",");
126 if (!comma || comma > right) {
128 left = strstr(right,
"[");
130 right = strstr(left,
"]");
132 comma = strstr(left,
",");
133 if (!comma || comma >right)
return;
136 const char *comma2 = 0;
137 if (comma) comma2 = strstr(comma+1,
",");
138 if (comma2 > right) comma2 = 0;
141 TString sbits(comma2+1,right-comma2-1);
142 sscanf(sbits.Data(),
"%d",&nbits);
143 if (nbits < 2 || nbits > 32) {
144 ::Error(
"GetRange",
"Illegal specification for the number of bits; %d. reset to 32.",nbits);
149 TString range(left+1,right-left-1);
150 TString sxmin(left+1,comma-left-1);
152 sxmin.ReplaceAll(
" ",
"");
153 if (sxmin.Contains(
"pi")) {
154 if (sxmin.Contains(
"2pi")) xmin = 2*kPi;
155 else if (sxmin.Contains(
"2*pi")) xmin = 2*kPi;
156 else if (sxmin.Contains(
"twopi")) xmin = 2*kPi;
157 else if (sxmin.Contains(
"pi/2")) xmin = kPi/2;
158 else if (sxmin.Contains(
"pi/4")) xmin = kPi/4;
159 else if (sxmin.Contains(
"pi")) xmin = kPi;
160 if (sxmin.Contains(
"-")) xmin = -xmin;
162 sscanf(sxmin.Data(),
"%lg",&xmin);
164 TString sxmax(comma+1,right-comma-1);
166 sxmax.ReplaceAll(
" ",
"");
167 if (sxmax.Contains(
"pi")) {
168 if (sxmax.Contains(
"2pi")) xmax = 2*kPi;
169 else if (sxmax.Contains(
"2*pi")) xmax = 2*kPi;
170 else if (sxmax.Contains(
"twopi")) xmax = 2*kPi;
171 else if (sxmax.Contains(
"pi/2")) xmax = kPi/2;
172 else if (sxmax.Contains(
"pi/4")) xmax = kPi/4;
173 else if (sxmax.Contains(
"pi")) xmax = kPi;
174 if (sxmax.Contains(
"-")) xmax = -xmax;
176 sscanf(sxmax.Data(),
"%lg",&xmax);
179 if (nbits < 32) bigint = 1<<nbits;
180 else bigint = 0xffffffff;
181 if (xmin < xmax) factor = bigint/(xmax-xmin);
182 if (xmin >= xmax && nbits <15) xmin = nbits+0.1;
185 ClassImp(TStreamerElement);
190 TStreamerElement::TStreamerElement()
199 fClassObject = (TClass*)(-1);
205 for (Int_t i=0;i<5;i++) fMaxIndex[i] = 0;
211 TStreamerElement::TStreamerElement(
const char *name,
const char *title, Int_t offset, Int_t dtype,
const char *typeName)
220 if (typeName && !strcmp(typeName,
"BASE")) {
222 fTypeName = typeName;
225 R__LOCKGUARD(gInterpreterMutex);
226 fTypeName = TClassEdit::ResolveTypedef(typeName);
229 fClassObject = (TClass*)(-1);
235 for (Int_t i=0;i<5;i++) fMaxIndex[i] = 0;
236 if (fTypeName ==
"Float16_t" || fTypeName ==
"Float16_t*") {
237 GetRange(title,fXmin,fXmax,fFactor);
238 if (fFactor > 0 || fXmin > 0) SetBit(kHasRange);
240 if (fTypeName ==
"Double32_t" || fTypeName ==
"Double32_t*") {
241 GetRange(title,fXmin,fXmax,fFactor);
242 if (fFactor > 0 || fXmin > 0) SetBit(kHasRange);
249 TStreamerElement::~TStreamerElement()
260 Bool_t TStreamerElement::CannotSplit()
const
262 if (GetTitle()[0] != 0 && strspn(GetTitle(),
"||") == 2)
return kTRUE;
263 TClass *cl = GetClassPointer();
264 if (!cl)
return kFALSE;
266 static TClassRef clonesArray(
"TClonesArray");
267 if (IsaPointer() && cl != clonesArray && !cl->GetCollectionProxy())
return kTRUE;
270 case TVirtualStreamerInfo::kAny +TVirtualStreamerInfo::kOffsetL:
271 case TVirtualStreamerInfo::kObject +TVirtualStreamerInfo::kOffsetL:
272 case TVirtualStreamerInfo::kTObject+TVirtualStreamerInfo::kOffsetL:
273 case TVirtualStreamerInfo::kTString+TVirtualStreamerInfo::kOffsetL:
274 case TVirtualStreamerInfo::kTNamed +TVirtualStreamerInfo::kOffsetL:
278 if ( !cl->CanSplit() )
return kTRUE;
286 TClass *TStreamerElement::GetClassPointer()
const
288 if (fClassObject!=(TClass*)(-1))
return fClassObject;
290 TString className(ExtractClassName(fTypeName));
291 bool quiet = (fType == TVirtualStreamerInfo::kArtificial);
292 ((TStreamerElement*)
this)->fClassObject = TClass::GetClass(className, kTRUE, quiet);
300 Int_t TStreamerElement::GetExecID()
const
303 if (strncmp(fTypeName.Data(),
"TRef",4) != 0)
return 0;
307 if (GetUniqueID())
return GetUniqueID();
310 char *action = (
char*)strstr(GetTitle(),
"EXEC:");
311 if (!action)
return 0;
312 Int_t nch = strlen(action)+1;
313 char *caction =
new char[nch];
314 strlcpy(caction,action+5,nch);
315 char *blank = (
char*)strchr(caction,
' ');
316 if (blank) *blank = 0;
319 Int_t index = TRef::AddExec(caction);
322 const_cast<TStreamerElement*
>(
this)->SetUniqueID(index+1);
331 const char *TStreamerElement::GetFullName()
const
333 TTHREAD_TLS_DECL_ARG(TString,name,kMaxLen);
336 for (Int_t i=0;i<fArrayDim;i++) {
337 snprintf(cdim,19,
"[%d]",fMaxIndex[i]);
348 void TStreamerElement::GetSequenceType(TString &sequenceType)
const
350 sequenceType.Clear();
351 Bool_t first = kTRUE;
352 if (TestBit(TStreamerElement::kWholeObject)) {
353 if (!first) sequenceType +=
",";
355 sequenceType +=
"wholeObject";
357 if (TestBit(TStreamerElement::kCache)) {
359 sequenceType +=
"cached";
361 if (TestBit(TStreamerElement::kRepeat)) {
362 if (!first) sequenceType +=
",";
364 sequenceType +=
"repeat";
366 if (TestBit(TStreamerElement::kDoNotDelete)) {
367 if (!first) sequenceType +=
",";
369 sequenceType +=
"nodelete";
371 if (TestBit(TStreamerElement::kWrite)) {
372 if (!first) sequenceType +=
",";
374 sequenceType +=
"write";
381 Int_t TStreamerElement::GetSize()
const
389 TMemberStreamer *TStreamerElement::GetStreamer()
const
399 const char *TStreamerElement::GetTypeNameBasic()
const
401 TDataType *dt = gROOT->GetType(fTypeName.Data());
402 if (fType < 1 || fType > 55)
return fTypeName.Data();
403 if (dt && dt->GetType() > 0)
return fTypeName.Data();
404 Int_t dtype = fType%20;
405 return TDataType::GetTypeName((EDataType)dtype);
411 void TStreamerElement::Init(TVirtualStreamerInfo *)
413 fClassObject = GetClassPointer();
414 if (fClassObject && fClassObject->IsTObject()) {
415 fTObjectOffset = fClassObject->GetBaseClassOffset(TObject::Class());
424 Bool_t TStreamerElement::IsOldFormat(
const char *newTypeName)
427 if (!strstr(newTypeName,fTypeName.Data()))
return kFALSE;
429 fTypeName = newTypeName;
436 Bool_t TStreamerElement::IsBase()
const
445 Bool_t TStreamerElement::IsTransient()
const
447 if (fType == TVirtualStreamerInfo::kArtificial) {
451 if (fType == TVirtualStreamerInfo::kCacheNew)
return kTRUE;
452 if (fType == TVirtualStreamerInfo::kCacheDelete)
return kTRUE;
453 if (fType == TVirtualStreamerInfo::kCache)
return kTRUE;
454 if (fType == TVirtualStreamerInfo::kMissing)
return kTRUE;
455 if (TVirtualStreamerInfo::kSkip <= fType && fType < TVirtualStreamerInfo::kConv)
return kTRUE;
463 void TStreamerElement::ls(Option_t *)
const
465 TString temp(GetTypeName());
466 if (IsaPointer() && !fTypeName.Contains(
"*")) temp +=
"*";
468 TString sequenceType;
469 GetSequenceType(sequenceType);
470 if (sequenceType.Length()) {
471 sequenceType.Prepend(
" (");
472 sequenceType +=
") ";
474 printf(
" %-14s %-15s offset=%3d type=%2d %s%-20s\n",
475 temp.Data(),GetFullName(),fOffset,fType,sequenceType.Data(),
482 void TStreamerElement::SetArrayDim(Int_t dim)
485 if (dim) fType += TVirtualStreamerInfo::kOffsetL;
492 void TStreamerElement::SetMaxIndex(Int_t dim, Int_t max)
494 if (dim < 0 || dim > 4)
return;
495 fMaxIndex[dim] = max;
496 if (fArrayLength == 0) fArrayLength = max;
497 else fArrayLength *= max;
503 void TStreamerElement::SetStreamer(TMemberStreamer *streamer)
505 fStreamer = streamer;
511 void TStreamerElement::Streamer(TBuffer &R__b)
514 if (R__b.IsReading()) {
515 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
520 R__b.ClassBegin(TStreamerElement::Class(), R__v);
521 R__b.ClassMember(
"TNamed");
522 TNamed::Streamer(R__b);
523 R__b.ClassMember(
"fType",
"Int_t");
525 R__b.ClassMember(
"fSize",
"Int_t");
527 R__b.ClassMember(
"fArrayLength",
"Int_t");
528 R__b >> fArrayLength;
529 R__b.ClassMember(
"fArrayDim",
"Int_t");
531 R__b.ClassMember(
"fMaxIndex",
"Int_t", 5);
532 if (R__v == 1) R__b.ReadStaticArray(fMaxIndex);
533 else R__b.ReadFastArray(fMaxIndex,5);
534 R__b.ClassMember(
"fTypeName",
"TString");
535 fTypeName.Streamer(R__b);
536 if (fType==11&&(fTypeName==
"Bool_t"||fTypeName==
"bool")) fType = 18;
542 if (R__v <= 2 && this->IsA()==TStreamerBasicType::Class()) {
546 TDataType *type = gROOT->GetType(GetTypeName());
547 if (type && fArrayLength) fSize = fArrayLength * type->Size();
553 if (fFactor > 0) SetBit(kHasRange);
556 if (TestBit(kHasRange)) GetRange(GetTitle(),fXmin,fXmax,fFactor);
559 R__b.ClassEnd(TStreamerElement::Class());
560 R__b.SetBufferOffset(R__s+R__c+
sizeof(UInt_t));
562 ResetBit(TStreamerElement::kCache);
563 ResetBit(TStreamerElement::kWrite);
565 R__b.WriteClassBuffer(TStreamerElement::Class(),
this);
573 void TStreamerElement::Update(
const TClass *oldClass, TClass *newClass)
575 if (fClassObject == oldClass) {
576 fClassObject = newClass;
577 if (fClassObject && fClassObject->IsTObject()) {
578 fTObjectOffset = fClassObject->GetBaseClassOffset(TObject::Class());
580 }
else if (fClassObject ==
nullptr) {
586 TString classname(ExtractClassName(fTypeName));
588 if (classname == newClass->GetName()) {
589 fClassObject = newClass;
590 if (fClassObject && fClassObject->IsTObject()) {
591 fTObjectOffset = fClassObject->GetBaseClassOffset(TObject::Class());
593 }
else if (TClassTable::GetDict(classname)) {
594 fClassObject = (TClass*)-1;
596 if (fClassObject && fClassObject->IsTObject()) {
597 fTObjectOffset = fClassObject->GetBaseClassOffset(TObject::Class());
611 ClassImp(TStreamerBase);
615 TStreamerBase::TStreamerBase() :
617 fBaseCheckSum( *( (UInt_t*)&(fMaxIndex[1]) ) ),
618 fStreamerFunc(0), fConvStreamerFunc(0), fStreamerInfo(0)
622 fBaseClass = (TClass*)(-1);
629 TStreamerBase::TStreamerBase(
const char *name,
const char *title, Int_t offset)
630 : TStreamerElement(name,title,offset,TVirtualStreamerInfo::kBase,
"BASE"),
632 fBaseCheckSum( *( (UInt_t*)&(fMaxIndex[1]) ) ),
633 fStreamerFunc(0), fConvStreamerFunc(0), fStreamerInfo(0)
638 if (strcmp(name,
"TObject") == 0) fType = TVirtualStreamerInfo::kTObject;
639 if (strcmp(name,
"TNamed") == 0) fType = TVirtualStreamerInfo::kTNamed;
641 fBaseClass = TClass::GetClass(GetName());
643 if (fBaseClass->IsVersioned()) {
644 fBaseVersion = fBaseClass->GetClassVersion();
648 fBaseCheckSum = fBaseClass->GetCheckSum();
659 TStreamerBase::~TStreamerBase()
666 TClass *TStreamerBase::GetClassPointer()
const
668 if (fBaseClass!=(TClass*)(-1))
return fBaseClass;
669 ((TStreamerBase*)
this)->fBaseClass = TClass::GetClass(GetName());
676 Int_t TStreamerBase::GetSize()
const
678 TClass *cl = GetClassPointer();
679 if (cl)
return cl->Size();
686 void TStreamerBase::Init(TVirtualStreamerInfo *)
688 fBaseClass = TClass::GetClass(GetName());
689 if (!fBaseClass)
return;
697 void TStreamerBase::InitStreaming()
700 fStreamerFunc = fNewBaseClass->GetStreamerFunc();
701 fConvStreamerFunc = fNewBaseClass->GetConvStreamerFunc();
702 if (fBaseVersion > 0 || fBaseCheckSum == 0) {
703 fStreamerInfo = fNewBaseClass->GetConversionStreamerInfo(fBaseClass,fBaseVersion);
705 fStreamerInfo = fNewBaseClass->FindConversionStreamerInfo(fBaseClass,fBaseCheckSum);
707 }
else if (fBaseClass && fBaseClass != (TClass*)-1) {
708 fStreamerFunc = fBaseClass->GetStreamerFunc();
709 fConvStreamerFunc = fBaseClass->GetConvStreamerFunc();
710 if (fBaseVersion >= 0 || fBaseCheckSum == 0) {
711 fStreamerInfo = fBaseClass->GetStreamerInfo(fBaseVersion);
713 fStreamerInfo = fBaseClass->FindStreamerInfo(fBaseCheckSum);
717 fConvStreamerFunc = 0;
725 Bool_t TStreamerBase::IsBase()
const
733 const char *TStreamerBase::GetInclude()
const
735 if (GetClassPointer() && fBaseClass->HasInterpreterInfo()) {
736 IncludeNameBuffer().Form(
"\"%s\"",fBaseClass->GetDeclFileName());
738 std::string shortname( TClassEdit::ShortType( GetName(), 1 ) );
739 IncludeNameBuffer().Form(
"\"%s.h\"",shortname.c_str());
741 return IncludeNameBuffer();
747 void TStreamerBase::ls(Option_t *)
const
749 TString sequenceType;
750 GetSequenceType(sequenceType);
751 if (sequenceType.Length()) {
752 sequenceType.Prepend(
" (");
753 sequenceType +=
") ";
755 printf(
" %-14s %-15s offset=%3d type=%2d %s%-20s\n",GetFullName(),GetTypeName(),fOffset,fType,sequenceType.Data(),GetTitle());
761 Int_t TStreamerBase::ReadBuffer (TBuffer &b,
char *pointer)
763 if (fConvStreamerFunc) {
765 fConvStreamerFunc(b,pointer+fOffset,fNewBaseClass ? fBaseClass :
nullptr);
766 }
else if (fStreamerFunc) {
768 fStreamerFunc(b,pointer+fOffset);
774 if( fNewBaseClass ) {
775 TClassStreamer* extstrm = fNewBaseClass->GetStreamer();
778 extstrm->SetOnFileClass(fBaseClass);
779 (*extstrm)(b, pointer);
781 b.ReadClassBuffer( fNewBaseClass, pointer+fOffset, fBaseClass );
784 TClassStreamer* extstrm = fBaseClass->GetStreamer();
787 (*extstrm)(b, pointer);
789 b.ReadClassBuffer( fBaseClass, pointer+fOffset );
799 void TStreamerBase::Streamer(TBuffer &R__b)
802 if (R__b.IsReading()) {
803 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
805 R__b.ClassBegin(TStreamerBase::Class(), R__v);
807 R__b.ClassMember(
"TStreamerElement");
808 TStreamerElement::Streamer(R__b);
813 fBaseClass = (TClass*)-1;
818 R__b.ClassMember(
"fBaseVersion",
"Int_t");
819 R__b >> fBaseVersion;
822 fBaseClass = TClass::GetClass(GetName());
823 fBaseVersion = fBaseClass->GetClassVersion();
825 R__b.ClassEnd(TStreamerBase::Class());
826 R__b.SetBufferOffset(R__s+R__c+
sizeof(UInt_t));
828 R__b.WriteClassBuffer(TStreamerBase::Class(),
this);
836 void TStreamerBase::Update(
const TClass *oldClass, TClass *newClass)
838 TStreamerElement::Update(oldClass, newClass);
840 if (fBaseClass == oldClass) {
841 fBaseClass = newClass;
843 }
else if (fBaseClass ==
nullptr) {
844 if (fName == newClass->GetName()) {
845 fBaseClass = newClass;
847 }
else if (TClassTable::GetDict(fName)) {
848 fBaseClass = TClass::GetClass(fName);
857 Int_t TStreamerBase::WriteBuffer (TBuffer &b,
char *pointer)
861 fStreamerFunc(b,pointer+fOffset);
868 TClassStreamer* extstrm = fNewBaseClass->GetStreamer();
871 extstrm->SetOnFileClass(fBaseClass);
872 (*extstrm)(b, pointer);
875 fNewBaseClass->WriteBuffer(b,pointer+fOffset);
879 TClassStreamer* extstrm = fBaseClass->GetStreamer();
881 (*extstrm)(b, pointer);
884 fBaseClass->WriteBuffer(b,pointer+fOffset);
901 ClassImp(TStreamerBasicPointer);
906 TStreamerBasicPointer::TStreamerBasicPointer() : fCountVersion(0),fCountName(),fCountClass(),fCounter(0)
914 TStreamerBasicPointer::TStreamerBasicPointer(
const char *name,
const char *title, Int_t offset, Int_t dtype,
const char *countName,
const char *countClass, Int_t countVersion,
const char *typeName)
915 : TStreamerElement(name,title,offset,dtype,typeName)
917 fType += TVirtualStreamerInfo::kOffsetP;
918 fCountName = countName;
919 fCountClass = countClass;
920 fCountVersion = countVersion;
929 TStreamerBasicPointer::~TStreamerBasicPointer()
936 ULong_t TStreamerBasicPointer::GetMethod()
const
938 if (!fCounter) ((TStreamerBasicPointer*)
this)->Init();
939 if (!fCounter)
return 0;
945 return (ULong_t)fCounter->GetOffset();
951 Int_t TStreamerBasicPointer::GetSize()
const
953 if (fArrayLength)
return fArrayLength*
sizeof(
void *);
954 return sizeof(
void *);
963 void TStreamerBasicPointer::Init(TVirtualStreamerInfo *directive)
965 fCounter = InitCounter( fCountClass, fCountName, directive );
971 void TStreamerBasicPointer::SetArrayDim(Int_t dim)
981 void TStreamerBasicPointer::Streamer(TBuffer &R__b)
984 if (R__b.IsReading()) {
985 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
987 R__b.ReadClassBuffer(TStreamerBasicPointer::Class(),
this, R__v, R__s, R__c);
993 TStreamerElement::Streamer(R__b);
994 R__b >> fCountVersion;
995 fCountName.Streamer(R__b);
996 fCountClass.Streamer(R__b);
997 R__b.SetBufferOffset(R__s+R__c+
sizeof(UInt_t));
999 R__b.WriteClassBuffer(TStreamerBasicPointer::Class(),
this);
1014 ClassImp(TStreamerLoop);
1019 TStreamerLoop::TStreamerLoop() : fCountVersion(0),fCountName(),fCountClass(),fCounter(0)
1026 TStreamerLoop::TStreamerLoop(
const char *name,
const char *title, Int_t offset,
const char *countName,
const char *countClass, Int_t countVersion,
const char *typeName)
1027 : TStreamerElement(name,title,offset,TVirtualStreamerInfo::kStreamLoop,typeName)
1029 fCountName = countName;
1030 fCountClass = countClass;
1031 fCountVersion = countVersion;
1038 TStreamerLoop::~TStreamerLoop()
1045 ULong_t TStreamerLoop::GetMethod()
const
1051 if (!fCounter)
return 0;
1052 return (ULong_t)fCounter->GetOffset();
1058 Int_t TStreamerLoop::GetSize()
const
1060 if (fArrayLength)
return fArrayLength*
sizeof(
void*);
1061 return sizeof(
void*);
1070 void TStreamerLoop::Init(TVirtualStreamerInfo *directive)
1072 fCounter = InitCounter( fCountClass, fCountName, directive );
1078 const char *TStreamerLoop::GetInclude()
const
1080 IncludeNameBuffer().Form(
"<%s>",
"TString.h");
1081 return IncludeNameBuffer();
1087 void TStreamerLoop::Streamer(TBuffer &R__b)
1090 if (R__b.IsReading()) {
1091 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
1093 R__b.ReadClassBuffer(TStreamerLoop::Class(),
this, R__v, R__s, R__c);
1098 TStreamerElement::Streamer(R__b);
1099 R__b >> fCountVersion;
1100 fCountName.Streamer(R__b);
1101 fCountClass.Streamer(R__b);
1102 R__b.SetBufferOffset(R__s+R__c+
sizeof(UInt_t));
1104 R__b.WriteClassBuffer(TStreamerLoop::Class(),
this);
1118 ClassImp(TStreamerBasicType);
1123 TStreamerBasicType::TStreamerBasicType() : fCounter(0)
1130 TStreamerBasicType::TStreamerBasicType(
const char *name,
const char *title, Int_t offset, Int_t dtype,
const char *typeName)
1131 : TStreamerElement(name,title,offset,dtype,typeName),fCounter(0)
1138 TStreamerBasicType::~TStreamerBasicType()
1145 ULong_t TStreamerBasicType::GetMethod()
const
1147 if (fType == TVirtualStreamerInfo::kCounter ||
1148 fType == (TVirtualStreamerInfo::kCounter+TVirtualStreamerInfo::kSkip))
return (ULong_t)&fCounter;
1155 Int_t TStreamerBasicType::GetSize()
const
1163 void TStreamerBasicType::Streamer(TBuffer &R__b)
1166 if (R__b.IsReading()) {
1167 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
1169 R__b.ReadClassBuffer(TStreamerBasicType::Class(),
this, R__v, R__s, R__c);
1172 TStreamerElement::Streamer(R__b);
1173 R__b.CheckByteCount(R__s, R__c, TStreamerBasicType::IsA());
1176 if (TVirtualStreamerInfo::kOffsetL < type && type < TVirtualStreamerInfo::kOffsetP) {
1177 type -= TVirtualStreamerInfo::kOffsetL;
1181 case TVirtualStreamerInfo::kBool: fSize =
sizeof(Bool_t);
break;
1182 case TVirtualStreamerInfo::kShort: fSize =
sizeof(Short_t);
break;
1183 case TVirtualStreamerInfo::kInt: fSize =
sizeof(Int_t);
break;
1184 case TVirtualStreamerInfo::kLong: fSize =
sizeof(Long_t);
break;
1185 case TVirtualStreamerInfo::kLong64: fSize =
sizeof(Long64_t);
break;
1186 case TVirtualStreamerInfo::kFloat: fSize =
sizeof(Float_t);
break;
1187 case TVirtualStreamerInfo::kFloat16: fSize =
sizeof(Float_t);
break;
1188 case TVirtualStreamerInfo::kDouble: fSize =
sizeof(Double_t);
break;
1189 case TVirtualStreamerInfo::kDouble32: fSize =
sizeof(Double_t);
break;
1190 case TVirtualStreamerInfo::kUChar: fSize =
sizeof(UChar_t);
break;
1191 case TVirtualStreamerInfo::kUShort: fSize =
sizeof(UShort_t);
break;
1192 case TVirtualStreamerInfo::kUInt: fSize =
sizeof(UInt_t);
break;
1193 case TVirtualStreamerInfo::kULong: fSize =
sizeof(ULong_t);
break;
1194 case TVirtualStreamerInfo::kULong64: fSize =
sizeof(ULong64_t);
break;
1195 case TVirtualStreamerInfo::kBits: fSize =
sizeof(UInt_t);
break;
1196 case TVirtualStreamerInfo::kCounter: fSize =
sizeof(Int_t);
break;
1197 case TVirtualStreamerInfo::kChar: fSize =
sizeof(Char_t);
break;
1198 case TVirtualStreamerInfo::kCharStar: fSize =
sizeof(Char_t*);
break;
1201 if (fArrayLength) fSize *= GetArrayLength();
1203 R__b.WriteClassBuffer(TStreamerBasicType::Class(),
this);
1218 ClassImp(TStreamerObject);
1223 TStreamerObject::TStreamerObject()
1230 TStreamerObject::TStreamerObject(
const char *name,
const char *title, Int_t offset,
const char *typeName)
1231 : TStreamerElement(name,title,offset,0,typeName)
1233 fType = TVirtualStreamerInfo::kObject;
1234 if (strcmp(typeName,
"TObject") == 0) fType = TVirtualStreamerInfo::kTObject;
1235 if (strcmp(typeName,
"TNamed") == 0) fType = TVirtualStreamerInfo::kTNamed;
1243 TStreamerObject::~TStreamerObject()
1250 void TStreamerObject::Init(TVirtualStreamerInfo *)
1252 fClassObject = GetClassPointer();
1253 if (fClassObject && fClassObject->IsTObject()) {
1254 fTObjectOffset = fClassObject->GetBaseClassOffset(TObject::Class());
1261 const char *TStreamerObject::GetInclude()
const
1263 TClass *cl = GetClassPointer();
1264 if (cl && cl->HasInterpreterInfo()) {
1265 IncludeNameBuffer().Form(
"\"%s\"",cl->GetDeclFileName());
1267 std::string shortname( TClassEdit::ShortType( GetTypeName(), 1 ) );
1268 IncludeNameBuffer().Form(
"\"%s.h\"",shortname.c_str());
1270 return IncludeNameBuffer();
1276 Int_t TStreamerObject::GetSize()
const
1278 TClass *cl = GetClassPointer();
1279 Int_t classSize = 8;
1280 if (cl) classSize = cl->Size();
1281 if (fArrayLength)
return fArrayLength*classSize;
1288 void TStreamerObject::Streamer(TBuffer &R__b)
1291 if (R__b.IsReading()) {
1292 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
1294 R__b.ReadClassBuffer(TStreamerObject::Class(),
this, R__v, R__s, R__c);
1298 TStreamerElement::Streamer(R__b);
1299 R__b.CheckByteCount(R__s, R__c, TStreamerObject::IsA());
1301 R__b.WriteClassBuffer(TStreamerObject::Class(),
this);
1315 ClassImp(TStreamerObjectAny);
1320 TStreamerObjectAny::TStreamerObjectAny()
1327 TStreamerObjectAny::TStreamerObjectAny(
const char *name,
const char *title, Int_t offset,
const char *typeName)
1328 : TStreamerElement(name,title,offset,TVirtualStreamerInfo::kAny,typeName)
1336 TStreamerObjectAny::~TStreamerObjectAny()
1343 void TStreamerObjectAny::Init(TVirtualStreamerInfo *)
1345 fClassObject = GetClassPointer();
1346 if (fClassObject && fClassObject->IsTObject()) {
1347 fTObjectOffset = fClassObject->GetBaseClassOffset(TObject::Class());
1354 const char *TStreamerObjectAny::GetInclude()
const
1356 TClass *cl = GetClassPointer();
1357 if (cl && cl->HasInterpreterInfo()) {
1358 IncludeNameBuffer().Form(
"\"%s\"",cl->GetDeclFileName());
1360 std::string shortname( TClassEdit::ShortType( GetTypeName(), 1 ) );
1361 IncludeNameBuffer().Form(
"\"%s.h\"",shortname.c_str());
1363 return IncludeNameBuffer();
1369 Int_t TStreamerObjectAny::GetSize()
const
1371 TClass *cl = GetClassPointer();
1372 Int_t classSize = 8;
1373 if (cl) classSize = cl->Size();
1374 if (fArrayLength)
return fArrayLength*classSize;
1381 void TStreamerObjectAny::Streamer(TBuffer &R__b)
1384 if (R__b.IsReading()) {
1385 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
1387 R__b.ReadClassBuffer(TStreamerObjectAny::Class(),
this, R__v, R__s, R__c);
1391 TStreamerElement::Streamer(R__b);
1392 R__b.CheckByteCount(R__s, R__c, TStreamerObjectAny::IsA());
1394 R__b.WriteClassBuffer(TStreamerObjectAny::Class(),
this);
1409 ClassImp(TStreamerObjectPointer);
1414 TStreamerObjectPointer::TStreamerObjectPointer()
1421 TStreamerObjectPointer::TStreamerObjectPointer(
const char *name,
const char *title,
1422 Int_t offset,
const char *typeName)
1423 : TStreamerElement(name,title,offset,TVirtualStreamerInfo::kObjectP,typeName)
1425 if (strncmp(title,
"->",2) == 0) fType = TVirtualStreamerInfo::kObjectp;
1433 TStreamerObjectPointer::~TStreamerObjectPointer()
1440 void TStreamerObjectPointer::Init(TVirtualStreamerInfo *)
1442 fClassObject = GetClassPointer();
1443 if (fClassObject && fClassObject->IsTObject()) {
1444 fTObjectOffset = fClassObject->GetBaseClassOffset(TObject::Class());
1451 const char *TStreamerObjectPointer::GetInclude()
const
1453 TClass *cl = GetClassPointer();
1454 if (cl && cl->HasInterpreterInfo()) {
1455 IncludeNameBuffer().Form(
"\"%s\"",cl->GetDeclFileName());
1457 std::string shortname( TClassEdit::ShortType( GetTypeName(), 1 ) );
1458 IncludeNameBuffer().Form(
"\"%s.h\"",shortname.c_str());
1461 return IncludeNameBuffer();
1467 Int_t TStreamerObjectPointer::GetSize()
const
1469 if (fArrayLength)
return fArrayLength*
sizeof(
void *);
1470 return sizeof(
void *);
1476 void TStreamerObjectPointer::SetArrayDim(Int_t dim)
1486 void TStreamerObjectPointer::Streamer(TBuffer &R__b)
1489 if (R__b.IsReading()) {
1490 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
1492 R__b.ReadClassBuffer(TStreamerObjectPointer::Class(),
this, R__v, R__s, R__c);
1496 TStreamerElement::Streamer(R__b);
1497 R__b.CheckByteCount(R__s, R__c, TStreamerObjectPointer::IsA());
1499 R__b.WriteClassBuffer(TStreamerObjectPointer::Class(),
this);
1513 ClassImp(TStreamerObjectAnyPointer);
1518 TStreamerObjectAnyPointer::TStreamerObjectAnyPointer()
1525 TStreamerObjectAnyPointer::TStreamerObjectAnyPointer(
const char *name,
const char *title,
1526 Int_t offset,
const char *typeName)
1527 : TStreamerElement(name,title,offset,TVirtualStreamerInfo::kAnyP,typeName)
1529 if (strncmp(title,
"->",2) == 0) fType = TVirtualStreamerInfo::kAnyp;
1537 TStreamerObjectAnyPointer::~TStreamerObjectAnyPointer()
1544 void TStreamerObjectAnyPointer::Init(TVirtualStreamerInfo *)
1546 fClassObject = GetClassPointer();
1547 if (fClassObject && fClassObject->IsTObject()) {
1548 fTObjectOffset = fClassObject->GetBaseClassOffset(TObject::Class());
1555 const char *TStreamerObjectAnyPointer::GetInclude()
const
1557 TClass *cl = GetClassPointer();
1558 if (cl && cl->HasInterpreterInfo()) {
1559 IncludeNameBuffer().Form(
"\"%s\"",cl->GetDeclFileName());
1561 std::string shortname( TClassEdit::ShortType( GetTypeName(), 1 ) );
1562 IncludeNameBuffer().Form(
"\"%s.h\"",shortname.c_str());
1565 return IncludeNameBuffer();
1571 Int_t TStreamerObjectAnyPointer::GetSize()
const
1573 if (fArrayLength)
return fArrayLength*
sizeof(
void *);
1574 return sizeof(
void *);
1580 void TStreamerObjectAnyPointer::SetArrayDim(Int_t dim)
1590 void TStreamerObjectAnyPointer::Streamer(TBuffer &R__b)
1592 if (R__b.IsReading()) {
1593 R__b.ReadClassBuffer(TStreamerObjectAnyPointer::Class(),
this);
1595 R__b.WriteClassBuffer(TStreamerObjectAnyPointer::Class(),
this);
1608 ClassImp(TStreamerString);
1613 TStreamerString::TStreamerString()
1620 TStreamerString::TStreamerString(
const char *name,
const char *title, Int_t offset)
1621 : TStreamerElement(name,title,offset,TVirtualStreamerInfo::kTString,
"TString")
1628 TStreamerString::~TStreamerString()
1635 const char *TStreamerString::GetInclude()
const
1637 IncludeNameBuffer().Form(
"<%s>",
"TString.h");
1638 return IncludeNameBuffer();
1644 Int_t TStreamerString::GetSize()
const
1646 if (fArrayLength)
return fArrayLength*
sizeof(TString);
1647 return sizeof(TString);
1653 void TStreamerString::Streamer(TBuffer &R__b)
1656 if (R__b.IsReading()) {
1657 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
1659 R__b.ReadClassBuffer(TStreamerString::Class(),
this, R__v, R__s, R__c);
1663 TStreamerElement::Streamer(R__b);
1664 R__b.CheckByteCount(R__s, R__c, TStreamerString::IsA());
1666 R__b.WriteClassBuffer(TStreamerString::Class(),
this);
1678 ClassImp(TStreamerSTL);
1683 TStreamerSTL::TStreamerSTL() : fSTLtype(0),fCtype(0)
1690 TStreamerSTL::TStreamerSTL(
const char *name,
const char *title, Int_t offset,
1691 const char *typeName,
const TVirtualCollectionProxy &proxy, Bool_t dmPointer)
1692 : TStreamerElement(name,title,offset,ROOT::kSTLany,typeName)
1694 fTypeName = TClassEdit::ShortType(fTypeName,TClassEdit::kDropStlDefault).c_str();
1697 || strcmp(name,typeName)==0) {
1701 fSTLtype = proxy.GetCollectionType();
1704 if (dmPointer) fSTLtype += TVirtualStreamerInfo::kOffsetP;
1706 if (fSTLtype == ROOT::kSTLbitset) {
1708 }
else if (proxy.GetValueClass()) {
1709 if (proxy.HasPointers()) fCtype = TVirtualStreamerInfo::kObjectp;
1710 else fCtype = TVirtualStreamerInfo::kObject;
1712 fCtype = proxy.GetType();
1713 if (proxy.HasPointers()) fCtype += TVirtualStreamerInfo::kOffsetP;
1715 if (TStreamerSTL::IsaPointer()) fType = TVirtualStreamerInfo::kSTLp;
1721 TStreamerSTL::TStreamerSTL(
const char *name,
const char *title, Int_t offset,
1722 const char *typeName,
const char *trueType, Bool_t dmPointer)
1723 : TStreamerElement(name,title,offset,ROOT::kSTLany,typeName)
1725 const char *t = trueType;
1726 if (!t || !*t) t = typeName;
1728 fTypeName = TClassEdit::ShortType(fTypeName,TClassEdit::kDropStlDefault).c_str();
1731 || strcmp(name,typeName)==0) {
1736 Int_t nch = strlen(t);
1737 char *s =
new char[nch+1];
1739 char *sopen = strchr(s,
'<');
1741 Fatal(
"TStreamerSTL",
"For %s, the type name (%s) is seemingly not a template (template argument not found)", name, s);
1744 *sopen = 0; sopen++;
1747 char* current=sopen;
1748 for(
int count = 0; *current!=
'\0'; current++) {
1749 if (*current==
'<') count++;
1750 if (*current==
'>') {
1751 if (count==0)
break;
1754 if (*current==
',' && count==0)
break;
1756 char *sclose = current; *sclose = 0; sclose--;
1757 char *sconst = strstr(sopen,
"const ");
1758 char *sbracket = strstr(sopen,
"<");
1759 if (sconst && (sbracket==0 || sconst < sbracket)) {
1761 char *pconst = sconst-1;
1762 if (*pconst ==
' ' || *pconst ==
'<' || *pconst ==
'*' || *pconst ==
'\0') sopen = sconst + 5;
1764 fSTLtype = TClassEdit::STLKind(s);
1766 if (fSTLtype == ROOT::kNotSTL) {
delete [] s;
return;}
1767 if (dmPointer) fSTLtype += TVirtualStreamerInfo::kOffsetP;
1770 while (*sopen==
' ') sopen++;
1771 Bool_t isPointer = kFALSE;
1774 char *star = strrchr(sopen,
'>');
1775 if (star) star = strchr(star,
'*');
1776 else star = strchr(sopen,
'*');
1782 while (*sclose ==
' ') {*sclose = 0; sclose--;}
1785 TDataType *dt = (TDataType*)gROOT->GetListOfTypes()->FindObject(sopen);
1786 if (fSTLtype == ROOT::kSTLbitset) {
1789 fCtype = dt->GetType();
1790 if (isPointer) fCtype += TVirtualStreamerInfo::kOffsetP;
1793 TClass *cl = TClass::GetClass(sopen);
1795 if (isPointer) fCtype = TVirtualStreamerInfo::kObjectp;
1796 else fCtype = TVirtualStreamerInfo::kObject;
1798 if (gCling->ClassInfo_IsEnum(sopen)) {
1799 if (isPointer) fCtype += TVirtualStreamerInfo::kOffsetP;
1801 if(strcmp(sopen,
"string")) {
1807 if (GetClassPointer() && GetClassPointer()->IsLoaded()) {
1808 Warning(
"TStreamerSTL",
"For %s we could not find any information about the type %s %d %s",fTypeName.Data(),sopen,fSTLtype,s);
1816 if (TStreamerSTL::IsaPointer()) fType = TVirtualStreamerInfo::kSTLp;
1822 TStreamerSTL::~TStreamerSTL()
1830 Bool_t TStreamerSTL::CannotSplit()
const
1833 if (GetTitle()[0]==
'[')
return kTRUE;
1837 if (GetArrayDim()>=1 && GetArrayLength()>1)
return kTRUE;
1839 if (TStreamerElement::CannotSplit())
return kTRUE;
1847 Bool_t TStreamerSTL::IsaPointer()
const
1849 const char *type_name = GetTypeName();
1850 if ( type_name[strlen(type_name)-1]==
'*' )
return kTRUE;
1858 Bool_t TStreamerSTL::IsBase()
const
1860 TString ts(GetName());
1862 if (strcmp(ts.Data(),GetTypeName())==0)
return kTRUE;
1863 if (strcmp(ts.Data(),GetTypeNameBasic())==0)
return kTRUE;
1869 Int_t TStreamerSTL::GetSize()
const
1874 TClass *cl = GetClassPointer();
1877 if (!TestBit(kWarned)) {
1878 Error(
"GetSize",
"Could not find the TClass for %s.\n"
1879 "This is likely to have been a typedef, if possible please declare it in CINT to work around the issue\n",fTypeName.Data());
1880 const_cast<TStreamerSTL*
>(
this)->SetBit(kWarned);
1886 if (fArrayLength)
return fArrayLength*size;
1893 void TStreamerSTL::ls(Option_t *)
const
1895 TString name(kMaxLen);
1898 for (Int_t i=0;i<fArrayDim;i++) {
1899 cdim.Form(
"[%d]",fMaxIndex[i]);
1902 TString sequenceType;
1903 GetSequenceType(sequenceType);
1904 if (sequenceType.Length()) {
1905 sequenceType.Prepend(
" (");
1906 sequenceType +=
") ";
1908 printf(
" %-14s %-15s offset=%3d type=%2d %s,stl=%d, ctype=%d, %-20s\n",
1909 GetTypeName(),name.Data(),fOffset,fType,sequenceType.Data(),
1910 fSTLtype,fCtype,GetTitle());
1916 const char *TStreamerSTL::GetInclude()
const
1918 if (fSTLtype == ROOT::kSTLvector) IncludeNameBuffer().Form(
"<%s>",
"vector");
1919 else if (fSTLtype == ROOT::kSTLlist) IncludeNameBuffer().Form(
"<%s>",
"list");
1920 else if (fSTLtype == ROOT::kSTLforwardlist) IncludeNameBuffer().Form(
"<%s>",
"forward_list");
1921 else if (fSTLtype == ROOT::kSTLdeque) IncludeNameBuffer().Form(
"<%s>",
"deque");
1922 else if (fSTLtype == ROOT::kSTLmap) IncludeNameBuffer().Form(
"<%s>",
"map");
1923 else if (fSTLtype == ROOT::kSTLmultimap) IncludeNameBuffer().Form(
"<%s>",
"map");
1924 else if (fSTLtype == ROOT::kSTLset) IncludeNameBuffer().Form(
"<%s>",
"set");
1925 else if (fSTLtype == ROOT::kSTLmultiset) IncludeNameBuffer().Form(
"<%s>",
"set");
1926 else if (fSTLtype == ROOT::kSTLunorderedset) IncludeNameBuffer().Form(
"<%s>",
"unordered_set");
1927 else if (fSTLtype == ROOT::kSTLunorderedmultiset) IncludeNameBuffer().Form(
"<%s>",
"unordered_set");
1928 else if (fSTLtype == ROOT::kSTLunorderedmap) IncludeNameBuffer().Form(
"<%s>",
"unordered_map");
1929 else if (fSTLtype == ROOT::kSTLunorderedmultimap) IncludeNameBuffer().Form(
"<%s>",
"unordered_map");
1930 else if (fSTLtype == ROOT::kSTLbitset) IncludeNameBuffer().Form(
"<%s>",
"bitset");
1931 return IncludeNameBuffer();
1938 void TStreamerSTL::SetStreamer(TMemberStreamer *streamer)
1940 fStreamer = streamer;
1946 void TStreamerSTL::Streamer(TBuffer &R__b)
1949 if (R__b.IsReading()) {
1950 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
1952 R__b.ReadClassBuffer(TStreamerSTL::Class(),
this, R__v, R__s, R__c);
1955 TStreamerElement::Streamer(R__b);
1958 R__b.CheckByteCount(R__s, R__c, TStreamerSTL::IsA());
1960 if (fSTLtype == ROOT::kSTLmultimap || fSTLtype == ROOT::kSTLset) {
1965 if (fTypeName.BeginsWith(
"std::set") || fTypeName.BeginsWith(
"set")) {
1966 fSTLtype = ROOT::kSTLset;
1967 }
else if (fTypeName.BeginsWith(
"std::multimap") || fTypeName.BeginsWith(
"multimap")) {
1968 fSTLtype = ROOT::kSTLmultimap;
1972 if (IsaPointer()) fType = TVirtualStreamerInfo::kSTLp;
1973 else fType = TVirtualStreamerInfo::kSTL;
1974 if (GetArrayLength() > 0) {
1975 fType += TVirtualStreamerInfo::kOffsetL;
1977 if (R__b.GetParent()) {
1978 if (fCtype==TVirtualStreamerInfo::kObjectp || fCtype==TVirtualStreamerInfo::kAnyp || fCtype==TVirtualStreamerInfo::kObjectP || fCtype==TVirtualStreamerInfo::kAnyP) {
1979 SetBit(kDoNotDelete);
1980 }
else if ( fSTLtype == ROOT::kSTLmap || fSTLtype == ROOT::kSTLmultimap) {
1983 SetBit(kDoNotDelete);
1990 fType = TVirtualStreamerInfo::kStreamer;
1991 R__b.WriteClassBuffer(TStreamerSTL::Class(),
this);
2004 ClassImp(TStreamerSTLstring);
2009 TStreamerSTLstring::TStreamerSTLstring()
2016 TStreamerSTLstring::TStreamerSTLstring(
const char *name,
const char *title, Int_t offset,
2017 const char *typeName, Bool_t dmPointer)
2024 fType = TVirtualStreamerInfo::kSTLp;
2026 fType = TVirtualStreamerInfo::kSTL;
2031 fSTLtype = ROOT::kSTLstring;
2032 fCtype = ROOT::kSTLstring;
2033 fTypeName= typeName;
2040 TStreamerSTLstring::~TStreamerSTLstring()
2047 const char *TStreamerSTLstring::GetInclude()
const
2049 IncludeNameBuffer() =
"<string>";
2050 return IncludeNameBuffer();
2056 Int_t TStreamerSTLstring::GetSize()
const
2058 if (fArrayLength)
return fArrayLength*
sizeof(string);
2059 return sizeof(string);
2065 void TStreamerSTLstring::Streamer(TBuffer &R__b)
2068 if (R__b.IsReading()) {
2069 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
2071 R__b.ReadClassBuffer(TStreamerSTLstring::Class(),
this, R__v, R__s, R__c);
2075 TStreamerSTL::Streamer(R__b);
2076 R__b.CheckByteCount(R__s, R__c, TStreamerSTLstring::IsA());
2078 R__b.WriteClassBuffer(TStreamerSTLstring::Class(),
this);
2090 ClassImp(TStreamerSTLstring);
2092 void TStreamerArtificial::Streamer(TBuffer& )
2100 ROOT::TSchemaRule::ReadFuncPtr_t TStreamerArtificial::GetReadFunc()
2107 ROOT::TSchemaRule::ReadRawFuncPtr_t TStreamerArtificial::GetReadRawFunc()
2111 return fReadRawFunc;