168 if ((cllist == 0) || (filename == 0))
171 std::ofstream fh(
TString(filename) +
".h");
172 std::ofstream fs(
TString(filename) +
".cxx");
174 fh <<
"// generated header file" << std::endl << std::endl;
175 fh <<
"#ifndef " << filename <<
"_h" << std::endl;
176 fh <<
"#define " << filename <<
"_h" << std::endl << std::endl;
180 fs <<
"// generated source file" << std::endl << std::endl;
181 fs <<
"#include \"" << filename <<
".h\"" << std::endl << std::endl;
188 while ((cl = (
TClass *)iter()) != 0) {
203 while ((cl = (
TClass *)iter()) != 0) {
206 <<
" &buf, void* ptr = 0, bool checktypes = true);" << std::endl
212 fh <<
"#endif" << std::endl << std::endl;
213 fs << std::endl << std::endl;
230 case kInt_t:
return "int";
241 return "unsigned char";
245 case kUInt_t:
return "unsigned int";
246 case kULong_t:
return "unsigned long";
278 return "unsigned char";
367 if ((specials == 1) && (member != 0)) {
377 if ((specials == 2) && (member != 0)) {
437 fs <<
"//__________________________________________________________________________" << std::endl;
440 fs <<
"{" << std::endl;
441 fs <<
tab1 << cl->
GetName() <<
" *obj = (" << cl->
GetName() <<
"*) ptr;" << std::endl;
443 fs <<
tab1 <<
"if (buf.IsReading()) { " << std::endl;
449 while ((
c1 = (
TClass *)iter()) != 0) {
452 if (
c1->GetListOfBases()->FindObject(cl->
GetName()) == 0)
455 fs <<
tab2 <<
"if (checktypes) {" << std::endl;
456 fs <<
tab3 <<
"void* ";
460 fs <<
"res = " <<
GetStreamerName(
c1) <<
"(buf, dynamic_cast<" <<
c1->GetName() <<
"*>(obj));" << std::endl;
461 fs <<
tab3 <<
"if (res) return dynamic_cast<" << cl->
GetName() <<
"*>((" <<
c1->GetName() <<
" *) res);"
465 fs <<
tab2 <<
"}" << std::endl;
470 fs <<
tab2 <<
"if (obj==0) obj = new " << cl->
GetName() <<
";" << std::endl;
545 std::cout <<
"fatal error with TStreamerBasicPointer" << std::endl;
553 fs <<
", \"" << el->
GetName() <<
"\", true)" << endch <<
";" << std::endl;
561 fs <<
", \"" << el->
GetName() <<
"\")" << endch <<
";" << std::endl;
632 fs <<
tab2 <<
"// STL type = " << elstl->
GetSTLtype() << std::endl;
636 fs <<
tab2 <<
"buf.SkipMember(\"" << el->
GetName() <<
"\"); // sinfo type " << el->
GetType() <<
" of class "
640 fs <<
tab2 <<
"buf.EndClassNode();" << std::endl;
642 fs <<
tab1 <<
"} else {" << std::endl;
646 fs <<
tab2 <<
"if (obj==0) return 0;" << std::endl;
650 while ((
c1 = (
TClass *)iter()) != 0) {
653 if (
c1->GetListOfBases()->FindObject(cl->
GetName()) == 0)
657 fs <<
tab2 <<
"if (checktypes) {" << std::endl;
659 fs <<
tab3 <<
"if (dynamic_cast<" <<
c1->GetName() <<
"*>(obj))" << std::endl;
664 fs <<
tab2 <<
"}" << std::endl;
694 fs <<
tab2 <<
"buf.WriteValue(";
699 fs <<
", \"" << el->
GetName() <<
"\");" << std::endl;
741 std::cout <<
"fatal error with TStreamerBasicPointer" << std::endl;
813 fs <<
tab2 <<
"// STL type = " << elstl->
GetSTLtype() << std::endl;
817 fs <<
tab2 <<
"buf.MakeEmptyMember(\"" << el->
GetName() <<
"\"); // sinfo type " << el->
GetType()
821 fs <<
tab2 <<
"buf.EndClassNode();" << std::endl;
823 fs <<
tab1 <<
"}" << std::endl;
824 fs <<
tab1 <<
"return obj;" << std::endl;
825 fs <<
"}" << std::endl << std::endl;
857 fs << tname << (isargptr ?
" " :
" *") << argname <<
" = "
858 <<
"(" << argcl->
GetName() <<
"*)"
859 <<
"buf.ReadObjectPtr(0, " <<
GetStreamerName(argcl) <<
");" << std::endl;
872 fs <<
"string *" << argname <<
" = "
873 <<
"buf.ReadSTLstring();" << std::endl;
885 default: fs <<
"/* argument " << argname <<
" not supported */";
911 fs <<
"buf.WriteValue(" << accname <<
", 0);" << std::endl;
916 fs <<
"buf.WriteObjectPtr(";
920 fs <<
"&(" << accname <<
")";
926 fs <<
"buf.WriteSTLstring(";
930 fs <<
"&(" << accname <<
")";
931 fs <<
");" << std::endl;
935 default: fs <<
"/* argument not supported */" << std::endl;
944 if ((cl == 0) || (el == 0))
963 std::vector<std::string> splitName;
981 default:
return false;
984 for (
int n = 0;
n < narg;
n++) {
998 int pstar = buf.
Index(
"*");
1003 while ((pstar > 0) && (buf[pstar] ==
' '))
1007 isargptr[
n] =
false;
1009 if (buf.
Index(
"const ") == 0) {
1011 while ((buf.
Length() > 0) && (buf[0] ==
' '))
1018 else if (buf ==
"string")
1033 Bool_t akaarrayaccess = (narg == 1) && (argtype[0] < 20);
1035 char tabs[30], tabs2[30];
1047 accname =
"(*cont)->";
1063 fs <<
"*dynamic_cast<" << contcl->
GetName() <<
"*>(obj);" << std::endl;
1068 strlcpy(tabs,
tab4,
sizeof(tabs));
1071 strlcpy(tabs,
tab3,
sizeof(tabs));
1073 strlcpy(tabs2, tabs,
sizeof(tabs2));
1076 strlcat(tabs2,
tab1,
sizeof(tabs2));
1077 fs << tabs <<
"if (" << (isarr ?
"*cont" :
"cont") <<
"==0) {" << std::endl;
1078 fs << tabs2 <<
"buf.WriteSTLsize(0" << (isstr ?
",true);" :
");") << std::endl;
1079 fs << tabs <<
"} else {" << std::endl;
1082 fs << tabs2 <<
"buf.WriteSTLsize(" << accname << (isstr ?
"length(), true);" :
"size());") << std::endl;
1085 fs << tabs2 <<
"buf.WriteSTLstringData(" << accname <<
"c_str());" << std::endl;
1087 if (akaarrayaccess) {
1088 fs << tabs2 << argtname[0] <<
"* arr = new " << argtname[0] <<
"[" << accname <<
"size()];" << std::endl;
1089 fs << tabs2 <<
"int k = 0;" << std::endl;
1092 fs << tabs2 << contcl->
GetName() <<
"::const_iterator iter;" << std::endl;
1093 fs << tabs2 <<
"for (iter = " << accname <<
"begin(); iter != " << accname <<
"end(); iter++)";
1094 if (akaarrayaccess) {
1095 fs << std::endl << tabs2 <<
tab1 <<
"arr[k++] = *iter;" << std::endl;
1096 fs << tabs2 <<
"buf.WriteArray(arr, " << accname <<
"size(), 0, false);" << std::endl;
1097 fs << tabs2 <<
"delete[] arr;" << std::endl;
1098 }
else if (narg == 1) {
1099 fs << std::endl << tabs2 <<
tab1;
1100 WriteSTLarg(fs,
"*iter", argtype[0], isargptr[0], argcl[0]);
1101 }
else if (narg == 2) {
1102 fs <<
" {" << std::endl;
1103 fs << tabs2 <<
tab1;
1104 WriteSTLarg(fs,
"iter->first", argtype[0], isargptr[0], argcl[0]);
1105 fs << tabs2 <<
tab1;
1106 WriteSTLarg(fs,
"iter->second", argtype[1], isargptr[1], argcl[1]);
1107 fs << tabs2 <<
"}" << std::endl;
1112 fs << tabs <<
"}" << std::endl;
1116 fs << tabs <<
"cont++;" << std::endl;
1118 fs << tabs <<
"(void*) cont = (char*) cont + sizeof(" << contcl->
GetName() <<
");" << std::endl;
1119 fs <<
tab3 <<
"}" << std::endl;
1122 fs <<
tab3 <<
"buf.EndSTLnode();" << std::endl;
1123 fs <<
tab2 <<
"}" << std::endl;
1134 accname =
"(*cont)->";
1152 fs <<
"*dynamic_cast<" << contcl->
GetName() <<
"*>(obj);" << std::endl;
1157 strlcpy(tabs,
tab4,
sizeof(tabs));
1160 strlcpy(tabs,
tab3,
sizeof(tabs));
1162 fs << tabs <<
"int size = buf.ReadSTLsize(" << (isstr ?
"true);" :
");") << std::endl;
1165 fs << tabs <<
"delete " << accptr <<
";" << std::endl;
1166 fs << tabs <<
"if (size==0) " << accptr <<
" = 0;" << std::endl;
1167 fs << tabs <<
" else " << accptr <<
" = new " << contcl->
GetName() <<
";" << std::endl;
1171 fs <<
"cont" << endch <<
";" << std::endl;
1174 fs << tabs << accname << (isstr ?
"erase();" :
"clear();") << std::endl;
1178 fs << tabs <<
"if (size>0) " << accname <<
"assign(buf.ReadSTLstringData(size));" << std::endl;
1180 if (akaarrayaccess) {
1181 fs << tabs << argtname[0] <<
"* arr = new " << argtname[0] <<
"[size];" << std::endl;
1182 fs << tabs <<
"buf.ReadArray(arr, size, 0, false);" << std::endl;
1185 fs << tabs <<
"for(int k=0;k<size;k++)";
1187 if (akaarrayaccess) {
1188 fs << std::endl << tabs <<
tab1 << accname;
1193 fs <<
"(arr[k]);" << std::endl;
1194 fs << tabs <<
"delete[] arr;" << std::endl;
1195 }
else if (narg == 1) {
1197 fs <<
" {" << std::endl << tabs <<
tab1;
1198 ReadSTLarg(fs, arg1, argtype[0], isargptr[0], argcl[0], argtname[0], ifcond);
1201 fs <<
"if (" << ifcond <<
") ";
1207 fs <<
"(" << arg1 <<
");" << std::endl;
1208 fs << tabs <<
"}" << std::endl;
1209 }
else if (narg == 2) {
1210 TString arg1(
"arg1"), arg2(
"arg2"), ifcond;
1211 fs <<
" {" << std::endl << tabs <<
tab1;
1212 ReadSTLarg(fs, arg1, argtype[0], isargptr[0], argcl[0], argtname[0], ifcond);
1214 ReadSTLarg(fs, arg2, argtype[1], isargptr[1], argcl[1], argtname[1], ifcond);
1217 fs <<
"if (" << ifcond <<
") ";
1218 fs << accname <<
"insert(make_pair(" << arg1 <<
", " << arg2 <<
"));" << std::endl;
1219 fs << tabs <<
"}" << std::endl;
1225 fs << tabs <<
"cont++;" << std::endl;
1227 fs << tabs <<
"(void*) cont = (char*) cont + sizeof(" << contcl->
GetName() <<
");" << std::endl;
1228 fs <<
tab3 <<
"}" << std::endl;
1231 fs <<
tab3 <<
"buf.EndSTLnode();" << std::endl;
1232 fs <<
tab2 <<
"}" << std::endl;
const char * names_xmlfileclass
The ROOT global object gROOT contains a list of all defined classes.
TDataMember * GetDataMember(const char *datamember) const
Return pointer to datamember object with name "datamember".
TVirtualStreamerInfo * GetStreamerInfo(Int_t version=0) const
returns a pointer to the TVirtualStreamerInfo object for version If the object does not exist,...
ROOT::ESTLType GetCollectionType() const
Return the 'type' of the STL the TClass is representing.
TClass * GetBaseDataMember(const char *datamember)
Return pointer to (base) class that contains datamember.
const char * GetDeclFileName() const
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
All ROOT classes may have RTTI (run time type identification) support added.
TMethodCall * SetterMethod(TClass *cl)
Return a TMethodCall method responsible for setting the value of data member.
Long_t GetOffset() const
Get offset from "this".
Int_t GetArrayDim() const
Return number of array dimensions.
Bool_t IsEnum() const
Return true if data member is an enum.
Bool_t IsBasic() const
Return true if data member is a basic type, e.g. char, int, long...
Bool_t IsaPointer() const
Return true if data member is a pointer.
TDataType * GetDataType() const
const char * GetTypeName() const
Get type of data member, e,g.: "class TDirectory*" -> "TDirectory".
TMethodCall * GetterMethod(TClass *cl=0)
Return a TMethodCall method responsible for getting the value of data member.
Long_t Property() const
Get property description word. For meaning of bits see EProperty.
Basic data type descriptor (datatype information is obtained from CINT).
TString GetTypeName()
Get basic type of typedef, e,g.
Long_t Property() const
Get property description word. For meaning of bits see EProperty.
Method or function calling interface.
const char * GetMethodName() const
TFunction * GetMethod()
Returns the TMethod describing the method to be executed.
The TNamed class is the base class for all named ROOT classes.
virtual const char * GetName() const
Returns name of object.
virtual void Delete(Option_t *option="")
Remove all objects from the array AND delete all heap based objects.
virtual TObject * FindObject(const char *name) const
Find an object in this collection using its name.
Int_t GetLast() const
Return index of last object in array.
TObject * At(Int_t idx) const
Mother of all ROOT objects.
const char * GetCountName() const
virtual TClass * GetClassPointer() const
Returns a pointer to the TClass of this element.
Int_t GetArrayDim() const
Int_t GetArrayLength() const
const char * GetTypeNameBasic() const
Return type name of this element in case the type name is not a standard basic type,...
Bool_t IsaPointer() const
Return true if the data member is a pointer.
const char * Data() const
TString & Remove(Ssiz_t pos)
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Abstract Interface class describing Streamer information for one class.
virtual TObjArray * GetElements() const =0
virtual Int_t GetClassVersion() const =0
TString GetMemberTypeName(TDataMember *member)
returns name of simple data type for given data member
Bool_t ProduceCode(TList *cllist, const char *filename)
Produce streamers for provide class list TList should include list of classes, for which code should ...
TString GetStreamerName(TClass *cl)
returns streamer function name for given class
TString fSetterName
buffer for name of getter method
const char * ElementGetter(TClass *cl, const char *membername, int specials=0)
produce code to access member of given class.
TXMLSetup fXmlSetup
buffer for name of setter method
virtual ~TXMLPlayer()
destructor of TXMLPlayer object
TString GetBasicTypeName(TStreamerElement *el)
return simple data types for given TStreamerElement object
void ReadSTLarg(std::ostream &fs, TString &argname, int argtyp, Bool_t isargptr, TClass *argcl, TString &tname, TString &ifcond)
Produce code to read argument of stl container from xml file.
TXMLPlayer()
default constructor
TString GetBasicTypeReaderMethodName(Int_t type, const char *realname)
return functions name to read simple data type from xml file
void ProduceStreamerSource(std::ostream &fs, TClass *cl, TList *cllist)
Produce source code of streamer function for specified class.
Bool_t ProduceSTLstreamer(std::ostream &fs, TClass *cl, TStreamerSTL *el, Bool_t isWriting)
Produce code of xml streamer for data member of stl type.
const char * ElementSetter(TClass *cl, const char *membername, char *endch)
Produce code to set value to given data member.
void WriteSTLarg(std::ostream &fs, const char *accname, int argtyp, Bool_t isargptr, TClass *argcl)
Produce code to write argument of stl container to xml file.
const char * XmlGetElementName(const TStreamerElement *el)
return converted name for TStreamerElement
ROOT::ESTLType IsSTLCont(std::string_view type)
type : type name: vector<list<classA,allocator>,allocator> result: 0 : not stl container code of cont...
int GetSplit(const char *type, std::vector< std::string > &output, int &nestedLoc, EModType mode=TClassEdit::kNone)
Stores in output (after emptying it) the split type.