]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/test/x3/symbols2.cpp
1 /*=============================================================================
2 Copyright (c) 2001-2015 Joel de Guzman
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/spirit/home/x3.hpp>
12 // Custom string type with a C-style string conversion.
13 struct custom_string_c
15 custom_string_c(char c
) { str
[0] = c
; str
[1] = '\0'; }
17 operator char*() { return str
; }
18 operator char const*() const { return str
; }
24 std::string
get_str(char const* str
)
26 return std::string(str
);
32 using spirit_test::test
;
33 using spirit_test::test_attr
;
34 using boost::spirit::x3::symbols
;
35 using boost::spirit::x3::rule
;
37 { // construction from symbol array
38 char const* syms
[] = {"Joel","Ruby","Tenji","Tutit","Kim","Joey"};
39 symbols
<int> sym(syms
);
41 BOOST_TEST((test("Joel", sym
)));
42 BOOST_TEST((test("Ruby", sym
)));
43 BOOST_TEST((test("Tenji", sym
)));
44 BOOST_TEST((test("Tutit", sym
)));
45 BOOST_TEST((test("Kim", sym
)));
46 BOOST_TEST((test("Joey", sym
)));
47 BOOST_TEST((!test("XXX", sym
)));
50 { // construction from 2 arrays
52 char const* syms
[] = {"Joel","Ruby","Tenji","Tutit","Kim","Joey"};
53 int data
[] = {1,2,3,4,5,6};
54 symbols
<int> sym(syms
, data
);
57 BOOST_TEST((test_attr("Joel", sym
, i
)));
59 BOOST_TEST((test_attr("Ruby", sym
, i
)));
61 BOOST_TEST((test_attr("Tenji", sym
, i
)));
63 BOOST_TEST((test_attr("Tutit", sym
, i
)));
65 BOOST_TEST((test_attr("Kim", sym
, i
)));
67 BOOST_TEST((test_attr("Joey", sym
, i
)));
69 BOOST_TEST((!test_attr("XXX", sym
, i
)));
72 { // allow std::string and other string types
75 // const and non-const std::string
77 std::string
const b("def");
80 BOOST_TEST((test("abc", sym
)));
81 BOOST_TEST((test("def", sym
)));
83 BOOST_TEST((test("abc", sym
)));
84 BOOST_TEST((!test("def", sym
)));
86 // non-const C-style string
87 char arr
[2]; arr
[0] = 'a'; arr
[1] = '\0';
89 BOOST_TEST((test("a", sym
)));
90 BOOST_TEST((!test("b", sym
)));
92 // const and non-const custom string type
93 custom_string_c
c('x');
94 custom_string_c
const cc('y');
96 BOOST_TEST((test("x", sym
)));
97 BOOST_TEST((test("y", sym
)));
98 BOOST_TEST((!test("z", sym
)));
104 sym
.add("a", 1)("b", 2);
106 BOOST_TEST(!sym
.find("c"));
108 BOOST_TEST(sym
.find("a") && *sym
.find("a") == 1);
109 BOOST_TEST(sym
.find("b") && *sym
.find("b") == 2);
111 BOOST_TEST(sym
.at("a") == 1);
112 BOOST_TEST(sym
.at("b") == 2);
113 BOOST_TEST(sym
.at("c") == 0);
115 BOOST_TEST(sym
.find("a") && *sym
.find("a") == 1);
116 BOOST_TEST(sym
.find("b") && *sym
.find("b") == 2);
117 BOOST_TEST(sym
.find("c") && *sym
.find("c") == 0);
119 symbols
<int> const_sym(sym
);
121 BOOST_TEST(const_sym
.find("a") && *const_sym
.find("a") == 1);
122 BOOST_TEST(const_sym
.find("b") && *const_sym
.find("b") == 2);
123 BOOST_TEST(const_sym
.find("c") && *const_sym
.find("c") == 0);
124 BOOST_TEST(!const_sym
.find("d"));
126 char const *str1
= "all";
127 char const *first
= str1
, *last
= str1
+ 3;
128 BOOST_TEST(*sym
.prefix_find(first
, last
) == 1 && first
== str1
+ 1);
130 char const *str2
= "dart";
131 first
= str2
; last
= str2
+ 4;
132 BOOST_TEST(!sym
.prefix_find(first
, last
) && first
== str2
);
136 symbols
<int> sym
,sym2
;
138 BOOST_TEST(sym
.name()=="test");
140 BOOST_TEST(sym2
.name()=="test");
142 symbols
<int> sym3(sym
);
143 BOOST_TEST(sym3
.name()=="test");
149 BOOST_TEST(sym
.at("foo") == 0);
151 BOOST_TEST(sym
.at("foo") == 1);
152 BOOST_TEST(sym
.at("fool") == 0);
154 BOOST_TEST(sym
.find("foo") && *sym
.find("foo") == 1);
155 BOOST_TEST(sym
.find("fool") && *sym
.find("fool") == 2);
156 BOOST_TEST(!sym
.find("foolish"));
157 BOOST_TEST(!sym
.find("foot"));
158 BOOST_TEST(!sym
.find("afoot"));
160 char const *str
, *first
, *last
;
161 str
= "foolish"; first
= str
; last
= str
+ 7;
162 BOOST_TEST(*sym
.prefix_find(first
, last
) == 2 && first
== str
+ 4);
164 first
= str
; last
= str
+ 4;
165 BOOST_TEST(*sym
.prefix_find(first
, last
) == 2 && first
== str
+ 4);
167 str
= "food"; first
= str
; last
= str
+ 4;
168 BOOST_TEST(*sym
.prefix_find(first
, last
) == 1 && first
== str
+ 3);
170 first
= str
; last
= str
+ 3;
171 BOOST_TEST(*sym
.prefix_find(first
, last
) == 1 && first
== str
+ 3);
173 first
= str
; last
= str
+ 2;
174 BOOST_TEST(!sym
.prefix_find(first
, last
) && first
== str
);
181 symbols
<double> vars
;
183 vars
.add("l1", 12.0);
187 double* d
= vars
.find("l1");
191 { // test for proto problem with rvalue references (10-11-2011)
193 sym
+= get_str("Joel");
194 sym
+= get_str("Ruby");
196 BOOST_TEST((test("Joel", sym
)));
197 BOOST_TEST((test("Ruby", sym
)));
200 return boost::report_errors();