Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v31r0 (aeb156f0)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Grammars.h
Go to the documentation of this file.
1 #pragma once
2 
3 #ifdef __GNUC__
4 # pragma GCC system_header
5 #endif
6 // ============================================================================
7 // Include files
8 // ============================================================================
9 // STD:
10 //==============================================================================
11 #include <list>
12 #include <map>
13 #include <set>
14 #include <string>
15 #include <tuple>
16 #include <unordered_map>
17 #include <unordered_set>
18 #include <vector>
19 //==============================================================================
20 // Boost:
21 //==============================================================================
22 #include <boost/fusion/include/std_pair.hpp>
23 #include <boost/fusion/include/unused.hpp>
24 #include <boost/spirit/include/qi.hpp>
25 
26 #include <boost/spirit/include/phoenix_core.hpp>
27 #include <boost/spirit/include/phoenix_operator.hpp>
28 
29 #include <boost/type_traits.hpp>
30 #include <boost/utility/enable_if.hpp>
31 
32 #include <boost/spirit/repository/include/qi_confix.hpp>
33 //==============================================================================
34 // Gaudi:
35 //==============================================================================
36 #include "GaudiKernel/HashMap.h"
37 #include "GaudiKernel/HistoDef.h"
40 #include "GaudiKernel/StringKey.h"
41 #include "GaudiKernel/VectorMap.h"
42 //==============================================================================
43 namespace Gaudi {
44  namespace Parsers {
45  //==============================================================================
46  // Namespace aliases:
47  //==============================================================================
48  namespace sp = boost::spirit;
49  namespace ph = boost::phoenix;
50  namespace qi = sp::qi;
51  namespace enc = sp::ascii;
52  namespace rep = sp::repository;
53  //==============================================================================
54  // Grammars
55  //==============================================================================
56  typedef std::string::const_iterator DefaultIterator;
57  typedef enc::space_type DefaultSkipper;
58  //==============================================================================
59  template <typename Iterator, typename T, typename Skipper, class Enable = void>
60  struct Grammar_ {
61  /* READ THIS IF YOUR COMPILE BREAKS ON THE FOLLOWING LINE
62  *
63  * To users: You have to ask developers to implement parser for your type T
64  * To developer: You have to implement and register Grammar for type T
65  *
66  */
67  BOOST_MPL_ASSERT_MSG( false, GRAMMAR_FOR_TYPE_DOES_NOT_EXISTS, ( T ) );
68  };
69 
70 #define REGISTER_GRAMMAR( ResultType, GrammarName ) \
71  template <typename Iterator, typename Skipper> \
72  struct Grammar_<Iterator, ResultType, Skipper> { \
73  typedef GrammarName<Iterator, Skipper> Grammar; \
74  }
75  //==============================================================================
76  template <typename Iterator>
77  struct SkipperGrammar : qi::grammar<Iterator> {
78  SkipperGrammar() : SkipperGrammar::base_type( comments ) {
79  comments = enc::space | rep::confix( "/*", "*/" )[*( qi::char_ - "*/" )] |
80  rep::confix( "//", ( sp::eol | sp::eoi ) )[*( qi::char_ - ( sp::eol | sp::eoi ) )];
81  }
82  qi::rule<Iterator> comments;
83  };
84  //==============================================================================
85  template <typename Iterator, typename Skipper>
86  struct StringGrammar : qi::grammar<Iterator, std::string(), qi::locals<char>, Skipper> {
87  //------------------------------------------------------------------------------
89  //------------------------------------------------------------------------------
90  StringGrammar() : StringGrammar::base_type( str ) {
91  begin_quote = enc::char_( "\"'" );
92  quote = enc::char_( qi::_r1 );
93 
94  str = qi::lexeme[begin_quote[qi::_a = qi::_1] >
95  *( ( enc::char_( '\\' ) >> quote( qi::_a ) )[qi::_val += qi::_a] |
96  ( enc::char_[qi::_val += qi::_1] - quote( qi::_a ) ) ) > quote( qi::_a )];
97  }
98  //------------------------------------------------------------------------------
99  qi::rule<Iterator, std::string(), qi::locals<char>, Skipper> str;
100  qi::rule<Iterator, char()> begin_quote;
101  qi::rule<Iterator, void( char )> quote;
102  //------------------------------------------------------------------------------
103  };
106  //==============================================================================
107  template <typename Iterator, typename Skipper>
108  struct CharGrammar : qi::grammar<Iterator, char(), Skipper> {
109  typedef char ResultT;
110  CharGrammar() : CharGrammar::base_type( ch ) {
111  ch = qi::int_parser<char>() | '\'' >> ( qi::char_ - '\'' ) >> '\'';
112  }
113  qi::rule<Iterator, char(), Skipper> ch;
114  };
115  REGISTER_GRAMMAR( char, CharGrammar );
116  //==============================================================================
117  template <typename Iterator, typename Skipper>
118  struct BoolGrammar : qi::grammar<Iterator, bool(), Skipper> {
119  typedef bool ResultT;
120  BoolGrammar() : BoolGrammar::base_type( boolean_literal ) {
121  boolean_literal = ( qi::lit( "true" ) | "True" | "TRUE" | "1" )[qi::_val = true] |
122  ( qi::lit( "false" ) | "False" | "FALSE" | "0" )[qi::_val = false];
123  }
124  qi::rule<Iterator, bool(), Skipper> boolean_literal;
125  };
126  REGISTER_GRAMMAR( bool, BoolGrammar );
127  //==============================================================================
128  template <typename Iterator, typename RT, typename Skipper>
129  struct IntGrammar : qi::grammar<Iterator, RT(), Skipper> {
130  typedef RT ResultT;
131  IntGrammar() : IntGrammar::base_type( integer ) {
132  integer = qi::int_parser<RT>()[qi::_val = qi::_1] >> -qi::no_case[qi::char_( 'L' )];
133  }
134  qi::rule<Iterator, RT(), Skipper> integer;
135  };
136  // ----------------------------------------------------------------------------
137  // Register IntGrammar:
138  // ----------------------------------------------------------------------------
139  template <typename Iterator, typename T, typename Skipper>
140  struct Grammar_<Iterator, T, Skipper, typename boost::enable_if<boost::is_integral<T>>::type> {
142  };
143  //==============================================================================
144  template <typename Iterator, typename RT, typename Skipper>
145  struct RealGrammar : qi::grammar<Iterator, RT(), Skipper> {
146  typedef RT ResultT;
147  RealGrammar() : RealGrammar::base_type( real ) { real = qi::real_parser<RT>(); }
148  qi::rule<Iterator, RT(), Skipper> real;
149  };
150  // ----------------------------------------------------------------------------
151  // Register RealGrammar:
152  // ----------------------------------------------------------------------------
153  template <typename Iterator, typename T, typename Skipper>
154  struct Grammar_<Iterator, T, Skipper, typename boost::enable_if<boost::is_floating_point<T>>::type> {
156  };
157  //==============================================================================
158  // Grammar for std::tuples
159  //==============================================================================
160  template <typename T>
162 
163  template <typename T>
165 
166  template <typename T, typename... Ts>
167  struct tuple_remove_first_type<std::tuple<T, Ts...>> {
168  typedef std::tuple<Ts...> type;
169  };
170 
171  template <typename T, typename... Ts>
172  struct tuple_get_first_type<std::tuple<T, Ts...>> {
173  typedef T type;
174  };
175 
176  // ----------------------------------------------------------------------------
177 
178  template <typename Iterator, typename TupleT, std::size_t N, typename Skipper>
180  : qi::grammar<Iterator, TupleT(), qi::locals<typename tuple_get_first_type<TupleT>::type>, Skipper> {
181  //---------------------------------------------------------------------------
182  typedef TupleT ResultT;
185  //---------------------------------------------------------------------------
186  struct Operations {
187  //----------------------------------------------------------------------
188 
189  void operator()( ResultT& res, HeadT& head, TailT& tail ) const {
190  res = std::tuple_cat( std::tuple<HeadT>( head ), tail );
191  }
192  //----------------------------------------------------------------------
193  };
194  //---------------------------------------------------------------------------
195  TupleInnerGrammar() : TupleInnerGrammar::base_type( tup ) {
196  tup = grHead[qi::_a = qi::_1] >> ',' >> grLast[op( qi::_val, qi::_a, qi::_1 )];
197  }
198 
201 
202  qi::rule<Iterator, ResultT(), qi::locals<HeadT>, Skipper> tup;
203  ph::function<Operations> op;
204  };
205 
206  template <typename Iterator, typename TupleT, typename Skipper>
207  struct TupleInnerGrammar<Iterator, TupleT, 1, Skipper> : qi::grammar<Iterator, TupleT(), Skipper> {
208  //---------------------------------------------------------------------------
209  typedef TupleT ResultT;
210  // typedef typename ResultT::value_type Tuple1T;
211  //---------------------------------------------------------------------------
212  struct Operations {
213  //---------------------------------------------------------------------
214  void operator()( ResultT& res, const typename std::tuple_element<0, ResultT>::type& val ) const {
215  res = ResultT();
216  std::get<0>( res ) = val;
217  }
218  //----------------------------------------------------------------------
219  };
220  //---------------------------------------------------------------------------
221  TupleInnerGrammar() : TupleInnerGrammar::base_type( tup ) { tup = grFirst[op( qi::_val, qi::_1 )]; }
222 
224 
225  qi::rule<Iterator, ResultT(), Skipper> tup;
226  ph::function<Operations> op;
227  };
228 
229  // ----------------------------------------------------------------------------
230  template <typename Iterator, typename TupleT, std::size_t N, typename Skipper>
231  struct TupleGrammar : qi::grammar<Iterator, TupleT(), qi::locals<char>, Skipper> {
232  typedef TupleT ResultT;
233  TupleGrammar() : TupleGrammar::base_type( tup ) {
234  begin = enc::char_( '[' )[qi::_val = ']'] | enc::char_( '(' )[qi::_val = ')'];
235  end = enc::char_( qi::_r1 );
236 
237  tup = begin[qi::_a = qi::_1] >> grTuple[qi::_val = qi::_1] >> end( qi::_a );
238  }
239 
240  qi::rule<Iterator, char()> begin;
241  qi::rule<Iterator, void( char )> end;
242  qi::rule<Iterator, ResultT(), qi::locals<char>, Skipper> tup;
244  };
245 
246  // -----------------------------------------------------------------------------
247  // Register TupleGrammar for std::tuple:
248  // ----------------------------------------------------------------------------
249  template <typename Iterator, typename Skipper, typename... Args>
250  struct Grammar_<Iterator, std::tuple<Args...>, Skipper> {
251  typedef TupleGrammar<Iterator, std::tuple<Args...>, sizeof...( Args ), Skipper> Grammar;
252  };
253  //==============================================================================
254  template <typename Iterator, typename VectorT, typename Skipper>
255  struct VectorGrammar : qi::grammar<Iterator, VectorT(), qi::locals<char>, Skipper> {
256  //------------------------------------------------------------------------------
257  typedef VectorT ResultT;
258  //------------------------------------------------------------------------------
259  VectorGrammar() : VectorGrammar::base_type( vec ) {
260  begin =
261  enc::char_( '[' )[qi::_val = ']'] | enc::char_( '{' )[qi::_val = '}'] | enc::char_( '(' )[qi::_val = ')'];
262  end = enc::char_( qi::_r1 );
263  list = elementGrammar % ',';
264  vec = begin[qi::_a = qi::_1] >> -list[qi::_val = qi::_1] >> end( qi::_a );
265  }
266  // ----------------------------------------------------------------------------
268  qi::rule<Iterator, char()> begin;
269  qi::rule<Iterator, void( char )> end;
270 
271  qi::rule<Iterator, ResultT(), qi::locals<char>, Skipper> vec;
272  qi::rule<Iterator, ResultT(), Skipper> list;
273  // ----------------------------------------------------------------------------
274  };
275  // ----------------------------------------------------------------------------
276  // Register VectorGrammar for std::vector:
277  // ----------------------------------------------------------------------------
278  template <typename Iterator, typename InnerT, typename AllocatorT, typename Skipper>
279  struct Grammar_<Iterator, std::vector<InnerT, AllocatorT>, Skipper> {
281  };
282  // ----------------------------------------------------------------------------
283  // Register VectorGrammar for std::list:
284  // ----------------------------------------------------------------------------
285  template <typename Iterator, typename InnerT, typename AllocatorT, typename Skipper>
286  struct Grammar_<Iterator, std::list<InnerT, AllocatorT>, Skipper> {
288  };
289  // ----------------------------------------------------------------------------
290  // Register VectorGrammar for std::set:
291  // ----------------------------------------------------------------------------
292  template <typename Iterator, typename InnerT, typename CompareT, typename AllocatorT, typename Skipper>
293  struct Grammar_<Iterator, std::set<InnerT, CompareT, AllocatorT>, Skipper> {
295  };
296  // ----------------------------------------------------------------------------
297  // Register VectorGrammar for std::unordered_set:
298  // ----------------------------------------------------------------------------
299  template <typename Iterator, typename InnerT, typename HashT, typename CompareT, typename AllocatorT,
300  typename Skipper>
301  struct Grammar_<Iterator, std::unordered_set<InnerT, HashT, CompareT, AllocatorT>, Skipper> {
303  };
304 
305  //==============================================================================
306  template <typename Iterator, typename PairT, typename Skipper>
307  struct PairGrammar : qi::grammar<Iterator, PairT(), qi::locals<char>, Skipper> {
308  //------------------------------------------------------------------------------
309  typedef PairT ResultT;
310  typedef typename PairT::first_type first_type;
311  typedef typename PairT::second_type second_type;
312  //------------------------------------------------------------------------------
313  struct first {};
314  struct second {};
315  //------------------------------------------------------------------------------
316  PairGrammar() : PairGrammar( "," ) {}
317  PairGrammar( const std::string& delimeter ) : PairGrammar::base_type( pair ) {
318  begin = enc::char_( '(' )[qi::_val = ')'] | enc::char_( '[' )[qi::_val = ']'];
319  end = qi::char_( qi::_r1 );
320  pair = begin[qi::_a = qi::_1] >> pair_in[qi::_val = qi::_1] >> end( qi::_a );
321  pair_in = key >> qi::lit( delimeter ) >> value;
322  }
323  // ----------------------------------------------------------------------------
326  qi::rule<Iterator, char()> begin;
327  qi::rule<Iterator, void( char )> end;
328  qi::rule<Iterator, ResultT(), qi::locals<char>, Skipper> pair;
329  qi::rule<Iterator, ResultT(), Skipper> pair_in;
330  // ph::function<Operations> op;
331  // ----------------------------------------------------------------------------
332  }; // END PairGrammar
333  // ----------------------------------------------------------------------------
334  // Register PairGrammar:
335  // ----------------------------------------------------------------------------
336  template <typename Iterator, typename KeyT, typename ValueT, typename Skipper>
337  struct Grammar_<Iterator, std::pair<KeyT, ValueT>, Skipper> {
339  };
340  // ============================================================================
341  template <typename Iterator, typename MapT, typename Skipper>
342  struct MapGrammar : qi::grammar<Iterator, MapT(), Skipper> {
343  //------------------------------------------------------------------------------
344  typedef MapT ResultT;
345  typedef typename MapT::key_type KeyT;
346  typedef typename MapT::mapped_type MappedT;
348 
350  //------------------------------------------------------------------------------
351  struct tag_key {};
352  struct tag_mapped {};
353  struct Operations {
354  //----------------------------------------------------------------------
355  void operator()( ResultT& res, const VectorPairT& vec ) const {
356  for ( auto cur = vec.begin(); cur != vec.end(); ++cur ) { res.insert( *cur ); }
357  }
358  void operator()( PairT& res, const KeyT& key, tag_key ) const { res.first = key; }
359  void operator()( PairT& res, const MappedT& value, tag_mapped ) const { res.second = value; }
360  //----------------------------------------------------------------------
361  };
362  //------------------------------------------------------------------------------
363  MapGrammar() : MapGrammar::base_type( map ) {
364  pair = key[op( qi::_val, qi::_1, tag_key() )] > ( qi::lit( ':' ) | '=' ) >
365  value[op( qi::_val, qi::_1, tag_mapped() )];
366  list = -( pair % enc::char_( ',' ) );
367  map = ( ( '[' >> list >> ']' ) | ( '{' >> list >> '}' ) )[op( qi::_val, qi::_1 )];
368  }
369  // ----------------------------------------------------------------------------
372  qi::rule<Iterator, PairT(), Skipper> pair;
373  qi::rule<Iterator, VectorPairT(), Skipper> list;
374  qi::rule<Iterator, ResultT(), Skipper> map;
375  ph::function<Operations> op;
376  // ----------------------------------------------------------------------------
377  };
378  // ----------------------------------------------------------------------------
379  // Register MapGrammar for std::map:
380  // ----------------------------------------------------------------------------
381  template <typename Iterator, typename KeyT, typename ValueT, typename KeyCompareT, typename AllocatorT,
382  typename Skipper>
383  struct Grammar_<Iterator, std::map<KeyT, ValueT, KeyCompareT, AllocatorT>, Skipper> {
385  };
386  // ----------------------------------------------------------------------------
387  // Register MapGrammar for std::unordered_map:
388  // ----------------------------------------------------------------------------
389  template <typename Iterator, typename KeyT, typename ValueT, typename HashT, typename KeyCompareT,
390  typename AllocatorT, typename Skipper>
391  struct Grammar_<Iterator, std::unordered_map<KeyT, ValueT, HashT, KeyCompareT, AllocatorT>, Skipper> {
393  };
394  // ----------------------------------------------------------------------------
395  // Register MapGrammar for GaudiUtils::VectorMap:
396  // ----------------------------------------------------------------------------
397  template <typename Iterator, typename KeyT, typename ValueT, typename KeyCompareT, typename AllocatorT,
398  typename Skipper>
399  struct Grammar_<Iterator, GaudiUtils::VectorMap<KeyT, ValueT, KeyCompareT, AllocatorT>, Skipper> {
401  };
402  // ============================================================================
403  template <typename Iterator, typename PointT, typename Skipper>
404  struct Pnt3DGrammar : qi::grammar<Iterator, PointT(), Skipper> {
405  typedef PointT ResultT;
406  typedef typename PointT::Scalar Scalar;
407  // ----------------------------------------------------------------------------
408  struct Operations {
409  void operator()( ResultT& res, const Scalar& scalar, const char xyz ) const {
410  switch ( xyz ) {
411  case 'x':
412  res.SetX( scalar );
413  break;
414  case 'y':
415  res.SetY( scalar );
416  break;
417  case 'z':
418  res.SetZ( scalar );
419  break;
420  default:
421  break;
422  }
423  }
424  }; // Operations
425  // ----------------------------------------------------------------------------
426  Pnt3DGrammar() : Pnt3DGrammar::base_type( point ) {
427  point = list | ( '(' >> list >> ')' ) | ( '[' >> list >> ']' );
428  list = -( enc::no_case[qi::lit( "x" ) | qi::lit( "px" )] >> ':' ) >> scalar[op( qi::_val, qi::_1, 'x' )] >>
429  ',' >> -( enc::no_case[qi::lit( "y" ) | qi::lit( "py" )] >> ':' ) >>
430  scalar[op( qi::_val, qi::_1, 'y' )] >> ',' >>
431  -( enc::no_case[qi::lit( "z" ) | qi::lit( "pz" )] >> ':' ) >> scalar[op( qi::_val, qi::_1, 'z' )];
432  }
433  // ----------------------------------------------------------------------------
434  qi::rule<Iterator, ResultT(), Skipper> point, list;
436  ph::function<Operations> op;
437  // ----------------------------------------------------------------------------
438  }; // Pnt3DGrammar
439  // ----------------------------------------------------------------------------
440  // Register Pnt3DGrammar for ROOT::Math::PositionVector3D:
441  // ----------------------------------------------------------------------------
442  template <typename Iterator, typename T1, typename T2, typename Skipper>
443  struct Grammar_<Iterator, ROOT::Math::PositionVector3D<T1, T2>, Skipper> {
445  };
446  // ----------------------------------------------------------------------------
447  // Register Pnt3DGrammar for ROOT::Math::DisplacementVector3D:
448  // ----------------------------------------------------------------------------
449  template <typename Iterator, typename T1, typename T2, typename Skipper>
450  struct Grammar_<Iterator, ROOT::Math::DisplacementVector3D<T1, T2>, Skipper> {
452  };
453  // ============================================================================
454  template <typename Iterator, typename PointT, typename Skipper>
455  struct Pnt4DGrammar : qi::grammar<Iterator, PointT(), Skipper> {
456  typedef PointT ResultT;
457  typedef typename PointT::Scalar ScalarT;
458  //-----------------------------------------------------------------------------
459  struct Operations {
460 
461  void operator()( ResultT& res, const ScalarT& scalar, const char xyz ) const {
462  switch ( xyz ) {
463  case 'x':
464  res.SetPx( scalar );
465  break;
466  case 'y':
467  res.SetPy( scalar );
468  break;
469  case 'z':
470  res.SetPz( scalar );
471  break;
472  case 'e':
473  res.SetE( scalar );
474  break;
475  default:
476  break;
477  }
478  }
479  void operator()( ResultT& res, const ResultT& xyz ) const {
480  res.SetPx( xyz.Px() );
481  res.SetPy( xyz.Py() );
482  res.SetPz( xyz.Pz() );
483  }
484  }; // Operations
485  // ----------------------------------------------------------------------------
486  Pnt4DGrammar() : Pnt4DGrammar::base_type( point4d ) {
487  point4d = list4d | ( '(' >> list4d >> ')' ) | ( '[' >> list4d >> ']' );
488  list4d = ( point3d[op( qi::_val, qi::_1 )] >> enc::char_( ";," ) >> e[op( qi::_val, qi::_1, 'e' )] ) |
489  ( e[op( qi::_val, qi::_1, 'e' )] >> enc::char_( ";," ) >> point3d[op( qi::_val, qi::_1 )] );
490  e = -( enc::no_case[enc::char_( "te" )] >> ':' ) >> scalar[qi::_val = qi::_1];
491 
492  point3d = list3d | ( '(' >> list3d >> ')' ) | ( '[' >> list3d >> ']' );
493  list3d = -( enc::no_case[qi::lit( "x" ) | qi::lit( "px" )] >> ':' ) >> scalar[op( qi::_val, qi::_1, 'x' )] >>
494  ',' >> -( enc::no_case[qi::lit( "y" ) | qi::lit( "py" )] >> ':' ) >>
495  scalar[op( qi::_val, qi::_1, 'y' )] >> ',' >>
496  -( enc::no_case[qi::lit( "z" ) | qi::lit( "pz" )] >> ':' ) >> scalar[op( qi::_val, qi::_1, 'z' )];
497  }
498  // ----------------------------------------------------------------------------
499  qi::rule<Iterator, ResultT(), Skipper> point3d, point4d, list3d, list4d;
500  qi::rule<Iterator, ScalarT(), Skipper> e;
502  ph::function<Operations> op;
503  // ----------------------------------------------------------------------------
504  }; // Pnt4DGrammar
505  // ----------------------------------------------------------------------------
506  // Register Pnt4DGrammar for ROOT::Math::LorentzVector:
507  // ----------------------------------------------------------------------------
508  template <typename Iterator, typename T1, typename Skipper>
509  struct Grammar_<Iterator, ROOT::Math::LorentzVector<T1>, Skipper> {
511  };
512  // ============================================================================
513  template <typename Iterator, typename Skipper>
514  struct Histo1DGrammar : qi::grammar<Iterator, Gaudi::Histo1DDef(), qi::locals<char>, Skipper> {
516  // ----------------------------------------------------------------------------
517  struct Operations {
518  void operator()( ResultT& res, const std::string& title ) const { res.setTitle( title ); }
519  void operator()( ResultT& res, const double& val, const char lh ) const {
520  switch ( lh ) {
521  case 'l':
522  res.setLowEdge( val );
523  break;
524  case 'h':
525  res.setHighEdge( val );
526  break;
527  default:
528  break;
529  }
530  }
531  void operator()( ResultT& res, int val ) const { res.setBins( val ); }
532  void operator()( ResultT& res ) const {}
533  }; // Operations
534  // ----------------------------------------------------------------------------
535  Histo1DGrammar() : Histo1DGrammar::base_type( hist ) {
536  val1 = title[op( qi::_val, qi::_1 )] >> ',' >> qi::double_[op( qi::_val, qi::_1, 'l' )] >> ',' >>
537  qi::double_[op( qi::_val, qi::_1, 'h' )] >> -( ',' >> qi::int_[op( qi::_val, qi::_1 )] );
538  val2 = qi::double_[op( qi::_val, qi::_1, 'l' )] >> ',' >> qi::double_[op( qi::_val, qi::_1, 'h' )] >> ',' >>
539  title[op( qi::_val, qi::_1 )] >> -( ',' >> qi::int_[op( qi::_val, qi::_1 )] );
540  val3 = qi::double_[op( qi::_val, qi::_1, 'l' )] >> ',' >> qi::double_[op( qi::_val, qi::_1, 'h' )] >>
541  -( ',' >> title[op( qi::_val, qi::_1 )] ) >> -( ',' >> qi::int_[op( qi::_val, qi::_1 )] );
542  begin = enc::char_( '[' )[qi::_val = ']'] | enc::char_( '(' )[qi::_val = ')'];
543  end = enc::char_( qi::_r1 );
544  hist = begin[qi::_a = qi::_1] >> ( val1 | val2 | val3 )[qi::_val = qi::_1] >> end( qi::_a );
545  }
546  // ----------------------------------------------------------------------------
547  qi::rule<Iterator, ResultT(), qi::locals<char>, Skipper> hist;
548  qi::rule<Iterator, ResultT(), Skipper> val1, val2, val3;
549  qi::rule<Iterator, char()> begin;
550  qi::rule<Iterator, void( char )> end;
552  ph::function<Operations> op;
553  // ----------------------------------------------------------------------------
554  }; // Histo1DGrammar
555  // ----------------------------------------------------------------------------
557  // ============================================================================
558  template <typename Iterator, typename Skipper>
559  struct KeyValueGrammar : qi::grammar<Iterator, std::pair<std::string, std::string>(), Skipper> {
560  //------------------------------------------------------------------------------
562  //------------------------------------------------------------------------------
563  struct first {};
564  struct second {};
565 
566  KeyValueGrammar() : KeyValueGrammar::base_type( pair ) {
567  //------------------------------------------------------------------------------
568  pair = gstring >> ":" >> +enc::char_;
569  }
570  // ----------------------------------------------------------------------------
572  qi::rule<Iterator, ResultT(), Skipper> pair;
573  // ----------------------------------------------------------------------------
574  }; // END KeyValueGrammar
575  // We don't register KeyalueGrammar because it's a special parser
576  // ============================================================================
577  } // namespace Parsers
578 } // namespace Gaudi
qi::rule< Iterator, char()> begin
Definition: Grammars.h:326
qi::rule< Iterator, ResultT(), Skipper > pair
Definition: Grammars.h:572
VectorGrammar< Iterator, std::vector< InnerT, AllocatorT >, Skipper > Grammar
Definition: Grammars.h:280
qi::rule< Iterator, ResultT(), Skipper > val3
Definition: Grammars.h:548
qi::rule< Iterator, VectorPairT(), Skipper > list
Definition: Grammars.h:373
StringGrammar< Iterator, Skipper > gstring
Definition: Grammars.h:571
MapGrammar< Iterator, std::map< KeyT, ValueT, KeyCompareT, AllocatorT >, Skipper > Grammar
Definition: Grammars.h:384
void operator()(ResultT &res, const ScalarT &scalar, const char xyz) const
Definition: Grammars.h:461
void operator()(ResultT &res, const std::string &title) const
Definition: Grammars.h:518
Grammar_< Iterator, ScalarT, Skipper >::Grammar scalar
Definition: Grammars.h:501
PairT::second_type second_type
Definition: Grammars.h:311
Grammar_< Iterator, typename PairT::first_type, Skipper >::Grammar key
Definition: Grammars.h:324
qi::rule< Iterator, ResultT(), Skipper > point
Definition: Grammars.h:434
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > pair
Definition: Grammars.h:328
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > tup
Definition: Grammars.h:242
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > vec
Definition: Grammars.h:271
struct GAUDI_API vector
Parametrisation class for vector-like implementation.
void operator()(ResultT &res, const typename std::tuple_element< 0, ResultT >::type &val) const
Definition: Grammars.h:214
SkipperGrammar< IteratorT > Skipper
Definition: Factory.h:26
qi::rule< Iterator, ResultT(), qi::locals< HeadT >, Skipper > tup
Definition: Grammars.h:202
ph::function< Operations > op
Definition: Grammars.h:436
STL namespace.
MapT::mapped_type MappedT
Definition: Grammars.h:346
T end(T...args)
StringGrammar< Iterator, Skipper > title
Definition: Grammars.h:551
qi::rule< Iterator, ResultT(), Skipper > map
Definition: Grammars.h:374
TupleInnerGrammar< Iterator, TailT, N-1, Skipper > grLast
Definition: Grammars.h:199
void operator()(ResultT &res) const
Definition: Grammars.h:532
BOOST_MPL_ASSERT_MSG(false, GRAMMAR_FOR_TYPE_DOES_NOT_EXISTS,(T))
VectorGrammar< Iterator, std::unordered_set< InnerT, HashT, CompareT, AllocatorT >, Skipper > Grammar
Definition: Grammars.h:302
The helper class to represent the efficient "key" for access.
Definition: StringKey.h:34
qi::rule< Iterator, ScalarT(), Skipper > e
Definition: Grammars.h:500
PairGrammar(const std::string &delimeter)
Definition: Grammars.h:317
STL class.
Grammar_< Iterator, typename VectorT::value_type, Skipper >::Grammar elementGrammar
Definition: Grammars.h:267
Grammar_< Iterator, HeadT, Skipper >::Grammar grHead
Definition: Grammars.h:200
int N
Definition: IOTest.py:99
void operator()(ResultT &res, const double &val, const char lh) const
Definition: Grammars.h:519
qi::rule< Iterator, char()> begin
Definition: Grammars.h:549
3D point typedefs
struct GAUDI_API map
Parametrisation class for map-like implementation.
qi::rule< Iterator, void(char)> end
Definition: Grammars.h:241
std::pair< KeyT, MappedT > PairT
Definition: Grammars.h:347
ph::function< Operations > op
Definition: Grammars.h:203
Pnt3DGrammar< Iterator, ROOT::Math::DisplacementVector3D< T1, T2 >, Skipper > Grammar
Definition: Grammars.h:451
VectorGrammar< Iterator, std::list< InnerT, AllocatorT >, Skipper > Grammar
Definition: Grammars.h:287
Grammar_< Iterator, typename PairT::second_type, Skipper >::Grammar value
Definition: Grammars.h:325
void operator()(ResultT &res, const Scalar &scalar, const char xyz) const
Definition: Grammars.h:409
Simple helper class for description of 1D-histogram The class is targeted to act as the primary "hist...
Definition: HistoDef.h:31
qi::rule< Iterator, ResultT(), qi::locals< char >, Skipper > hist
Definition: Grammars.h:547
MapT::key_type KeyT
Definition: Grammars.h:345
qi::rule< Iterator, ResultT(), Skipper > pair_in
Definition: Grammars.h:329
PairT::first_type first_type
Definition: Grammars.h:310
tuple_get_first_type< TupleT >::type HeadT
Definition: Grammars.h:184
qi::rule< Iterator, ResultT(), Skipper > point4d
Definition: Grammars.h:499
qi::rule< Iterator, PairT(), Skipper > pair
Definition: Grammars.h:372
MapGrammar< Iterator, GaudiUtils::VectorMap< KeyT, ValueT, KeyCompareT, AllocatorT >, Skipper > Grammar
Definition: Grammars.h:400
qi::rule< Iterator, ResultT(), Skipper > list
Definition: Grammars.h:272
MapGrammar< Iterator, std::unordered_map< KeyT, ValueT, HashT, KeyCompareT, AllocatorT >, Skipper > Grammar
Definition: Grammars.h:392
std::string::const_iterator DefaultIterator
Definition: Grammars.h:56
void operator()(PairT &res, const KeyT &key, tag_key) const
Definition: Grammars.h:358
Pnt4DGrammar< Iterator, ROOT::Math::LorentzVector< T1 >, Skipper > Grammar
Definition: Grammars.h:510
Grammar_< Iterator, typename MapT::key_type, Skipper >::Grammar key
Definition: Grammars.h:370
void operator()(ResultT &res, int val) const
Definition: Grammars.h:531
enc::space_type DefaultSkipper
Definition: Grammars.h:57
std::vector< PairT > VectorPairT
Definition: Grammars.h:349
qi::rule< Iterator, void(char)> end
Definition: Grammars.h:269
T tuple_cat(T...args)
qi::rule< Iterator, bool(), Skipper > boolean_literal
Definition: Grammars.h:124
STL class.
boost::spirit::classic::position_iterator2< ForwardIterator > Iterator
Definition: Iterator.h:18
PairGrammar< Iterator, std::pair< KeyT, ValueT >, Skipper > Grammar
Definition: Grammars.h:338
T begin(T...args)
void operator()(ResultT &res, const VectorPairT &vec) const
Definition: Grammars.h:355
void operator()(ResultT &res, const ResultT &xyz) const
Definition: Grammars.h:479
Forward declarations for the functions in SerializeSTL.h.
Definition: GaudiHistoID.h:136
tuple_remove_first_type< TupleT >::type TailT
Definition: Grammars.h:183
qi::rule< Iterator, char(), Skipper > ch
Definition: Grammars.h:113
TupleInnerGrammar< Iterator, TupleT, N, Skipper > grTuple
Definition: Grammars.h:243
qi::rule< Iterator, void(char)> end
Definition: Grammars.h:550
Grammar_< Iterator, typename std::tuple_element< 0, ResultT >::type, Skipper >::Grammar grFirst
Definition: Grammars.h:223
qi::rule< Iterator, char()> begin
Definition: Grammars.h:268
ph::function< Operations > op
Definition: Grammars.h:375
Pnt3DGrammar< Iterator, ROOT::Math::PositionVector3D< T1, T2 >, Skipper > Grammar
Definition: Grammars.h:444
VectorGrammar< Iterator, std::set< InnerT, CompareT, AllocatorT >, Skipper > Grammar
Definition: Grammars.h:294
AttribStringParser::Iterator begin(const AttribStringParser &parser)
4D point typedefs
Grammar_< Iterator, typename MapT::mapped_type, Skipper >::Grammar value
Definition: Grammars.h:371
qi::rule< Iterator, RT(), Skipper > real
Definition: Grammars.h:148
qi::rule< Iterator, RT(), Skipper > integer
Definition: Grammars.h:134
void operator()(ResultT &res, HeadT &head, TailT &tail) const
Definition: Grammars.h:189
qi::rule< Iterator, char()> begin
Definition: Grammars.h:240
qi::rule< Iterator, void(char)> end
Definition: Grammars.h:327
void operator()(PairT &res, const MappedT &value, tag_mapped) const
Definition: Grammars.h:359
Helper functions to set/get the application return code.
Definition: __init__.py:1
Gaudi::Histo1DDef ResultT
Definition: Grammars.h:515
std::pair< std::string, std::string > ResultT
Definition: Grammars.h:561
ph::function< Operations > op
Definition: Grammars.h:502
qi::rule< Iterator, ResultT(), Skipper > tup
Definition: Grammars.h:225
PointT::Scalar ScalarT
Definition: Grammars.h:457
Grammar_< Iterator, Scalar, Skipper >::Grammar scalar
Definition: Grammars.h:435
ph::function< Operations > op
Definition: Grammars.h:552
REGISTER_GRAMMAR(GaudiMath::Interpolation::Type, InterpolGrammar)