6
6
7
7
#include < boost/network/uri/detail/uri_parts.hpp>
8
8
#include < boost/config/warning_disable.hpp>
9
- #include < boost/spirit/include/qi.hpp>
10
- #include < boost/spirit/include/phoenix_operator.hpp>
11
- #include < boost/spirit/include/version.hpp>
12
- #include < boost/spirit/repository/include/qi_iter_pos.hpp>
9
+ #include < boost/spirit/home/qi.hpp>
13
10
#include < boost/fusion/adapted/struct/adapt_struct.hpp>
14
11
15
-
16
- BOOST_FUSION_ADAPT_TPL_STRUCT
17
- (
18
- (String),
19
- (boost::network::uri::detail::iterator_range)(String),
20
- (typename String::const_iterator, first)
21
- (typename String::const_iterator, second)
22
- );
23
-
24
12
BOOST_FUSION_ADAPT_TPL_STRUCT
25
13
(
26
- (String ),
27
- (boost::network::uri::detail::hierarchical_part)(String ),
28
- (boost::network::uri::detail:: iterator_range<String >, user_info)
29
- (boost::network::uri::detail:: iterator_range<String >, host)
30
- (boost::network::uri::detail:: iterator_range<String >, port)
31
- (boost::network::uri::detail:: iterator_range<String >, path)
14
+ (FwdIter ),
15
+ (boost::network::uri::detail::hierarchical_part)(FwdIter ),
16
+ (boost::iterator_range<FwdIter >, user_info)
17
+ (boost::iterator_range<FwdIter >, host)
18
+ (boost::iterator_range<FwdIter >, port)
19
+ (boost::iterator_range<FwdIter >, path)
32
20
);
33
21
34
22
BOOST_FUSION_ADAPT_TPL_STRUCT
35
23
(
36
- (String ),
37
- (boost::network::uri::detail::uri_parts)(String ),
38
- (boost::network::uri::detail:: iterator_range<String >, scheme)
39
- (boost::network::uri::detail::hierarchical_part<String >, hier_part)
40
- (boost::network::uri::detail:: iterator_range<String >, query)
41
- (boost::network::uri::detail:: iterator_range<String >, fragment)
24
+ (FwdIter ),
25
+ (boost::network::uri::detail::uri_parts)(FwdIter ),
26
+ (boost::iterator_range<FwdIter >, scheme)
27
+ (boost::network::uri::detail::hierarchical_part<FwdIter >, hier_part)
28
+ (boost::iterator_range<FwdIter >, query)
29
+ (boost::iterator_range<FwdIter >, fragment)
42
30
);
43
31
44
-
45
32
namespace boost {
46
33
namespace network {
47
34
namespace uri {
48
35
namespace detail {
49
36
namespace qi = boost::spirit::qi;
50
37
51
38
template <
52
- class String ,
53
- typename Iterator
39
+ class String
54
40
>
55
- struct uri_grammar : qi::grammar<Iterator, detail::uri_parts<String>()> {
41
+ struct uri_grammar : qi::grammar<
42
+ typename String::const_iterator
43
+ , detail::uri_parts<typename String::const_iterator>()> {
56
44
57
- uri_grammar () : uri_grammar::base_type(start, " uri " ) {
58
- using boost::spirit::repository::qi::iter_pos ;
45
+ typedef String string_type;
46
+ typedef typename String::const_iterator const_iterator ;
59
47
48
+ uri_grammar () : uri_grammar::base_type(start, " uri" ) {
60
49
// gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
61
50
gen_delims %= qi::char_ (" :/?#[]@" );
62
51
// sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
@@ -83,46 +72,34 @@ struct uri_grammar : qi::grammar<Iterator, detail::uri_parts<String>()> {
83
72
];
84
73
// path-abempty = *( "/" segment )
85
74
path_abempty %=
86
- iter_pos
87
- >> qi::omit[qi::raw[*(qi::char_ (" /" ) >> segment)]]
88
- >> iter_pos
75
+ qi::raw[qi::raw[*(qi::char_ (" /" ) >> segment)]]
89
76
;
90
77
// path-absolute = "/" [ segment-nz *( "/" segment ) ]
91
78
path_absolute %=
92
- iter_pos
93
- >> qi::omit[qi::raw[
79
+ qi::raw[qi::raw[
94
80
qi::char_ (" /" )
95
81
>> -(segment_nz >> *(qi::char_ (" /" ) >> segment))
96
82
]]
97
- >> iter_pos
98
83
;
99
84
// path-rootless = segment-nz *( "/" segment )
100
85
path_rootless %=
101
- iter_pos
102
- >> qi::omit[qi::raw[
86
+ qi::raw[qi::raw[
103
87
segment_nz >> *(qi::char_ (" /" ) >> segment)
104
88
]]
105
- >> iter_pos
106
89
;
107
90
// path-empty = 0<pchar>
108
91
path_empty %=
109
- iter_pos
110
- >> qi::omit[qi::eps]
111
- >> iter_pos
92
+ qi::raw[qi::eps]
112
93
;
113
94
114
95
// scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
115
96
scheme %=
116
- iter_pos
117
- >> qi::omit[qi::alpha >> *(qi::alnum | qi::char_ (" +.-" ))]
118
- >> iter_pos
97
+ qi::raw[qi::alpha >> *(qi::alnum | qi::char_ (" +.-" ))]
119
98
;
120
99
121
100
// user_info = *( unreserved / pct-encoded / sub-delims / ":" )
122
101
user_info %=
123
- iter_pos
124
- >> qi::omit[qi::raw[*(unreserved | pct_encoded | sub_delims | qi::char_ (" :" ))]]
125
- >> iter_pos
102
+ qi::raw[qi::raw[*(unreserved | pct_encoded | sub_delims | qi::char_ (" :" ))]]
126
103
;
127
104
128
105
ip_literal %=
@@ -173,30 +150,22 @@ struct uri_grammar : qi::grammar<Iterator, detail::uri_parts<String>()> {
173
150
174
151
// TODO, host = IP-literal / IPv4address / reg-name
175
152
host %=
176
- iter_pos
177
- >> qi::omit[ip_literal | ipv4address | reg_name]
178
- >> iter_pos
153
+ qi::raw[ip_literal | ipv4address | reg_name]
179
154
;
180
155
181
156
// port %= qi::ushort_;
182
157
port %=
183
- iter_pos
184
- >> qi::omit[*qi::digit]
185
- >> iter_pos
158
+ qi::raw[*qi::digit]
186
159
;
187
160
188
161
// query = *( pchar / "/" / "?" )
189
162
query %=
190
- iter_pos
191
- >> qi::omit[qi::raw[*(pchar | qi::char_ (" /?" ))]]
192
- >> iter_pos
163
+ qi::raw[qi::raw[*(pchar | qi::char_ (" /?" ))]]
193
164
;
194
165
195
166
// fragment = *( pchar / "/" / "?" )
196
167
fragment %=
197
- iter_pos
198
- >> qi::omit[qi::raw[*(pchar | qi::char_ (" /?" ))]]
199
- >> iter_pos
168
+ qi::raw[qi::raw[*(pchar | qi::char_ (" /?" ))]]
200
169
;
201
170
202
171
// hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty
@@ -211,9 +180,9 @@ struct uri_grammar : qi::grammar<Iterator, detail::uri_parts<String>()> {
211
180
)
212
181
|
213
182
(
214
- qi::attr (iterator_range<String >())
215
- >> qi::attr (iterator_range<String >())
216
- >> qi::attr (iterator_range<String >())
183
+ qi::attr (iterator_range<const_iterator >())
184
+ >> qi::attr (iterator_range<const_iterator >())
185
+ >> qi::attr (iterator_range<const_iterator >())
217
186
>> (
218
187
path_absolute
219
188
| path_rootless
@@ -230,41 +199,41 @@ struct uri_grammar : qi::grammar<Iterator, detail::uri_parts<String>()> {
230
199
;
231
200
}
232
201
233
- qi::rule<Iterator , typename String ::value_type ()>
202
+ qi::rule<const_iterator , typename string_type ::value_type ()>
234
203
gen_delims, sub_delims, reserved, unreserved;
235
- qi::rule<Iterator, String ()>
204
+ qi::rule<const_iterator, string_type ()>
236
205
pct_encoded, pchar;
237
206
238
- qi::rule<Iterator, String ()>
207
+ qi::rule<const_iterator, string_type ()>
239
208
segment, segment_nz, segment_nz_nc;
240
- qi::rule<Iterator , iterator_range<String >()>
209
+ qi::rule<const_iterator , iterator_range<const_iterator >()>
241
210
path_abempty, path_absolute, path_rootless, path_empty;
242
211
243
- qi::rule<Iterator, String ()>
212
+ qi::rule<const_iterator, string_type ()>
244
213
dec_octet, ipv4address, reg_name, ipv6address, ipvfuture, ip_literal;
245
214
246
- qi::rule<Iterator, String ()>
215
+ qi::rule<const_iterator, string_type ()>
247
216
h16, ls32;
248
217
249
- qi::rule<Iterator , iterator_range<String >()>
218
+ qi::rule<const_iterator , iterator_range<const_iterator >()>
250
219
host, port;
251
220
252
- qi::rule<Iterator , iterator_range<String >()>
221
+ qi::rule<const_iterator , iterator_range<const_iterator >()>
253
222
scheme, user_info, query, fragment;
254
223
255
- qi::rule<Iterator , hierarchical_part<String >()>
224
+ qi::rule<const_iterator , hierarchical_part<const_iterator >()>
256
225
hier_part;
257
226
258
227
// actual uri parser
259
- qi::rule<Iterator , uri_parts<String >()> start;
228
+ qi::rule<const_iterator , uri_parts<const_iterator >()> start;
260
229
261
230
};
262
231
263
232
bool parse (std::string::const_iterator first,
264
233
std::string::const_iterator last,
265
- uri_parts<std::string> &parts) {
234
+ uri_parts<std::string::const_iterator > &parts) {
266
235
namespace qi = boost::spirit::qi;
267
- static detail::uri_grammar<std::string, std::string::const_iterator > grammar;
236
+ static detail::uri_grammar<std::string> grammar;
268
237
bool is_valid = qi::parse (first, last, grammar, parts);
269
238
return is_valid && (first == last);
270
239
}
0 commit comments