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