]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/test/qi/symbols1.cpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / spirit / test / qi / symbols1.cpp
1 /*=============================================================================
2 Copyright (c) 2001-2010 Joel de Guzman
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/detail/lightweight_test.hpp>
8 #include <boost/spirit/include/qi_string.hpp>
9 #include <boost/spirit/include/qi_char.hpp>
10 #include <boost/spirit/include/qi_action.hpp>
11 #include <boost/spirit/include/qi_auxiliary.hpp>
12 #include <boost/spirit/include/qi_directive.hpp>
13 #include <boost/spirit/include/qi_operator.hpp>
14 #include <boost/spirit/include/qi_nonterminal.hpp>
15 #include <boost/spirit/include/support_argument.hpp>
16 #include <boost/spirit/include/phoenix_core.hpp>
17 #include <boost/spirit/include/phoenix_operator.hpp>
18
19 #include <iostream>
20 #include "test.hpp"
21
22 // Custom string type with a C-style string conversion.
23 struct custom_string_c
24 {
25 custom_string_c(char c) { str[0] = c; str[1] = '\0'; }
26
27 operator char*() { return str; }
28 operator char const*() const { return str; }
29
30 private:
31 char str[2];
32 };
33
34 int
35 main()
36 {
37 using spirit_test::test;
38 using spirit_test::test_attr;
39 using boost::spirit::qi::symbols;
40 using boost::spirit::qi::rule;
41 using boost::spirit::qi::lazy;
42 using boost::spirit::qi::_r1;
43
44 { // basics
45 symbols<char, int> sym;
46
47 sym.add
48 ("Joel")
49 ("Ruby")
50 ("Tenji")
51 ("Tutit")
52 ("Kim")
53 ("Joey")
54 ("Joeyboy")
55 ;
56
57 boost::mpl::true_ f = boost::mpl::bool_<boost::spirit::traits::is_parser<symbols<char, int> >::value>();
58
59 // silence stupid compiler warnings
60 // i.e. MSVC warning C4189: 'f' : local variable is initialized but not referenced
61 BOOST_TEST((f.value));
62
63 BOOST_TEST((test("Joel", sym)));
64 BOOST_TEST((test("Ruby", sym)));
65 BOOST_TEST((test("Tenji", sym)));
66 BOOST_TEST((test("Tutit", sym)));
67 BOOST_TEST((test("Kim", sym)));
68 BOOST_TEST((test("Joey", sym)));
69 BOOST_TEST((test("Joeyboy", sym)));
70 BOOST_TEST((!test("XXX", sym)));
71
72 // test copy
73 symbols<char, int> sym2;
74 sym2 = sym;
75 BOOST_TEST((test("Joel", sym2)));
76 BOOST_TEST((test("Ruby", sym2)));
77 BOOST_TEST((test("Tenji", sym2)));
78 BOOST_TEST((test("Tutit", sym2)));
79 BOOST_TEST((test("Kim", sym2)));
80 BOOST_TEST((test("Joey", sym2)));
81 BOOST_TEST((!test("XXX", sym2)));
82
83 // make sure it plays well with other parsers
84 BOOST_TEST((test("Joelyo", sym >> "yo")));
85
86 sym.remove
87 ("Joel")
88 ("Ruby")
89 ;
90
91 BOOST_TEST((!test("Joel", sym)));
92 BOOST_TEST((!test("Ruby", sym)));
93 }
94
95 { // comma syntax
96 symbols<char, int> sym;
97 sym += "Joel", "Ruby", "Tenji", "Tutit", "Kim", "Joey";
98
99 BOOST_TEST((test("Joel", sym)));
100 BOOST_TEST((test("Ruby", sym)));
101 BOOST_TEST((test("Tenji", sym)));
102 BOOST_TEST((test("Tutit", sym)));
103 BOOST_TEST((test("Kim", sym)));
104 BOOST_TEST((test("Joey", sym)));
105 BOOST_TEST((!test("XXX", sym)));
106
107 sym -= "Joel", "Ruby";
108
109 BOOST_TEST((!test("Joel", sym)));
110 BOOST_TEST((!test("Ruby", sym)));
111 }
112
113 { // no-case handling
114 using namespace boost::spirit::ascii;
115
116 symbols<char, int> sym;
117 // NOTE: make sure all entries are in lower-case!!!
118 sym = "joel", "ruby", "tenji", "tutit", "kim", "joey";
119
120 BOOST_TEST((test("joel", no_case[sym])));
121 BOOST_TEST((test("ruby", no_case[sym])));
122 BOOST_TEST((test("tenji", no_case[sym])));
123 BOOST_TEST((test("tutit", no_case[sym])));
124 BOOST_TEST((test("kim", no_case[sym])));
125 BOOST_TEST((test("joey", no_case[sym])));
126
127 BOOST_TEST((test("JOEL", no_case[sym])));
128 BOOST_TEST((test("RUBY", no_case[sym])));
129 BOOST_TEST((test("TENJI", no_case[sym])));
130 BOOST_TEST((test("TUTIT", no_case[sym])));
131 BOOST_TEST((test("KIM", no_case[sym])));
132 BOOST_TEST((test("JOEY", no_case[sym])));
133
134 // make sure it plays well with other parsers
135 BOOST_TEST((test("Joelyo", no_case[sym] >> "yo")));
136 }
137
138 { // attributes
139 symbols<char, int> sym;
140
141 sym.add
142 ("Joel", 1)
143 ("Ruby", 2)
144 ("Tenji", 3)
145 ("Tutit", 4)
146 ("Kim", 5)
147 ("Joey", 6)
148 ("Joeyboy", 7)
149 ;
150
151 int i;
152 BOOST_TEST((test_attr("Joel", sym, i)));
153 BOOST_TEST(i == 1);
154 BOOST_TEST((test_attr("Ruby", sym, i)));
155 BOOST_TEST(i == 2);
156 BOOST_TEST((test_attr("Tenji", sym, i)));
157 BOOST_TEST(i == 3);
158 BOOST_TEST((test_attr("Tutit", sym, i)));
159 BOOST_TEST(i == 4);
160 BOOST_TEST((test_attr("Kim", sym, i)));
161 BOOST_TEST(i == 5);
162 BOOST_TEST((test_attr("Joey", sym, i)));
163 BOOST_TEST(i == 6);
164 BOOST_TEST((test_attr("Joeyboy", sym, i)));
165 BOOST_TEST(i == 7);
166 BOOST_TEST((!test_attr("XXX", sym, i)));
167
168 // double add:
169
170 sym.add("Joel", 265);
171 BOOST_TEST((test_attr("Joel", sym, i)));
172 BOOST_TEST(i == 1);
173 }
174
175 { // actions
176 namespace phx = boost::phoenix;
177 using boost::spirit::_1;
178
179 symbols<char, int> sym;
180 sym.add
181 ("Joel", 1)
182 ("Ruby", 2)
183 ("Tenji", 3)
184 ("Tutit", 4)
185 ("Kim", 5)
186 ("Joey", 6)
187 ;
188
189 int i;
190 BOOST_TEST((test("Joel", sym[phx::ref(i) = _1])));
191 BOOST_TEST(i == 1);
192 BOOST_TEST((test("Ruby", sym[phx::ref(i) = _1])));
193 BOOST_TEST(i == 2);
194 BOOST_TEST((test("Tenji", sym[phx::ref(i) = _1])));
195 BOOST_TEST(i == 3);
196 BOOST_TEST((test("Tutit", sym[phx::ref(i) = _1])));
197 BOOST_TEST(i == 4);
198 BOOST_TEST((test("Kim", sym[phx::ref(i) = _1])));
199 BOOST_TEST(i == 5);
200 BOOST_TEST((test("Joey", sym[phx::ref(i) = _1])));
201 BOOST_TEST(i == 6);
202 BOOST_TEST((!test("XXX", sym[phx::ref(i) = _1])));
203 }
204
205 return boost::report_errors();
206 }