Skip to content

Commit cdd6c13

Browse files
committed
Using %= for the rule assignment and then fixing ambiguity in MSVC for unqualified calls to begin() and end().
1 parent 190cfe1 commit cdd6c13

File tree

1 file changed

+31
-26
lines changed

1 file changed

+31
-26
lines changed

boost/network/uri/detail/parse_uri.hpp

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ namespace boost { namespace spirit { namespace traits {
2525
struct transform_attribute<
2626
boost::network::uri::detail::uri_parts<Tag>,
2727
typename boost::network::uri::detail::uri_parts_tuple<Tag>::type
28+
#if SPIRIT_VERSION >= 0x2030
29+
, boost::spirit::qi::domain
30+
#endif
2831
>
2932
{
3033
typedef typename boost::network::uri::detail::uri_parts_tuple<Tag>::type type;
@@ -96,76 +99,76 @@ namespace boost { namespace network { namespace uri {
9699
struct uri_grammar : qi::grammar<Iterator, uri_parts<Tag>()> {
97100
uri_grammar() : uri_grammar::base_type(start, "uri") {
98101
// gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
99-
gen_delims = qi::char_(":/?#[]@");
102+
gen_delims %= qi::char_(":/?#[]@");
100103
// sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
101-
sub_delims = qi::char_("!$&'()*+,;=");
104+
sub_delims %= qi::char_("!$&'()*+,;=");
102105
// reserved = gen-delims / sub-delims
103-
reserved = gen_delims | sub_delims;
106+
reserved %= gen_delims | sub_delims;
104107
// unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
105-
unreserved = qi::alnum | qi::char_("-._~");
108+
unreserved %= qi::alnum | qi::char_("-._~");
106109
// pct-encoded = "%" HEXDIG HEXDIG
107-
pct_encoded = qi::char_("%") >> qi::repeat(2)[qi::xdigit];
110+
pct_encoded %= qi::char_("%") >> qi::repeat(2)[qi::xdigit];
108111

109112
// pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
110-
pchar = qi::raw[
113+
pchar %= qi::raw[
111114
unreserved | pct_encoded | sub_delims | qi::char_(":@")
112115
];
113116

114117
// segment = *pchar
115-
segment = qi::raw[*pchar];
118+
segment %= qi::raw[*pchar];
116119
// segment-nz = 1*pchar
117-
segment_nz = qi::raw[+pchar];
120+
segment_nz %= qi::raw[+pchar];
118121
// segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
119-
segment_nz_nc = qi::raw[
122+
segment_nz_nc %= qi::raw[
120123
+(unreserved | pct_encoded | sub_delims | qi::char_("@"))
121124
];
122125
// path-abempty = *( "/" segment )
123-
path_abempty = qi::raw[*(qi::char_("/") >> segment)];
126+
path_abempty %= qi::raw[*(qi::char_("/") >> segment)];
124127
// path-absolute = "/" [ segment-nz *( "/" segment ) ]
125-
path_absolute = qi::raw[
128+
path_absolute %= qi::raw[
126129
qi::char_("/")
127130
>> -(segment_nz >> *(qi::char_("/") >> segment))
128131
];
129132
// path-rootless = segment-nz *( "/" segment )
130-
path_rootless = qi::raw[
133+
path_rootless %= qi::raw[
131134
segment_nz >> *(qi::char_("/") >> segment)
132135
];
133136
// path-empty = 0<pchar>
134-
path_empty = qi::eps;
137+
path_empty %= qi::eps;
135138

136139
// scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
137-
scheme = qi::alpha >> *(qi::alnum | qi::char_("+.-"));
140+
scheme %= qi::alpha >> *(qi::alnum | qi::char_("+.-"));
138141

139142
// user_info = *( unreserved / pct-encoded / sub-delims / ":" )
140-
user_info = qi::raw[
143+
user_info %= qi::raw[
141144
*(unreserved | pct_encoded | sub_delims | qi::char_(":"))
142145
];
143146

144147
// dec-octet = DIGIT / %x31-39 DIGIT / "1" 2DIGIT / "2" %x30-34 DIGIT / "25" %x30-35
145-
dec_octet =
148+
dec_octet %=
146149
!(qi::lit('0') >> qi::digit)
147150
>> qi::raw[
148151
qi::uint_parser<boost::uint8_t, 10, 1, 3>()
149152
];
150153
// IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
151-
ipv4address = qi::raw[
154+
ipv4address %= qi::raw[
152155
dec_octet >> qi::repeat(3)[qi::lit('.') >> dec_octet]
153156
];
154157
// reg-name = *( unreserved / pct-encoded / sub-delims )
155-
reg_name = qi::raw[
158+
reg_name %= qi::raw[
156159
*(unreserved | pct_encoded | sub_delims)
157160
];
158161
// TODO, host = IP-literal / IPv4address / reg-name
159-
host = ipv4address | reg_name;
162+
host %= ipv4address | reg_name;
160163

161164
// query = *( pchar / "/" / "?" )
162-
query = qi::raw[*(pchar | qi::char_("/?"))];
165+
query %= qi::raw[*(pchar | qi::char_("/?"))];
163166
// fragment = *( pchar / "/" / "?" )
164-
fragment = qi::raw[*(pchar | qi::char_("/?"))];
167+
fragment %= qi::raw[*(pchar | qi::char_("/?"))];
165168

166169
// hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty
167170
// authority = [ userinfo "@" ] host [ ":" port ]
168-
hier_part =
171+
hier_part %=
169172
(
170173
"//"
171174
>> -(user_info >> '@')
@@ -185,8 +188,8 @@ namespace boost { namespace network { namespace uri {
185188
)
186189
);
187190

188-
start = uri;
189-
uri =
191+
start %= uri;
192+
uri %=
190193
scheme >> ':'
191194
>> hier_part
192195
>> -('?' >> query)
@@ -234,8 +237,10 @@ namespace boost { namespace network { namespace uri {
234237
inline bool parse_uri(Range & range, uri_parts<Tag> & parts) {
235238
typedef typename range_iterator<Range>::type iterator;
236239

237-
iterator start_ = begin(range);
238-
iterator end_ = end(range);
240+
// Qualified boost::begin and boost::end because MSVC complains
241+
// of ambiguity on call to begin(range) and end(rand).
242+
iterator start_ = boost::begin(range);
243+
iterator end_ = boost::end(range);
239244

240245
uri_grammar<iterator, Tag> grammar;
241246

0 commit comments

Comments
 (0)