169 if ((cllist == 0) || (filename == 0))
172 std::ofstream fh(
TString(filename) +
".h");
173 std::ofstream fs(
TString(filename) +
".cxx");
175 fh <<
"// generated header file" << std::endl << std::endl;
176 fh <<
"#ifndef " << filename <<
"_h" << std::endl;
177 fh <<
"#define " << filename <<
"_h" << std::endl << std::endl;
181 fs <<
"// generated source file" << std::endl << std::endl;
182 fs <<
"#include \"" << filename <<
".h\"" << std::endl << std::endl;
189 while ((cl = (
TClass *)iter()) != 0) {
204 while ((cl = (
TClass *)iter()) != 0) {
207 <<
" &buf, void* ptr = 0, bool checktypes = true);" << std::endl
213 fh <<
"#endif" << std::endl << std::endl;
214 fs << std::endl << std::endl;
231 case kInt_t:
return "int";
242 return "unsigned char";
246 case kUInt_t:
return "unsigned int";
247 case kULong_t:
return "unsigned long";
279 return "unsigned char";
368 if ((specials == 1) && (member != 0)) {
378 if ((specials == 2) && (member != 0)) {
438 fs <<
"//__________________________________________________________________________" << std::endl;
441 fs <<
"{" << std::endl;
442 fs <<
tab1 << cl->
GetName() <<
" *obj = (" << cl->
GetName() <<
"*) ptr;" << std::endl;
444 fs <<
tab1 <<
"if (buf.IsReading()) { " << std::endl;
450 while ((
c1 = (
TClass *)iter()) != 0) {
453 if (
c1->GetListOfBases()->FindObject(cl->
GetName()) == 0)
456 fs <<
tab2 <<
"if (checktypes) {" << std::endl;
457 fs <<
tab3 <<
"void* ";
461 fs <<
"res = " <<
GetStreamerName(
c1) <<
"(buf, dynamic_cast<" <<
c1->GetName() <<
"*>(obj));" << std::endl;
462 fs <<
tab3 <<
"if (res) return dynamic_cast<" << cl->
GetName() <<
"*>((" <<
c1->GetName() <<
" *) res);"
466 fs <<
tab2 <<
"}" << std::endl;
471 fs <<
tab2 <<
"if (obj==0) obj = new " << cl->
GetName() <<
";" << std::endl;
546 std::cout <<
"fatal error with TStreamerBasicPointer" << std::endl;
554 fs <<
", \"" << el->
GetName() <<
"\", true)" << endch <<
";" << std::endl;
562 fs <<
", \"" << el->
GetName() <<
"\")" << endch <<
";" << std::endl;
633 fs <<
tab2 <<
"// STL type = " << elstl->
GetSTLtype() << std::endl;
637 fs <<
tab2 <<
"buf.SkipMember(\"" << el->
GetName() <<
"\"); // sinfo type " << el->
GetType() <<
" of class "
641 fs <<
tab2 <<
"buf.EndClassNode();" << std::endl;
643 fs <<
tab1 <<
"} else {" << std::endl;
647 fs <<
tab2 <<
"if (obj==0) return 0;" << std::endl;
651 while ((
c1 = (
TClass *)iter()) != 0) {
654 if (
c1->GetListOfBases()->FindObject(cl->
GetName()) == 0)
658 fs <<
tab2 <<
"if (checktypes) {" << std::endl;
660 fs <<
tab3 <<
"if (dynamic_cast<" <<
c1->GetName() <<
"*>(obj))" << std::endl;
665 fs <<
tab2 <<
"}" << std::endl;
695 fs <<
tab2 <<
"buf.WriteValue(";
700 fs <<
", \"" << el->
GetName() <<
"\");" << std::endl;
742 std::cout <<
"fatal error with TStreamerBasicPointer" << std::endl;
814 fs <<
tab2 <<
"// STL type = " << elstl->
GetSTLtype() << std::endl;
818 fs <<
tab2 <<
"buf.MakeEmptyMember(\"" << el->
GetName() <<
"\"); // sinfo type " << el->
GetType()
822 fs <<
tab2 <<
"buf.EndClassNode();" << std::endl;
824 fs <<
tab1 <<
"}" << std::endl;
825 fs <<
tab1 <<
"return obj;" << std::endl;
826 fs <<
"}" << std::endl << std::endl;
858 fs << tname << (isargptr ?
" " :
" *") << argname <<
" = "
859 <<
"(" << argcl->
GetName() <<
"*)"
860 <<
"buf.ReadObjectPtr(0, " <<
GetStreamerName(argcl) <<
");" << std::endl;
873 fs <<
"string *" << argname <<
" = "
874 <<
"buf.ReadSTLstring();" << std::endl;
886 default: fs <<
"/* argument " << argname <<
" not supported */";
912 fs <<
"buf.WriteValue(" << accname <<
", 0);" << std::endl;
917 fs <<
"buf.WriteObjectPtr(";
921 fs <<
"&(" << accname <<
")";
927 fs <<
"buf.WriteSTLstring(";
931 fs <<
"&(" << accname <<
")";
932 fs <<
");" << std::endl;
936 default: fs <<
"/* argument not supported */" << std::endl;
945 if ((cl == 0) || (el == 0))
964 std::vector<std::string> splitName;
982 default:
return false;
985 for (
int n = 0;
n < narg;
n++) {
999 int pstar = buf.
Index(
"*");
1004 while ((pstar > 0) && (buf[pstar] ==
' '))
1008 isargptr[
n] =
false;
1010 if (buf.
Index(
"const ") == 0) {
1012 while ((buf.
Length() > 0) && (buf[0] ==
' '))
1019 else if (buf ==
"string")
1034 Bool_t akaarrayaccess = (narg == 1) && (argtype[0] < 20);
1036 char tabs[30], tabs2[30];
1048 accname =
"(*cont)->";
1064 fs <<
"*dynamic_cast<" << contcl->
GetName() <<
"*>(obj);" << std::endl;
1069 strlcpy(tabs,
tab4,
sizeof(tabs));
1072 strlcpy(tabs,
tab3,
sizeof(tabs));
1074 strlcpy(tabs2, tabs,
sizeof(tabs2));
1077 strlcat(tabs2,
tab1,
sizeof(tabs2));
1078 fs << tabs <<
"if (" << (isarr ?
"*cont" :
"cont") <<
"==0) {" << std::endl;
1079 fs << tabs2 <<
"buf.WriteSTLsize(0" << (isstr ?
",true);" :
");") << std::endl;
1080 fs << tabs <<
"} else {" << std::endl;
1083 fs << tabs2 <<
"buf.WriteSTLsize(" << accname << (isstr ?
"length(), true);" :
"size());") << std::endl;
1086 fs << tabs2 <<
"buf.WriteSTLstringData(" << accname <<
"c_str());" << std::endl;
1088 if (akaarrayaccess) {
1089 fs << tabs2 << argtname[0] <<
"* arr = new " << argtname[0] <<
"[" << accname <<
"size()];" << std::endl;
1090 fs << tabs2 <<
"int k = 0;" << std::endl;
1093 fs << tabs2 << contcl->
GetName() <<
"::const_iterator iter;" << std::endl;
1094 fs << tabs2 <<
"for (iter = " << accname <<
"begin(); iter != " << accname <<
"end(); iter++)";
1095 if (akaarrayaccess) {
1096 fs << std::endl << tabs2 <<
tab1 <<
"arr[k++] = *iter;" << std::endl;
1097 fs << tabs2 <<
"buf.WriteArray(arr, " << accname <<
"size(), 0, false);" << std::endl;
1098 fs << tabs2 <<
"delete[] arr;" << std::endl;
1099 }
else if (narg == 1) {
1100 fs << std::endl << tabs2 <<
tab1;
1101 WriteSTLarg(fs,
"*iter", argtype[0], isargptr[0], argcl[0]);
1102 }
else if (narg == 2) {
1103 fs <<
" {" << std::endl;
1104 fs << tabs2 <<
tab1;
1105 WriteSTLarg(fs,
"iter->first", argtype[0], isargptr[0], argcl[0]);
1106 fs << tabs2 <<
tab1;
1107 WriteSTLarg(fs,
"iter->second", argtype[1], isargptr[1], argcl[1]);
1108 fs << tabs2 <<
"}" << std::endl;
1113 fs << tabs <<
"}" << std::endl;
1117 fs << tabs <<
"cont++;" << std::endl;
1119 fs << tabs <<
"(void*) cont = (char*) cont + sizeof(" << contcl->
GetName() <<
");" << std::endl;
1120 fs <<
tab3 <<
"}" << std::endl;
1123 fs <<
tab3 <<
"buf.EndSTLnode();" << std::endl;
1124 fs <<
tab2 <<
"}" << std::endl;
1135 accname =
"(*cont)->";
1153 fs <<
"*dynamic_cast<" << contcl->
GetName() <<
"*>(obj);" << std::endl;
1158 strlcpy(tabs,
tab4,
sizeof(tabs));
1161 strlcpy(tabs,
tab3,
sizeof(tabs));
1163 fs << tabs <<
"int size = buf.ReadSTLsize(" << (isstr ?
"true);" :
");") << std::endl;
1166 fs << tabs <<
"delete " << accptr <<
";" << std::endl;
1167 fs << tabs <<
"if (size==0) " << accptr <<
" = 0;" << std::endl;
1168 fs << tabs <<
" else " << accptr <<
" = new " << contcl->
GetName() <<
";" << std::endl;
1172 fs <<
"cont" << endch <<
";" << std::endl;
1175 fs << tabs << accname << (isstr ?
"erase();" :
"clear();") << std::endl;
1179 fs << tabs <<
"if (size>0) " << accname <<
"assign(buf.ReadSTLstringData(size));" << std::endl;
1181 if (akaarrayaccess) {
1182 fs << tabs << argtname[0] <<
"* arr = new " << argtname[0] <<
"[size];" << std::endl;
1183 fs << tabs <<
"buf.ReadArray(arr, size, 0, false);" << std::endl;
1186 fs << tabs <<
"for(int k=0;k<size;k++)";
1188 if (akaarrayaccess) {
1189 fs << std::endl << tabs <<
tab1 << accname;
1194 fs <<
"(arr[k]);" << std::endl;
1195 fs << tabs <<
"delete[] arr;" << std::endl;
1196 }
else if (narg == 1) {
1198 fs <<
" {" << std::endl << tabs <<
tab1;
1199 ReadSTLarg(fs, arg1, argtype[0], isargptr[0], argcl[0], argtname[0], ifcond);
1202 fs <<
"if (" << ifcond <<
") ";
1208 fs <<
"(" << arg1 <<
");" << std::endl;
1209 fs << tabs <<
"}" << std::endl;
1210 }
else if (narg == 2) {
1211 TString arg1(
"arg1"), arg2(
"arg2"), ifcond;
1212 fs <<
" {" << std::endl << tabs <<
tab1;
1213 ReadSTLarg(fs, arg1, argtype[0], isargptr[0], argcl[0], argtname[0], ifcond);
1215 ReadSTLarg(fs, arg2, argtype[1], isargptr[1], argcl[1], argtname[1], ifcond);
1218 fs <<
"if (" << ifcond <<
") ";
1219 fs << accname <<
"insert(make_pair(" << arg1 <<
", " << arg2 <<
"));" << std::endl;
1220 fs << tabs <<
"}" << std::endl;
1226 fs << tabs <<
"cont++;" << std::endl;
1228 fs << tabs <<
"(void*) cont = (char*) cont + sizeof(" << contcl->
GetName() <<
");" << std::endl;
1229 fs <<
tab3 <<
"}" << std::endl;
1232 fs <<
tab3 <<
"buf.EndSTLnode();" << std::endl;
1233 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".
ROOT::ESTLType GetCollectionType() const
Return the 'type' of the STL the TClass is representing.
TVirtualStreamerInfo * GetStreamerInfo(Int_t version=0, Bool_t isTransient=kFALSE) const
returns a pointer to the TVirtualStreamerInfo object for version If the object does not exist,...
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.: "class TDirectory*" -> "TDirectory".
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.
virtual TObject * FindObject(const char *name) const
Must be redefined in derived classes.
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.