2016-05-28 09:23:54 -04:00
|
|
|
[/
|
2017-02-06 20:07:03 -05:00
|
|
|
Copyright (c) 2013-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
|
2016-05-28 09:23:54 -04:00
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
]
|
|
|
|
|
|
2017-06-04 17:25:55 -07:00
|
|
|
[section:DynamicBuffer DynamicBuffer]
|
2016-05-28 09:23:54 -04:00
|
|
|
|
|
|
|
|
A dynamic buffer encapsulates memory storage that may be automatically resized
|
|
|
|
|
as required, where the memory is divided into an input sequence followed by an
|
|
|
|
|
output sequence. These memory regions are internal to the dynamic buffer, but
|
|
|
|
|
direct access to the elements is provided to permit them to be efficiently used
|
|
|
|
|
with I/O operations, such as the send or receive operations of a socket. Data
|
|
|
|
|
written to the output sequence of a dynamic buffer object is appended to the
|
|
|
|
|
input sequence of the same object.
|
|
|
|
|
|
|
|
|
|
The interface to this concept is intended to permit the following
|
|
|
|
|
implementation strategies:
|
|
|
|
|
|
|
|
|
|
* A single contiguous octet array, which is reallocated as necessary to
|
2017-02-05 18:02:14 -05:00
|
|
|
accommodate changes in the size of the octet sequence. This is the
|
2017-05-05 12:34:36 -07:00
|
|
|
implementation approach currently offered by __flat_buffer__.
|
2016-05-28 09:23:54 -04:00
|
|
|
|
|
|
|
|
* A sequence of one or more octet arrays, where each array is of the same
|
|
|
|
|
size. Additional octet array objects are appended to the sequence to
|
|
|
|
|
accommodate changes in the size of the octet sequence.
|
|
|
|
|
|
|
|
|
|
* A sequence of one or more octet arrays of varying sizes. Additional octet
|
|
|
|
|
array objects are appended to the sequence to accommodate changes in the
|
2016-09-25 11:19:51 -04:00
|
|
|
size of the character sequence. This is the implementation approach
|
2017-05-05 12:34:36 -07:00
|
|
|
currently offered by __multi_buffer__.
|
2016-05-28 09:23:54 -04:00
|
|
|
|
2017-06-20 20:10:47 -07:00
|
|
|
In this table:
|
2016-05-28 09:23:54 -04:00
|
|
|
|
|
|
|
|
* `X` denotes a dynamic buffer class.
|
|
|
|
|
* `a` denotes a value of type `X`.
|
|
|
|
|
* `c` denotes a (possibly const) value of type `X`.
|
|
|
|
|
* `n` denotes a value of type `std::size_t`.
|
2017-05-10 12:03:00 -07:00
|
|
|
* `T` denotes a type meeting the requirements for __ConstBufferSequence__.
|
|
|
|
|
* `U` denotes a type meeting the requirements for __MutableBufferSequence__.
|
2016-05-28 09:23:54 -04:00
|
|
|
|
|
|
|
|
[table DynamicBuffer requirements
|
2017-05-28 09:05:29 -07:00
|
|
|
[[expression] [type] [semantics, pre/post-conditions]]
|
2016-05-28 09:23:54 -04:00
|
|
|
[
|
|
|
|
|
[`X::const_buffers_type`]
|
|
|
|
|
[`T`]
|
|
|
|
|
[
|
|
|
|
|
This type represents the memory associated with the input sequence.
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
[
|
|
|
|
|
[`X::mutable_buffers_type`]
|
|
|
|
|
[`U`]
|
|
|
|
|
[
|
|
|
|
|
This type represents the memory associated with the output sequence.
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
[
|
|
|
|
|
[`c.size()`]
|
|
|
|
|
[`std::size_t`]
|
|
|
|
|
[
|
|
|
|
|
Returns the size, in bytes, of the input sequence.
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
[
|
|
|
|
|
[`c.max_size()`]
|
|
|
|
|
[`std::size_t`]
|
|
|
|
|
[
|
|
|
|
|
Returns the permitted maximum of the sum of the sizes of the input
|
|
|
|
|
sequence and output sequence.
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
[
|
|
|
|
|
[`c.capacity()`]
|
|
|
|
|
[`std::size_t`]
|
|
|
|
|
[
|
|
|
|
|
Returns the maximum sum of the sizes of the input sequence and output
|
|
|
|
|
sequence that the dynamic buffer can hold without requiring reallocation.
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
[
|
|
|
|
|
[`c.data()`]
|
|
|
|
|
[`X::const_buffers_type`]
|
|
|
|
|
[
|
|
|
|
|
Returns a constant buffer sequence u that represents the memory
|
|
|
|
|
associated with the input sequence, and where `buffer_size(u) == size()`.
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
[
|
|
|
|
|
[`a.prepare(n)`]
|
2016-09-25 11:19:51 -04:00
|
|
|
[`X::mutable_buffers_type`]
|
2016-05-28 09:23:54 -04:00
|
|
|
[
|
|
|
|
|
Returns a mutable buffer sequence u representing the output sequence,
|
|
|
|
|
and where `buffer_size(u) == n`. The dynamic buffer reallocates memory
|
|
|
|
|
as required. All constant or mutable buffer sequences previously
|
|
|
|
|
obtained using `data()` or `prepare()` are invalidated.
|
|
|
|
|
|
|
|
|
|
Throws: `length_error` if `size() + n` exceeds `max_size()`.
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
[
|
|
|
|
|
[`a.commit(n)`]
|
|
|
|
|
[ ]
|
|
|
|
|
[
|
|
|
|
|
Appends `n` bytes from the start of the output sequence to the end of
|
|
|
|
|
the input sequence. The remainder of the output sequence is discarded.
|
|
|
|
|
If `n` is greater than the size of the output sequence, the entire
|
|
|
|
|
output sequence is appended to the input sequence. All constant or
|
|
|
|
|
mutable buffer sequences previously obtained using `data()` or
|
|
|
|
|
`prepare()` are invalidated.
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
[
|
|
|
|
|
[`a.consume(n)`]
|
|
|
|
|
[ ]
|
|
|
|
|
[
|
|
|
|
|
Removes `n` bytes from beginning of the input sequence. If `n` is
|
|
|
|
|
greater than the size of the input sequence, the entire input sequence
|
|
|
|
|
is removed. All constant or mutable buffer sequences previously
|
|
|
|
|
obtained using `data()` or `prepare()` are invalidated.
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
[endsect]
|