[/
 / Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com)
 /
 / 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)
 /]

[section:WriteHandler Write handler requirements]

A write handler must meet the requirements for a [link
asio.reference.Handler handler]. A value `h` of a write handler class
should work correctly in the expression `h(ec, s)`, where `ec` is an lvalue of
type `const error_code` and `s` is an lvalue of type `const size_t`.

[heading Examples]

A free function as a write handler:

  void write_handler(
      const asio::error_code& ec,
      std::size_t bytes_transferred)
  {
    ...
  }

A write handler function object:

  struct write_handler
  {
    ...
    void operator()(
        const asio::error_code& ec,
        std::size_t bytes_transferred)
    {
      ...
    }
    ...
  };

A lambda as a write handler:

  socket.async_write(...
      [](const asio::error_code& ec,
        std::size_t bytes_transferred)
      {
        ...
      });

A non-static class member function adapted to a write handler using
`std::bind()`:

  void my_class::write_handler(
      const asio::error_code& ec,
      std::size_t bytes_transferred)
  {
    ...
  }
  ...
  socket.async_write(...,
      std::bind(&my_class::write_handler,
        this, std::placeholders::_1,
        std::placeholders::_2));

A non-static class member function adapted to a write handler using
`boost::bind()`:

  void my_class::write_handler(
      const asio::error_code& ec,
      std::size_t bytes_transferred)
  {
    ...
  }
  ...
  socket.async_write(...,
      boost::bind(&my_class::write_handler,
        this, asio::placeholders::error,
        asio::placeholders::bytes_transferred));

[endsect]
