1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>Counted Stream </title> 5<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> 6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 7<link rel="home" href="../../../index.html" title="Chapter 1. Boost.Beast"> 8<link rel="up" href="../layered_streams.html" title="Layered Streams"> 9<link rel="prev" href="../layered_streams.html" title="Layered Streams"> 10<link rel="next" href="../buffer_types.html" title="Buffer Types"> 11</head> 12<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 13<table cellpadding="2" width="100%"><tr> 14<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> 15<td align="center"><a href="../../../../../../../index.html">Home</a></td> 16<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> 17<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 18<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 19<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> 20</tr></table> 21<hr> 22<div class="spirit-nav"> 23<a accesskey="p" href="../layered_streams.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../layered_streams.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../buffer_types.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> 24</div> 25<div class="section"> 26<div class="titlepage"><div><div><h4 class="title"> 27<a name="beast.using_io.layered_streams.counted_stream_example"></a><a class="link" href="counted_stream_example.html" title="Counted Stream ">Counted 28 Stream </a> 29</h4></div></div></div> 30<p> 31 This example shows the definition of a layered stream which keeps individual 32 counts of the total number of bytes read from and written to the next layer. 33 It meets the requirements for synchronous and asynchronous read and write 34 streams: 35 </p> 36<pre class="programlisting"><span class="comment">// A layered stream which counts the bytes read and bytes written on the next layer</span> 37<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">NextLayer</span><span class="special">></span> 38<span class="keyword">class</span> <span class="identifier">counted_stream</span> 39<span class="special">{</span> 40 <span class="identifier">NextLayer</span> <span class="identifier">next_layer_</span><span class="special">;</span> <span class="comment">// Reads and writes are passed through to this</span> 41 <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">bytes_read_</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="comment">// Holds the total bytes read</span> 42 <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">bytes_written_</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="comment">// Holds the total bytes written</span> 43 44 <span class="comment">// This is the "initiation" object passed to async_initiate to start the operation</span> 45 <span class="keyword">struct</span> <span class="identifier">run_read_op</span> 46 <span class="special">{</span> 47 <span class="keyword">template</span><span class="special"><</span> 48 <span class="keyword">class</span> <span class="identifier">ReadHandler</span><span class="special">,</span> 49 <span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">></span> 50 <span class="keyword">void</span> 51 <span class="keyword">operator</span><span class="special">()(</span> 52 <span class="identifier">ReadHandler</span><span class="special">&&</span> <span class="identifier">handler</span><span class="special">,</span> 53 <span class="identifier">counted_stream</span><span class="special">*</span> <span class="identifier">stream</span><span class="special">,</span> 54 <span class="identifier">MutableBufferSequence</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">buffers</span><span class="special">)</span> 55 <span class="special">{</span> 56 <span class="keyword">using</span> <span class="identifier">handler_type</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">decay</span><span class="special"><</span><span class="identifier">ReadHandler</span><span class="special">>::</span><span class="identifier">type</span><span class="special">;</span> 57 58 <span class="comment">// async_base handles all of the composed operation boilerplate for us</span> 59 <span class="keyword">using</span> <span class="identifier">base</span> <span class="special">=</span> <span class="identifier">async_base</span><span class="special"><</span> 60 <span class="identifier">handler_type</span><span class="special">,</span> <span class="identifier">beast</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special"><</span><span class="identifier">NextLayer</span><span class="special">>>;</span> 61 62 <span class="comment">// Our composed operation is implemented as a completion handler object</span> 63 <span class="keyword">struct</span> <span class="identifier">op</span> <span class="special">:</span> <span class="identifier">base</span> 64 <span class="special">{</span> 65 <span class="identifier">counted_stream</span><span class="special">&</span> <span class="identifier">stream_</span><span class="special">;</span> 66 67 <span class="identifier">op</span><span class="special">(</span> <span class="identifier">counted_stream</span><span class="special">&</span> <span class="identifier">stream</span><span class="special">,</span> 68 <span class="identifier">handler_type</span><span class="special">&&</span> <span class="identifier">handler</span><span class="special">,</span> 69 <span class="identifier">MutableBufferSequence</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">buffers</span><span class="special">)</span> 70 <span class="special">:</span> <span class="identifier">base</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">handler</span><span class="special">),</span> <span class="identifier">stream</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">())</span> 71 <span class="special">,</span> <span class="identifier">stream_</span><span class="special">(</span><span class="identifier">stream</span><span class="special">)</span> 72 <span class="special">{</span> 73 <span class="comment">// Start the asynchronous operation</span> 74 <span class="identifier">stream_</span><span class="special">.</span><span class="identifier">next_layer</span><span class="special">().</span><span class="identifier">async_read_some</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="keyword">this</span><span class="special">));</span> 75 <span class="special">}</span> 76 77 <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">bytes_transferred</span><span class="special">)</span> 78 <span class="special">{</span> 79 <span class="comment">// Count the bytes transferred towards the total</span> 80 <span class="identifier">stream_</span><span class="special">.</span><span class="identifier">bytes_read_</span> <span class="special">+=</span> <span class="identifier">bytes_transferred</span><span class="special">;</span> 81 82 <span class="keyword">this</span><span class="special">-></span><span class="identifier">complete_now</span><span class="special">(</span><span class="identifier">ec</span><span class="special">,</span> <span class="identifier">bytes_transferred</span><span class="special">);</span> 83 <span class="special">}</span> 84 <span class="special">};</span> 85 86 <span class="identifier">op</span><span class="special">(*</span><span class="identifier">stream</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">ReadHandler</span><span class="special">>(</span><span class="identifier">handler</span><span class="special">),</span> <span class="identifier">buffers</span><span class="special">);</span> 87 <span class="special">}</span> 88 <span class="special">};</span> 89 90 <span class="comment">// This is the "initiation" object passed to async_initiate to start the operation</span> 91 <span class="keyword">struct</span> <span class="identifier">run_write_op</span> 92 <span class="special">{</span> 93 <span class="keyword">template</span><span class="special"><</span> 94 <span class="keyword">class</span> <span class="identifier">WriteHandler</span><span class="special">,</span> 95 <span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">></span> 96 <span class="keyword">void</span> 97 <span class="keyword">operator</span><span class="special">()(</span> 98 <span class="identifier">WriteHandler</span><span class="special">&&</span> <span class="identifier">handler</span><span class="special">,</span> 99 <span class="identifier">counted_stream</span><span class="special">*</span> <span class="identifier">stream</span><span class="special">,</span> 100 <span class="identifier">ConstBufferSequence</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">buffers</span><span class="special">)</span> 101 <span class="special">{</span> 102 <span class="keyword">using</span> <span class="identifier">handler_type</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">decay</span><span class="special"><</span><span class="identifier">WriteHandler</span><span class="special">>::</span><span class="identifier">type</span><span class="special">;</span> 103 104 <span class="comment">// async_base handles all of the composed operation boilerplate for us</span> 105 <span class="keyword">using</span> <span class="identifier">base</span> <span class="special">=</span> <span class="identifier">async_base</span><span class="special"><</span> 106 <span class="identifier">handler_type</span><span class="special">,</span> <span class="identifier">beast</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special"><</span><span class="identifier">NextLayer</span><span class="special">>>;</span> 107 108 <span class="comment">// Our composed operation is implemented as a completion handler object</span> 109 <span class="keyword">struct</span> <span class="identifier">op</span> <span class="special">:</span> <span class="identifier">base</span> 110 <span class="special">{</span> 111 <span class="identifier">counted_stream</span><span class="special">&</span> <span class="identifier">stream_</span><span class="special">;</span> 112 113 <span class="identifier">op</span><span class="special">(</span> <span class="identifier">counted_stream</span><span class="special">&</span> <span class="identifier">stream</span><span class="special">,</span> 114 <span class="identifier">handler_type</span><span class="special">&&</span> <span class="identifier">handler</span><span class="special">,</span> 115 <span class="identifier">ConstBufferSequence</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">buffers</span><span class="special">)</span> 116 <span class="special">:</span> <span class="identifier">base</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">handler</span><span class="special">),</span> <span class="identifier">stream</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">())</span> 117 <span class="special">,</span> <span class="identifier">stream_</span><span class="special">(</span><span class="identifier">stream</span><span class="special">)</span> 118 <span class="special">{</span> 119 <span class="comment">// Start the asynchronous operation</span> 120 <span class="identifier">stream_</span><span class="special">.</span><span class="identifier">next_layer</span><span class="special">().</span><span class="identifier">async_write_some</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(*</span><span class="keyword">this</span><span class="special">));</span> 121 <span class="special">}</span> 122 123 <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">bytes_transferred</span><span class="special">)</span> 124 <span class="special">{</span> 125 <span class="comment">// Count the bytes transferred towards the total</span> 126 <span class="identifier">stream_</span><span class="special">.</span><span class="identifier">bytes_written_</span> <span class="special">+=</span> <span class="identifier">bytes_transferred</span><span class="special">;</span> 127 128 <span class="keyword">this</span><span class="special">-></span><span class="identifier">complete_now</span><span class="special">(</span><span class="identifier">ec</span><span class="special">,</span> <span class="identifier">bytes_transferred</span><span class="special">);</span> 129 <span class="special">}</span> 130 <span class="special">};</span> 131 132 <span class="identifier">op</span><span class="special">(*</span><span class="identifier">stream</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">WriteHandler</span><span class="special">>(</span><span class="identifier">handler</span><span class="special">),</span> <span class="identifier">buffers</span><span class="special">);</span> 133 <span class="special">}</span> 134 <span class="special">};</span> 135 136<span class="keyword">public</span><span class="special">:</span> 137 <span class="comment">/// The type of executor used by this stream</span> 138 <span class="keyword">using</span> <span class="identifier">executor_type</span> <span class="special">=</span> <span class="identifier">beast</span><span class="special">::</span><span class="identifier">executor_type</span><span class="special"><</span><span class="identifier">NextLayer</span><span class="special">>;</span> 139 140 <span class="comment">/// Constructor</span> 141 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span><span class="special">...</span> <span class="identifier">Args</span><span class="special">></span> 142 <span class="keyword">explicit</span> 143 <span class="identifier">counted_stream</span><span class="special">(</span><span class="identifier">Args</span><span class="special">&&...</span> <span class="identifier">args</span><span class="special">)</span> 144 <span class="special">:</span> <span class="identifier">next_layer_</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">forward</span><span class="special"><</span><span class="identifier">Args</span><span class="special">>(</span><span class="identifier">args</span><span class="special">)...)</span> 145 <span class="special">{</span> 146 <span class="special">}</span> 147 148 <span class="comment">/// Returns an instance of the executor used to submit completion handlers</span> 149 <span class="identifier">executor_type</span> <span class="identifier">get_executor</span><span class="special">()</span> <span class="keyword">noexcept</span> 150 <span class="special">{</span> 151 <span class="keyword">return</span> <span class="identifier">next_layer_</span><span class="special">.</span><span class="identifier">get_executor</span><span class="special">();</span> 152 <span class="special">}</span> 153 154 <span class="comment">/// Returns a reference to the next layer</span> 155 <span class="identifier">NextLayer</span><span class="special">&</span> <span class="identifier">next_layer</span><span class="special">()</span> <span class="keyword">noexcept</span> 156 <span class="special">{</span> 157 <span class="keyword">return</span> <span class="identifier">next_layer_</span><span class="special">;</span> 158 <span class="special">}</span> 159 160 <span class="comment">/// Returns a reference to the next layer</span> 161 <span class="identifier">NextLayer</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">next_layer</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> 162 <span class="special">{</span> 163 <span class="keyword">return</span> <span class="identifier">next_layer_</span><span class="special">;</span> 164 <span class="special">}</span> 165 166 <span class="comment">/// Returns the total number of bytes read since the stream was constructed</span> 167 <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">bytes_read</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> 168 <span class="special">{</span> 169 <span class="keyword">return</span> <span class="identifier">bytes_read_</span><span class="special">;</span> 170 <span class="special">}</span> 171 172 <span class="comment">/// Returns the total number of bytes written since the stream was constructed</span> 173 <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">bytes_written</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> 174 <span class="special">{</span> 175 <span class="keyword">return</span> <span class="identifier">bytes_written_</span><span class="special">;</span> 176 <span class="special">}</span> 177 178 <span class="comment">/// Read some data from the stream</span> 179 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">></span> 180 <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">read_some</span><span class="special">(</span><span class="identifier">MutableBufferSequence</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">buffers</span><span class="special">)</span> 181 <span class="special">{</span> 182 <span class="keyword">auto</span> <span class="keyword">const</span> <span class="identifier">bytes_transferred</span> <span class="special">=</span> <span class="identifier">next_layer_</span><span class="special">.</span><span class="identifier">read_some</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">);</span> 183 <span class="identifier">bytes_read_</span> <span class="special">+=</span> <span class="identifier">bytes_transferred</span><span class="special">;</span> 184 <span class="keyword">return</span> <span class="identifier">bytes_transferred</span><span class="special">;</span> 185 <span class="special">}</span> 186 187 <span class="comment">/// Read some data from the stream</span> 188 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">></span> 189 <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">read_some</span><span class="special">(</span><span class="identifier">MutableBufferSequence</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&</span> <span class="identifier">ec</span><span class="special">)</span> 190 <span class="special">{</span> 191 <span class="keyword">auto</span> <span class="keyword">const</span> <span class="identifier">bytes_transferred</span> <span class="special">=</span> <span class="identifier">next_layer_</span><span class="special">.</span><span class="identifier">read_some</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">ec</span><span class="special">);</span> 192 <span class="identifier">bytes_read_</span> <span class="special">+=</span> <span class="identifier">bytes_transferred</span><span class="special">;</span> 193 <span class="keyword">return</span> <span class="identifier">bytes_transferred</span><span class="special">;</span> 194 <span class="special">}</span> 195 196 <span class="comment">/// Write some data to the stream</span> 197 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">></span> 198 <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">write_some</span><span class="special">(</span><span class="identifier">ConstBufferSequence</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">buffers</span><span class="special">)</span> 199 <span class="special">{</span> 200 <span class="keyword">auto</span> <span class="keyword">const</span> <span class="identifier">bytes_transferred</span> <span class="special">=</span> <span class="identifier">next_layer_</span><span class="special">.</span><span class="identifier">write_some</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">);</span> 201 <span class="identifier">bytes_written_</span> <span class="special">+=</span> <span class="identifier">bytes_transferred</span><span class="special">;</span> 202 <span class="keyword">return</span> <span class="identifier">bytes_transferred</span><span class="special">;</span> 203 <span class="special">}</span> 204 205 <span class="comment">/// Write some data to the stream</span> 206 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">></span> 207 <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">write_some</span><span class="special">(</span><span class="identifier">ConstBufferSequence</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">error_code</span><span class="special">&</span> <span class="identifier">ec</span><span class="special">)</span> 208 <span class="special">{</span> 209 <span class="keyword">auto</span> <span class="keyword">const</span> <span class="identifier">bytes_transferred</span> <span class="special">=</span> <span class="identifier">next_layer_</span><span class="special">.</span><span class="identifier">write_some</span><span class="special">(</span><span class="identifier">buffers</span><span class="special">,</span> <span class="identifier">ec</span><span class="special">);</span> 210 <span class="identifier">bytes_written_</span> <span class="special">+=</span> <span class="identifier">bytes_transferred</span><span class="special">;</span> 211 <span class="keyword">return</span> <span class="identifier">bytes_transferred</span><span class="special">;</span> 212 <span class="special">}</span> 213 214 <span class="comment">/// Read some data from the stream asynchronously</span> 215 <span class="keyword">template</span><span class="special"><</span> 216 <span class="keyword">class</span> <span class="identifier">MutableBufferSequence</span><span class="special">,</span> 217 <span class="keyword">class</span> <span class="identifier">ReadHandler</span> <span class="special">=</span> 218 <span class="identifier">net</span><span class="special">::</span><span class="identifier">default_completion_token_t</span><span class="special"><</span><span class="identifier">executor_type</span><span class="special">>></span> 219 <span class="identifier">BOOST_BEAST_ASYNC_RESULT2</span><span class="special">(</span><span class="identifier">ReadHandler</span><span class="special">)</span> 220 <span class="identifier">async_read_some</span><span class="special">(</span> 221 <span class="identifier">MutableBufferSequence</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">buffers</span><span class="special">,</span> 222 <span class="identifier">ReadHandler</span><span class="special">&&</span> <span class="identifier">handler</span> <span class="special">=</span> 223 <span class="identifier">net</span><span class="special">::</span><span class="identifier">default_completion_token_t</span><span class="special"><</span><span class="identifier">executor_type</span><span class="special">>{})</span> 224 <span class="special">{</span> 225 <span class="keyword">return</span> <span class="identifier">net</span><span class="special">::</span><span class="identifier">async_initiate</span><span class="special"><</span> 226 <span class="identifier">ReadHandler</span><span class="special">,</span> 227 <span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">)>(</span> 228 <span class="identifier">run_read_op</span><span class="special">{},</span> 229 <span class="identifier">handler</span><span class="special">,</span> 230 <span class="keyword">this</span><span class="special">,</span> 231 <span class="identifier">buffers</span><span class="special">);</span> 232 <span class="special">}</span> 233 234 <span class="comment">/// Write some data to the stream asynchronously</span> 235 <span class="keyword">template</span><span class="special"><</span> 236 <span class="keyword">class</span> <span class="identifier">ConstBufferSequence</span><span class="special">,</span> 237 <span class="keyword">class</span> <span class="identifier">WriteHandler</span> <span class="special">=</span> 238 <span class="identifier">net</span><span class="special">::</span><span class="identifier">default_completion_token_t</span><span class="special"><</span><span class="identifier">executor_type</span><span class="special">>></span> 239 <span class="identifier">BOOST_BEAST_ASYNC_RESULT2</span><span class="special">(</span><span class="identifier">WriteHandler</span><span class="special">)</span> 240 <span class="identifier">async_write_some</span><span class="special">(</span> 241 <span class="identifier">ConstBufferSequence</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">buffers</span><span class="special">,</span> 242 <span class="identifier">WriteHandler</span><span class="special">&&</span> <span class="identifier">handler</span> <span class="special">=</span> 243 <span class="identifier">net</span><span class="special">::</span><span class="identifier">default_completion_token_t</span><span class="special"><</span> 244 <span class="identifier">executor_type</span><span class="special">>{})</span> 245 <span class="special">{</span> 246 <span class="keyword">return</span> <span class="identifier">net</span><span class="special">::</span><span class="identifier">async_initiate</span><span class="special"><</span> 247 <span class="identifier">WriteHandler</span><span class="special">,</span> 248 <span class="keyword">void</span><span class="special">(</span><span class="identifier">error_code</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">)>(</span> 249 <span class="identifier">run_write_op</span><span class="special">{},</span> 250 <span class="identifier">handler</span><span class="special">,</span> 251 <span class="keyword">this</span><span class="special">,</span> 252 <span class="identifier">buffers</span><span class="special">);</span> 253 <span class="special">}</span> 254<span class="special">};</span> 255</pre> 256</div> 257<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 258<td align="left"></td> 259<td align="right"><div class="copyright-footer">Copyright © 2016-2019 Vinnie 260 Falco<p> 261 Distributed under the Boost Software License, Version 1.0. (See accompanying 262 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>) 263 </p> 264</div></td> 265</tr></table> 266<hr> 267<div class="spirit-nav"> 268<a accesskey="p" href="../layered_streams.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../layered_streams.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../buffer_types.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> 269</div> 270</body> 271</html> 272