32 TTreeGeneratorBase::TTreeGeneratorBase(TTree *tree,
const char *option) : fTree(tree), fOptionStr(option) { }
38 void TTreeGeneratorBase::AddHeader(TClass *cl)
43 TObject *obj = fListOfHeaders.FindObject(cl->GetName());
49 if (cl->GetCollectionProxy() && cl->GetCollectionProxy()->GetValueClass()) {
50 AddHeader( cl->GetCollectionProxy()->GetValueClass() );
55 if (0 == strcmp(cl->GetName(),
"string")) {
56 directive =
"#include <string>\n";
57 }
else if (cl->GetCollectionProxy() && (stlType = cl->GetCollectionType())) {
58 const char *what =
"";
60 case ROOT::kSTLvector: what =
"vector";
break;
61 case ROOT::kSTLlist: what =
"list";
break;
62 case ROOT::kSTLforwardlist: what =
"forward_list";
break;
63 case -ROOT::kSTLdeque:
64 case ROOT::kSTLdeque: what =
"deque";
break;
66 case ROOT::kSTLmap: what =
"map";
break;
67 case -ROOT::kSTLmultimap:
68 case ROOT::kSTLmultimap: what =
"map";
break;
70 case ROOT::kSTLset: what =
"set";
break;
71 case -ROOT::kSTLmultiset:
72 case ROOT::kSTLmultiset: what =
"set";
break;
73 case -ROOT::kSTLunorderedset:
74 case ROOT::kSTLunorderedset: what =
"unordered_set";
break;
75 case -ROOT::kSTLunorderedmultiset:
76 case ROOT::kSTLunorderedmultiset: what =
"unordered_multiset";
break;
77 case -ROOT::kSTLunorderedmap:
78 case ROOT::kSTLunorderedmap: what =
"unordered_map";
break;
79 case -ROOT::kSTLunorderedmultimap:
80 case ROOT::kSTLunorderedmultimap: what =
"unordered_multimap";
break;
83 directive =
"#include <";
84 directive.Append(what);
85 directive.Append(
">\n");
87 }
else if (cl->GetDeclFileName() && strlen(cl->GetDeclFileName()) ) {
88 const char *filename = cl->GetDeclFileName();
90 if (!filename)
return;
93 TString inclPath(
"include;prec_stl");
95 TString inclPath(
"include:prec_stl");
99 TString sIncl(filename);
101 const char* pdelim =
";";
102 static const char ddelim =
'\\';
104 const char* pdelim =
":";
105 static const char ddelim =
'/';
107 while (inclPath.Tokenize(inclDir, posDelim, pdelim))
109 if (sIncl.BeginsWith(inclDir)) {
110 filename += inclDir.Length();
111 if (filename[0] == ddelim || filename[0] ==
'/') {
117 directive = Form(
"#include \"%s\"\n",filename);
118 }
else if (!strncmp(cl->GetName(),
"pair<", 5)
119 || !strncmp(cl->GetName(),
"std::pair<", 10)) {
120 TClassEdit::TSplitType split(cl->GetName());
121 if (split.fElements.size() == 3) {
122 for (
int arg = 1; arg < 3; ++arg) {
123 TClass* clArg = TClass::GetClass(split.fElements[arg].c_str());
124 if (clArg) AddHeader(clArg);
129 if (directive.Length()) {
130 TIter i( &fListOfHeaders );
131 for(TNamed *n = (TNamed *)i(); n; n = (TNamed*)i()) {
132 if (directive == n->GetTitle()) {
136 fListOfHeaders.Add(
new TNamed(cl->GetName(), directive.Data()));
144 void TTreeGeneratorBase::AddHeader(
const char *classname)
146 AddHeader(TClass::GetClass(classname));
152 TString TTreeGeneratorBase::GetContainedClassName(TBranchElement *branch, TStreamerElement *element, Bool_t ispointer)
154 TString cname = branch->GetClonesName();
155 if (cname.Length()==0) {
157 Long64_t i = branch->GetTree()->GetReadEntry();
160 char *obj = branch->GetObject();
162 TBranchElement *parent = (TBranchElement*)branch->GetMother()->GetSubBranch(branch);
163 const char *pclname = parent->GetClassName();
165 TClass *clparent = TClass::GetClass(pclname);
169 const char *ename = 0;
171 ename = element->GetName();
172 lOffset = clparent->GetStreamerInfo()->GetOffset(ename);
177 else Error(
"AnalyzeBranch",
"Missing parent for %s.", branch->GetName());
181 arr = (TClonesArray*)*(
void**)(obj+lOffset);
183 arr = (TClonesArray*)(obj+lOffset);
185 cname = arr->GetClass()->GetName();
187 if (cname.Length()==0) {
188 Error(
"AnalyzeBranch",
189 "Introspection of TClonesArray in older file not implemented yet.");
197 TVirtualStreamerInfo *TTreeGeneratorBase::GetBaseClass(TStreamerElement *element)
199 TStreamerBase *base =
dynamic_cast<TStreamerBase*
>(element);
201 TVirtualStreamerInfo *info = base->GetBaseStreamerInfo();
202 if (info)
return info;
212 TVirtualStreamerInfo *TTreeGeneratorBase::GetStreamerInfo(TBranch *branch, TIter current, TClass *cl)
214 TVirtualStreamerInfo *objInfo = 0;
215 TBranchElement *b = 0;
216 TString cname = cl->GetName();
218 while( ( b = (TBranchElement*)current() ) ) {
219 if ( cname == b->GetInfo()->GetName() ) {
220 objInfo = b->GetInfo();
224 if (objInfo == 0 && branch->GetTree()->GetDirectory()->GetFile()) {
225 const TList *infolist = branch->GetTree()->GetDirectory()->GetFile()->GetStreamerInfoCache();
227 TVirtualStreamerInfo *i = (TVirtualStreamerInfo *)infolist->FindObject(cname);
230 objInfo = (TVirtualStreamerInfo *)cl->GetStreamerInfo(i->GetClassVersion());
236 objInfo = cl->GetStreamerInfo();