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";
239 if ((first ==
'B') || (first ==
'b'))
241 return "unsigned char";
245 case kUInt_t:
return "unsigned int";
246 case kULong_t:
return "unsigned long";
276 if ((first ==
'B') || (first ==
'b'))
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) {
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;
473 for (n = 0; n <= elements->
GetLast(); n++) {
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) {
657 fs <<
tab2 <<
"if (checktypes) {" << std::endl;
659 fs <<
tab3 <<
"if (dynamic_cast<" << c1->
GetName() <<
"*>(obj))" << std::endl;
664 fs <<
tab2 <<
"}" << std::endl;
668 for (n = 0; n <= elements->
GetLast(); n++) {
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;
virtual const char * GetName() const
Returns name of object.
TMethodCall * SetterMethod(TClass *cl)
Return a TMethodCall method responsible for setting the value of data member.
TList * GetListOfBases()
Return list containing the TBaseClass(es) of a class.
const char * GetTypeNameBasic() const
Return type name of this element in case the type name is not a standard basic type, return the basic type name known to CINT.
TMethodCall * GetterMethod(TClass *cl=0)
Return a TMethodCall method responsible for getting the value of data member.
TString GetTypeName()
Get basic type of typedef, e,g.
ROOT::ESTLType IsSTLCont(std::string_view type)
type : type name: vector<list<classA,allocator>,allocator> result: 0 : not stl container code of cont...
TXMLSetup fXmlSetup
buffer for name of setter method
const char * GetDeclFileName() const
const char * names_xmlfileclass
TXMLPlayer()
default constructor
virtual void Delete(Option_t *option="")
Remove all objects from the array AND delete all heap based objects.
All ROOT classes may have RTTI (run time type identification) support added.
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.
void ProduceStreamerSource(std::ostream &fs, TClass *cl, TList *cllist)
Produce source code of streamer function for specified class.
Bool_t IsEnum() const
Return true if data member is an enum.
virtual TClass * GetClassPointer() const
Returns a pointer to the TClass of this element.
TVirtualStreamerInfo * GetStreamerInfo(Int_t version=0) const
returns a pointer to the TVirtualStreamerInfo object for version If the object does not exist...
const char * GetTypeName() const
Get type of data member, e,g.: "class TDirectory*" -> "TDirectory".
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Int_t GetArrayLength() const
TObject * At(Int_t idx) const
Int_t GetArrayDim() const
TString GetBasicTypeReaderMethodName(Int_t type, const char *realname)
return functions name to read simple data type from xml file
Bool_t IsaPointer() const
Return true if the data member is a pointer.
virtual TObject * FindObject(const char *name) const
Delete a TObjLink object.
TString GetStreamerName(TClass *cl)
returns streamer function name for given 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.
Bool_t IsBasic() const
Return true if data member is a basic type, e.g. char, int, long...
virtual Int_t GetClassVersion() const =0
The TNamed class is the base class for all named ROOT classes.
virtual TObject * FindObject(const char *name) const
Find an object in this collection using its name.
Long_t Property() const
Get property description word. For meaning of bits see EProperty.
Long_t Property() const
Get property description word. For meaning of bits see EProperty.
TDataType * GetDataType() const
Method or function calling interface.
const char * ElementSetter(TClass *cl, const char *membername, char *endch)
Produce code to set value to 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 GetBasicTypeName(TStreamerElement *el)
return simple data types for given TStreamerElement object
const char * GetMethodName() const
Int_t GetLast() const
Return index of last object in array.
const char * XmlGetElementName(const TStreamerElement *el)
return converted name for TStreamerElement
Basic data type descriptor (datatype information is obtained from CINT).
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.
Int_t GetArrayDim() const
Return number of array dimensions.
The ROOT global object gROOT contains a list of all defined classes.
TClass * GetBaseDataMember(const char *datamember)
Return pointer to (base) class that contains datamember.
ROOT::ESTLType GetCollectionType() const
Return the 'type' of the STL the TClass is representing.
Long_t GetOffset() const
Get offset from "this".
TString & Remove(Ssiz_t pos)
TString fSetterName
buffer for name of getter method
TFunction * GetMethod()
Returns the TMethod describing the method to be executed.
virtual TObjArray * GetElements() const =0
virtual ~TXMLPlayer()
destructor of TXMLPlayer object
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 * ElementGetter(TClass *cl, const char *membername, int specials=0)
produce code to access member of given class.
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.
Mother of all ROOT objects.
TString GetMemberTypeName(TDataMember *member)
returns name of simple data type for given data member
const char * GetCountName() const
TDataMember * GetDataMember(const char *datamember) const
Return pointer to datamember object with name "datamember".
Abstract Interface class describing Streamer information for one class.
Bool_t IsaPointer() const
Return true if data member is a pointer.
const char * Data() const