[/
 / 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:HandshakeHandler SSL handshake handler requirements]

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

[heading Examples]

A free function as a handshake handler:

  void handshake_handler(
      const asio::error_code& ec)
  {
    ...
  }

A handshake handler function object:

  struct handshake_handler
  {
    ...
    void operator()(
        const asio::error_code& ec)
    {
      ...
    }
    ...
  };

A lambda as a handshake handler:

  ssl_stream.async_handshake(...,
      [](const asio::error_code& ec)
      {
        ...
      });

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

  void my_class::handshake_handler(
      const asio::error_code& ec)
  {
    ...
  }
  ...
  ssl_stream.async_handshake(...,
      std::bind(&my_class::handshake_handler,
        this, std::placeholders::_1));

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

  void my_class::handshake_handler(
      const asio::error_code& ec)
  {
    ...
  }
  ...
  ssl_stream.async_handshake(...,
      boost::bind(&my_class::handshake_handler,
        this, asio::placeholders::error));

[endsect]
