[/
 / Copyright (c) 2003-2021 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:MutableBufferSequence Mutable buffer sequence requirements]

A ['mutable buffer sequence] represents a set of memory regions that may be
used to receive the output of an operation, such as the `receive` operation of
a socket.

A type `X` meets the `MutableBufferSequence` requirements if it satisfies the
requirements of `Destructible` (C++Std [destructible]) and
`CopyConstructible` (C++Std [copyconstructible]), as well as the additional
requirements listed below.

In the table below, `x` denotes a (possibly const) value of type `X`, and `u`
denotes an identifier.

[table MutableBufferSequence requirements
  [[expression] [return type] [assertion/note[br]pre/post-condition]]
  [
    [`asio::buffer_sequence_begin(x)`[br]
     `asio::buffer_sequence_end(x)`]
    [An iterator type meeting the requirements for bidirectional iterators
     (C++Std \[bidirectional.iterators\]) whose value type is convertible to
     `mutable_buffer`.]
    []
  ]
  [
    [``
      X u(x);
    ``]
    []
    [post:[br]
     ``
       equal(
         asio::buffer_sequence_begin(x),
         asio::buffer_sequence_end(x),
         asio::buffer_sequence_begin(u),
         asio::buffer_sequence_end(u),
         [](const mutable_buffer& b1,
            const mutable_buffer& b2)
          {
            return b1.data() == b2.data()
                && b1.size() == b2.size();
          })
     ``]
  ]
]

[endsect]
