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