The Gaudi Framework  v29r0 (ff2e7097)
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 {
20  namespace Utils
21  {
33  {
34  public:
36  struct Attrib {
39  };
40 
42  // This class is essentially a wrapper around boost::sregex_iterator.
43  class Iterator : public std::iterator<std::input_iterator_tag, Attrib>
44  {
45  public:
46  Iterator() = default;
47  Iterator( const boost::sregex_iterator& it, bool expand_vars ) : m_it( it ), m_expandVars( expand_vars )
48  {
49  // i_setAttrib();
50  }
51  Iterator( const Iterator& other ) : Iterator( other.m_it, other.m_expandVars ) {}
52  Iterator( Iterator&& other ) : m_it( std::move( other.m_it ) ), m_expandVars( other.m_expandVars ) {}
54  {
55  ++m_it;
56  return *this;
57  }
59  {
60  auto old = *this;
61  ++m_it;
62  return old;
63  }
65  {
66  i_setAttrib();
67  return m_attrib;
68  }
69  bool operator==( const Iterator& other ) { return m_it == other.m_it; }
70  bool operator!=( const Iterator& other ) { return m_it != other.m_it; }
71 
72  private:
74  boost::sregex_iterator m_it;
75  bool m_expandVars = false;
80  void i_setAttrib()
81  {
82  static const boost::sregex_iterator endmark;
83  if ( m_it != endmark ) {
84  // if we have a match, we cache the values
85  m_attrib = Attrib{( *m_it )[1], ( *m_it )[2]};
86  if ( m_expandVars && m_attrib.value.find( "${" ) != std::string::npos ) {
87  static const boost::regex varexp{"\\$\\{([^}]+)\\}"};
88  auto i = 1;
89  while ( i ) {
90  i = 0;
91  m_attrib.value = boost::regex_replace( m_attrib.value, varexp,
92  [&i]( const boost::smatch& m ) -> std::string {
93  const std::string name = m[1];
94  const char* cname = name.c_str();
95  if ( System::isEnvSet( cname ) ) {
96  ++i;
97  return System::getEnv( cname );
98  }
99  return m[0]; // do not expand unknown vars
100  },
101  boost::match_default | boost::format_all );
102  }
103  }
104  } else {
105  // otherwise we clean the cache
106  m_attrib = Attrib();
107  }
108  }
109  };
110 
116  AttribStringParser( std::string data, bool expand_vars = true ) : m_data( data ), m_expandVars( expand_vars ) {}
117 
118  private:
121 
122  boost::sregex_iterator parse() const
123  {
124  static const boost::regex exp{"[[:space:]]*([^[:space:]]+)[[:space:]]*=[[:space:]]*'(.*?)'"};
125  return boost::sregex_iterator( begin( m_data ), end( m_data ), exp );
126  }
127  friend Iterator begin( const AttribStringParser& );
128  };
130  {
131  return AttribStringParser::Iterator( parser.parse(), parser.m_expandVars );
132  }
134  {
136  }
137  }
138 }
139 
140 #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:94
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:21
void i_setAttrib()
Helper method used to update the cached Attrib instance when dereferencing the iterator.