8
8
9
9
#include < boost/network/protocol/http/response_concept.hpp>
10
10
#include < boost/network/protocol/http/request_concept.hpp>
11
+ #include < boost/mpl/if.hpp>
11
12
#include < boost/concept/requires.hpp>
12
13
13
14
namespace boost { namespace network { namespace http {
@@ -18,36 +19,64 @@ namespace boost { namespace network { namespace http {
18
19
template <class Tag >
19
20
struct basic_request ;
20
21
21
- namespace impl {
22
-
23
- template <class Message >
24
- struct source_wrapper {
25
- typedef typename string<typename Message::tag>::type string_type;
26
- Message const & message_;
27
- source_wrapper (Message const & message)
28
- : message_(message) {}
29
- source_wrapper (source_wrapper const & other)
30
- : message_(other.message_) {}
31
- operator string_type const () {
32
- return message_.source ();
33
- }
34
- };
35
-
36
- } // namespace impl
37
-
38
- template <class Tag >
39
- inline BOOST_CONCEPT_REQUIRES (((Response<basic_response<Tag> >)),
40
- (impl::source_wrapper<basic_response<Tag> > const ))
41
- source(basic_response<Tag> const & message) {
42
- return impl::source_wrapper<basic_response<Tag> >(message);
22
+ #define BOOST_NETWORK_DEFINE_HTTP_WRAPPER (name, accessor ) \
23
+ struct name ##_pod_accessor { \
24
+ protected: \
25
+ template <class Message > \
26
+ typename Message::string_type const & \
27
+ get_value (Message const & message) const { \
28
+ return message.accessor ; \
29
+ } \
30
+ }; \
31
+ \
32
+ struct name ##_member_accessor { \
33
+ protected: \
34
+ template <class Message > \
35
+ typename Message::string_type \
36
+ get_value (Message const & message) const { \
37
+ return message.accessor (); \
38
+ } \
39
+ }; \
40
+ \
41
+ template <class Tag > \
42
+ struct name ##_wrapper_impl : \
43
+ mpl::if_< \
44
+ is_base_of<tags::pod, Tag>, \
45
+ name##_pod_accessor, \
46
+ name##_member_accessor \
47
+ > \
48
+ {}; \
49
+ \
50
+ template <class Message > \
51
+ struct name ##_wrapper : \
52
+ name##_wrapper_impl<typename Message::tag>::type { \
53
+ typedef typename string<typename Message::tag>::type \
54
+ string_type; \
55
+ Message const & message_; \
56
+ name##_wrapper(Message const & message) \
57
+ : message_(message) {} \
58
+ name##_wrapper(name##_wrapper const & other) \
59
+ : message_(other.message_) {} \
60
+ operator string_type const () { \
61
+ return this ->get_value (message_); \
62
+ } \
63
+ }; \
64
+ \
65
+ template <class Tag > \
66
+ inline BOOST_CONCEPT_REQUIRES (((Response<basic_response<Tag> >)), \
67
+ (name##_wrapper<basic_response<Tag> > const )) \
68
+ name (basic_response<Tag> const & message) { \
69
+ return name##_wrapper<basic_response<Tag> >(message); \
70
+ } \
71
+ \
72
+ template <class Tag > \
73
+ inline BOOST_CONCEPT_REQUIRES (((Request<basic_request<Tag> >)), \
74
+ (name##_wrapper<basic_request<Tag> > const )) \
75
+ name (basic_request<Tag> const & message) { \
76
+ return name##_wrapper<basic_request<Tag> >(message); \
43
77
}
44
78
45
- template <class Tag >
46
- inline BOOST_CONCEPT_REQUIRES (((Request<basic_request<Tag> >)),
47
- (impl::source_wrapper<basic_request<Tag> > const ))
48
- source(basic_request<Tag> const & message) {
49
- return impl::source_wrapper<basic_request<Tag> >(message);
50
- }
79
+ BOOST_NETWORK_DEFINE_HTTP_WRAPPER (source, source);
51
80
52
81
} // namespace http
53
82
0 commit comments