Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v28r2p1 (f1a77ff4)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
AttribStringParser.h
Go to the documentation of this file.
1 #ifndef _ATTRIB_STRING_PARSER_H_
2 #define _ATTRIB_STRING_PARSER_H_
3 
4 #include "GaudiKernel/Kernel.h"
5 #include "GaudiKernel/System.h"
6 #include <iterator>
7 #ifdef __clang__
8 #pragma clang diagnostic push
9 // Hide warning message:
10 // boost/regex/v4/instances.hpp:128:17: warning: keyword is hidden by macro definition
11 #pragma clang diagnostic ignored "-Wkeyword-macro"
12 #endif
13 #include <boost/regex.hpp>
14 #ifdef __clang__
15 #pragma clang diagnostic pop
16 #endif
17 
18 namespace Gaudi {
19  namespace Utils {
31  public:
33  struct Attrib {
36  };
37 
39  // This class is essentially a wrapper around boost::sregex_iterator.
40  class Iterator: public std::iterator<std::input_iterator_tag, Attrib> {
41  public:
42  Iterator() = default;
43  Iterator(const boost::sregex_iterator& it, bool expand_vars):
44  m_it(it),
45  m_expandVars(expand_vars)
46  {
47  //i_setAttrib();
48  }
49  Iterator(const Iterator& other): Iterator(other.m_it, other.m_expandVars)
50  {
51  }
52  Iterator(Iterator&& other):
53  m_it(std::move(other.m_it)),
55  {
56  }
58  ++m_it;
59  return *this;
60  }
62  auto old = *this;
63  ++m_it;
64  return old;
65  }
67  i_setAttrib();
68  return m_attrib;
69  }
70  bool operator==(const Iterator& other) {
71  return m_it == other.m_it;
72  }
73  bool operator!=(const Iterator& other) {
74  return m_it != other.m_it;
75  }
76  private:
78  boost::sregex_iterator m_it;
79  bool m_expandVars = false;
84  void i_setAttrib() {
85  static const boost::sregex_iterator endmark;
86  if (m_it != endmark) {
87  // if we have a match, we cache the values
88  m_attrib = Attrib{(*m_it)[1], (*m_it)[2]};
89  if (m_expandVars && m_attrib.value.find("${") != std::string::npos) {
90  static const boost::regex varexp{"\\$\\{([^}]+)\\}"};
91  auto i = 1;
92  while (i) {
93  i = 0;
94  m_attrib.value = boost::regex_replace(m_attrib.value,
95  varexp, [&i] (const boost::smatch& m) -> std::string {
96  const std::string name = m[1];
97  const char* cname = name.c_str();
98  if (System::isEnvSet(cname)) {
99  ++i;
100  return System::getEnv(cname);
101  }
102  return m[0]; // do not expand unknown vars
103  },
104  boost::match_default | boost::format_all);
105  }
106  }
107  } else {
108  // otherwise we clean the cache
109  m_attrib = Attrib();
110  }
111  }
112  };
113 
119  AttribStringParser(std::string data, bool expand_vars=true):
120  m_data(data),
121  m_expandVars(expand_vars) {
122  }
123 
124  private:
127 
128  boost::sregex_iterator parse() const {
129  static const boost::regex exp{"[[:space:]]*([^[:space:]]+)[[:space:]]*=[[:space:]]*'(.*?)'"};
130  return boost::sregex_iterator(begin(m_data), end(m_data), exp);
131  }
132  friend Iterator begin(const AttribStringParser&);
133  };
135  return AttribStringParser::Iterator(parser.parse(), parser.m_expandVars);
136  }
139  }
140  }
141 }
142 
143 #endif
Parse attribute strings allowing iteration over the various attributes.
AttribStringParser::Iterator end(const AttribStringParser &)
friend Iterator begin(const AttribStringParser &)
STL namespace.
Iterator to loop over the tag/value pairs in the attribute string.
STL class.
Iterator(const boost::sregex_iterator &it, bool expand_vars)
constexpr double m
Definition: SystemOfUnits.h:93
boost::sregex_iterator m_it
Wrapped boost::sregex_iterator instance.
Simple class to wrap tag/value pairs.
T find(T...args)
boost::spirit::classic::position_iterator2< ForwardIterator > Iterator
Definition: Iterator.h:18
Attrib m_attrib
Cached Attrib instance.
AttribStringParser(std::string data, bool expand_vars=true)
Initialize the parsing of an attribute string.
boost::sregex_iterator parse() const
Helper functions to set/get the application return code.
Definition: __init__.py:1
TO * reference(FROM *from)
Definition: KeyedObject.cpp:20
void i_setAttrib()
Helper method used to update the cached Attrib instance when dereferencing the iterator.