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;