]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/spirit/repository/test/karma/subrule.cpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / libs / spirit / repository / test / karma / subrule.cpp
CommitLineData
7c673cae
FG
1// Copyright (c) 2001-2010 Hartmut Kaiser
2// Copyright (c) 2009 Francois Barel
3//
4// Distributed under the Boost Software License, Version 1.0. (See accompanying
5// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
7#include <boost/config/warning_disable.hpp>
8#include <boost/detail/lightweight_test.hpp>
9
10#include <boost/spirit/include/karma_operator.hpp>
11#include <boost/spirit/include/karma_char.hpp>
12#include <boost/spirit/include/karma_auxiliary.hpp>
13#include <boost/spirit/include/karma_string.hpp>
14#include <boost/spirit/include/karma_numeric.hpp>
15#include <boost/spirit/include/karma_nonterminal.hpp>
16#include <boost/spirit/include/karma_action.hpp>
17#include <boost/spirit/include/phoenix_core.hpp>
18#include <boost/spirit/include/phoenix_operator.hpp>
19#include <boost/spirit/include/phoenix_statement.hpp>
20#include <boost/spirit/include/phoenix_fusion.hpp>
21
22#include <boost/spirit/repository/include/karma_subrule.hpp>
23
24#include "test.hpp"
25
26using namespace spirit_test;
27
28///////////////////////////////////////////////////////////////////////////////
29int main()
30{
31 using namespace boost;
32 using namespace boost::spirit;
33 using namespace boost::spirit::karma;
34// using namespace boost::spirit::ascii;
35 using boost::spirit::repository::karma::subrule;
36
37 typedef spirit_test::output_iterator<char>::type outiter_type;
38
39 // basic tests
40 {
41 rule<outiter_type> start;
42 subrule<0> sr;
43
44 start = (
45 sr = char_[_1 = 'a'] << int_[_1 = 10] << double_[_1 = 12.4]
46 );
47 BOOST_TEST(test("a1012.4", start));
48
49 BOOST_TEST(test("a1012.4", (
20effc67 50 sr = (char_ << int_ << double_)[(_1 = 'a', _2 = 10, _3 = 12.4)]
7c673cae
FG
51 )));
52
53 subrule<1> a;
54 subrule<2> b;
55 subrule<3> c;
56
57 start = (
58 sr = a << b << c
59 , a = char_[_1 = 'a']
60 , b = int_[_1 = 10]
61 , c = double_[_1 = 12.4]
62 );
63 BOOST_TEST(test("a1012.4", start));
64 }
65
66 // basic tests with delimiter
67 {
68 rule<outiter_type, space_type> start;
69 subrule<0> sr;
70
71 start = (
72 sr = char_[_1 = 'a'] << int_[_1 = 10] << double_[_1 = 12.4]
73 );
74 BOOST_TEST(test_delimited("a 10 12.4 ", start, space));
75
76 BOOST_TEST(test_delimited("a 10 12.4 ", (
20effc67 77 sr = (char_ << int_ << double_)[(_1 = 'a', _2 = 10, _3 = 12.4)]
7c673cae
FG
78 ), space));
79
80 subrule<1> a;
81 subrule<2> b;
82 subrule<3> c;
83
84 start = (
85 sr = a << b << c
86 , a = char_[_1 = 'a']
87 , b = int_[_1 = 10]
88 , c = double_[_1 = 12.4]
89 );
90 BOOST_TEST(test_delimited("a 10 12.4 ", start, space));
91 }
92
93 // basic tests involving a direct parameter
94 {
95 typedef variant<char, int, double> var_type;
96
97 rule<outiter_type, var_type()> start;
98 subrule<0, var_type()> sr;
99
100 start = (
101 sr = (char_ | int_ | double_)[_1 = _r0]
102 )[_1 = _val];
103
104 var_type v ('a');
105 BOOST_TEST(test("a", start, v));
106 v = 10;
107 BOOST_TEST(test("10", start, v));
108 v = 12.4;
109 BOOST_TEST(test("12.4", start, v));
110 }
111
112 {
113 typedef variant<char, int, double> var_type;
114
115 rule<outiter_type, space_type, var_type()> start;
116 subrule<0, var_type()> sr;
117
118 start %= (
119 sr = (char_ | int_ | double_)[_1 = _r0]
120 );
121
122 var_type v ('a');
123 BOOST_TEST(test_delimited("a ", start, v, space));
124 v = 10;
125 BOOST_TEST(test_delimited("10 ", start, v, space));
126 v = 12.4;
127 BOOST_TEST(test_delimited("12.4 ", start, v, space));
128 }
129
130 {
131 rule<outiter_type, void(char, int, double)> start;
132 subrule<0, void(char, int, double)> sr;
133
134 start = (
135 sr = char_[_1 = _r1] << int_[_1 = _r2] << double_[_1 = _r3]
136 )(_r1, _r2, _r3);
137 BOOST_TEST(test("a1012.4", start('a', 10, 12.4)));
138
139 BOOST_TEST(test("a1012.4", (
20effc67 140 sr = (char_ << int_ << double_)[(_1 = _r1, _2 = _r2, _3 = _r3)]
7c673cae
FG
141 )('a', 10, 12.4)));
142
143 subrule<1, void(char, int, double)> entry;
144 subrule<2, void(char)> a;
145 subrule<3, void(int)> b;
146 subrule<4, void(double)> c;
147
148 start = (
149 entry = a(_r1) << b(_r2) << c(_r3)
150 , a = char_[_1 = _r1]
151 , b = int_[_1 = _r1]
152 , c = double_[_1 = _r1]
153 )(_r1, _r2, _r3);
154 BOOST_TEST(test("a1012.4", start('a', 10, 12.4)));
155 }
156
157 {
158 rule<outiter_type, space_type, void(char, int, double)> start;
159 subrule<0, void(char, int, double)> sr;
160
161 start = (
162 sr = char_[_1 = _r1] << int_[_1 = _r2] << double_[_1 = _r3]
163 )(_r1, _r2, _r3);
164 BOOST_TEST(test_delimited("a 10 12.4 ", start('a', 10, 12.4), space));
165
166 BOOST_TEST(test_delimited("a 10 12.4 ", (
20effc67 167 sr = (char_ << int_ << double_)[(_1 = _r1, _2 = _r2, _3 = _r3)]
7c673cae
FG
168 )('a', 10, 12.4), space));
169
170 subrule<1, void(char, int, double)> entry;
171 subrule<2, void(char)> a;
172 subrule<3, void(int)> b;
173 subrule<4, void(double)> c;
174
175 start = (
176 entry = a(_r1) << b(_r2) << c(_r3)
177 , a = char_[_1 = _r1]
178 , b = int_[_1 = _r1]
179 , c = double_[_1 = _r1]
180 )(_r1, _r2, _r3);
181 BOOST_TEST(test_delimited("a 10 12.4 ", start('a', 10, 12.4), space));
182 }
183
184 return boost::report_errors();
185}
186