[/
 / Copyright (c) 2003-2015 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:HandleService Handle service requirements]

A handle service must meet the requirements for an [link
asio.reference.IoObjectService I/O object service] with support for movability,
as well as the additional requirements listed below.

In the table below, `X` denotes a handle service class, `a` and `ao` denote
values of type `X`, `b` and `c` denote values of type `X::implementation_type`,
`n` denotes a value of type `X::native_handle_type`, `ec` denotes a value of
type `error_code`, and `u` and `v` denote identifiers.

[table HandleService requirements
  [[expression] [return type] [assertion/note\npre/post-condition]]
  [
    [`X::native_handle_type`]
    []
    [
      The implementation-defined native representation of a handle. Must
      satisfy the requirements of `CopyConstructible` types (C++ Std, 20.1.3),
      and the requirements of `Assignable` types (C++ Std, 23.1).
    ]
  ]
  [
    [`a.construct(b);`]
    []
    [
      From [link asio.reference.IoObjectService IoObjectService]
      requirements.\n
      post: `!a.is_open(b)`.
    ]
  ]
  [
    [`a.destroy(b);`]
    []
    [
      From [link asio.reference.IoObjectService IoObjectService]
      requirements. Implicitly cancels asynchronous operations, as if by calling
      `a.close(b, ec)`.
    ]
  ]
  [
    [``
      a.move_construct(b, c);
    ``]
    []
    [
      From [link asio.reference.IoObjectService IoObjectService] requirements.
      The underlying native representation is moved from `c` to `b`.
    ]
  ]
  [
    [``
      a.move_assign(b, ao, c);
    ``]
    []
    [
      From [link asio.reference.IoObjectService IoObjectService] requirements.
      Implicitly cancels asynchronous operations associated with `b`, as if by
      calling `a.close(b, ec)`. Then the underlying native representation is
      moved from `c` to `b`.
    ]
  ]
  [
    [``
      a.assign(b, n, ec);
    ``]
    [`error_code`]
    [
      pre: `!a.is_open(b)`.\n
      post: `!!ec || a.is_open(b)`.
    ]
  ]
  [
    [``
      a.is_open(b);
    ``]
    [`bool`]
    [
    ]
  ]
  [
    [``
      const X& u = a;
      const X::implementation_type& v = b;
      u.is_open(v);
    ``]
    [`bool`]
    [
    ]
  ]
  [
    [``
      a.close(b, ec);
    ``]
    [`error_code`]
    [
      If `a.is_open()` is true, causes any outstanding asynchronous operations
      to complete as soon as possible. Handlers for cancelled operations shall
      be passed the error code `error::operation_aborted`.\n
      post: `!a.is_open(b)`.
    ]
  ]
  [
    [``
      a.native_handle(b);
    ``]
    [`X::native_handle_type`]
    [
    ]
  ]
  [
    [``
      a.cancel(b, ec);
    ``]
    [`error_code`]
    [
      pre: `a.is_open(b)`.\n
      Causes any outstanding asynchronous operations to complete as soon as
      possible. Handlers for cancelled operations shall be passed the error
      code `error::operation_aborted`.
    ]
  ]
]

[endsect]
