CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
FriendlyName.cc
Go to the documentation of this file.
1 /*
2  * friendlyName.cpp
3  * CMSSW
4  *
5  * Created by Chris Jones on 2/24/06.
6  *
7  */
8 #include <string>
9 #include <boost/regex.hpp>
10 #include <iostream>
11 #include <map>
12 #include "boost/thread/tss.hpp"
13 
14 //NOTE: This should probably be rewritten so that we break the class name into a tree where the template arguments are the node. On the way down the tree
15 // we look for '<' or ',' and on the way up (caused by finding a '>') we can apply the transformation to the output string based on the class name for the
16 // templated class. Up front we'd register a class name to a transformation function (which would probably take a std::vector<std::string> which holds
17 // the results of the node transformations)
18 
19 namespace edm {
20  namespace friendlyname {
21  static boost::regex const reBeginSpace("^ +");
22  static boost::regex const reEndSpace(" +$");
23  static boost::regex const reAllSpaces(" +");
24  static boost::regex const reColons("::");
25  static boost::regex const reComma(",");
26  static boost::regex const reTemplateArgs("[^<]*<(.*)>$");
27  static boost::regex const reTemplateClass("([^<>,]+<[^<>]*>)");
28  static std::string const emptyString("");
29 
30  std::string handleNamespaces(std::string const& iIn) {
31  return boost::regex_replace(iIn,reColons,emptyString,boost::format_perl);
32 
33  }
34 
35  std::string removeExtraSpaces(std::string const& iIn) {
36  return boost::regex_replace(boost::regex_replace(iIn,reBeginSpace,emptyString),
38  }
39 
40  std::string removeAllSpaces(std::string const& iIn) {
41  return boost::regex_replace(iIn, reAllSpaces,emptyString);
42  }
43  static boost::regex const reWrapper("edm::Wrapper<(.*)>");
44  static boost::regex const reString("std::basic_string<char>");
45  static boost::regex const reSorted("edm::SortedCollection<(.*), *edm::StrictWeakOrdering<\\1 *> >");
46  static boost::regex const reUnsigned("unsigned ");
47  static boost::regex const reLong("long ");
48  static boost::regex const reVector("std::vector");
49  static boost::regex const reAIKR(", *edm::helper::AssociationIdenticalKeyReference"); //this is a default so can replaced with empty
50  //force first argument to also be the argument to edm::ClonePolicy so that if OwnVector is within
51  // a template it will not eat all the remaining '>'s
52  static boost::regex const reOwnVector("edm::OwnVector<(.*), *edm::ClonePolicy<\\1 *> >");
53 
54  //NOTE: the '?' means make the smallest match. This may lead to problems where the template arguments themselves have commas
55  // but we are using it in the cases where edm::AssociationMap appears multiple times in template arguments
56  static boost::regex const reOneToOne("edm::AssociationMap< *edm::OneToOne<(.*?),(.*?), *u[a-z]*> >");
57  static boost::regex const reOneToMany("edm::AssociationMap< *edm::OneToMany<(.*?),(.*?), *u[a-z]*> >");
58  static boost::regex const reOneToValue("edm::AssociationMap< *edm::OneToValue<(.*?),(.*?), *u[a-z]*> >");
59  static boost::regex const reOneToManyWithQuality("edm::AssociationMap<edm::OneToManyWithQuality<(.*?), *(.*?), *(.*?), *u[a-z]*> >");
60  static boost::regex const reToVector("edm::AssociationVector<(.*), *(.*), *edm::Ref.*,.*>");
61  //NOTE: if the item within a clone policy is a template, this substitution will probably fail
62  static boost::regex const reToRangeMap("edm::RangeMap< *(.*), *(.*), *edm::ClonePolicy<([^>]*)> >");
63  //NOTE: If container is a template with one argument which is its 'type' then can simplify name
64  static boost::regex const reToRefs1("edm::RefVector< *(.*)< *(.*) *>, *\\2 *, *edm::refhelper::FindUsingAdvance< *\\1< *\\2 *> *, *\\2 *> *>");
65  static boost::regex const reToRefs2("edm::RefVector< *(.*) *, *(.*) *, *edm::refhelper::FindUsingAdvance< *\\1, *\\2 *> *>");
66  static boost::regex const reToRefsAssoc("edm::RefVector< *Association(.*) *, *edm::helper(.*), *Association(.*)::Find>");
67 
68  std::string standardRenames(std::string const& iIn) {
69  using boost::regex_replace;
70  using boost::regex;
71  std::string name = regex_replace(iIn, reWrapper, "$1");
72  name = regex_replace(name,reAIKR,"");
73  name = regex_replace(name,reString,"String");
74  name = regex_replace(name,reSorted,"sSorted<$1>");
75  name = regex_replace(name,reUnsigned,"u");
76  name = regex_replace(name,reLong,"l");
77  name = regex_replace(name,reVector,"s");
78  name = regex_replace(name,reOwnVector,"sOwned<$1>");
79  name = regex_replace(name,reToVector,"AssociationVector<$1,To,$2>");
80  name = regex_replace(name,reOneToOne,"Association<$1,ToOne,$2>");
81  name = regex_replace(name,reOneToMany,"Association<$1,ToMany,$2>");
82  name = regex_replace(name,reOneToValue,"Association<$1,ToValue,$2>");
83  name = regex_replace(name,reOneToManyWithQuality,"Association<$1,ToMany,$2,WithQuantity,$3>");
84  name = regex_replace(name,reToRangeMap,"RangeMap<$1,$2>");
85  name = regex_replace(name,reToRefs1,"Refs<$1<$2>>");
86  name = regex_replace(name,reToRefs2,"Refs<$1,$2>");
87  name = regex_replace(name,reToRefsAssoc,"Refs<Association$1>");
88  //std::cout <<"standardRenames '"<<name<<"'"<<std::endl;
89  return name;
90  }
91 
92  std::string handleTemplateArguments(std::string const&);
93  std::string subFriendlyName(std::string const& iFullName) {
94  using namespace boost;
95  std::string result = removeExtraSpaces(iFullName);
96 
97  smatch theMatch;
98  if(regex_match(result,theMatch,reTemplateArgs)) {
99  //std::cout <<"found match \""<<theMatch.str(1) <<"\"" <<std::endl;
100  //static regex const templateClosing(">$");
101  //std::string aMatch = regex_replace(theMatch.str(1),templateClosing,"");
102  std::string aMatch = theMatch.str(1);
103  std::string theSub = handleTemplateArguments(aMatch);
104  regex const eMatch(std::string("(^[^<]*)<")+aMatch+">");
105  result = regex_replace(result,eMatch,theSub+"$1");
106  }
107  return result;
108  }
109 
110  std::string handleTemplateArguments(std::string const& iIn) {
111  using namespace boost;
112  std::string result = removeExtraSpaces(iIn);
113  bool shouldStop = false;
114  while(!shouldStop) {
115  if(std::string::npos != result.find_first_of("<")) {
116  smatch theMatch;
117  if(regex_search(result,theMatch,reTemplateClass)) {
118  std::string templateClass = theMatch.str(1);
119  std::string friendlierName = removeAllSpaces(subFriendlyName(templateClass));
120 
121  //std::cout <<" t: "<<templateClass <<" f:"<<friendlierName<<std::endl;
122  result = regex_replace(result, regex(templateClass),friendlierName);
123  } else {
124  //static regex const eComma(",");
125  //result = regex_replace(result,eComma,"");
126  std::cout <<" no template match for \""<<result<<"\""<<std::endl;
127  assert(0 =="failed to find a match for template class");
128  }
129  } else {
130  shouldStop=true;
131  }
132  }
133  result = regex_replace(result,reComma,"");
134  return result;
135  }
136  std::string friendlyName(std::string const& iFullName) {
137  typedef std::map<std::string, std::string> Map;
138  static boost::thread_specific_ptr<Map> s_fillToFriendlyName;
139  if(0 == s_fillToFriendlyName.get()){
140  s_fillToFriendlyName.reset(new Map);
141  }
142  Map::const_iterator itFound = s_fillToFriendlyName->find(iFullName);
143  if(s_fillToFriendlyName->end()==itFound) {
144  itFound = s_fillToFriendlyName->insert(Map::value_type(iFullName, handleNamespaces(subFriendlyName(standardRenames(iFullName))))).first;
145  }
146  return itFound->second;
147  }
148  }
149 } // namespace edm
150 
static boost::regex const reOneToValue("edm::AssociationMap< *edm::OneToValue<(.*?),(.*?), *u[a-z]*> >")
static boost::regex const reTemplateArgs("[^<]*<(.*)>$")
static boost::regex const reOwnVector("edm::OwnVector<(.*), *edm::ClonePolicy<\\1 *> >")
static boost::regex const reLong("long ")
static boost::regex const reUnsigned("unsigned ")
static boost::regex const reToRangeMap("edm::RangeMap< *(.*), *(.*), *edm::ClonePolicy<([^>]*)> >")
static boost::regex const reSorted("edm::SortedCollection<(.*), *edm::StrictWeakOrdering<\\1 *> >")
static boost::regex const reToRefs2("edm::RefVector< *(.*) *, *(.*) *, *edm::refhelper::FindUsingAdvance< *\\1, *\\2 *> *>")
static boost::regex const reAllSpaces(" +")
std::string removeAllSpaces(std::string const &iIn)
Definition: FriendlyName.cc:40
std::string subFriendlyName(std::string const &iFullName)
Definition: FriendlyName.cc:93
static boost::regex const reTemplateClass("([^<>,]+<[^<>]*>)")
static boost::regex const reOneToMany("edm::AssociationMap< *edm::OneToMany<(.*?),(.*?), *u[a-z]*> >")
static boost::regex const reOneToOne("edm::AssociationMap< *edm::OneToOne<(.*?),(.*?), *u[a-z]*> >")
static boost::regex const reVector("std::vector")
static boost::regex const reToVector("edm::AssociationVector<(.*), *(.*), *edm::Ref.*,.*>")
static boost::regex const reOneToManyWithQuality("edm::AssociationMap<edm::OneToManyWithQuality<(.*?), *(.*?), *(.*?), *u[a-z]*> >")
std::string friendlyName(std::string const &iFullName)
tuple result
Definition: query.py:137
static boost::regex const reToRefs1("edm::RefVector< *(.*)< *(.*) *>, *\\2 *, *edm::refhelper::FindUsingAdvance< *\\1< *\\2 *> *, *\\2 *> *>")
std::string handleNamespaces(std::string const &iIn)
Definition: FriendlyName.cc:30
Container::value_type value_type
static boost::regex const reAIKR(", *edm::helper::AssociationIdenticalKeyReference")
static boost::regex const reBeginSpace("^ +")
std::string standardRenames(std::string const &iIn)
Definition: FriendlyName.cc:68
std::string handleTemplateArguments(std::string const &)
static boost::regex const reComma(",")
static boost::regex const reColons("::")
static std::string const emptyString("")
static boost::regex const reString("std::basic_string<char>")
static boost::regex const reEndSpace(" +$")
static boost::regex const reWrapper("edm::Wrapper<(.*)>")
tuple cout
Definition: gather_cfg.py:121
std::string removeExtraSpaces(std::string const &iIn)
Definition: FriendlyName.cc:35
static boost::regex const reToRefsAssoc("edm::RefVector< *Association(.*) *, *edm::helper(.*), *Association(.*)::Find>")