// Copyright Dean Michael Berris 2007. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef __NETWORK_MESSAGE_WRAPPERS_BODY_HPP__ #define __NETWORK_MESSAGE_WRAPPERS_BODY_HPP__ #include #include #include namespace boost { namespace network { template struct body_range { typedef typename boost::iterator_range type; }; namespace impl { template struct body_wrapper : public detail::wrapper_base > { typedef basic_message message_type; typedef typename string::type string_type; typedef detail::wrapper_base > wrapper_base; explicit body_wrapper(basic_message & message_) : wrapper_base(message_) { }; operator string_type () const { return string_type(wrapper_base::_message.body()); }; std::size_t size() const { return wrapper_base::_message.body().size(); } operator boost::iterator_range< typename boost::range_iterator::type > () const { return boost::make_iterator_range(wrapper_base::_message.body()); } typename string_type::const_iterator begin() const { return wrapper_base::_message.body().begin(); } typename string_type::const_iterator end() const { return wrapper_base::_message.body().end(); } }; template struct body_wrapper_const : public detail::wrapper_base_const > { typedef basic_message message_type; typedef typename string::type string_type; typedef detail::wrapper_base_const > wrapper_base; explicit body_wrapper_const(basic_message const & message_) : wrapper_base(message_) {}; operator string_type () const { return string_type(wrapper_base::_message.body()); } std::size_t size() const { return wrapper_base::_message.body().size(); } operator boost::range_iterator () const { return boost::make_iterator_range(wrapper_base::_message.body()); } }; template inline std::ostream & operator<<(std::ostream & os, body_wrapper const & body) { os << static_cast::string_type>(body); return os; } template inline std::ostream & operator<<(std::ostream & os, body_wrapper_const const & body) { os << static_cast::string_type>(body); return os; } } // namespace impl template inline impl::body_wrapper const body(basic_message & message_) { return impl::body_wrapper(message_); } template inline impl::body_wrapper_const const body(basic_message const & message_) { return impl::body_wrapper_const(message_); } } // namespace network } // namespace boost #endif // __NETWORK_MESSAGE_WRAPPERS_BODY_HPP__