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;
179 fs <<
"// generated source file" << std::endl << std::endl;
180 fs <<
"#include \"" << filename <<
".h\"" << std::endl << std::endl;
187 while ((cl = (
TClass *)iter()) != 0) {
202 while ((cl = (
TClass *)iter()) != 0) {
205 <<
" &buf, void* ptr = 0, bool checktypes = true);" << std::endl
211 fh <<
"#endif" << std::endl << std::endl;
212 fs << std::endl << std::endl;
229 case kInt_t:
return "int";
240 return "unsigned char";
244 case kUInt_t:
return "unsigned int";
245 case kULong_t:
return "unsigned long";
277 return "unsigned char";
366 if ((specials == 1) && (member != 0)) {
376 if ((specials == 2) && (member != 0)) {
436 fs <<
"//__________________________________________________________________________" << std::endl;
439 fs <<
"{" << std::endl;
440 fs <<
tab1 << cl->
GetName() <<
" *obj = (" << cl->
GetName() <<
"*) ptr;" << std::endl;
442 fs <<
tab1 <<
"if (buf.IsReading()) { " << std::endl;
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;
469 fs <<
tab2 <<
"if (obj==0) obj = new " << cl->
GetName() <<
";" << std::endl;
544 std::cout <<
"fatal error with TStreamerBasicPointer" << std::endl;
552 fs <<
", \"" << el->
GetName() <<
"\", true)" << endch <<
";" << std::endl;
560 fs <<
", \"" << el->
GetName() <<
"\")" << endch <<
";" << std::endl;
631 fs <<
tab2 <<
"// STL type = " << elstl->
GetSTLtype() << std::endl;
635 fs <<
tab2 <<
"buf.SkipMember(\"" << el->
GetName() <<
"\"); // sinfo type " << el->
GetType() <<
" of class "
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;
663 fs <<
tab2 <<
"}" << std::endl;
693 fs <<
tab2 <<
"buf.WriteValue(";
698 fs <<
", \"" << el->
GetName() <<
"\");" << std::endl;
740 std::cout <<
"fatal error with TStreamerBasicPointer" << std::endl;
812 fs <<
tab2 <<
"// STL type = " << elstl->
GetSTLtype() << std::endl;
816 fs <<
tab2 <<
"buf.MakeEmptyMember(\"" << el->
GetName() <<
"\"); // sinfo type " << el->
GetType()
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;
856 fs << tname << (isargptr ?
" " :
" *") << argname <<
" = "
857 <<
"(" << argcl->
GetName() <<
"*)"
858 <<
"buf.ReadObjectPtr(0, " <<
GetStreamerName(argcl) <<
");" << std::endl;
871 fs <<
"string *" << argname <<
" = "
872 <<
"buf.ReadSTLstring();" << std::endl;
884 default: fs <<
"/* argument " << argname <<
" not supported */";
910 fs <<
"buf.WriteValue(" << accname <<
", 0);" << std::endl;
915 fs <<
"buf.WriteObjectPtr(";
919 fs <<
"&(" << accname <<
")";
925 fs <<
"buf.WriteSTLstring(";
929 fs <<
"&(" << accname <<
")";
930 fs <<
");" << std::endl;
934 default: fs <<
"/* argument not supported */" << std::endl;
943 if ((cl == 0) || (el == 0))
962 std::vector<std::string> splitName;
980 default:
return false;
983 for (
int n = 0;
n < narg;
n++) {
997 int pstar = buf.
Index(
"*");
1002 while ((pstar > 0) && (buf[pstar] ==
' '))
1006 isargptr[
n] =
false;
1008 if (buf.
Index(
"const ") == 0) {
1010 while ((buf.
Length() > 0) && (buf[0] ==
' '))
1017 else if (buf ==
"string")
1032 Bool_t akaarrayaccess = (narg == 1) && (argtype[0] < 20);
1034 char tabs[30], tabs2[30];
1046 accname =
"(*cont)->";
1062 fs <<
"*dynamic_cast<" << contcl->
GetName() <<
"*>(obj);" << std::endl;
1067 strlcpy(tabs,
tab4,
sizeof(tabs));
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;
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;
1133 accname =
"(*cont)->";
1151 fs <<
"*dynamic_cast<" << contcl->
GetName() <<
"*>(obj);" << std::endl;
1156 strlcpy(tabs,
tab4,
sizeof(tabs));
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;
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;
1192 fs <<
"(arr[k]);" << std::endl;
1193 fs << tabs <<
"delete[] arr;" << std::endl;
1194 }
else if (narg == 1) {
1196 fs <<
" {" << std::endl << tabs <<
tab1;
1197 ReadSTLarg(fs, arg1, argtype[0], isargptr[0], argcl[0], argtname[0], ifcond);
1200 fs <<
"if (" << ifcond <<
") ";
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);
1216 fs <<
"if (" << ifcond <<
") ";
1217 fs << accname <<
"insert(make_pair(" << arg1 <<
", " << arg2 <<
"));" << std::endl;
1218 fs << tabs <<
"}" << std::endl;
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;
const char * names_xmlfileclass
TClass instances represent classes, structs and namespaces in the ROOT type system.
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
Return name of the file containing the declaration of this 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.
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.