@@ -25,6 +25,9 @@ namespace boost { namespace spirit { namespace traits {
2525struct transform_attribute <
2626 boost::network::uri::detail::uri_parts<Tag>,
2727typename boost::network::uri::detail::uri_parts_tuple<Tag>::type
28+ #if SPIRIT_VERSION >= 0x2030
29+ , boost::spirit::qi::domain
30+ #endif
2831 >
2932 {
3033typedef typename boost::network::uri::detail::uri_parts_tuple<Tag>::type type;
@@ -96,76 +99,76 @@ namespace boost { namespace network { namespace uri {
9699struct uri_grammar : qi::grammar<Iterator, uri_parts<Tag>()> {
97100uri_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[
126129qi::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 {
234237inline bool parse_uri (Range & range, uri_parts<Tag> & parts) {
235238typedef 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