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