66
77#include < boost/network/uri/detail/uri_parts.hpp>
88#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>
1310#include < boost/fusion/adapted/struct/adapt_struct.hpp>
1411
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-
2412BOOST_FUSION_ADAPT_TPL_STRUCT
2513(
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)
3220 );
3321
3422BOOST_FUSION_ADAPT_TPL_STRUCT
3523(
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)
4230 );
4331
44-
4532namespace boost {
4633namespace network {
4734namespace uri {
4835namespace detail {
4936namespace qi = boost::spirit::qi;
5037
5138template <
52- class String ,
53- typename Iterator
39+ class String
5440 >
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>()> {
5644
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 ;
5947
48+ uri_grammar () : uri_grammar::base_type(start," uri" ) {
6049// gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
6150 gen_delims %=qi::char_ (" :/?#[]@" );
6251// sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
@@ -83,46 +72,34 @@ struct uri_grammar : qi::grammar<Iterator, detail::uri_parts<String>()> {
8372 ];
8473// path-abempty = *( "/" segment )
8574 path_abempty %=
86- iter_pos
87- >> qi::omit[qi::raw[*(qi::char_ (" /" ) >> segment)]]
88- >> iter_pos
75+ qi::raw[qi::raw[*(qi::char_ (" /" ) >> segment)]]
8976 ;
9077// path-absolute = "/" [ segment-nz *( "/" segment ) ]
9178 path_absolute %=
92- iter_pos
93- >> qi::omit[qi::raw[
79+ qi::raw[qi::raw[
9480qi::char_ (" /" )
9581 >> -(segment_nz >> *(qi::char_ (" /" ) >> segment))
9682 ]]
97- >> iter_pos
9883 ;
9984// path-rootless = segment-nz *( "/" segment )
10085 path_rootless %=
101- iter_pos
102- >> qi::omit[qi::raw[
86+ qi::raw[qi::raw[
10387 segment_nz >> *(qi::char_ (" /" ) >> segment)
10488 ]]
105- >> iter_pos
10689 ;
10790// path-empty = 0<pchar>
10891 path_empty %=
109- iter_pos
110- >> qi::omit[qi::eps]
111- >> iter_pos
92+ qi::raw[qi::eps]
11293 ;
11394
11495// scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
11596 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_ (" +.-" ))]
11998 ;
12099
121100// user_info = *( unreserved / pct-encoded / sub-delims / ":" )
122101 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_ (" :" ))]]
126103 ;
127104
128105 ip_literal %=
@@ -173,30 +150,22 @@ struct uri_grammar : qi::grammar<Iterator, detail::uri_parts<String>()> {
173150
174151// TODO, host = IP-literal / IPv4address / reg-name
175152 host %=
176- iter_pos
177- >> qi::omit[ip_literal | ipv4address | reg_name]
178- >> iter_pos
153+ qi::raw[ip_literal | ipv4address | reg_name]
179154 ;
180155
181156// port %= qi::ushort_;
182157 port %=
183- iter_pos
184- >> qi::omit[*qi::digit]
185- >> iter_pos
158+ qi::raw[*qi::digit]
186159 ;
187160
188161// query = *( pchar / "/" / "?" )
189162 query %=
190- iter_pos
191- >> qi::omit[qi::raw[*(pchar |qi::char_ (" /?" ))]]
192- >> iter_pos
163+ qi::raw[qi::raw[*(pchar |qi::char_ (" /?" ))]]
193164 ;
194165
195166// fragment = *( pchar / "/" / "?" )
196167 fragment %=
197- iter_pos
198- >> qi::omit[qi::raw[*(pchar |qi::char_ (" /?" ))]]
199- >> iter_pos
168+ qi::raw[qi::raw[*(pchar |qi::char_ (" /?" ))]]
200169 ;
201170
202171// 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>()> {
211180 )
212181 |
213182 (
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 >())
217186 >> (
218187 path_absolute
219188 | path_rootless
@@ -230,41 +199,41 @@ struct uri_grammar : qi::grammar<Iterator, detail::uri_parts<String>()> {
230199 ;
231200 }
232201
233- qi::rule<Iterator ,typename String ::value_type ()>
202+ qi::rule<const_iterator ,typename string_type ::value_type ()>
234203 gen_delims, sub_delims, reserved, unreserved;
235- qi::rule<Iterator, String ()>
204+ qi::rule<const_iterator, string_type ()>
236205 pct_encoded, pchar;
237206
238- qi::rule<Iterator, String ()>
207+ qi::rule<const_iterator, string_type ()>
239208 segment, segment_nz, segment_nz_nc;
240- qi::rule<Iterator , iterator_range<String >()>
209+ qi::rule<const_iterator , iterator_range<const_iterator >()>
241210 path_abempty, path_absolute, path_rootless, path_empty;
242211
243- qi::rule<Iterator, String ()>
212+ qi::rule<const_iterator, string_type ()>
244213 dec_octet, ipv4address, reg_name, ipv6address, ipvfuture, ip_literal;
245214
246- qi::rule<Iterator, String ()>
215+ qi::rule<const_iterator, string_type ()>
247216 h16, ls32;
248217
249- qi::rule<Iterator , iterator_range<String >()>
218+ qi::rule<const_iterator , iterator_range<const_iterator >()>
250219 host, port;
251220
252- qi::rule<Iterator , iterator_range<String >()>
221+ qi::rule<const_iterator , iterator_range<const_iterator >()>
253222 scheme, user_info, query, fragment;
254223
255- qi::rule<Iterator , hierarchical_part<String >()>
224+ qi::rule<const_iterator , hierarchical_part<const_iterator >()>
256225 hier_part;
257226
258227// actual uri parser
259- qi::rule<Iterator , uri_parts<String >()> start;
228+ qi::rule<const_iterator , uri_parts<const_iterator >()> start;
260229
261230};
262231
263232bool parse (std::string::const_iterator first,
264233 std::string::const_iterator last,
265- uri_parts<std::string> &parts) {
234+ uri_parts<std::string::const_iterator > &parts) {
266235namespace qi = boost::spirit::qi;
267- static detail::uri_grammar<std::string, std::string::const_iterator > grammar;
236+ static detail::uri_grammar<std::string> grammar;
268237bool is_valid =qi::parse (first, last, grammar, parts);
269238return is_valid && (first == last);
270239}