]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/test/karma/kleene.cpp
1 // Copyright (c) 2001-2011 Hartmut Kaiser
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)
6 #include <boost/config/warning_disable.hpp>
7 #include <boost/detail/lightweight_test.hpp>
9 #include <boost/assign/std/vector.hpp>
11 #include <boost/spirit/include/karma_char.hpp>
12 #include <boost/spirit/include/karma_string.hpp>
13 #include <boost/spirit/include/karma_numeric.hpp>
14 #include <boost/spirit/include/karma_generate.hpp>
15 #include <boost/spirit/include/karma_operator.hpp>
16 #include <boost/spirit/include/karma_action.hpp>
17 #include <boost/spirit/include/karma_nonterminal.hpp>
18 #include <boost/spirit/include/karma_auxiliary.hpp>
19 #include <boost/spirit/include/karma_directive.hpp>
20 #include <boost/fusion/include/vector.hpp>
21 #include <boost/spirit/include/phoenix_core.hpp>
22 #include <boost/spirit/include/phoenix_operator.hpp>
23 #include <boost/fusion/include/std_pair.hpp>
25 #include <boost/assign/std/vector.hpp>
29 using namespace spirit_test
;
31 ///////////////////////////////////////////////////////////////////////////////
34 action (std::vector
<char>& vec
)
35 : vec(vec
), it(vec
.begin())
38 void operator()(unsigned& value
, boost::spirit::unused_type
, bool& pass
) const
40 pass
= (it
!= vec
.end());
45 std::vector
<char>& vec
;
46 mutable std::vector
<char>::iterator it
;
55 BOOST_FUSION_ADAPT_STRUCT(
61 ///////////////////////////////////////////////////////////////////////////////
64 using namespace boost::spirit
;
65 using namespace boost::spirit::ascii
;
66 namespace fusion
= boost::fusion
;
69 std::string
s1("aaaa");
70 BOOST_TEST(test("aaaa", *char_
, s1
));
71 BOOST_TEST(test_delimited("a a a a ", *char_
, s1
, ' '));
74 BOOST_TEST(test("", *char_
, s2
));
75 BOOST_TEST(test_delimited("", *char_
, s2
, ' '));
79 std::string
s1("aaaaa");
80 BOOST_TEST(test("aaaaa", char_
<< *(char_
<< char_
), s1
));
81 BOOST_TEST(test_delimited("a a a a a ",
82 char_
<< *(char_
<< char_
), s1
, ' '));
85 BOOST_TEST(test("a", char_
<< *(char_
<< char_
), s1
));
87 BOOST_TEST(!test("", char_
<< *(char_
<< char_
), s1
));
88 // BOOST_TEST(test("aa", char_ << *buffer[char_ << char_] << char_, s1));
90 BOOST_TEST(!test("", char_
<< *(char_
<< char_
), s1
));
91 // BOOST_TEST(test("aaaa", char_ << *buffer[char_ << char_] << char_, s1));
95 using boost::spirit::karma::strict
;
96 using boost::spirit::karma::relaxed
;
97 using namespace boost::assign
;
99 typedef std::pair
<char, char> data
;
100 std::vector
<data
> v1
;
101 v1
+= std::make_pair('a', 'a'),
102 std::make_pair('b', 'b'),
103 std::make_pair('c', 'c'),
104 std::make_pair('d', 'd'),
105 std::make_pair('e', 'e'),
106 std::make_pair('f', 'f'),
107 std::make_pair('g', 'g');
109 karma::rule
<spirit_test::output_iterator
<char>::type
, data()> r
;
110 r
= &char_('a') << char_
;
112 BOOST_TEST(test("a", r
<< *(r
<< r
), v1
));
113 BOOST_TEST(test("a", relaxed
[r
<< *(r
<< r
)], v1
));
114 BOOST_TEST(!test("", strict
[r
<< *(r
<< r
)], v1
));
116 v1
+= std::make_pair('a', 'a');
118 BOOST_TEST(!test("", r
<< *(r
<< r
), v1
));
119 BOOST_TEST(!test("", relaxed
[r
<< *(r
<< r
)], v1
));
120 BOOST_TEST(!test("", strict
[r
<< *(r
<< r
)], v1
));
122 v1
+= std::make_pair('a', 'a');
124 BOOST_TEST(test("aaa", r
<< *(r
<< r
), v1
));
125 BOOST_TEST(test("aaa", relaxed
[r
<< *(r
<< r
)], v1
));
126 BOOST_TEST(!test("", strict
[r
<< *(r
<< r
)], v1
));
130 using namespace boost::assign
;
135 BOOST_TEST(test("abc", *char_
, v
));
136 BOOST_TEST(test_delimited("a b c ", *char_
, v
, ' '));
140 using namespace boost::assign
;
145 BOOST_TEST(test("102030", *int_
, v
));
146 BOOST_TEST(test_delimited("10, 20, 30, ", *int_
, v
, lit(", ")));
148 BOOST_TEST(test("10,20,30,", *(int_
<< ','), v
));
149 BOOST_TEST(test_delimited("10 , 20 , 30 , ", *(int_
<< ','), v
, lit(' ')));
151 // leads to infinite loops
152 // fusion::vector<char, char> cc ('a', 'c');
153 // BOOST_TEST(test("ac", char_ << *(lit(' ') << ',') << char_, cc));
154 // BOOST_TEST(test_delimited("a c ",
155 // char_ << *(lit(' ') << ',') << char_, cc, " "));
159 using namespace boost::assign
;
160 namespace phx
= boost::phoenix
;
163 v
+= 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h';
165 BOOST_TEST(test("abcdefgh", (*char_
)[_1
= phx::ref(v
)]));
166 BOOST_TEST(test_delimited("a b c d e f g h ",
167 (*char_
)[_1
= phx::ref(v
)], space
));
170 // failing sub-generators
172 using boost::spirit::karma::strict
;
173 using boost::spirit::karma::relaxed
;
175 using namespace boost::assign
;
177 typedef std::pair
<char, char> data
;
178 std::vector
<data
> v2
;
179 v2
+= std::make_pair('a', 'a'),
180 std::make_pair('b', 'b'),
181 std::make_pair('c', 'c'),
182 std::make_pair('d', 'd'),
183 std::make_pair('e', 'e'),
184 std::make_pair('f', 'f'),
185 std::make_pair('g', 'g');
187 karma::rule
<spirit_test::output_iterator
<char>::type
, data()> r
;
189 r
= &char_('d') << char_
;
190 BOOST_TEST(test("d", *r
, v2
));
191 BOOST_TEST(test("d", relaxed
[*r
], v2
));
192 BOOST_TEST(test("", strict
[*r
], v2
));
194 r
= &char_('a') << char_
;
195 BOOST_TEST(test("a", *r
, v2
));
196 BOOST_TEST(test("a", relaxed
[*r
], v2
));
197 BOOST_TEST(test("a", strict
[*r
], v2
));
199 r
= &char_('g') << char_
;
200 BOOST_TEST(test("g", *r
, v2
));
201 BOOST_TEST(test("g", relaxed
[*r
], v2
));
202 BOOST_TEST(test("", strict
[*r
], v2
));
204 r
= !char_('d') << char_
;
205 BOOST_TEST(test("abcefg", *r
, v2
));
206 BOOST_TEST(test("abcefg", relaxed
[*r
], v2
));
207 BOOST_TEST(test("abc", strict
[*r
], v2
));
209 r
= !char_('a') << char_
;
210 BOOST_TEST(test("bcdefg", *r
, v2
));
211 BOOST_TEST(test("bcdefg", relaxed
[*r
], v2
));
212 BOOST_TEST(test("", strict
[*r
], v2
));
214 r
= !char_('g') << char_
;
215 BOOST_TEST(test("abcdef", *r
, v2
));
216 BOOST_TEST(test("abcdef", relaxed
[*r
], v2
));
217 BOOST_TEST(test("abcdef", strict
[*r
], v2
));
219 r
= &char_('A') << char_
;
220 BOOST_TEST(test("", *r
, v2
));
224 // make sure user defined end condition is applied if no attribute
226 using namespace boost::assign
;
229 v
+= 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h';
230 BOOST_TEST(test("[6162636465666768]", '[' << *hex
[action(v
)] << ']'));
234 using boost::spirit::karma::double_
;
239 BOOST_TEST(test("A1.02.0", 'A' << *(double_
<< double_
), v
));
242 return boost::report_errors();