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>
1615
1716
1817namespace boost {
1918namespace network {
2019namespace uri {
2120namespace details {
2221template <
22+ typename Uri,
2323typename Map
2424 >
2525struct key_value_sequence
26- : spirit::qi::grammar<uri::const_iterator , Map()>
26+ : spirit::qi::grammar<typename Uri::const_iterator_type , Map()>
2727{
28+ typedef typename Uri::const_iterator_type const_iterator_type;
29+
2830key_value_sequence ()
2931 : key_value_sequence::base_type(query)
3032 {
@@ -34,63 +36,79 @@ struct key_value_sequence
3436 value = +spirit::qi::char_ (" a-zA-Z_0-9/%" );
3537 }
3638
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;
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;
4042};
4143}// namespace details
4244
4345template <
46+ class Tag ,
4447class Map
4548 >
4649inline
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;
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;
5053spirit::qi::parse (boost::begin (range),boost::end (range), parser, map);
5154return map;
5255}
5356
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));
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));
5763for (; it != end; ++it) {
5864if (*it ==' :' ) {
5965break ;
6066 }
6167 }
62- return std::string (boost::begin (user_info_range), it);
68+ return typename string<Tag>:: type (boost::begin (user_info_range), it);
6369}
6470
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));
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));
6877for (; it != end; ++it) {
6978if (*it ==' :' ) {
7079 ++it;
7180break ;
7281 }
7382 }
74- return std::string (it,boost::end (user_info_range));
83+ return typename string<Tag>:: type (it,boost::end (user_info_range));
7584}
7685
77- std::stringdecoded_path (const uri &uri_) {
78- uri::const_range_type path_range = uri_.path_range ();
79- std::string decoded_path;
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;
8092decode (path_range,std::back_inserter (decoded_path));
8193return decoded_path;
8294}
8395
84- std::stringdecoded_query (const uri &uri_) {
85- uri::const_range_type query_range = uri_.query_range ();
86- std::string decoded_query;
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;
87102decode (query_range,std::back_inserter (decoded_query));
88103return decoded_query;
89104}
90105
91- std::stringdecoded_fragment (const uri &uri_) {
92- uri::const_range_type fragment_range = uri_.fragment_range ();
93- std::string decoded_fragment;
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;
94112decode (fragment_range,std::back_inserter (decoded_fragment));
95113return decoded_fragment;
96114}