1212#include < boost/network/uri/encode.hpp>
1313#include < boost/network/uri/decode.hpp>
1414#include < boost/spirit/include/qi.hpp>
15+ #include < boost/fusion/include/std_pair.hpp>
1516
1617
1718namespace boost {
1819namespace network {
1920namespace uri {
2021namespace details {
2122template <
22- typename Uri,
2323typename Map
2424 >
2525struct key_value_sequence
26- : spirit::qi::grammar<typename Uri::const_iterator_type , Map()>
26+ : spirit::qi::grammar<uri::const_iterator , Map()>
2727{
28- typedef typename Uri::const_iterator_type const_iterator_type;
29-
3028key_value_sequence ()
3129 : key_value_sequence::base_type(query)
3230 {
@@ -36,79 +34,63 @@ struct key_value_sequence
3634 value = +spirit::qi::char_ (" a-zA-Z_0-9/%" );
3735 }
3836
39- spirit::qi::rule<const_iterator_type , Map()> query;
40- spirit::qi::rule<const_iterator_type , std::pair<typename Uri::string_type, typename Uri::string_type >()> pair;
41- spirit::qi::rule<const_iterator_type ,typename Uri::string_type ()> key, value;
37+ spirit::qi::rule<uri::const_iterator , Map()> query;
38+ spirit::qi::rule<uri::const_iterator , std::pair<std::string, std::string >()> pair;
39+ spirit::qi::rule<uri::const_iterator ,typename std::string ()> key, value;
4240};
4341}// namespace details
4442
4543template <
46- class Tag ,
4744class Map
4845 >
4946inline
50- Map &query_map (const basic_uri<Tag> &uri , Map &map) {
51- typename basic_uri<Tag> ::const_range_type range =uri .query_range ();
52- details::key_value_sequence<basic_uri<Tag>, Map> parser;
47+ Map &query_map (const uri &uri_ , Map &map) {
48+ uri ::const_range_type range =uri_ .query_range ();
49+ details::key_value_sequence<Map> parser;
5350spirit::qi::parse (boost::begin (range),boost::end (range), parser, map);
5451return map;
5552}
5653
57- template <
58- class Tag
59- >
60- typename basic_uri<Tag>::string_typeusername (const basic_uri<Tag> &uri) {
61- typename basic_uri<Tag>::const_range_type user_info_range = uri.user_info_range ();
62- typename basic_uri<Tag>::const_iterator_typeit (boost::begin (user_info_range)),end (boost::end (user_info_range));
54+ std::stringusername (const uri &uri_) {
55+ uri::const_range_type user_info_range = uri_.user_info_range ();
56+ uri::const_iteratorit (boost::begin (user_info_range)),end (boost::end (user_info_range));
6357for (; it != end; ++it) {
6458if (*it ==' :' ) {
6559break ;
6660 }
6761 }
68- return typename string<Tag>:: type (boost::begin (user_info_range), it);
62+ return std::string (boost::begin (user_info_range), it);
6963}
7064
71- template <
72- class Tag
73- >
74- typename basic_uri<Tag>::string_typepassword (const basic_uri<Tag> &uri) {
75- typename basic_uri<Tag>::const_range_type user_info_range = uri.user_info_range ();
76- typename basic_uri<Tag>::const_iterator_typeit (boost::begin (user_info_range)),end (boost::end (user_info_range));
65+ std::stringpassword (const uri &uri_) {
66+ uri::const_range_type user_info_range = uri_.user_info_range ();
67+ uri::const_iteratorit (boost::begin (user_info_range)),end (boost::end (user_info_range));
7768for (; it != end; ++it) {
7869if (*it ==' :' ) {
7970 ++it;
8071break ;
8172 }
8273 }
83- return typename string<Tag>:: type (it,boost::end (user_info_range));
74+ return std::string (it,boost::end (user_info_range));
8475}
8576
86- template <
87- class Tag
88- >
89- typename basic_uri<Tag>::string_typedecoded_path (const basic_uri<Tag> &uri) {
90- typename basic_uri<Tag>::const_range_type path_range = uri.path_range ();
91- typename basic_uri<Tag>::string_type decoded_path;
77+ std::stringdecoded_path (const uri &uri_) {
78+ uri::const_range_type path_range = uri_.path_range ();
79+ std::string decoded_path;
9280decode (path_range,std::back_inserter (decoded_path));
9381return decoded_path;
9482}
9583
96- template <
97- class Tag
98- >
99- typename basic_uri<Tag>::string_typedecoded_query (const basic_uri<Tag> &uri) {
100- typename basic_uri<Tag>::const_range_type query_range = uri.query_range ();
101- typename basic_uri<Tag>::string_type decoded_query;
84+ std::stringdecoded_query (const uri &uri_) {
85+ uri::const_range_type query_range = uri_.query_range ();
86+ std::string decoded_query;
10287decode (query_range,std::back_inserter (decoded_query));
10388return decoded_query;
10489}
10590
106- template <
107- class Tag
108- >
109- typename basic_uri<Tag>::string_typedecoded_fragment (const basic_uri<Tag> &uri) {
110- typename basic_uri<Tag>::const_range_type fragment_range = uri.fragment_range ();
111- typename basic_uri<Tag>::string_type decoded_fragment;
91+ std::stringdecoded_fragment (const uri &uri_) {
92+ uri::const_range_type fragment_range = uri_.fragment_range ();
93+ std::string decoded_fragment;
11294decode (fragment_range,std::back_inserter (decoded_fragment));
11395return decoded_fragment;
11496}