$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Eugene M. Kim (gene_at_[hidden])
Date: 2008-01-23 05:23:59
Greetings,
On UNIX-like platforms, 
boost::asio::detail::socket_option::{boolean,integer} templates are very 
useful when defining socket option classes for non-standard options that 
are supported by the platform, e.g.:
namespace so = boost::asio::detail::socket_option;
typedef so::boolean<SOL_SOCKET, SO_REUSEADDR>   reuse_addr;
typedef so::boolean<SOL_SOCKET, SO_REUSEPORT>   reuse_port;
typedef so::boolean<SOL_SOCKET, SO_ERROR>       pending_error;
typedef so::integer<SOL_SOCKET, SO_SNDLOWAT>    send_low_watermark;
typedef so::integer<SOL_SOCKET, SO_RCVLOWAT>    recv_low_watermark;
typedef so::boolean<IPPROTO_IP, IP_HDRINCL>     include_header;
typedef so::boolean<IPPROTO_IP, IP_DONTFRAG>    do_not_fragment;
typedef so::integer<IPPROTO_IP, IP_TOS>         type_of_service;
typedef so::integer<IPPROTO_IP, IP_TTL>         time_to_live;
... and so on.
It is not suitable to include these non-standard options in the asio 
library itself, but it seems justifiable to move the boolean/integer 
templates out of boost::asio::detail and into boost::asio.
Also, many socket options take a C struct as an argument, so a template 
for such options might be useful as well:
template <int Level, int Name, class Value>
class typed
: public Value
{
  typedef Value value;
  template <typename Protocol>
  int level(const Protocol &) const
  {
    return Level;
  }
  template <typename Protocol>
  int name(const Protocol &) const
  {
    return Name;
  }
  template <typename Protocol>
  value *data(const Protocol &)
  {
    return (value *)this;
  }
  template <typename Protocol>
  std::size_t size(const Protocol &) const
  {
    return sizeof(Value);
  }
  template <typename Protocol>
  void resize(const Protocol &, std::size_t s) const
  {
    if (s != sizeof(Value))
      throw std::length_error("resizing fixed-length socket option");
  }
};
Then it becomes trivial to define and use such socket options:
typedef typed<SOL_SOCKET, SO_SNDTIMEO, struct ::timeval> send_timeout;
typedef typed<SOL_SOCKET, SO_RCVTIMEO, struct ::timeval> recv_timeout;
send_timeout sndtimeo;
sndtimeo.tv_sec = 1;
sndtimeo.tv_usec = 0;
Would this template be appropriate for inclusion in a future version of 
asio?  Just my $.02.
Cheers,
Eugene