// Copyright Dean Michael Berris 2007-2010. // 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_DIRECTIVES_HEADER_HPP__ #define __NETWORK_MESSAGE_DIRECTIVES_HEADER_HPP__ #include #include #include #include #include #include #include #include #include namespace boost { namespace network { namespace impl { template struct header_directive { explicit header_directive(KeyType const & header_name, ValueType const & header_value) : _header_name(header_name), _header_value(header_value) { }; template struct pod_directive { template static void eval(Message const & message, T1 const & key, T2 const & value) { typedef typename Message::headers_container_type::value_type value_type; value_type value_ = { key, value }; message.headers.insert(message.headers.end(), value_); } }; template struct normal_directive { template static void eval(Message const & message, T1 const & key, T2 const & value) { typedef typename Message::headers_container_type::value_type value_type; message.add_header(value_type(key, value)); } }; template struct directive_impl : mpl::if_< is_base_of< tags::pod, typename Message::tag >, pod_directive, normal_directive >::type {}; template void operator() (Message const & msg) const { typedef typename Message::headers_container_type::value_type value_type; directive_impl::eval(msg, _header_name, _header_value); } private: KeyType const & _header_name; ValueType const & _header_value; }; } // namespace impl template inline impl::header_directive header(T1 const & header_name, T2 const & header_value) { return impl::header_directive(header_name, header_value); } } // namespace network } // namespace boost #endif // __NETWORK_MESSAGE_DIRECTIVES_HEADER_HPP__