pattern1.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // Copyright (c) 2001-2010 Hartmut Kaiser
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #include <boost/config/warning_disable.hpp>
  6. #include <boost/detail/lightweight_test.hpp>
  7. #include <boost/spirit/include/karma_operator.hpp>
  8. #include <boost/spirit/include/karma_char.hpp>
  9. #include <boost/spirit/include/karma_auxiliary.hpp>
  10. #include <boost/spirit/include/karma_string.hpp>
  11. #include <boost/spirit/include/karma_numeric.hpp>
  12. #include <boost/spirit/include/karma_nonterminal.hpp>
  13. #include <boost/spirit/include/karma_action.hpp>
  14. #include <boost/spirit/include/phoenix_core.hpp>
  15. #include <boost/spirit/include/phoenix_operator.hpp>
  16. #include <boost/spirit/include/phoenix_fusion.hpp>
  17. #include "test.hpp"
  18. using namespace spirit_test;
  19. ///////////////////////////////////////////////////////////////////////////////
  20. int main()
  21. {
  22. using namespace boost;
  23. using namespace boost::spirit;
  24. using namespace boost::spirit::ascii;
  25. typedef spirit_test::output_iterator<char>::type outiter_type;
  26. // test rule parameter propagation
  27. {
  28. using boost::phoenix::at_c;
  29. karma::rule<outiter_type, fusion::vector<char, int, double>()> start;
  30. fusion::vector<char, int, double> vec('a', 10, 12.4);
  31. start %= char_ << int_ << double_;
  32. BOOST_TEST(test("a1012.4", start, vec));
  33. karma::rule<outiter_type, char()> a;
  34. karma::rule<outiter_type, int()> b;
  35. karma::rule<outiter_type, double()> c;
  36. a %= char_ << eps;
  37. b %= int_;
  38. c %= double_;
  39. start = a[_1 = at_c<0>(_r0)] << b[_1 = at_c<1>(_r0)] << c[_1 = at_c<2>(_r0)];
  40. BOOST_TEST(test("a1012.4", start, vec));
  41. start = (a << b << c)[_1 = at_c<0>(_r0), _2 = at_c<1>(_r0), _3 = at_c<2>(_r0)];
  42. BOOST_TEST(test("a1012.4", start, vec));
  43. start = a << b << c;
  44. BOOST_TEST(test("a1012.4", start, vec));
  45. start %= a << b << c;
  46. BOOST_TEST(test("a1012.4", start, vec));
  47. }
  48. {
  49. using boost::phoenix::at_c;
  50. karma::rule<outiter_type, space_type, fusion::vector<char, int, double>()> start;
  51. fusion::vector<char, int, double> vec('a', 10, 12.4);
  52. start %= char_ << int_ << double_;
  53. BOOST_TEST(test_delimited("a 10 12.4 ", start, vec, space));
  54. karma::rule<outiter_type, space_type, char()> a;
  55. karma::rule<outiter_type, space_type, int()> b;
  56. karma::rule<outiter_type, space_type, double()> c;
  57. a %= char_ << eps;
  58. b %= int_;
  59. c %= double_;
  60. start = a[_1 = at_c<0>(_r0)] << b[_1 = at_c<1>(_r0)] << c[_1 = at_c<2>(_r0)];
  61. BOOST_TEST(test_delimited("a 10 12.4 ", start, vec, space));
  62. start = (a << b << c)[_1 = at_c<0>(_r0), _2 = at_c<1>(_r0), _3 = at_c<2>(_r0)];
  63. BOOST_TEST(test_delimited("a 10 12.4 ", start, vec, space));
  64. start = a << b << c;
  65. BOOST_TEST(test_delimited("a 10 12.4 ", start, vec, space));
  66. start %= a << b << c;
  67. BOOST_TEST(test_delimited("a 10 12.4 ", start, vec, space));
  68. }
  69. // test direct initalization
  70. {
  71. using boost::phoenix::at_c;
  72. fusion::vector<char, int, double> vec('a', 10, 12.4);
  73. karma::rule<outiter_type, space_type, fusion::vector<char, int, double>()>
  74. start = char_ << int_ << double_;;
  75. BOOST_TEST(test_delimited("a 10 12.4 ", start, vec, space));
  76. karma::rule<outiter_type, space_type, char()> a = char_ << eps;
  77. karma::rule<outiter_type, space_type, int()> b = int_;
  78. karma::rule<outiter_type, space_type, double()> c = double_;
  79. start = a[_1 = at_c<0>(_r0)] << b[_1 = at_c<1>(_r0)] << c[_1 = at_c<2>(_r0)];
  80. BOOST_TEST(test_delimited("a 10 12.4 ", start, vec, space));
  81. }
  82. return boost::report_errors();
  83. }