// 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_HEADERS_HPP__ #define __NETWORK_MESSAGE_WRAPPERS_HEADERS_HPP__ #include #include #include #include #include namespace boost { namespace network { /// Template metaprogram to get the range type for a message template struct headers_range { typedef typename headers_container::type headers_container_type; typedef typename boost::iterator_range type; }; template struct basic_message; /** headers wrapper for messages. * * This exposes an interface similar to a map, indexable * using operator[] taking a string as the index and returns * a range of iterators (std::pair) * whose keys are all equal to the index string. * * This type is also convertible to a * headers_range >::type * Which allows for full range support. * * The type is also convertible to a * headers_container::type * Which copies the headers from the wrapped message. * */ namespace impl { template struct headers_wrapper : public detail::wrapper_base_const > { typedef Tag tag; typedef basic_message message_type; typedef typename string::type string_type; typedef typename headers_range::type range_type; typedef typename headers_container::type headers_container_type; typedef typename headers_container_type::const_iterator const_iterator; typedef typename headers_container_type::iterator iterator; typedef detail::wrapper_base_const > wrapper_base; explicit headers_wrapper(basic_message const & message_) : wrapper_base(message_) { }; range_type operator[] (string_type const & key) const { return headers_wrapper::_message.headers().equal_range(key); }; typename message_type::headers_container_type::size_type count(string_type const & key) const { return headers_wrapper::_message.headers().count(key); }; const_iterator begin() const { return headers_wrapper::_message.headers().begin(); }; const_iterator end() const { return headers_wrapper::_message.headers().end(); }; operator range_type () { return make_iterator_range(headers_wrapper::_message.headers().begin(), headers_wrapper::_message.headers().end()); }; operator headers_container_type () { return headers_wrapper::_message.headers(); } }; } // namespace impl /// Factory method to create the right wrapper object template inline impl::headers_wrapper headers(basic_message const & message_) { return impl::headers_wrapper(message_); } } // namespace network } // namespace boost #endif // __NETWORK_MESSAGE_WRAPPERS_HEADERS_HPP__