Adds asio library and Storage Module
This commit is contained in:
1 parent
79a6ee5779
commit
30439acd43
4869 files changed
+618801
-903
No files matched your search
@@ -0,0 +1,522 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title>buffer</title>
|
||||
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
|
||||
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||
<link rel="home" href="../../index.html" title="Asio">
|
||||
<link rel="up" href="../reference.html" title="Reference">
|
||||
<link rel="prev" href="bind_executor/overload2.html" title="bind_executor (2 of 2 overloads)">
|
||||
<link rel="next" href="buffer/overload1.html" title="buffer (1 of 32 overloads)">
|
||||
</head>
|
||||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="p" href="bind_executor/overload2.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="buffer/overload1.html"><img src="../../next.png" alt="Next"></a>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="titlepage"><div><div><h3 class="title">
|
||||
<a name="asio.reference.buffer"></a><a class="link" href="buffer.html" title="buffer">buffer</a>
|
||||
</h3></div></div></div>
|
||||
<p>
|
||||
<a class="indexterm" name="asio.indexterm.buffer"></a>
|
||||
The <code class="computeroutput">asio::buffer</code> function is used
|
||||
to create a buffer object to represent raw memory, an array of POD elements,
|
||||
a vector of POD elements, or a std::string.
|
||||
</p>
|
||||
<p>
|
||||
Create a new modifiable buffer from an existing buffer.
|
||||
</p>
|
||||
<pre class="programlisting">mutable_buffer <a class="link" href="buffer/overload1.html" title="buffer (1 of 32 overloads)">buffer</a>(
|
||||
const mutable_buffer & b);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload1.html" title="buffer (1 of 32 overloads)">more...</a></em></span>
|
||||
|
||||
mutable_buffer <a class="link" href="buffer/overload2.html" title="buffer (2 of 32 overloads)">buffer</a>(
|
||||
const mutable_buffer & b,
|
||||
std::size_t max_size_in_bytes);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload2.html" title="buffer (2 of 32 overloads)">more...</a></em></span>
|
||||
</pre>
|
||||
<p>
|
||||
Create a new non-modifiable buffer from an existing buffer.
|
||||
</p>
|
||||
<pre class="programlisting">const_buffer <a class="link" href="buffer/overload3.html" title="buffer (3 of 32 overloads)">buffer</a>(
|
||||
const const_buffer & b);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload3.html" title="buffer (3 of 32 overloads)">more...</a></em></span>
|
||||
|
||||
const_buffer <a class="link" href="buffer/overload4.html" title="buffer (4 of 32 overloads)">buffer</a>(
|
||||
const const_buffer & b,
|
||||
std::size_t max_size_in_bytes);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload4.html" title="buffer (4 of 32 overloads)">more...</a></em></span>
|
||||
</pre>
|
||||
<p>
|
||||
Create a new modifiable buffer that represents the given memory range.
|
||||
</p>
|
||||
<pre class="programlisting">mutable_buffer <a class="link" href="buffer/overload5.html" title="buffer (5 of 32 overloads)">buffer</a>(
|
||||
void * data,
|
||||
std::size_t size_in_bytes);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload5.html" title="buffer (5 of 32 overloads)">more...</a></em></span>
|
||||
</pre>
|
||||
<p>
|
||||
Create a new non-modifiable buffer that represents the given memory range.
|
||||
</p>
|
||||
<pre class="programlisting">const_buffer <a class="link" href="buffer/overload6.html" title="buffer (6 of 32 overloads)">buffer</a>(
|
||||
const void * data,
|
||||
std::size_t size_in_bytes);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload6.html" title="buffer (6 of 32 overloads)">more...</a></em></span>
|
||||
</pre>
|
||||
<p>
|
||||
Create a new modifiable buffer that represents the given POD array.
|
||||
</p>
|
||||
<pre class="programlisting">template<
|
||||
typename PodType,
|
||||
std::size_t N>
|
||||
mutable_buffer <a class="link" href="buffer/overload7.html" title="buffer (7 of 32 overloads)">buffer</a>(
|
||||
PodType (&data)[N]);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload7.html" title="buffer (7 of 32 overloads)">more...</a></em></span>
|
||||
|
||||
template<
|
||||
typename PodType,
|
||||
std::size_t N>
|
||||
mutable_buffer <a class="link" href="buffer/overload8.html" title="buffer (8 of 32 overloads)">buffer</a>(
|
||||
PodType (&data)[N],
|
||||
std::size_t max_size_in_bytes);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload8.html" title="buffer (8 of 32 overloads)">more...</a></em></span>
|
||||
</pre>
|
||||
<p>
|
||||
Create a new non-modifiable buffer that represents the given POD array.
|
||||
</p>
|
||||
<pre class="programlisting">template<
|
||||
typename PodType,
|
||||
std::size_t N>
|
||||
const_buffer <a class="link" href="buffer/overload9.html" title="buffer (9 of 32 overloads)">buffer</a>(
|
||||
const PodType (&data)[N]);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload9.html" title="buffer (9 of 32 overloads)">more...</a></em></span>
|
||||
|
||||
template<
|
||||
typename PodType,
|
||||
std::size_t N>
|
||||
const_buffer <a class="link" href="buffer/overload10.html" title="buffer (10 of 32 overloads)">buffer</a>(
|
||||
const PodType (&data)[N],
|
||||
std::size_t max_size_in_bytes);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload10.html" title="buffer (10 of 32 overloads)">more...</a></em></span>
|
||||
</pre>
|
||||
<p>
|
||||
Create a new modifiable buffer that represents the given POD array.
|
||||
</p>
|
||||
<pre class="programlisting">template<
|
||||
typename PodType,
|
||||
std::size_t N>
|
||||
mutable_buffer <a class="link" href="buffer/overload11.html" title="buffer (11 of 32 overloads)">buffer</a>(
|
||||
boost::array< PodType, N > & data);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload11.html" title="buffer (11 of 32 overloads)">more...</a></em></span>
|
||||
|
||||
template<
|
||||
typename PodType,
|
||||
std::size_t N>
|
||||
mutable_buffer <a class="link" href="buffer/overload12.html" title="buffer (12 of 32 overloads)">buffer</a>(
|
||||
boost::array< PodType, N > & data,
|
||||
std::size_t max_size_in_bytes);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload12.html" title="buffer (12 of 32 overloads)">more...</a></em></span>
|
||||
</pre>
|
||||
<p>
|
||||
Create a new non-modifiable buffer that represents the given POD array.
|
||||
</p>
|
||||
<pre class="programlisting">template<
|
||||
typename PodType,
|
||||
std::size_t N>
|
||||
const_buffer <a class="link" href="buffer/overload13.html" title="buffer (13 of 32 overloads)">buffer</a>(
|
||||
boost::array< const PodType, N > & data);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload13.html" title="buffer (13 of 32 overloads)">more...</a></em></span>
|
||||
|
||||
template<
|
||||
typename PodType,
|
||||
std::size_t N>
|
||||
const_buffer <a class="link" href="buffer/overload14.html" title="buffer (14 of 32 overloads)">buffer</a>(
|
||||
boost::array< const PodType, N > & data,
|
||||
std::size_t max_size_in_bytes);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload14.html" title="buffer (14 of 32 overloads)">more...</a></em></span>
|
||||
|
||||
template<
|
||||
typename PodType,
|
||||
std::size_t N>
|
||||
const_buffer <a class="link" href="buffer/overload15.html" title="buffer (15 of 32 overloads)">buffer</a>(
|
||||
const boost::array< PodType, N > & data);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload15.html" title="buffer (15 of 32 overloads)">more...</a></em></span>
|
||||
|
||||
template<
|
||||
typename PodType,
|
||||
std::size_t N>
|
||||
const_buffer <a class="link" href="buffer/overload16.html" title="buffer (16 of 32 overloads)">buffer</a>(
|
||||
const boost::array< PodType, N > & data,
|
||||
std::size_t max_size_in_bytes);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload16.html" title="buffer (16 of 32 overloads)">more...</a></em></span>
|
||||
</pre>
|
||||
<p>
|
||||
Create a new modifiable buffer that represents the given POD array.
|
||||
</p>
|
||||
<pre class="programlisting">template<
|
||||
typename PodType,
|
||||
std::size_t N>
|
||||
mutable_buffer <a class="link" href="buffer/overload17.html" title="buffer (17 of 32 overloads)">buffer</a>(
|
||||
std::array< PodType, N > & data);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload17.html" title="buffer (17 of 32 overloads)">more...</a></em></span>
|
||||
|
||||
template<
|
||||
typename PodType,
|
||||
std::size_t N>
|
||||
mutable_buffer <a class="link" href="buffer/overload18.html" title="buffer (18 of 32 overloads)">buffer</a>(
|
||||
std::array< PodType, N > & data,
|
||||
std::size_t max_size_in_bytes);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload18.html" title="buffer (18 of 32 overloads)">more...</a></em></span>
|
||||
</pre>
|
||||
<p>
|
||||
Create a new non-modifiable buffer that represents the given POD array.
|
||||
</p>
|
||||
<pre class="programlisting">template<
|
||||
typename PodType,
|
||||
std::size_t N>
|
||||
const_buffer <a class="link" href="buffer/overload19.html" title="buffer (19 of 32 overloads)">buffer</a>(
|
||||
std::array< const PodType, N > & data);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload19.html" title="buffer (19 of 32 overloads)">more...</a></em></span>
|
||||
|
||||
template<
|
||||
typename PodType,
|
||||
std::size_t N>
|
||||
const_buffer <a class="link" href="buffer/overload20.html" title="buffer (20 of 32 overloads)">buffer</a>(
|
||||
std::array< const PodType, N > & data,
|
||||
std::size_t max_size_in_bytes);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload20.html" title="buffer (20 of 32 overloads)">more...</a></em></span>
|
||||
|
||||
template<
|
||||
typename PodType,
|
||||
std::size_t N>
|
||||
const_buffer <a class="link" href="buffer/overload21.html" title="buffer (21 of 32 overloads)">buffer</a>(
|
||||
const std::array< PodType, N > & data);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload21.html" title="buffer (21 of 32 overloads)">more...</a></em></span>
|
||||
|
||||
template<
|
||||
typename PodType,
|
||||
std::size_t N>
|
||||
const_buffer <a class="link" href="buffer/overload22.html" title="buffer (22 of 32 overloads)">buffer</a>(
|
||||
const std::array< PodType, N > & data,
|
||||
std::size_t max_size_in_bytes);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload22.html" title="buffer (22 of 32 overloads)">more...</a></em></span>
|
||||
</pre>
|
||||
<p>
|
||||
Create a new modifiable buffer that represents the given POD vector.
|
||||
</p>
|
||||
<pre class="programlisting">template<
|
||||
typename PodType,
|
||||
typename Allocator>
|
||||
mutable_buffer <a class="link" href="buffer/overload23.html" title="buffer (23 of 32 overloads)">buffer</a>(
|
||||
std::vector< PodType, Allocator > & data);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload23.html" title="buffer (23 of 32 overloads)">more...</a></em></span>
|
||||
|
||||
template<
|
||||
typename PodType,
|
||||
typename Allocator>
|
||||
mutable_buffer <a class="link" href="buffer/overload24.html" title="buffer (24 of 32 overloads)">buffer</a>(
|
||||
std::vector< PodType, Allocator > & data,
|
||||
std::size_t max_size_in_bytes);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload24.html" title="buffer (24 of 32 overloads)">more...</a></em></span>
|
||||
</pre>
|
||||
<p>
|
||||
Create a new non-modifiable buffer that represents the given POD vector.
|
||||
</p>
|
||||
<pre class="programlisting">template<
|
||||
typename PodType,
|
||||
typename Allocator>
|
||||
const_buffer <a class="link" href="buffer/overload25.html" title="buffer (25 of 32 overloads)">buffer</a>(
|
||||
const std::vector< PodType, Allocator > & data);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload25.html" title="buffer (25 of 32 overloads)">more...</a></em></span>
|
||||
|
||||
template<
|
||||
typename PodType,
|
||||
typename Allocator>
|
||||
const_buffer <a class="link" href="buffer/overload26.html" title="buffer (26 of 32 overloads)">buffer</a>(
|
||||
const std::vector< PodType, Allocator > & data,
|
||||
std::size_t max_size_in_bytes);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload26.html" title="buffer (26 of 32 overloads)">more...</a></em></span>
|
||||
</pre>
|
||||
<p>
|
||||
Create a new modifiable buffer that represents the given string.
|
||||
</p>
|
||||
<pre class="programlisting">template<
|
||||
typename Elem,
|
||||
typename Traits,
|
||||
typename Allocator>
|
||||
mutable_buffer <a class="link" href="buffer/overload27.html" title="buffer (27 of 32 overloads)">buffer</a>(
|
||||
std::basic_string< Elem, Traits, Allocator > & data);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload27.html" title="buffer (27 of 32 overloads)">more...</a></em></span>
|
||||
|
||||
template<
|
||||
typename Elem,
|
||||
typename Traits,
|
||||
typename Allocator>
|
||||
mutable_buffer <a class="link" href="buffer/overload28.html" title="buffer (28 of 32 overloads)">buffer</a>(
|
||||
std::basic_string< Elem, Traits, Allocator > & data,
|
||||
std::size_t max_size_in_bytes);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload28.html" title="buffer (28 of 32 overloads)">more...</a></em></span>
|
||||
</pre>
|
||||
<p>
|
||||
Create a new non-modifiable buffer that represents the given string.
|
||||
</p>
|
||||
<pre class="programlisting">template<
|
||||
typename Elem,
|
||||
typename Traits,
|
||||
typename Allocator>
|
||||
const_buffer <a class="link" href="buffer/overload29.html" title="buffer (29 of 32 overloads)">buffer</a>(
|
||||
const std::basic_string< Elem, Traits, Allocator > & data);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload29.html" title="buffer (29 of 32 overloads)">more...</a></em></span>
|
||||
|
||||
template<
|
||||
typename Elem,
|
||||
typename Traits,
|
||||
typename Allocator>
|
||||
const_buffer <a class="link" href="buffer/overload30.html" title="buffer (30 of 32 overloads)">buffer</a>(
|
||||
const std::basic_string< Elem, Traits, Allocator > & data,
|
||||
std::size_t max_size_in_bytes);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload30.html" title="buffer (30 of 32 overloads)">more...</a></em></span>
|
||||
</pre>
|
||||
<p>
|
||||
Create a new modifiable buffer that represents the given string_view.
|
||||
</p>
|
||||
<pre class="programlisting">template<
|
||||
typename Elem,
|
||||
typename Traits>
|
||||
const_buffer <a class="link" href="buffer/overload31.html" title="buffer (31 of 32 overloads)">buffer</a>(
|
||||
basic_string_view< Elem, Traits > data);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload31.html" title="buffer (31 of 32 overloads)">more...</a></em></span>
|
||||
</pre>
|
||||
<p>
|
||||
Create a new non-modifiable buffer that represents the given string.
|
||||
</p>
|
||||
<pre class="programlisting">template<
|
||||
typename Elem,
|
||||
typename Traits>
|
||||
const_buffer <a class="link" href="buffer/overload32.html" title="buffer (32 of 32 overloads)">buffer</a>(
|
||||
basic_string_view< Elem, Traits > data,
|
||||
std::size_t max_size_in_bytes);
|
||||
<span class="emphasis"><em>» <a class="link" href="buffer/overload32.html" title="buffer (32 of 32 overloads)">more...</a></em></span>
|
||||
</pre>
|
||||
<p>
|
||||
A buffer object represents a contiguous region of memory as a 2-tuple consisting
|
||||
of a pointer and size in bytes. A tuple of the form <code class="computeroutput">{void*, size_t}</code>
|
||||
specifies a mutable (modifiable) region of memory. Similarly, a tuple of
|
||||
the form <code class="computeroutput">{const void*, size_t}</code> specifies a const (non-modifiable)
|
||||
region of memory. These two forms correspond to the classes <a class="link" href="mutable_buffer.html" title="mutable_buffer"><code class="computeroutput">mutable_buffer</code></a>
|
||||
and <a class="link" href="const_buffer.html" title="const_buffer"><code class="computeroutput">const_buffer</code></a>,
|
||||
respectively. To mirror C++'s conversion rules, a <a class="link" href="mutable_buffer.html" title="mutable_buffer"><code class="computeroutput">mutable_buffer</code></a>
|
||||
is implicitly convertible to a <a class="link" href="const_buffer.html" title="const_buffer"><code class="computeroutput">const_buffer</code></a>,
|
||||
and the opposite conversion is not permitted.
|
||||
</p>
|
||||
<p>
|
||||
The simplest use case involves reading or writing a single buffer of a specified
|
||||
size:
|
||||
</p>
|
||||
<pre class="programlisting">sock.send(asio::buffer(data, size));
|
||||
</pre>
|
||||
<p>
|
||||
In the above example, the return value of <code class="computeroutput">asio::buffer</code> meets
|
||||
the requirements of the ConstBufferSequence concept so that it may be directly
|
||||
passed to the socket's write function. A buffer created for modifiable memory
|
||||
also meets the requirements of the MutableBufferSequence concept.
|
||||
</p>
|
||||
<p>
|
||||
An individual buffer may be created from a builtin array, std::vector, std::array
|
||||
or boost::array of POD elements. This helps prevent buffer overruns by automatically
|
||||
determining the size of the buffer:
|
||||
</p>
|
||||
<pre class="programlisting">char d1[128];
|
||||
size_t bytes_transferred = sock.receive(asio::buffer(d1));
|
||||
|
||||
std::vector<char> d2(128);
|
||||
bytes_transferred = sock.receive(asio::buffer(d2));
|
||||
|
||||
std::array<char, 128> d3;
|
||||
bytes_transferred = sock.receive(asio::buffer(d3));
|
||||
|
||||
boost::array<char, 128> d4;
|
||||
bytes_transferred = sock.receive(asio::buffer(d4));
|
||||
</pre>
|
||||
<p>
|
||||
In all three cases above, the buffers created are exactly 128 bytes long.
|
||||
Note that a vector is <span class="emphasis"><em>never</em></span> automatically resized when
|
||||
creating or using a buffer. The buffer size is determined using the vector's
|
||||
<code class="computeroutput">size()</code> member function, and not its capacity.
|
||||
</p>
|
||||
<h5>
|
||||
<a name="asio.reference.buffer.h0"></a>
|
||||
<span><a name="asio.reference.buffer.accessing_buffer_contents"></a></span><a class="link" href="buffer.html#asio.reference.buffer.accessing_buffer_contents">Accessing
|
||||
Buffer Contents</a>
|
||||
</h5>
|
||||
<p>
|
||||
The contents of a buffer may be accessed using the <code class="computeroutput">data()</code> and
|
||||
<code class="computeroutput">size()</code> member functions:
|
||||
</p>
|
||||
<pre class="programlisting">asio::mutable_buffer b1 = ...;
|
||||
std::size_t s1 = b1.size();
|
||||
unsigned char* p1 = static_cast<unsigned char*>(b1.data());
|
||||
|
||||
asio::const_buffer b2 = ...;
|
||||
std::size_t s2 = b2.size();
|
||||
const void* p2 = b2.data();
|
||||
</pre>
|
||||
<p>
|
||||
The <code class="computeroutput">data()</code> member function permits violations of type safety,
|
||||
so uses of it in application code should be carefully considered.
|
||||
</p>
|
||||
<p>
|
||||
For convenience, a <a class="link" href="buffer_size.html" title="buffer_size"><code class="computeroutput">buffer_size</code></a>
|
||||
function is provided that works with both buffers and buffer sequences (that
|
||||
is, types meeting the ConstBufferSequence or MutableBufferSequence type requirements).
|
||||
In this case, the function returns the total size of all buffers in the sequence.
|
||||
</p>
|
||||
<h5>
|
||||
<a name="asio.reference.buffer.h1"></a>
|
||||
<span><a name="asio.reference.buffer.buffer_copying"></a></span><a class="link" href="buffer.html#asio.reference.buffer.buffer_copying">Buffer
|
||||
Copying</a>
|
||||
</h5>
|
||||
<p>
|
||||
The <a class="link" href="buffer_copy.html" title="buffer_copy"><code class="computeroutput">buffer_copy</code></a>
|
||||
function may be used to copy raw bytes between individual buffers and buffer
|
||||
sequences.
|
||||
</p>
|
||||
<p>
|
||||
In particular, when used with the <a class="link" href="buffer_size.html" title="buffer_size"><code class="computeroutput">buffer_size</code></a>
|
||||
function, the <a class="link" href="buffer_copy.html" title="buffer_copy"><code class="computeroutput">buffer_copy</code></a>
|
||||
function can be used to linearise a sequence of buffers. For example:
|
||||
</p>
|
||||
<pre class="programlisting">vector<const_buffer> buffers = ...;
|
||||
|
||||
vector<unsigned char> data(asio::buffer_size(buffers));
|
||||
asio::buffer_copy(asio::buffer(data), buffers);
|
||||
</pre>
|
||||
<p>
|
||||
Note that <a class="link" href="buffer_copy.html" title="buffer_copy"><code class="computeroutput">buffer_copy</code></a>
|
||||
is implemented in terms of <code class="computeroutput">memcpy</code>, and consequently it cannot
|
||||
be used to copy between overlapping memory regions.
|
||||
</p>
|
||||
<h5>
|
||||
<a name="asio.reference.buffer.h2"></a>
|
||||
<span><a name="asio.reference.buffer.buffer_invalidation"></a></span><a class="link" href="buffer.html#asio.reference.buffer.buffer_invalidation">Buffer
|
||||
Invalidation</a>
|
||||
</h5>
|
||||
<p>
|
||||
A buffer object does not have any ownership of the memory it refers to. It
|
||||
is the responsibility of the application to ensure the memory region remains
|
||||
valid until it is no longer required for an I/O operation. When the memory
|
||||
is no longer available, the buffer is said to have been invalidated.
|
||||
</p>
|
||||
<p>
|
||||
For the <code class="computeroutput">asio::buffer</code> overloads that accept an argument of type
|
||||
std::vector, the buffer objects returned are invalidated by any vector operation
|
||||
that also invalidates all references, pointers and iterators referring to
|
||||
the elements in the sequence (C++ Std, 23.2.4)
|
||||
</p>
|
||||
<p>
|
||||
For the <code class="computeroutput">asio::buffer</code> overloads that accept an argument of type
|
||||
std::basic_string, the buffer objects returned are invalidated according
|
||||
to the rules defined for invalidation of references, pointers and iterators
|
||||
referring to elements of the sequence (C++ Std, 21.3).
|
||||
</p>
|
||||
<h5>
|
||||
<a name="asio.reference.buffer.h3"></a>
|
||||
<span><a name="asio.reference.buffer.buffer_arithmetic"></a></span><a class="link" href="buffer.html#asio.reference.buffer.buffer_arithmetic">Buffer
|
||||
Arithmetic</a>
|
||||
</h5>
|
||||
<p>
|
||||
Buffer objects may be manipulated using simple arithmetic in a safe way which
|
||||
helps prevent buffer overruns. Consider an array initialised as follows:
|
||||
</p>
|
||||
<pre class="programlisting">boost::array<char, 6> a = { 'a', 'b', 'c', 'd', 'e' };
|
||||
</pre>
|
||||
<p>
|
||||
A buffer object <code class="computeroutput">b1</code> created using:
|
||||
</p>
|
||||
<pre class="programlisting">b1 = asio::buffer(a);
|
||||
</pre>
|
||||
<p>
|
||||
represents the entire array, <code class="computeroutput">{ 'a', 'b', 'c', 'd', 'e' }</code>. An
|
||||
optional second argument to the <code class="computeroutput">asio::buffer</code> function may be
|
||||
used to limit the size, in bytes, of the buffer:
|
||||
</p>
|
||||
<pre class="programlisting">b2 = asio::buffer(a, 3);
|
||||
</pre>
|
||||
<p>
|
||||
such that <code class="computeroutput">b2</code> represents the data <code class="computeroutput">{ 'a', 'b', 'c' }</code>.
|
||||
Even if the size argument exceeds the actual size of the array, the size
|
||||
of the buffer object created will be limited to the array size.
|
||||
</p>
|
||||
<p>
|
||||
An offset may be applied to an existing buffer to create a new one:
|
||||
</p>
|
||||
<pre class="programlisting">b3 = b1 + 2;
|
||||
</pre>
|
||||
<p>
|
||||
where <code class="computeroutput">b3</code> will set to represent <code class="computeroutput">{ 'c', 'd', 'e' }</code>.
|
||||
If the offset exceeds the size of the existing buffer, the newly created
|
||||
buffer will be empty.
|
||||
</p>
|
||||
<p>
|
||||
Both an offset and size may be specified to create a buffer that corresponds
|
||||
to a specific range of bytes within an existing buffer:
|
||||
</p>
|
||||
<pre class="programlisting">b4 = asio::buffer(b1 + 1, 3);
|
||||
</pre>
|
||||
<p>
|
||||
so that <code class="computeroutput">b4</code> will refer to the bytes <code class="computeroutput">{ 'b', 'c', 'd' }</code>.
|
||||
</p>
|
||||
<h5>
|
||||
<a name="asio.reference.buffer.h4"></a>
|
||||
<span><a name="asio.reference.buffer.buffers_and_scatter_gather_i_o"></a></span><a class="link" href="buffer.html#asio.reference.buffer.buffers_and_scatter_gather_i_o">Buffers and
|
||||
Scatter-Gather I/O</a>
|
||||
</h5>
|
||||
<p>
|
||||
To read or write using multiple buffers (i.e. scatter-gather I/O), multiple
|
||||
buffer objects may be assigned into a container that supports the MutableBufferSequence
|
||||
(for read) or ConstBufferSequence (for write) concepts:
|
||||
</p>
|
||||
<pre class="programlisting">char d1[128];
|
||||
std::vector<char> d2(128);
|
||||
boost::array<char, 128> d3;
|
||||
|
||||
boost::array<mutable_buffer, 3> bufs1 = {
|
||||
asio::buffer(d1),
|
||||
asio::buffer(d2),
|
||||
asio::buffer(d3) };
|
||||
bytes_transferred = sock.receive(bufs1);
|
||||
|
||||
std::vector<const_buffer> bufs2;
|
||||
bufs2.push_back(asio::buffer(d1));
|
||||
bufs2.push_back(asio::buffer(d2));
|
||||
bufs2.push_back(asio::buffer(d3));
|
||||
bytes_transferred = sock.send(bufs2);
|
||||
</pre>
|
||||
<h5>
|
||||
<a name="asio.reference.buffer.h5"></a>
|
||||
<span><a name="asio.reference.buffer.requirements"></a></span><a class="link" href="buffer.html#asio.reference.buffer.requirements">Requirements</a>
|
||||
</h5>
|
||||
<p>
|
||||
<span class="emphasis"><em>Header: </em></span><code class="literal">asio/buffer.hpp</code>
|
||||
</p>
|
||||
<p>
|
||||
<span class="emphasis"><em>Convenience header: </em></span><code class="literal">asio.hpp</code>
|
||||
</p>
|
||||
</div>
|
||||
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||
<td align="left"></td>
|
||||
<td align="right"><div class="copyright-footer">Copyright © 2003-2020 Christopher M.
|
||||
Kohlhoff<p>
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||
</p>
|
||||
</div></td>
|
||||
</tr></table>
|
||||
<hr>
|
||||
<div class="spirit-nav">
|
||||
<a accesskey="p" href="bind_executor/overload2.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="buffer/overload1.html"><img src="../../next.png" alt="Next"></a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in new issue
Block a user