122 const char *tab1 =
" ";
123 const char *tab2 =
" ";
124 const char *tab3 =
" ";
125 const char *tab4 =
" ";
127 const char *names_xmlfileclass =
"TXmlFile";
129 ClassImp(TXMLPlayer);
134 TXMLPlayer::TXMLPlayer() : TObject()
141 TXMLPlayer::~TXMLPlayer()
148 TString TXMLPlayer::GetStreamerName(TClass *cl)
152 TString res = cl->GetName();
165 Bool_t TXMLPlayer::ProduceCode(TList *cllist,
const char *filename)
167 if ((cllist == 0) || (filename == 0))
170 std::ofstream fh(TString(filename) +
".h");
171 std::ofstream fs(TString(filename) +
".cxx");
173 fh <<
"// generated header file" << std::endl << std::endl;
174 fh <<
"#ifndef " << filename <<
"_h" << std::endl;
175 fh <<
"#define " << filename <<
"_h" << std::endl << std::endl;
177 fh <<
"#include \"" << names_xmlfileclass <<
".h\"" << std::endl << std::endl;
179 fs <<
"// generated source file" << std::endl << std::endl;
180 fs <<
"#include \"" << filename <<
".h\"" << std::endl << std::endl;
187 while ((cl = (TClass *)iter()) != 0) {
188 if (inclfiles.FindObject(cl->GetDeclFileName()) == 0) {
189 fs <<
"#include \"" << cl->GetDeclFileName() <<
"\"" << std::endl;
190 inclfiles.Add(
new TNamed(cl->GetDeclFileName(),
""));
202 while ((cl = (TClass *)iter()) != 0) {
204 fh <<
"extern void* " << GetStreamerName(cl) <<
"(" << names_xmlfileclass
205 <<
" &buf, void* ptr = 0, bool checktypes = true);" << std::endl
208 ProduceStreamerSource(fs, cl, cllist);
211 fh <<
"#endif" << std::endl << std::endl;
212 fs << std::endl << std::endl;
220 TString TXMLPlayer::GetMemberTypeName(TDataMember *member)
225 if (member->IsBasic())
226 switch (member->GetDataType()->GetType()) {
227 case kChar_t:
return "char";
228 case kShort_t:
return "short";
229 case kInt_t:
return "int";
230 case kLong_t:
return "long";
231 case kLong64_t:
return "long long";
233 case kFloat_t:
return "float";
235 case kDouble_t:
return "double";
237 char first = member->GetDataType()->GetTypeName()[0];
238 if ((first ==
'B') || (first ==
'b'))
240 return "unsigned char";
242 case kBool_t:
return "bool";
243 case kUShort_t:
return "unsigned short";
244 case kUInt_t:
return "unsigned int";
245 case kULong_t:
return "unsigned long";
246 case kULong64_t:
return "unsigned long long";
249 if (member->IsEnum())
252 return member->GetTypeName();
258 TString TXMLPlayer::GetBasicTypeName(TStreamerElement *el)
260 if (el->GetType() == TVirtualStreamerInfo::kCounter)
263 switch (el->GetType() % 20) {
264 case TVirtualStreamerInfo::kChar:
return "char";
265 case TVirtualStreamerInfo::kShort:
return "short";
266 case TVirtualStreamerInfo::kInt:
return "int";
267 case TVirtualStreamerInfo::kLong:
return "long";
268 case TVirtualStreamerInfo::kLong64:
return "long long";
269 case TVirtualStreamerInfo::kFloat16:
270 case TVirtualStreamerInfo::kFloat:
return "float";
271 case TVirtualStreamerInfo::kDouble32:
272 case TVirtualStreamerInfo::kDouble:
return "double";
273 case TVirtualStreamerInfo::kUChar: {
274 char first = el->GetTypeNameBasic()[0];
275 if ((first ==
'B') || (first ==
'b'))
277 return "unsigned char";
279 case TVirtualStreamerInfo::kBool:
return "bool";
280 case TVirtualStreamerInfo::kUShort:
return "unsigned short";
281 case TVirtualStreamerInfo::kUInt:
return "unsigned int";
282 case TVirtualStreamerInfo::kULong:
return "unsigned long";
283 case TVirtualStreamerInfo::kULong64:
return "unsigned long long";
291 TString TXMLPlayer::GetBasicTypeReaderMethodName(Int_t type,
const char *realname)
293 if (type == TVirtualStreamerInfo::kCounter)
297 case TVirtualStreamerInfo::kChar:
return "ReadChar";
298 case TVirtualStreamerInfo::kShort:
return "ReadShort";
299 case TVirtualStreamerInfo::kInt:
return "ReadInt";
300 case TVirtualStreamerInfo::kLong:
return "ReadLong";
301 case TVirtualStreamerInfo::kLong64:
return "ReadLong64";
302 case TVirtualStreamerInfo::kFloat16:
303 case TVirtualStreamerInfo::kFloat:
return "ReadFloat";
304 case TVirtualStreamerInfo::kDouble32:
305 case TVirtualStreamerInfo::kDouble:
return "ReadDouble";
306 case TVirtualStreamerInfo::kUChar: {
307 Bool_t isbool =
false;
309 isbool = (TString(realname).Index(
"bool", 0, TString::kIgnoreCase) >= 0);
314 case TVirtualStreamerInfo::kBool:
return "ReadBool";
315 case TVirtualStreamerInfo::kUShort:
return "ReadUShort";
316 case TVirtualStreamerInfo::kUInt:
return "ReadUInt";
317 case TVirtualStreamerInfo::kULong:
return "ReadULong";
318 case TVirtualStreamerInfo::kULong64:
return "ReadULong64";
331 const char *TXMLPlayer::ElementGetter(TClass *cl,
const char *membername,
int specials)
333 TClass *membercl = cl ? cl->GetBaseDataMember(membername) : 0;
334 TDataMember *member = membercl ? membercl->GetDataMember(membername) : 0;
335 TMethodCall *mgetter = member ? member->GetterMethod(0) : 0;
337 if ((mgetter != 0) && (mgetter->GetMethod()->Property() & kIsPublic)) {
338 fGetterName =
"obj->";
339 fGetterName += mgetter->GetMethodName();
341 }
else if ((member == 0) || ((member->Property() & kIsPublic) != 0)) {
342 fGetterName =
"obj->";
343 fGetterName += membername;
346 Bool_t deref = (member->GetArrayDim() == 0) && (specials != 2);
351 if (member->Property() & kIsConstant)
352 fGetterName +=
"const ";
353 fGetterName += GetMemberTypeName(member);
354 if (member->IsaPointer())
356 fGetterName +=
"*) ";
358 fGetterName +=
"buf.P(obj,";
359 fGetterName += member->GetOffset();
366 if ((specials == 1) && (member != 0)) {
368 cast += GetMemberTypeName(member);
369 if (member->IsaPointer() || (member->GetArrayDim() > 0))
376 if ((specials == 2) && (member != 0)) {
383 return fGetterName.Data();
390 const char *TXMLPlayer::ElementSetter(TClass *cl,
const char *membername,
char *endch)
394 TClass *membercl = cl ? cl->GetBaseDataMember(membername) : 0;
395 TDataMember *member = membercl ? membercl->GetDataMember(membername) : 0;
396 TMethodCall *msetter = member ? member->SetterMethod(cl) : 0;
398 if ((msetter != 0) && (msetter->GetMethod()->Property() & kIsPublic)) {
399 fSetterName =
"obj->";
400 fSetterName += msetter->GetMethodName();
403 }
else if ((member == 0) || (member->Property() & kIsPublic) != 0) {
404 fSetterName =
"obj->";
405 fSetterName += membername;
406 fSetterName +=
" = ";
409 if (member->GetArrayDim() == 0)
412 if (member->Property() & kIsConstant)
413 fSetterName +=
"const ";
414 fSetterName += GetMemberTypeName(member);
415 if (member->IsaPointer())
417 fSetterName +=
"*) buf.P(obj,";
418 fSetterName += member->GetOffset();
419 fSetterName +=
")) = ";
421 return fSetterName.Data();
427 void TXMLPlayer::ProduceStreamerSource(std::ostream &fs, TClass *cl, TList *cllist)
431 TVirtualStreamerInfo *info = cl->GetStreamerInfo();
432 TObjArray *elements = info->GetElements();
436 fs <<
"//__________________________________________________________________________" << std::endl;
437 fs <<
"void* " << GetStreamerName(cl) <<
"(" << names_xmlfileclass <<
" &buf, void* ptr, bool checktypes)"
439 fs <<
"{" << std::endl;
440 fs << tab1 << cl->GetName() <<
" *obj = (" << cl->GetName() <<
"*) ptr;" << std::endl;
442 fs << tab1 <<
"if (buf.IsReading()) { " << std::endl;
446 Bool_t firstchild =
true;
448 while ((c1 = (TClass *)iter()) != 0) {
451 if (c1->GetListOfBases()->FindObject(cl->GetName()) == 0)
454 fs << tab2 <<
"if (checktypes) {" << std::endl;
455 fs << tab3 <<
"void* ";
459 fs <<
"res = " << GetStreamerName(c1) <<
"(buf, dynamic_cast<" << c1->GetName() <<
"*>(obj));" << std::endl;
460 fs << tab3 <<
"if (res) return dynamic_cast<" << cl->GetName() <<
"*>((" << c1->GetName() <<
" *) res);"
464 fs << tab2 <<
"}" << std::endl;
466 fs << tab2 <<
"if (!buf.CheckClassNode(\"" << cl->GetName() <<
"\", " << info->GetClassVersion() <<
")) return 0;"
469 fs << tab2 <<
"if (obj==0) obj = new " << cl->GetName() <<
";" << std::endl;
472 for (n = 0; n <= elements->GetLast(); n++) {
474 TStreamerElement *el =
dynamic_cast<TStreamerElement *
>(elements->At(n));
478 Int_t typ = el->GetType();
482 case TVirtualStreamerInfo::kBool:
483 case TVirtualStreamerInfo::kChar:
484 case TVirtualStreamerInfo::kShort:
485 case TVirtualStreamerInfo::kInt:
486 case TVirtualStreamerInfo::kLong:
487 case TVirtualStreamerInfo::kLong64:
488 case TVirtualStreamerInfo::kFloat:
489 case TVirtualStreamerInfo::kFloat16:
490 case TVirtualStreamerInfo::kDouble:
491 case TVirtualStreamerInfo::kUChar:
492 case TVirtualStreamerInfo::kUShort:
493 case TVirtualStreamerInfo::kUInt:
494 case TVirtualStreamerInfo::kULong:
495 case TVirtualStreamerInfo::kULong64:
496 case TVirtualStreamerInfo::kDouble32:
497 case TVirtualStreamerInfo::kCounter: {
499 fs << tab2 << ElementSetter(cl, el->GetName(), endch);
500 fs <<
"buf." << GetBasicTypeReaderMethodName(el->GetType(), 0) <<
"(\"" << el->GetName() <<
"\")" << endch
506 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kBool:
507 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kChar:
508 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kShort:
509 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kInt:
510 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kLong:
511 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kLong64:
512 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kFloat:
513 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kFloat16:
514 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kDouble:
515 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kUChar:
516 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kUShort:
517 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kUInt:
518 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kULong:
519 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kULong64:
520 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kDouble32: {
521 fs << tab2 <<
"buf.ReadArray(" << ElementGetter(cl, el->GetName(), (el->GetArrayDim() > 1) ? 1 : 0);
522 fs <<
", " << el->GetArrayLength() <<
", \"" << el->GetName() <<
"\");" << std::endl;
527 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kBool:
528 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kChar:
529 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kShort:
530 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kInt:
531 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kLong:
532 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kLong64:
533 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kFloat:
534 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kFloat16:
535 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kDouble:
536 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kUChar:
537 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kUShort:
538 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kUInt:
539 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kULong:
540 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kULong64:
541 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kDouble32: {
542 TStreamerBasicPointer *elp =
dynamic_cast<TStreamerBasicPointer *
>(el);
544 std::cout <<
"fatal error with TStreamerBasicPointer" << std::endl;
549 fs << tab2 << ElementSetter(cl, el->GetName(), endch);
550 fs <<
"buf.ReadArray(" << ElementGetter(cl, el->GetName());
551 fs <<
", " << ElementGetter(cl, elp->GetCountName());
552 fs <<
", \"" << el->GetName() <<
"\", true)" << endch <<
";" << std::endl;
556 case TVirtualStreamerInfo::kCharStar: {
558 fs << tab2 << ElementSetter(cl, el->GetName(), endch);
559 fs <<
"buf.ReadCharStar(" << ElementGetter(cl, el->GetName());
560 fs <<
", \"" << el->GetName() <<
"\")" << endch <<
";" << std::endl;
564 case TVirtualStreamerInfo::kBase: {
565 fs << tab2 << GetStreamerName(el->GetClassPointer()) <<
"(buf, dynamic_cast<"
566 << el->GetClassPointer()->GetName() <<
"*>(obj), false);" << std::endl;
571 case TVirtualStreamerInfo::kAnyp:
572 case TVirtualStreamerInfo::kAnyp + TVirtualStreamerInfo::kOffsetL: {
573 if (el->GetArrayLength() > 0) {
574 fs << tab2 <<
"buf.ReadObjectArr(" << ElementGetter(cl, el->GetName());
575 fs <<
", " << el->GetArrayLength() <<
", -1"
576 <<
", \"" << el->GetName() <<
"\", " << GetStreamerName(el->GetClassPointer()) <<
");" << std::endl;
578 fs << tab2 <<
"buf.ReadObject(" << ElementGetter(cl, el->GetName());
579 fs <<
", \"" << el->GetName() <<
"\", " << GetStreamerName(el->GetClassPointer()) <<
");" << std::endl;
585 case TVirtualStreamerInfo::kAnyP:
586 case TVirtualStreamerInfo::kAnyP + TVirtualStreamerInfo::kOffsetL: {
587 if (el->GetArrayLength() > 0) {
588 fs << tab2 <<
"for (int n=0;n<" << el->GetArrayLength() <<
";n++) "
589 <<
"delete (" << ElementGetter(cl, el->GetName()) <<
")[n];" << std::endl;
590 fs << tab2 <<
"buf.ReadObjectPtrArr((void**) " << ElementGetter(cl, el->GetName(), 3);
591 fs <<
", " << el->GetArrayLength() <<
", \"" << el->GetName() <<
"\", "
592 << GetStreamerName(el->GetClassPointer()) <<
");" << std::endl;
596 fs << tab2 <<
"delete " << ElementGetter(cl, el->GetName()) <<
";" << std::endl;
597 fs << tab2 << ElementSetter(cl, el->GetName(), endch);
598 fs <<
"(" << el->GetClassPointer()->GetName() <<
"*) buf.ReadObjectPtr(\"" << el->GetName() <<
"\", "
599 << GetStreamerName(el->GetClassPointer()) <<
")" << endch <<
";" << std::endl;
605 case TVirtualStreamerInfo::kAny: {
606 fs << tab2 <<
"buf.ReadObject(" << ElementGetter(cl, el->GetName(), 2);
607 fs <<
", \"" << el->GetName() <<
"\", " << GetStreamerName(el->GetClassPointer()) <<
");" << std::endl;
612 case TVirtualStreamerInfo::kAny + TVirtualStreamerInfo::kOffsetL: {
613 fs << tab2 <<
"buf.ReadObjectArr(" << ElementGetter(cl, el->GetName());
614 fs <<
", " << el->GetArrayLength() <<
", sizeof(" << el->GetClassPointer()->GetName() <<
"), \""
615 << el->GetName() <<
"\", " << GetStreamerName(el->GetClassPointer()) <<
");" << std::endl;
620 case TVirtualStreamerInfo::kSTLp:
621 case TVirtualStreamerInfo::kSTL:
622 case TVirtualStreamerInfo::kSTLp + TVirtualStreamerInfo::kOffsetL:
623 case TVirtualStreamerInfo::kSTL + TVirtualStreamerInfo::kOffsetL: {
624 TStreamerSTL *elstl =
dynamic_cast<TStreamerSTL *
>(el);
628 if (ProduceSTLstreamer(fs, cl, elstl,
false))
631 fs << tab2 <<
"// STL type = " << elstl->GetSTLtype() << std::endl;
635 fs << tab2 <<
"buf.SkipMember(\"" << el->GetName() <<
"\"); // sinfo type " << el->GetType() <<
" of class "
636 << el->GetClassPointer()->GetName() <<
" not supported" << std::endl;
639 fs << tab2 <<
"buf.EndClassNode();" << std::endl;
641 fs << tab1 <<
"} else {" << std::endl;
645 fs << tab2 <<
"if (obj==0) return 0;" << std::endl;
649 while ((c1 = (TClass *)iter()) != 0) {
652 if (c1->GetListOfBases()->FindObject(cl->GetName()) == 0)
656 fs << tab2 <<
"if (checktypes) {" << std::endl;
658 fs << tab3 <<
"if (dynamic_cast<" << c1->GetName() <<
"*>(obj))" << std::endl;
659 fs << tab4 <<
"return " << GetStreamerName(c1) <<
"(buf, dynamic_cast<" << c1->GetName() <<
"*>(obj));"
663 fs << tab2 <<
"}" << std::endl;
665 fs << tab2 <<
"buf.StartClassNode(\"" << cl->GetName() <<
"\", " << info->GetClassVersion() <<
");" << std::endl;
667 for (n = 0; n <= elements->GetLast(); n++) {
669 TStreamerElement *el =
dynamic_cast<TStreamerElement *
>(elements->At(n));
673 Int_t typ = el->GetType();
677 case TVirtualStreamerInfo::kBool:
678 case TVirtualStreamerInfo::kChar:
679 case TVirtualStreamerInfo::kShort:
680 case TVirtualStreamerInfo::kInt:
681 case TVirtualStreamerInfo::kLong:
682 case TVirtualStreamerInfo::kLong64:
683 case TVirtualStreamerInfo::kFloat:
684 case TVirtualStreamerInfo::kFloat16:
685 case TVirtualStreamerInfo::kDouble:
686 case TVirtualStreamerInfo::kUChar:
687 case TVirtualStreamerInfo::kUShort:
688 case TVirtualStreamerInfo::kUInt:
689 case TVirtualStreamerInfo::kULong:
690 case TVirtualStreamerInfo::kULong64:
691 case TVirtualStreamerInfo::kDouble32:
692 case TVirtualStreamerInfo::kCounter: {
693 fs << tab2 <<
"buf.WriteValue(";
694 if (typ == TVirtualStreamerInfo::kUChar)
695 fs <<
"(unsigned char) " << ElementGetter(cl, el->GetName());
697 fs << ElementGetter(cl, el->GetName());
698 fs <<
", \"" << el->GetName() <<
"\");" << std::endl;
703 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kBool:
704 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kChar:
705 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kShort:
706 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kInt:
707 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kLong:
708 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kLong64:
709 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kFloat:
710 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kFloat16:
711 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kDouble:
712 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kUChar:
713 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kUShort:
714 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kUInt:
715 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kULong:
716 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kULong64:
717 case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kDouble32: {
718 fs << tab2 <<
"buf.WriteArray(" << ElementGetter(cl, el->GetName(), (el->GetArrayDim() > 1) ? 1 : 0);
719 fs <<
", " << el->GetArrayLength() <<
", \"" << el->GetName() <<
"\");" << std::endl;
723 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kBool:
724 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kChar:
725 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kShort:
726 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kInt:
727 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kLong:
728 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kLong64:
729 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kFloat:
730 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kFloat16:
731 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kDouble:
732 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kUChar:
733 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kUShort:
734 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kUInt:
735 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kULong:
736 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kULong64:
737 case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kDouble32: {
738 TStreamerBasicPointer *elp =
dynamic_cast<TStreamerBasicPointer *
>(el);
740 std::cout <<
"fatal error with TStreamerBasicPointer" << std::endl;
743 fs << tab2 <<
"buf.WriteArray(" << ElementGetter(cl, el->GetName());
744 fs <<
", " << ElementGetter(cl, elp->GetCountName()) <<
", \"" << el->GetName() <<
"\", true);" << std::endl;
748 case TVirtualStreamerInfo::kCharStar: {
749 fs << tab2 <<
"buf.WriteCharStar(" << ElementGetter(cl, el->GetName()) <<
", \"" << el->GetName() <<
"\");"
754 case TVirtualStreamerInfo::kBase: {
755 fs << tab2 << GetStreamerName(el->GetClassPointer()) <<
"(buf, dynamic_cast<"
756 << el->GetClassPointer()->GetName() <<
"*>(obj), false);" << std::endl;
761 case TVirtualStreamerInfo::kAnyp:
762 case TVirtualStreamerInfo::kAnyp + TVirtualStreamerInfo::kOffsetL: {
763 if (el->GetArrayLength() > 0) {
764 fs << tab2 <<
"buf.WriteObjectArr(" << ElementGetter(cl, el->GetName());
765 fs <<
", " << el->GetArrayLength() <<
", -1"
766 <<
", \"" << el->GetName() <<
"\", " << GetStreamerName(el->GetClassPointer()) <<
");" << std::endl;
768 fs << tab2 <<
"buf.WriteObject(" << ElementGetter(cl, el->GetName());
769 fs <<
", \"" << el->GetName() <<
"\", " << GetStreamerName(el->GetClassPointer()) <<
");" << std::endl;
775 case TVirtualStreamerInfo::kAnyP:
776 case TVirtualStreamerInfo::kAnyP + TVirtualStreamerInfo::kOffsetL: {
777 if (el->GetArrayLength() > 0) {
778 fs << tab2 <<
"buf.WriteObjectPtrArr((void**) " << ElementGetter(cl, el->GetName(), 3);
779 fs <<
", " << el->GetArrayLength() <<
", \"" << el->GetName() <<
"\", "
780 << GetStreamerName(el->GetClassPointer()) <<
");" << std::endl;
782 fs << tab2 <<
"buf.WriteObjectPtr(" << ElementGetter(cl, el->GetName());
783 fs <<
", \"" << el->GetName() <<
"\", " << GetStreamerName(el->GetClassPointer()) <<
");" << std::endl;
788 case TVirtualStreamerInfo::kAny: {
789 fs << tab2 <<
"buf.WriteObject(" << ElementGetter(cl, el->GetName(), 2);
790 fs <<
", \"" << el->GetName() <<
"\", " << GetStreamerName(el->GetClassPointer()) <<
");" << std::endl;
794 case TVirtualStreamerInfo::kAny + TVirtualStreamerInfo::kOffsetL: {
795 fs << tab2 <<
"buf.WriteObjectArr(" << ElementGetter(cl, el->GetName());
796 fs <<
", " << el->GetArrayLength() <<
", sizeof(" << el->GetClassPointer()->GetName() <<
"), \""
797 << el->GetName() <<
"\", " << GetStreamerName(el->GetClassPointer()) <<
");" << std::endl;
802 case TVirtualStreamerInfo::kSTLp + TVirtualStreamerInfo::kOffsetL:
803 case TVirtualStreamerInfo::kSTL + TVirtualStreamerInfo::kOffsetL:
804 case TVirtualStreamerInfo::kSTLp:
805 case TVirtualStreamerInfo::kSTL: {
806 TStreamerSTL *elstl =
dynamic_cast<TStreamerSTL *
>(el);
810 if (ProduceSTLstreamer(fs, cl, elstl,
true))
812 fs << tab2 <<
"// STL type = " << elstl->GetSTLtype() << std::endl;
816 fs << tab2 <<
"buf.MakeEmptyMember(\"" << el->GetName() <<
"\"); // sinfo type " << el->GetType()
817 <<
" of class " << el->GetClassPointer()->GetName() <<
" not supported" << std::endl;
820 fs << tab2 <<
"buf.EndClassNode();" << std::endl;
822 fs << tab1 <<
"}" << std::endl;
823 fs << tab1 <<
"return obj;" << std::endl;
824 fs <<
"}" << std::endl << std::endl;
830 void TXMLPlayer::ReadSTLarg(std::ostream &fs, TString &argname,
int argtyp, Bool_t isargptr, TClass *argcl,
831 TString &tname, TString &ifcond)
834 case TVirtualStreamerInfo::kBool:
835 case TVirtualStreamerInfo::kChar:
836 case TVirtualStreamerInfo::kShort:
837 case TVirtualStreamerInfo::kInt:
838 case TVirtualStreamerInfo::kLong:
839 case TVirtualStreamerInfo::kLong64:
840 case TVirtualStreamerInfo::kFloat:
841 case TVirtualStreamerInfo::kFloat16:
842 case TVirtualStreamerInfo::kDouble:
843 case TVirtualStreamerInfo::kUChar:
844 case TVirtualStreamerInfo::kUShort:
845 case TVirtualStreamerInfo::kUInt:
846 case TVirtualStreamerInfo::kULong:
847 case TVirtualStreamerInfo::kULong64:
848 case TVirtualStreamerInfo::kDouble32:
849 case TVirtualStreamerInfo::kCounter: {
850 fs << tname <<
" " << argname <<
" = buf." << GetBasicTypeReaderMethodName(argtyp, tname.Data()) <<
"(0);"
855 case TVirtualStreamerInfo::kObject: {
856 fs << tname << (isargptr ?
" " :
" *") << argname <<
" = "
857 <<
"(" << argcl->GetName() <<
"*)"
858 <<
"buf.ReadObjectPtr(0, " << GetStreamerName(argcl) <<
");" << std::endl;
860 if (ifcond.Length() > 0)
870 case TVirtualStreamerInfo::kSTLstring: {
871 fs <<
"string *" << argname <<
" = "
872 <<
"buf.ReadSTLstring();" << std::endl;
874 if (ifcond.Length() > 0)
884 default: fs <<
"/* argument " << argname <<
" not supported */";
891 void TXMLPlayer::WriteSTLarg(std::ostream &fs,
const char *accname,
int argtyp, Bool_t isargptr, TClass *argcl)
894 case TVirtualStreamerInfo::kBool:
895 case TVirtualStreamerInfo::kChar:
896 case TVirtualStreamerInfo::kShort:
897 case TVirtualStreamerInfo::kInt:
898 case TVirtualStreamerInfo::kLong:
899 case TVirtualStreamerInfo::kLong64:
900 case TVirtualStreamerInfo::kFloat:
901 case TVirtualStreamerInfo::kFloat16:
902 case TVirtualStreamerInfo::kDouble:
903 case TVirtualStreamerInfo::kUChar:
904 case TVirtualStreamerInfo::kUShort:
905 case TVirtualStreamerInfo::kUInt:
906 case TVirtualStreamerInfo::kULong:
907 case TVirtualStreamerInfo::kULong64:
908 case TVirtualStreamerInfo::kDouble32:
909 case TVirtualStreamerInfo::kCounter: {
910 fs <<
"buf.WriteValue(" << accname <<
", 0);" << std::endl;
914 case TVirtualStreamerInfo::kObject: {
915 fs <<
"buf.WriteObjectPtr(";
919 fs <<
"&(" << accname <<
")";
920 fs <<
", 0, " << GetStreamerName(argcl) <<
");" << std::endl;
924 case TVirtualStreamerInfo::kSTLstring: {
925 fs <<
"buf.WriteSTLstring(";
929 fs <<
"&(" << accname <<
")";
930 fs <<
");" << std::endl;
934 default: fs <<
"/* argument not supported */" << std::endl;
941 Bool_t TXMLPlayer::ProduceSTLstreamer(std::ostream &fs, TClass *cl, TStreamerSTL *el, Bool_t isWriting)
943 if ((cl == 0) || (el == 0))
946 TClass *contcl = el->GetClassPointer();
948 Bool_t isstr = (el->GetSTLtype() == ROOT::kSTLstring);
949 Bool_t isptr = el->IsaPointer();
950 Bool_t isarr = (el->GetArrayLength() > 0);
951 Bool_t isparent = (strcmp(el->GetName(), contcl->GetName()) == 0);
960 if (!isstr && contcl->GetCollectionType() != ROOT::kNotSTL) {
962 std::vector<std::string> splitName;
963 TClassEdit::GetSplit(contcl->GetName(), splitName, nestedLoc);
965 stltyp = contcl->GetCollectionType();
967 case ROOT::kSTLvector: narg = 1;
break;
968 case ROOT::kSTLlist: narg = 1;
break;
969 case ROOT::kSTLforwardlist: narg = 1;
break;
970 case ROOT::kSTLdeque: narg = 1;
break;
971 case ROOT::kSTLmap: narg = 2;
break;
972 case ROOT::kSTLmultimap: narg = 2;
break;
973 case ROOT::kSTLset: narg = 1;
break;
974 case ROOT::kSTLmultiset: narg = 1;
break;
975 case ROOT::kSTLunorderedset: narg = 1;
break;
976 case ROOT::kSTLunorderedmultiset: narg = 1;
break;
977 case ROOT::kSTLunorderedmap: narg = 2;
break;
978 case ROOT::kSTLunorderedmultimap: narg = 2;
break;
980 default:
return false;
983 for (
int n = 0; n < narg; n++) {
989 TString buf = splitName[n + 1];
994 if (TClassEdit::IsSTLCont(buf.Data()))
997 int pstar = buf.Index(
"*");
1002 while ((pstar > 0) && (buf[pstar] ==
' '))
1004 buf.Remove(pstar + 1);
1006 isargptr[n] =
false;
1008 if (buf.Index(
"const ") == 0) {
1010 while ((buf.Length() > 0) && (buf[0] ==
' '))
1014 TDataType *dt = (TDataType *)gROOT->GetListOfTypes()->FindObject(buf);
1016 argtype[n] = dt->GetType();
1017 else if (buf ==
"string")
1018 argtype[n] = TVirtualStreamerInfo::kSTLstring;
1020 argcl[n] = TClass::GetClass(buf);
1022 argtype[n] = TVirtualStreamerInfo::kObject;
1032 Bool_t akaarrayaccess = (narg == 1) && (argtype[0] < 20);
1034 char tabs[30], tabs2[30];
1038 fs << tab2 <<
"if (buf.StartSTLnode(\"" << fXmlSetup.XmlGetElementName(el) <<
"\")) {" << std::endl;
1040 fs << tab3 << contcl->GetName() <<
" ";
1046 accname =
"(*cont)->";
1062 fs <<
"*dynamic_cast<" << contcl->GetName() <<
"*>(obj);" << std::endl;
1064 fs << ElementGetter(cl, el->GetName()) <<
";" << std::endl;
1066 if (isarr && el->GetArrayLength()) {
1067 strlcpy(tabs, tab4,
sizeof(tabs));
1068 fs << tab3 <<
"for(int n=0;n<" << el->GetArrayLength() <<
";n++) {" << std::endl;
1070 strlcpy(tabs, tab3,
sizeof(tabs));
1072 strlcpy(tabs2, tabs,
sizeof(tabs2));
1075 strlcat(tabs2, tab1,
sizeof(tabs2));
1076 fs << tabs <<
"if (" << (isarr ?
"*cont" :
"cont") <<
"==0) {" << std::endl;
1077 fs << tabs2 <<
"buf.WriteSTLsize(0" << (isstr ?
",true);" :
");") << std::endl;
1078 fs << tabs <<
"} else {" << std::endl;
1081 fs << tabs2 <<
"buf.WriteSTLsize(" << accname << (isstr ?
"length(), true);" :
"size());") << std::endl;
1084 fs << tabs2 <<
"buf.WriteSTLstringData(" << accname <<
"c_str());" << std::endl;
1086 if (akaarrayaccess) {
1087 fs << tabs2 << argtname[0] <<
"* arr = new " << argtname[0] <<
"[" << accname <<
"size()];" << std::endl;
1088 fs << tabs2 <<
"int k = 0;" << std::endl;
1091 fs << tabs2 << contcl->GetName() <<
"::const_iterator iter;" << std::endl;
1092 fs << tabs2 <<
"for (iter = " << accname <<
"begin(); iter != " << accname <<
"end(); iter++)";
1093 if (akaarrayaccess) {
1094 fs << std::endl << tabs2 << tab1 <<
"arr[k++] = *iter;" << std::endl;
1095 fs << tabs2 <<
"buf.WriteArray(arr, " << accname <<
"size(), 0, false);" << std::endl;
1096 fs << tabs2 <<
"delete[] arr;" << std::endl;
1097 }
else if (narg == 1) {
1098 fs << std::endl << tabs2 << tab1;
1099 WriteSTLarg(fs,
"*iter", argtype[0], isargptr[0], argcl[0]);
1100 }
else if (narg == 2) {
1101 fs <<
" {" << std::endl;
1102 fs << tabs2 << tab1;
1103 WriteSTLarg(fs,
"iter->first", argtype[0], isargptr[0], argcl[0]);
1104 fs << tabs2 << tab1;
1105 WriteSTLarg(fs,
"iter->second", argtype[1], isargptr[1], argcl[1]);
1106 fs << tabs2 <<
"}" << std::endl;
1111 fs << tabs <<
"}" << std::endl;
1113 if (isarr && el->GetArrayLength()) {
1115 fs << tabs <<
"cont++;" << std::endl;
1117 fs << tabs <<
"(void*) cont = (char*) cont + sizeof(" << contcl->GetName() <<
");" << std::endl;
1118 fs << tab3 <<
"}" << std::endl;
1121 fs << tab3 <<
"buf.EndSTLnode();" << std::endl;
1122 fs << tab2 <<
"}" << std::endl;
1126 fs << tab2 <<
"if (buf.VerifySTLnode(\"" << fXmlSetup.XmlGetElementName(el) <<
"\")) {" << std::endl;
1128 fs << tab3 << contcl->GetName() <<
" ";
1129 TString accname, accptr;
1133 accname =
"(*cont)->";
1151 fs <<
"*dynamic_cast<" << contcl->GetName() <<
"*>(obj);" << std::endl;
1153 fs << ElementGetter(cl, el->GetName()) <<
";" << std::endl;
1155 if (isarr && el->GetArrayLength()) {
1156 strlcpy(tabs, tab4,
sizeof(tabs));
1157 fs << tab3 <<
"for(int n=0;n<" << el->GetArrayLength() <<
";n++) {" << std::endl;
1159 strlcpy(tabs, tab3,
sizeof(tabs));
1161 fs << tabs <<
"int size = buf.ReadSTLsize(" << (isstr ?
"true);" :
");") << std::endl;
1164 fs << tabs <<
"delete " << accptr <<
";" << std::endl;
1165 fs << tabs <<
"if (size==0) " << accptr <<
" = 0;" << std::endl;
1166 fs << tabs <<
" else " << accptr <<
" = new " << contcl->GetName() <<
";" << std::endl;
1169 fs << tabs << ElementSetter(cl, el->GetName(), endch);
1170 fs <<
"cont" << endch <<
";" << std::endl;
1173 fs << tabs << accname << (isstr ?
"erase();" :
"clear();") << std::endl;
1177 fs << tabs <<
"if (size>0) " << accname <<
"assign(buf.ReadSTLstringData(size));" << std::endl;
1179 if (akaarrayaccess) {
1180 fs << tabs << argtname[0] <<
"* arr = new " << argtname[0] <<
"[size];" << std::endl;
1181 fs << tabs <<
"buf.ReadArray(arr, size, 0, false);" << std::endl;
1184 fs << tabs <<
"for(int k=0;k<size;k++)";
1186 if (akaarrayaccess) {
1187 fs << std::endl << tabs << tab1 << accname;
1188 if ((stltyp == ROOT::kSTLset) || (stltyp == ROOT::kSTLmultiset))
1192 fs <<
"(arr[k]);" << std::endl;
1193 fs << tabs <<
"delete[] arr;" << std::endl;
1194 }
else if (narg == 1) {
1195 TString arg1(
"arg"), ifcond;
1196 fs <<
" {" << std::endl << tabs << tab1;
1197 ReadSTLarg(fs, arg1, argtype[0], isargptr[0], argcl[0], argtname[0], ifcond);
1199 if (ifcond.Length() > 0)
1200 fs <<
"if (" << ifcond <<
") ";
1202 if ((stltyp == ROOT::kSTLset) || (stltyp == ROOT::kSTLmultiset))
1206 fs <<
"(" << arg1 <<
");" << std::endl;
1207 fs << tabs <<
"}" << std::endl;
1208 }
else if (narg == 2) {
1209 TString arg1(
"arg1"), arg2(
"arg2"), ifcond;
1210 fs <<
" {" << std::endl << tabs << tab1;
1211 ReadSTLarg(fs, arg1, argtype[0], isargptr[0], argcl[0], argtname[0], ifcond);
1213 ReadSTLarg(fs, arg2, argtype[1], isargptr[1], argcl[1], argtname[1], ifcond);
1215 if (ifcond.Length() > 0)
1216 fs <<
"if (" << ifcond <<
") ";
1217 fs << accname <<
"insert(make_pair(" << arg1 <<
", " << arg2 <<
"));" << std::endl;
1218 fs << tabs <<
"}" << std::endl;
1222 if (isarr && el->GetArrayLength()) {
1224 fs << tabs <<
"cont++;" << std::endl;
1226 fs << tabs <<
"(void*) cont = (char*) cont + sizeof(" << contcl->GetName() <<
");" << std::endl;
1227 fs << tab3 <<
"}" << std::endl;
1230 fs << tab3 <<
"buf.EndSTLnode();" << std::endl;
1231 fs << tab2 <<
"}" << std::endl;