Repository: redboltz/async_mqtt (language: cpp)

Issue:
shared_ptr_array seems to confitional C++14 or C++17
async_mqtt is for C++17 or later. So should be refined.


Discussion / hints:

Fix patch:
diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc
index 2313714d4..ff0f326b2 100644
--- a/CHANGELOG.adoc
+++ b/CHANGELOG.adoc
@@ -4,12 +4,27 @@
 
 == 6.0.0
 === breaking changes
+* Re-organized directory strucure respect to boost libraries.
+** It affects the users only if include the specific header file directly.
+* Re-desined strand handling. #206
+** template parameter Strand is removed. Users can pass strand wrapped executor for multi threading.
+** associated properties of the completion handler are correctly propagated.
+* Removed buffer from packet interface except the infterface for adcanced user. #195
+** For example, create PUBLISH packet using "topic1", and get the filed as string by `topic()`.
+*** No `allocate_buffer("topic1")` is required.
 * Organized predefined headers. #194
 ** For mqtt, include `async_mqtt/all.hpp`. In addition,
 ** For mqtts, include `async_mqtt/predefined_layer/mqtts.hpp`
 ** For ws, include `async_mqtt/predefined_layer/ws.hpp`
 ** For wss, include `async_mqtt/predefined_layer/wss.hpp`
 
+=== other updates
+* Used bound allocator to allocate buffer for packet on receive. #222
+* Added convenient handshaking function for underlying layers. #216
+** TCP, TLS, Websocket, Websocket on TLS are handshaked by one function call.
+* Refined documents. #220, #222
+* Refined examples. #214, #220
+
 == 5.1.2
 * Refined custom underlying layer support. #190, #191, #193
 
diff --git a/doc/CHANGELOG.html b/doc/CHANGELOG.html
index ebd995a03..b2533f575 100644
--- a/doc/CHANGELOG.html
+++ b/doc/CHANGELOG.html
@@ -71,6 +71,46 @@ <h3 id="_breaking_changes">breaking changes</h3>
 <div class="ulist">
 <ul>
 <li>
+<p>Re-organized directory strucure respect to boost libraries.</p>
+<div class="ulist">
+<ul>
+<li>
+<p>It affects the users only if include the specific header file directly.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Re-desined strand handling. #206</p>
+<div class="ulist">
+<ul>
+<li>
+<p>template parameter Strand is removed. Users can pass strand wrapped executor for multi threading.</p>
+</li>
+<li>
+<p>associated properties of the completion handler are correctly propagated.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Removed buffer from packet interface except the infterface for adcanced user. #195</p>
+<div class="ulist">
+<ul>
+<li>
+<p>For example, create PUBLISH packet using "topic1", and get the filed as string by <code>topic()</code>.</p>
+<div class="ulist">
+<ul>
+<li>
+<p>No <code>allocate_buffer("topic1")</code> is required.</p>
+</li>
+</ul>
+</div>
+</li>
+</ul>
+</div>
+</li>
+<li>
 <p>Organized predefined headers. #194</p>
 <div class="ulist">
 <ul>
@@ -92,6 +132,32 @@ <h3 id="_breaking_changes">breaking changes</h3>
 </ul>
 </div>
 </div>
+<div class="sect2">
+<h3 id="_other_updates">other updates</h3>
+<div class="ulist">
+<ul>
+<li>
+<p>Used bound allocator to allocate buffer for packet on receive. #222</p>
+</li>
+<li>
+<p>Added convenient handshaking function for underlying layers. #216</p>
+<div class="ulist">
+<ul>
+<li>
+<p>TCP, TLS, Websocket, Websocket on TLS are handshaked by one function call.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Refined documents. #220, #222</p>
+</li>
+<li>
+<p>Refined examples. #214, #220</p>
+</li>
+</ul>
+</div>
+</div>
 </div>
 </div>
 <div class="sect1">
@@ -170,7 +236,7 @@ <h4 id="_broker">broker</h4>
 </div>
 </div>
 <div class="sect2">
-<h3 id="_other_updates">other updates</h3>
+<h3 id="_other_updates_2">other updates</h3>
 <div class="ulist">
 <ul>
 <li>
@@ -295,7 +361,7 @@ <h3 id="_breaking_changes_3">breaking changes</h3>
 </div>
 </div>
 <div class="sect2">
-<h3 id="_other_updates_2">other updates</h3>
+<h3 id="_other_updates_3">other updates</h3>
 <div class="ulist">
 <ul>
 <li>
@@ -333,7 +399,7 @@ <h3 id="_breaking_changes_4">breaking changes</h3>
 </div>
 </div>
 <div class="sect2">
-<h3 id="_other_updates_3">other updates</h3>
+<h3 id="_other_updates_4">other updates</h3>
 <div class="ulist">
 <ul>
 <li>
@@ -386,7 +452,7 @@ <h4 id="_broker_3">broker</h4>
 </div>
 </div>
 <div class="sect2">
-<h3 id="_other_updates_4">other updates</h3>
+<h3 id="_other_updates_5">other updates</h3>
 <div class="ulist">
 <ul>
 <li>
diff --git a/doc/api/buffer_8hpp_source.html b/doc/api/buffer_8hpp_source.html
index 163c1e239..2206b3de8 100644
--- a/doc/api/buffer_8hpp_source.html
+++ b/doc/api/buffer_8hpp_source.html
@@ -117,528 +117,527 @@
 <div class="line"><a id="l00015" name="l00015"></a><span class="lineno">   15</span><span class="preprocessor">#include &lt;boost/container_hash/hash.hpp&gt;</span></div>
 <div class="line"><a id="l00016" name="l00016"></a><span class="lineno">   16</span> </div>
 <div class="line"><a id="l00017" name="l00017"></a><span class="lineno">   17</span><span class="preprocessor">#include &lt;async_mqtt/util/move.hpp&gt;</span></div>
-<div class="line"><a id="l00018" name="l00018"></a><span class="lineno">   18</span><span class="preprocessor">#include &lt;async_mqtt/util/shared_ptr_array.hpp&gt;</span></div>
-<div class="line"><a id="l00019" name="l00019"></a><span class="lineno">   19</span><span class="preprocessor">#include &lt;async_mqtt/util/is_iterator.hpp&gt;</span></div>
-<div class="line"><a id="l00020" name="l00020"></a><span class="lineno">   20</span> </div>
-<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span><span class="keyword">namespace </span>async_mqtt {</div>
-<div class="line"><a id="l00027" name="l00027"></a><span class="lineno">   27</span> </div>
-<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span><span class="keyword">namespace </span>as = boost::asio;</div>
-<div class="line"><a id="l00029" name="l00029"></a><span class="lineno">   29</span> </div>
-<div class="foldopen" id="foldopen00038" data-start="{" data-end="};">
-<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html">   38</a></span><span class="keyword">class </span><a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a> {</div>
-<div class="line"><a id="l00039" name="l00039"></a><span class="lineno">   39</span><span class="keyword">public</span>:</div>
-<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span>    <span class="keyword">using </span>life_type = std::shared_ptr&lt;void&gt;;</div>
-<div class="line"><a id="l00041" name="l00041"></a><span class="lineno">   41</span>    <span class="keyword">using </span>traits_type = std::string_view::traits_type;</div>
-<div class="line"><a id="l00042" name="l00042"></a><span class="lineno">   42</span>    <span class="keyword">using </span>value_type = std::string_view::value_type;</div>
-<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span>    <span class="keyword">using </span>pointer = std::string_view::pointer;</div>
-<div class="line"><a id="l00044" name="l00044"></a><span class="lineno">   44</span>    <span class="keyword">using </span>const_pointer = std::string_view::const_pointer;</div>
-<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span>    <span class="keyword">using </span>reference = std::string_view::reference;</div>
-<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span>    <span class="keyword">using </span>const_reference = std::string_view::const_reference;</div>
-<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span>    <span class="keyword">using </span>iterator = std::string_view::iterator;</div>
-<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span>    <span class="keyword">using </span>const_iterator = std::string_view::const_iterator;</div>
-<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span>    <span class="keyword">using </span>const_reverse_iterator = std::string_view::const_reverse_iterator;</div>
-<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span>    <span class="keyword">using </span>reverse_iterator = std::string_view::reverse_iterator;</div>
-<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span>    <span class="keyword">using </span>size_type = std::string_view::size_type;</div>
-<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span>    <span class="keyword">using </span>difference_type = std::string_view::difference_type;</div>
-<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span> </div>
-<div class="line"><a id="l00054" name="l00054"></a><span class="lineno">   54</span>    <span class="keyword">static</span> <span class="keyword">constexpr</span> size_type npos = std::string_view::npos;</div>
-<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span> </div>
-<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">   59</a></span>    <span class="keyword">constexpr</span> <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a>() noexcept = default;</div>
-<div class="line"><a id="l00060" name="l00060"></a><span class="lineno">   60</span> </div>
-<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a088947de7fb4d32454075ca12a8cd6c5">   64</a></span>    <a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a>(<a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a> const&amp; other) = default;</div>
-<div class="line"><a id="l00065" name="l00065"></a><span class="lineno">   65</span> </div>
-<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a1b5fcfee9e7ed812e29ac77e991fcf24">   69</a></span>    <a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a>(<a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a>&amp;&amp; other) = default;</div>
-<div class="line"><a id="l00070" name="l00070"></a><span class="lineno">   70</span> </div>
-<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a0373b7226007473603184e423d20c0c3">   74</a></span>    <a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a>&amp; operator=(<a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a> const&amp; other) = default;</div>
-<div class="line"><a id="l00075" name="l00075"></a><span class="lineno">   75</span> </div>
-<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a9346d850d596a68325d70f5534c93694">   79</a></span>    <a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a>&amp; operator=(<a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a>&amp;&amp; other) = default;</div>
-<div class="line"><a id="l00080" name="l00080"></a><span class="lineno">   80</span> </div>
-<div class="foldopen" id="foldopen00087" data-start="{" data-end="}">
-<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a89dadefc440669338abeff8e8f282d45">   87</a></span>    constexpr <a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a>(<span class="keywordtype">char</span> const* s, std::<span class="keywordtype">size_t</span> count)</div>
-<div class="line"><a id="l00088" name="l00088"></a><span class="lineno">   88</span>        :view_{s, count}</div>
-<div class="line"><a id="l00089" name="l00089"></a><span class="lineno">   89</span>    {}</div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno">   18</span><span class="preprocessor">#include &lt;async_mqtt/util/is_iterator.hpp&gt;</span></div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno">   19</span> </div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno">   25</span><span class="keyword">namespace </span>async_mqtt {</div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span> </div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno">   27</span><span class="keyword">namespace </span>as = boost::asio;</div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span> </div>
+<div class="foldopen" id="foldopen00037" data-start="{" data-end="};">
+<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html">   37</a></span><span class="keyword">class </span><a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a> {</div>
+<div class="line"><a id="l00038" name="l00038"></a><span class="lineno">   38</span><span class="keyword">public</span>:</div>
+<div class="line"><a id="l00039" name="l00039"></a><span class="lineno">   39</span>    <span class="keyword">using </span>life_type = std::shared_ptr&lt;void&gt;;</div>
+<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span>    <span class="keyword">using </span>traits_type = std::string_view::traits_type;</div>
+<div class="line"><a id="l00041" name="l00041"></a><span class="lineno">   41</span>    <span class="keyword">using </span>value_type = std::string_view::value_type;</div>
+<div class="line"><a id="l00042" name="l00042"></a><span class="lineno">   42</span>    <span class="keyword">using </span>pointer = std::string_view::pointer;</div>
+<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span>    <span class="keyword">using </span>const_pointer = std::string_view::const_pointer;</div>
+<div class="line"><a id="l00044" name="l00044"></a><span class="lineno">   44</span>    <span class="keyword">using </span>reference = std::string_view::reference;</div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span>    <span class="keyword">using </span>const_reference = std::string_view::const_reference;</div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span>    <span class="keyword">using </span>iterator = std::string_view::iterator;</div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span>    <span class="keyword">using </span>const_iterator = std::string_view::const_iterator;</div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span>    <span class="keyword">using </span>const_reverse_iterator = std::string_view::const_reverse_iterator;</div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span>    <span class="keyword">using </span>reverse_iterator = std::string_view::reverse_iterator;</div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span>    <span class="keyword">using </span>size_type = std::string_view::size_type;</div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span>    <span class="keyword">using </span>difference_type = std::string_view::difference_type;</div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span> </div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span>    <span class="keyword">static</span> <span class="keyword">constexpr</span> size_type npos = std::string_view::npos;</div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno">   54</span> </div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">   58</a></span>    <span class="keyword">constexpr</span> <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a>() noexcept = default;</div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno">   59</span> </div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a088947de7fb4d32454075ca12a8cd6c5">   63</a></span>    <a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a>(<a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a> const&amp; other) = default;</div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno">   64</span> </div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a1b5fcfee9e7ed812e29ac77e991fcf24">   68</a></span>    <a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a>(<a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a>&amp;&amp; other) = default;</div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno">   69</span> </div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a0373b7226007473603184e423d20c0c3">   73</a></span>    <a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a>&amp; operator=(<a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a> const&amp; other) = default;</div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno">   74</span> </div>
+<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a9346d850d596a68325d70f5534c93694">   78</a></span>    <a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a>&amp; operator=(<a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a>&amp;&amp; other) = default;</div>
+<div class="line"><a id="l00079" name="l00079"></a><span class="lineno">   79</span> </div>
+<div class="foldopen" id="foldopen00086" data-start="{" data-end="}">
+<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a89dadefc440669338abeff8e8f282d45">   86</a></span>    constexpr <a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a>(<span class="keywordtype">char</span> const* s, std::<span class="keywordtype">size_t</span> count)</div>
+<div class="line"><a id="l00087" name="l00087"></a><span class="lineno">   87</span>        :view_{s, count}</div>
+<div class="line"><a id="l00088" name="l00088"></a><span class="lineno">   88</span>    {}</div>
 </div>
-<div class="line"><a id="l00090" name="l00090"></a><span class="lineno">   90</span> </div>
-<div class="foldopen" id="foldopen00097" data-start="{" data-end="}">
-<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a92d4036fb9070e0be851fa133b20c9b9">   97</a></span>    <span class="keyword">constexpr</span> <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a92d4036fb9070e0be851fa133b20c9b9">buffer</a>(<span class="keywordtype">char</span> <span class="keyword">const</span>* s)</div>
-<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span>        :view_{s}</div>
-<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span>    {}</div>
+<div class="line"><a id="l00089" name="l00089"></a><span class="lineno">   89</span> </div>
+<div class="foldopen" id="foldopen00096" data-start="{" data-end="}">
+<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a92d4036fb9070e0be851fa133b20c9b9">   96</a></span>    <span class="keyword">constexpr</span> <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a92d4036fb9070e0be851fa133b20c9b9">buffer</a>(<span class="keywordtype">char</span> <span class="keyword">const</span>* s)</div>
+<div class="line"><a id="l00097" name="l00097"></a><span class="lineno">   97</span>        :view_{s}</div>
+<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span>    {}</div>
 </div>
-<div class="line"><a id="l00100" name="l00100"></a><span class="lineno">  100</span> </div>
-<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">  108</span>    <span class="keyword">template</span> &lt;</div>
-<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">  109</span>        <span class="keyword">typename</span> It,</div>
-<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">  110</span>        <span class="keyword">typename</span> End,</div>
-<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">  111</span>        <span class="keyword">typename</span> std::enable_if_t&lt;</div>
-<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">  112</span>            is_input_iterator&lt;It&gt;::value &amp;&amp;</div>
-<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">  113</span>            is_input_iterator&lt;End&gt;::value</div>
-<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">  114</span>        &gt;* = <span class="keyword">nullptr</span></div>
-<div class="line"><a id="l00115" name="l00115"></a><span class="lineno">  115</span>    &gt;</div>
-<div class="foldopen" id="foldopen00116" data-start="{" data-end="}">
-<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a6354f235a64c4441d85d5874f341e2fe">  116</a></span>    <span class="keyword">constexpr</span> <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a6354f235a64c4441d85d5874f341e2fe">buffer</a>(It first, End last)</div>
-<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">  117</span>        :view_{&amp;*first, &amp;*first + std::distance(first, last)}</div>
-<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">  118</span>    {}</div>
+<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span> </div>
+<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">  107</span>    <span class="keyword">template</span> &lt;</div>
+<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">  108</span>        <span class="keyword">typename</span> It,</div>
+<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">  109</span>        <span class="keyword">typename</span> End,</div>
+<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">  110</span>        <span class="keyword">typename</span> std::enable_if_t&lt;</div>
+<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">  111</span>            is_input_iterator&lt;It&gt;::value &amp;&amp;</div>
+<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">  112</span>            is_input_iterator&lt;End&gt;::value</div>
+<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">  113</span>        &gt;* = <span class="keyword">nullptr</span></div>
+<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">  114</span>    &gt;</div>
+<div class="foldopen" id="foldopen00115" data-start="{" data-end="}">
+<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a6354f235a64c4441d85d5874f341e2fe">  115</a></span>    <span class="keyword">constexpr</span> <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a6354f235a64c4441d85d5874f341e2fe">buffer</a>(It first, End last)</div>
+<div class="line"><a id="l00116" name="l00116"></a><span class="lineno">  116</span>        :view_{&amp;*first, &amp;*first + std::distance(first, last)}</div>
+<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">  117</span>    {}</div>
 </div>
-<div class="line"><a id="l00119" name="l00119"></a><span class="lineno">  119</span> </div>
-<div class="foldopen" id="foldopen00126" data-start="{" data-end="}">
-<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#ac8ec6154fe9b524a5722848ea21fa7e0">  126</a></span>    <span class="keyword">explicit</span> <span class="keyword">constexpr</span> <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#ac8ec6154fe9b524a5722848ea21fa7e0">buffer</a>(std::string_view sv)</div>
-<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">  127</span>        : view_{force_move(sv)}</div>
-<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">  128</span>    {}</div>
+<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">  118</span> </div>
+<div class="foldopen" id="foldopen00125" data-start="{" data-end="}">
+<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#ac8ec6154fe9b524a5722848ea21fa7e0">  125</a></span>    <span class="keyword">explicit</span> <span class="keyword">constexpr</span> <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#ac8ec6154fe9b524a5722848ea21fa7e0">buffer</a>(std::string_view sv)</div>
+<div class="line"><a id="l00126" name="l00126"></a><span class="lineno">  126</span>        : view_{force_move(sv)}</div>
+<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">  127</span>    {}</div>
 </div>
-<div class="line"><a id="l00129" name="l00129"></a><span class="lineno">  129</span> </div>
-<div class="foldopen" id="foldopen00134" data-start="{" data-end="}">
-<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a24b4b37514e88ef089ef7b52b8293d0d">  134</a></span>    <span class="keyword">explicit</span> <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a24b4b37514e88ef089ef7b52b8293d0d">buffer</a>(std::string s) {</div>
-<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">  135</span>        <span class="keyword">auto</span> str = std::make_shared&lt;std::string&gt;(force_move(s));</div>
-<div class="line"><a id="l00136" name="l00136"></a><span class="lineno">  136</span>        view_ = *str;</div>
-<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">  137</span>        life_ = force_move(str);</div>
-<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">  138</span>    }</div>
+<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">  128</span> </div>
+<div class="foldopen" id="foldopen00133" data-start="{" data-end="}">
+<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a24b4b37514e88ef089ef7b52b8293d0d">  133</a></span>    <span class="keyword">explicit</span> <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a24b4b37514e88ef089ef7b52b8293d0d">buffer</a>(std::string s) {</div>
+<div class="line"><a id="l00134" name="l00134"></a><span class="lineno">  134</span>        <span class="keyword">auto</span> str = std::make_shared&lt;std::string&gt;(force_move(s));</div>
+<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">  135</span>        view_ = *str;</div>
+<div class="line"><a id="l00136" name="l00136"></a><span class="lineno">  136</span>        life_ = force_move(str);</div>
+<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">  137</span>    }</div>
 </div>
-<div class="line"><a id="l00139" name="l00139"></a><span class="lineno">  139</span> </div>
-<div class="foldopen" id="foldopen00146" data-start="{" data-end="}">
-<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a55fb8cd69efe05757c164e8c87d0b76c">  146</a></span>    <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a55fb8cd69efe05757c164e8c87d0b76c">buffer</a>(std::string_view sv, std::shared_ptr&lt;void&gt; life)</div>
-<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">  147</span>        : view_{force_move(sv)},</div>
-<div class="line"><a id="l00148" name="l00148"></a><span class="lineno">  148</span>          life_{force_move(life)}</div>
-<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">  149</span>    {}</div>
+<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">  138</span> </div>
+<div class="foldopen" id="foldopen00145" data-start="{" data-end="}">
+<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a55fb8cd69efe05757c164e8c87d0b76c">  145</a></span>    <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a55fb8cd69efe05757c164e8c87d0b76c">buffer</a>(std::string_view sv, std::shared_ptr&lt;void&gt; life)</div>
+<div class="line"><a id="l00146" name="l00146"></a><span class="lineno">  146</span>        : view_{force_move(sv)},</div>
+<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">  147</span>          life_{force_move(life)}</div>
+<div class="line"><a id="l00148" name="l00148"></a><span class="lineno">  148</span>    {}</div>
 </div>
-<div class="line"><a id="l00150" name="l00150"></a><span class="lineno">  150</span> </div>
-<div class="foldopen" id="foldopen00158" data-start="{" data-end="}">
-<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a55447262777041aa99c4c260382670fc">  158</a></span>    <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a55447262777041aa99c4c260382670fc">buffer</a>(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, std::size_t count,std::shared_ptr&lt;void&gt; life)</div>
-<div class="line"><a id="l00159" name="l00159"></a><span class="lineno">  159</span>        : view_{s, count},</div>
-<div class="line"><a id="l00160" name="l00160"></a><span class="lineno">  160</span>          life_{force_move(life)}</div>
-<div class="line"><a id="l00161" name="l00161"></a><span class="lineno">  161</span>    {}</div>
+<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">  149</span> </div>
+<div class="foldopen" id="foldopen00157" data-start="{" data-end="}">
+<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a55447262777041aa99c4c260382670fc">  157</a></span>    <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a55447262777041aa99c4c260382670fc">buffer</a>(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, std::size_t count,std::shared_ptr&lt;void&gt; life)</div>
+<div class="line"><a id="l00158" name="l00158"></a><span class="lineno">  158</span>        : view_{s, count},</div>
+<div class="line"><a id="l00159" name="l00159"></a><span class="lineno">  159</span>          life_{force_move(life)}</div>
+<div class="line"><a id="l00160" name="l00160"></a><span class="lineno">  160</span>    {}</div>
 </div>
-<div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span> </div>
-<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">  170</span>    <span class="keyword">template</span> &lt;</div>
-<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">  171</span>        <span class="keyword">typename</span> It,</div>
-<div class="line"><a id="l00172" name="l00172"></a><span class="lineno">  172</span>        <span class="keyword">typename</span> End,</div>
-<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">  173</span>        <span class="keyword">typename</span> std::enable_if_t&lt;</div>
-<div class="line"><a id="l00174" name="l00174"></a><span class="lineno">  174</span>            is_input_iterator&lt;It&gt;::value &amp;&amp;</div>
-<div class="line"><a id="l00175" name="l00175"></a><span class="lineno">  175</span>            is_input_iterator&lt;End&gt;::value</div>
-<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">  176</span>        &gt;* = <span class="keyword">nullptr</span></div>
-<div class="line"><a id="l00177" name="l00177"></a><span class="lineno">  177</span>    &gt;</div>
-<div class="foldopen" id="foldopen00178" data-start="{" data-end="}">
-<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#aceb1698f2803378a97b415e53b9f6a1c">  178</a></span>    <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#aceb1698f2803378a97b415e53b9f6a1c">buffer</a>(It first, End last, std::shared_ptr&lt;void&gt; life)</div>
-<div class="line"><a id="l00179" name="l00179"></a><span class="lineno">  179</span>        : view_{&amp;*first, static_cast&lt;std::size_t&gt;(std::distance(first, last))},</div>
-<div class="line"><a id="l00180" name="l00180"></a><span class="lineno">  180</span>          life_{force_move(life)}</div>
-<div class="line"><a id="l00181" name="l00181"></a><span class="lineno">  181</span> </div>
-<div class="line"><a id="l00182" name="l00182"></a><span class="lineno">  182</span>    {}</div>
+<div class="line"><a id="l00161" name="l00161"></a><span class="lineno">  161</span> </div>
+<div class="line"><a id="l00169" name="l00169"></a><span class="lineno">  169</span>    <span class="keyword">template</span> &lt;</div>
+<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">  170</span>        <span class="keyword">typename</span> It,</div>
+<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">  171</span>        <span class="keyword">typename</span> End,</div>
+<div class="line"><a id="l00172" name="l00172"></a><span class="lineno">  172</span>        <span class="keyword">typename</span> std::enable_if_t&lt;</div>
+<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">  173</span>            is_input_iterator&lt;It&gt;::value &amp;&amp;</div>
+<div class="line"><a id="l00174" name="l00174"></a><span class="lineno">  174</span>            is_input_iterator&lt;End&gt;::value</div>
+<div class="line"><a id="l00175" name="l00175"></a><span class="lineno">  175</span>        &gt;* = <span class="keyword">nullptr</span></div>
+<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">  176</span>    &gt;</div>
+<div class="foldopen" id="foldopen00177" data-start="{" data-end="}">
+<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#aceb1698f2803378a97b415e53b9f6a1c">  177</a></span>    <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#aceb1698f2803378a97b415e53b9f6a1c">buffer</a>(It first, End last, std::shared_ptr&lt;void&gt; life)</div>
+<div class="line"><a id="l00178" name="l00178"></a><span class="lineno">  178</span>        : view_{&amp;*first, static_cast&lt;std::size_t&gt;(std::distance(first, last))},</div>
+<div class="line"><a id="l00179" name="l00179"></a><span class="lineno">  179</span>          life_{force_move(life)}</div>
+<div class="line"><a id="l00180" name="l00180"></a><span class="lineno">  180</span> </div>
+<div class="line"><a id="l00181" name="l00181"></a><span class="lineno">  181</span>    {}</div>
 </div>
-<div class="line"><a id="l00183" name="l00183"></a><span class="lineno">  183</span> </div>
-<div class="line"><a id="l00184" name="l00184"></a><span class="lineno">  184</span>    <span class="keyword">constexpr</span> const_iterator begin() const noexcept {</div>
-<div class="line"><a id="l00185" name="l00185"></a><span class="lineno">  185</span>        <span class="keywordflow">return</span> view_.begin();</div>
-<div class="line"><a id="l00186" name="l00186"></a><span class="lineno">  186</span>    }</div>
-<div class="line"><a id="l00187" name="l00187"></a><span class="lineno">  187</span>    <span class="keyword">constexpr</span> const_iterator cbegin() const noexcept {</div>
-<div class="line"><a id="l00188" name="l00188"></a><span class="lineno">  188</span>        <span class="keywordflow">return</span> view_.cbegin();</div>
-<div class="line"><a id="l00189" name="l00189"></a><span class="lineno">  189</span>    }</div>
-<div class="line"><a id="l00190" name="l00190"></a><span class="lineno">  190</span>    <span class="keyword">constexpr</span> const_iterator end() const noexcept {</div>
-<div class="line"><a id="l00191" name="l00191"></a><span class="lineno">  191</span>        <span class="keywordflow">return</span> view_.end();</div>
-<div class="line"><a id="l00192" name="l00192"></a><span class="lineno">  192</span>    }</div>
-<div class="line"><a id="l00193" name="l00193"></a><span class="lineno">  193</span>    <span class="keyword">constexpr</span> const_iterator cend() const noexcept {</div>
-<div class="line"><a id="l00194" name="l00194"></a><span class="lineno">  194</span>        <span class="keywordflow">return</span> view_.cend();</div>
-<div class="line"><a id="l00195" name="l00195"></a><span class="lineno">  195</span>    }</div>
-<div class="line"><a id="l00196" name="l00196"></a><span class="lineno">  196</span>    <span class="keyword">constexpr</span> const_reverse_iterator rbegin() const noexcept {</div>
-<div class="line"><a id="l00197" name="l00197"></a><span class="lineno">  197</span>        <span class="keywordflow">return</span> view_.rbegin();</div>
-<div class="line"><a id="l00198" name="l00198"></a><span class="lineno">  198</span>    }</div>
-<div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span>    <span class="keyword">constexpr</span> const_reverse_iterator crbegin() const noexcept {</div>
-<div class="line"><a id="l00200" name="l00200"></a><span class="lineno">  200</span>        <span class="keywordflow">return</span> view_.crbegin();</div>
-<div class="line"><a id="l00201" name="l00201"></a><span class="lineno">  201</span>    }</div>
-<div class="line"><a id="l00202" name="l00202"></a><span class="lineno">  202</span>    <span class="keyword">constexpr</span> const_reverse_iterator rend() const noexcept {</div>
-<div class="line"><a id="l00203" name="l00203"></a><span class="lineno">  203</span>        <span class="keywordflow">return</span> view_.rend();</div>
-<div class="line"><a id="l00204" name="l00204"></a><span class="lineno">  204</span>    }</div>
-<div class="line"><a id="l00205" name="l00205"></a><span class="lineno">  205</span>    <span class="keyword">constexpr</span> const_reverse_iterator crend() const noexcept {</div>
-<div class="line"><a id="l00206" name="l00206"></a><span class="lineno">  206</span>        <span class="keywordflow">return</span> view_.crend();</div>
-<div class="line"><a id="l00207" name="l00207"></a><span class="lineno">  207</span>    }</div>
-<div class="line"><a id="l00208" name="l00208"></a><span class="lineno">  208</span> </div>
-<div class="line"><a id="l00209" name="l00209"></a><span class="lineno">  209</span>    <span class="keyword">constexpr</span> const_reference operator[](size_type pos)<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00210" name="l00210"></a><span class="lineno">  210</span>        <span class="keywordflow">return</span> view_[pos];</div>
-<div class="line"><a id="l00211" name="l00211"></a><span class="lineno">  211</span>    }</div>
-<div class="line"><a id="l00212" name="l00212"></a><span class="lineno">  212</span>    <span class="keyword">constexpr</span> const_reference at(size_type pos)<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00213" name="l00213"></a><span class="lineno">  213</span>        <span class="keywordflow">return</span> view_.at(pos);</div>
-<div class="line"><a id="l00214" name="l00214"></a><span class="lineno">  214</span>    }</div>
-<div class="line"><a id="l00215" name="l00215"></a><span class="lineno">  215</span> </div>
-<div class="line"><a id="l00216" name="l00216"></a><span class="lineno">  216</span>    <span class="keyword">constexpr</span> const_reference front()<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00217" name="l00217"></a><span class="lineno">  217</span>        <span class="keywordflow">return</span> view_.front();</div>
-<div class="line"><a id="l00218" name="l00218"></a><span class="lineno">  218</span>    }</div>
-<div class="line"><a id="l00219" name="l00219"></a><span class="lineno">  219</span>    <span class="keyword">constexpr</span> const_reference back()<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00220" name="l00220"></a><span class="lineno">  220</span>        <span class="keywordflow">return</span> view_.back();</div>
-<div class="line"><a id="l00221" name="l00221"></a><span class="lineno">  221</span>    }</div>
-<div class="line"><a id="l00222" name="l00222"></a><span class="lineno">  222</span> </div>
-<div class="line"><a id="l00223" name="l00223"></a><span class="lineno">  223</span>    <span class="keyword">constexpr</span> const_pointer data() const noexcept {</div>
-<div class="line"><a id="l00224" name="l00224"></a><span class="lineno">  224</span>        <span class="keywordflow">return</span> view_.data();</div>
-<div class="line"><a id="l00225" name="l00225"></a><span class="lineno">  225</span>    }</div>
-<div class="line"><a id="l00226" name="l00226"></a><span class="lineno">  226</span> </div>
-<div class="line"><a id="l00227" name="l00227"></a><span class="lineno">  227</span>    <span class="keyword">constexpr</span> size_type size() const noexcept {</div>
-<div class="line"><a id="l00228" name="l00228"></a><span class="lineno">  228</span>        <span class="keywordflow">return</span> view_.size();</div>
-<div class="line"><a id="l00229" name="l00229"></a><span class="lineno">  229</span>    }</div>
-<div class="line"><a id="l00230" name="l00230"></a><span class="lineno">  230</span>    <span class="keyword">constexpr</span> size_type length() const noexcept {</div>
-<div class="line"><a id="l00231" name="l00231"></a><span class="lineno">  231</span>        <span class="keywordflow">return</span> view_.length();</div>
-<div class="line"><a id="l00232" name="l00232"></a><span class="lineno">  232</span>    }</div>
-<div class="line"><a id="l00233" name="l00233"></a><span class="lineno">  233</span>    <span class="keyword">constexpr</span> size_type max_size() const noexcept {</div>
-<div class="line"><a id="l00234" name="l00234"></a><span class="lineno">  234</span>        <span class="keywordflow">return</span> view_.max_size();</div>
-<div class="line"><a id="l00235" name="l00235"></a><span class="lineno">  235</span>    }</div>
-<div class="line"><a id="l00236" name="l00236"></a><span class="lineno">  236</span> </div>
-<div class="line"><a id="l00237" name="l00237"></a><span class="lineno">  237</span>    <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> empty() const noexcept {</div>
-<div class="line"><a id="l00238" name="l00238"></a><span class="lineno">  238</span>        <span class="keywordflow">return</span> view_.empty();</div>
-<div class="line"><a id="l00239" name="l00239"></a><span class="lineno">  239</span>    }</div>
-<div class="line"><a id="l00240" name="l00240"></a><span class="lineno">  240</span> </div>
-<div class="line"><a id="l00241" name="l00241"></a><span class="lineno">  241</span>    <span class="keyword">constexpr</span> <span class="keywordtype">void</span> remove_prefix(size_type n) {</div>
-<div class="line"><a id="l00242" name="l00242"></a><span class="lineno">  242</span>        view_.remove_prefix(n);</div>
-<div class="line"><a id="l00243" name="l00243"></a><span class="lineno">  243</span>    }</div>
-<div class="line"><a id="l00244" name="l00244"></a><span class="lineno">  244</span> </div>
-<div class="line"><a id="l00245" name="l00245"></a><span class="lineno">  245</span>    <span class="keyword">constexpr</span> <span class="keywordtype">void</span> remove_suffix(size_type n) {</div>
-<div class="line"><a id="l00246" name="l00246"></a><span class="lineno">  246</span>        view_.remove_suffix(n);</div>
-<div class="line"><a id="l00247" name="l00247"></a><span class="lineno">  247</span>    }</div>
-<div class="line"><a id="l00248" name="l00248"></a><span class="lineno">  248</span> </div>
-<div class="line"><a id="l00249" name="l00249"></a><span class="lineno">  249</span>    <span class="keywordtype">void</span> swap(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a>&amp; buf) <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00250" name="l00250"></a><span class="lineno">  250</span>        view_.swap(buf.view_);</div>
-<div class="line"><a id="l00251" name="l00251"></a><span class="lineno">  251</span>        life_.swap(buf.life_);</div>
-<div class="line"><a id="l00252" name="l00252"></a><span class="lineno">  252</span>    }</div>
-<div class="line"><a id="l00253" name="l00253"></a><span class="lineno">  253</span> </div>
-<div class="line"><a id="l00254" name="l00254"></a><span class="lineno">  254</span>    size_type copy(<span class="keywordtype">char</span>* dest, size_type count, size_type pos = 0 )<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00255" name="l00255"></a><span class="lineno">  255</span>        <span class="keywordflow">return</span> view_.copy(dest, count, pos);</div>
-<div class="line"><a id="l00256" name="l00256"></a><span class="lineno">  256</span>    }</div>
-<div class="line"><a id="l00257" name="l00257"></a><span class="lineno">  257</span> </div>
-<div class="foldopen" id="foldopen00266" data-start="{" data-end="}">
-<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">  266</a></span>    <a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a> <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">substr</a>(size_type pos = 0, size_type count = npos) <span class="keyword">const</span>&amp; {</div>
-<div class="line"><a id="l00267" name="l00267"></a><span class="lineno">  267</span>        <span class="comment">// range is checked in std::string_view::substr.</span></div>
-<div class="line"><a id="l00268" name="l00268"></a><span class="lineno">  268</span>        <span class="keywordflow">return</span> <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a>(view_.substr(pos, count), life_);</div>
-<div class="line"><a id="l00269" name="l00269"></a><span class="lineno">  269</span>    }</div>
+<div class="line"><a id="l00182" name="l00182"></a><span class="lineno">  182</span> </div>
+<div class="line"><a id="l00183" name="l00183"></a><span class="lineno">  183</span>    <span class="keyword">constexpr</span> const_iterator begin() const noexcept {</div>
+<div class="line"><a id="l00184" name="l00184"></a><span class="lineno">  184</span>        <span class="keywordflow">return</span> view_.begin();</div>
+<div class="line"><a id="l00185" name="l00185"></a><span class="lineno">  185</span>    }</div>
+<div class="line"><a id="l00186" name="l00186"></a><span class="lineno">  186</span>    <span class="keyword">constexpr</span> const_iterator cbegin() const noexcept {</div>
+<div class="line"><a id="l00187" name="l00187"></a><span class="lineno">  187</span>        <span class="keywordflow">return</span> view_.cbegin();</div>
+<div class="line"><a id="l00188" name="l00188"></a><span class="lineno">  188</span>    }</div>
+<div class="line"><a id="l00189" name="l00189"></a><span class="lineno">  189</span>    <span class="keyword">constexpr</span> const_iterator end() const noexcept {</div>
+<div class="line"><a id="l00190" name="l00190"></a><span class="lineno">  190</span>        <span class="keywordflow">return</span> view_.end();</div>
+<div class="line"><a id="l00191" name="l00191"></a><span class="lineno">  191</span>    }</div>
+<div class="line"><a id="l00192" name="l00192"></a><span class="lineno">  192</span>    <span class="keyword">constexpr</span> const_iterator cend() const noexcept {</div>
+<div class="line"><a id="l00193" name="l00193"></a><span class="lineno">  193</span>        <span class="keywordflow">return</span> view_.cend();</div>
+<div class="line"><a id="l00194" name="l00194"></a><span class="lineno">  194</span>    }</div>
+<div class="line"><a id="l00195" name="l00195"></a><span class="lineno">  195</span>    <span class="keyword">constexpr</span> const_reverse_iterator rbegin() const noexcept {</div>
+<div class="line"><a id="l00196" name="l00196"></a><span class="lineno">  196</span>        <span class="keywordflow">return</span> view_.rbegin();</div>
+<div class="line"><a id="l00197" name="l00197"></a><span class="lineno">  197</span>    }</div>
+<div class="line"><a id="l00198" name="l00198"></a><span class="lineno">  198</span>    <span class="keyword">constexpr</span> const_reverse_iterator crbegin() const noexcept {</div>
+<div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span>        <span class="keywordflow">return</span> view_.crbegin();</div>
+<div class="line"><a id="l00200" name="l00200"></a><span class="lineno">  200</span>    }</div>
+<div class="line"><a id="l00201" name="l00201"></a><span class="lineno">  201</span>    <span class="keyword">constexpr</span> const_reverse_iterator rend() const noexcept {</div>
+<div class="line"><a id="l00202" name="l00202"></a><span class="lineno">  202</span>        <span class="keywordflow">return</span> view_.rend();</div>
+<div class="line"><a id="l00203" name="l00203"></a><span class="lineno">  203</span>    }</div>
+<div class="line"><a id="l00204" name="l00204"></a><span class="lineno">  204</span>    <span class="keyword">constexpr</span> const_reverse_iterator crend() const noexcept {</div>
+<div class="line"><a id="l00205" name="l00205"></a><span class="lineno">  205</span>        <span class="keywordflow">return</span> view_.crend();</div>
+<div class="line"><a id="l00206" name="l00206"></a><span class="lineno">  206</span>    }</div>
+<div class="line"><a id="l00207" name="l00207"></a><span class="lineno">  207</span> </div>
+<div class="line"><a id="l00208" name="l00208"></a><span class="lineno">  208</span>    <span class="keyword">constexpr</span> const_reference operator[](size_type pos)<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00209" name="l00209"></a><span class="lineno">  209</span>        <span class="keywordflow">return</span> view_[pos];</div>
+<div class="line"><a id="l00210" name="l00210"></a><span class="lineno">  210</span>    }</div>
+<div class="line"><a id="l00211" name="l00211"></a><span class="lineno">  211</span>    <span class="keyword">constexpr</span> const_reference at(size_type pos)<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00212" name="l00212"></a><span class="lineno">  212</span>        <span class="keywordflow">return</span> view_.at(pos);</div>
+<div class="line"><a id="l00213" name="l00213"></a><span class="lineno">  213</span>    }</div>
+<div class="line"><a id="l00214" name="l00214"></a><span class="lineno">  214</span> </div>
+<div class="line"><a id="l00215" name="l00215"></a><span class="lineno">  215</span>    <span class="keyword">constexpr</span> const_reference front()<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00216" name="l00216"></a><span class="lineno">  216</span>        <span class="keywordflow">return</span> view_.front();</div>
+<div class="line"><a id="l00217" name="l00217"></a><span class="lineno">  217</span>    }</div>
+<div class="line"><a id="l00218" name="l00218"></a><span class="lineno">  218</span>    <span class="keyword">constexpr</span> const_reference back()<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00219" name="l00219"></a><span class="lineno">  219</span>        <span class="keywordflow">return</span> view_.back();</div>
+<div class="line"><a id="l00220" name="l00220"></a><span class="lineno">  220</span>    }</div>
+<div class="line"><a id="l00221" name="l00221"></a><span class="lineno">  221</span> </div>
+<div class="line"><a id="l00222" name="l00222"></a><span class="lineno">  222</span>    <span class="keyword">constexpr</span> const_pointer data() const noexcept {</div>
+<div class="line"><a id="l00223" name="l00223"></a><span class="lineno">  223</span>        <span class="keywordflow">return</span> view_.data();</div>
+<div class="line"><a id="l00224" name="l00224"></a><span class="lineno">  224</span>    }</div>
+<div class="line"><a id="l00225" name="l00225"></a><span class="lineno">  225</span> </div>
+<div class="line"><a id="l00226" name="l00226"></a><span class="lineno">  226</span>    <span class="keyword">constexpr</span> size_type size() const noexcept {</div>
+<div class="line"><a id="l00227" name="l00227"></a><span class="lineno">  227</span>        <span class="keywordflow">return</span> view_.size();</div>
+<div class="line"><a id="l00228" name="l00228"></a><span class="lineno">  228</span>    }</div>
+<div class="line"><a id="l00229" name="l00229"></a><span class="lineno">  229</span>    <span class="keyword">constexpr</span> size_type length() const noexcept {</div>
+<div class="line"><a id="l00230" name="l00230"></a><span class="lineno">  230</span>        <span class="keywordflow">return</span> view_.length();</div>
+<div class="line"><a id="l00231" name="l00231"></a><span class="lineno">  231</span>    }</div>
+<div class="line"><a id="l00232" name="l00232"></a><span class="lineno">  232</span>    <span class="keyword">constexpr</span> size_type max_size() const noexcept {</div>
+<div class="line"><a id="l00233" name="l00233"></a><span class="lineno">  233</span>        <span class="keywordflow">return</span> view_.max_size();</div>
+<div class="line"><a id="l00234" name="l00234"></a><span class="lineno">  234</span>    }</div>
+<div class="line"><a id="l00235" name="l00235"></a><span class="lineno">  235</span> </div>
+<div class="line"><a id="l00236" name="l00236"></a><span class="lineno">  236</span>    <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> empty() const noexcept {</div>
+<div class="line"><a id="l00237" name="l00237"></a><span class="lineno">  237</span>        <span class="keywordflow">return</span> view_.empty();</div>
+<div class="line"><a id="l00238" name="l00238"></a><span class="lineno">  238</span>    }</div>
+<div class="line"><a id="l00239" name="l00239"></a><span class="lineno">  239</span> </div>
+<div class="line"><a id="l00240" name="l00240"></a><span class="lineno">  240</span>    <span class="keyword">constexpr</span> <span class="keywordtype">void</span> remove_prefix(size_type n) {</div>
+<div class="line"><a id="l00241" name="l00241"></a><span class="lineno">  241</span>        view_.remove_prefix(n);</div>
+<div class="line"><a id="l00242" name="l00242"></a><span class="lineno">  242</span>    }</div>
+<div class="line"><a id="l00243" name="l00243"></a><span class="lineno">  243</span> </div>
+<div class="line"><a id="l00244" name="l00244"></a><span class="lineno">  244</span>    <span class="keyword">constexpr</span> <span class="keywordtype">void</span> remove_suffix(size_type n) {</div>
+<div class="line"><a id="l00245" name="l00245"></a><span class="lineno">  245</span>        view_.remove_suffix(n);</div>
+<div class="line"><a id="l00246" name="l00246"></a><span class="lineno">  246</span>    }</div>
+<div class="line"><a id="l00247" name="l00247"></a><span class="lineno">  247</span> </div>
+<div class="line"><a id="l00248" name="l00248"></a><span class="lineno">  248</span>    <span class="keywordtype">void</span> swap(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a>&amp; buf) <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00249" name="l00249"></a><span class="lineno">  249</span>        view_.swap(buf.view_);</div>
+<div class="line"><a id="l00250" name="l00250"></a><span class="lineno">  250</span>        life_.swap(buf.life_);</div>
+<div class="line"><a id="l00251" name="l00251"></a><span class="lineno">  251</span>    }</div>
+<div class="line"><a id="l00252" name="l00252"></a><span class="lineno">  252</span> </div>
+<div class="line"><a id="l00253" name="l00253"></a><span class="lineno">  253</span>    size_type copy(<span class="keywordtype">char</span>* dest, size_type count, size_type pos = 0 )<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00254" name="l00254"></a><span class="lineno">  254</span>        <span class="keywordflow">return</span> view_.copy(dest, count, pos);</div>
+<div class="line"><a id="l00255" name="l00255"></a><span class="lineno">  255</span>    }</div>
+<div class="line"><a id="l00256" name="l00256"></a><span class="lineno">  256</span> </div>
+<div class="foldopen" id="foldopen00265" data-start="{" data-end="}">
+<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">  265</a></span>    <a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a> <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">substr</a>(size_type pos = 0, size_type count = npos) <span class="keyword">const</span>&amp; {</div>
+<div class="line"><a id="l00266" name="l00266"></a><span class="lineno">  266</span>        <span class="comment">// range is checked in std::string_view::substr.</span></div>
+<div class="line"><a id="l00267" name="l00267"></a><span class="lineno">  267</span>        <span class="keywordflow">return</span> <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a>(view_.substr(pos, count), life_);</div>
+<div class="line"><a id="l00268" name="l00268"></a><span class="lineno">  268</span>    }</div>
 </div>
-<div class="line"><a id="l00270" name="l00270"></a><span class="lineno">  270</span> </div>
-<div class="foldopen" id="foldopen00279" data-start="{" data-end="}">
-<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#ad3d64b3893dfec271b87d8f2e3dd6b65">  279</a></span>    <a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a> <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#ad3d64b3893dfec271b87d8f2e3dd6b65">substr</a>(size_type pos = 0, size_type count = npos) &amp;&amp; {</div>
-<div class="line"><a id="l00280" name="l00280"></a><span class="lineno">  280</span>        <span class="comment">// range is checked in std::string_view::substr.</span></div>
-<div class="line"><a id="l00281" name="l00281"></a><span class="lineno">  281</span>        <span class="keywordflow">return</span> <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a>(view_.substr(pos, count), force_move(life_));</div>
-<div class="line"><a id="l00282" name="l00282"></a><span class="lineno">  282</span>    }</div>
+<div class="line"><a id="l00269" name="l00269"></a><span class="lineno">  269</span> </div>
+<div class="foldopen" id="foldopen00278" data-start="{" data-end="}">
+<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"><a class="line" href="classasync__mqtt_1_1buffer.html#ad3d64b3893dfec271b87d8f2e3dd6b65">  278</a></span>    <a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a> <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#ad3d64b3893dfec271b87d8f2e3dd6b65">substr</a>(size_type pos = 0, size_type count = npos) &amp;&amp; {</div>
+<div class="line"><a id="l00279" name="l00279"></a><span class="lineno">  279</span>        <span class="comment">// range is checked in std::string_view::substr.</span></div>
+<div class="line"><a id="l00280" name="l00280"></a><span class="lineno">  280</span>        <span class="keywordflow">return</span> <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a>(view_.substr(pos, count), force_move(life_));</div>
+<div class="line"><a id="l00281" name="l00281"></a><span class="lineno">  281</span>    }</div>
 </div>
-<div class="line"><a id="l00283" name="l00283"></a><span class="lineno">  283</span> </div>
-<div class="line"><a id="l00284" name="l00284"></a><span class="lineno">  284</span>    <span class="keyword">constexpr</span> <span class="keywordtype">int</span> compare(<a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a> <span class="keyword">const</span>&amp; buf) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00285" name="l00285"></a><span class="lineno">  285</span>        <span class="keywordflow">return</span> view_.compare(buf.view_);</div>
-<div class="line"><a id="l00286" name="l00286"></a><span class="lineno">  286</span>    }</div>
-<div class="line"><a id="l00287" name="l00287"></a><span class="lineno">  287</span>    <span class="keyword">constexpr</span> <span class="keywordtype">int</span> compare(std::string_view <span class="keyword">const</span>&amp; v) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00288" name="l00288"></a><span class="lineno">  288</span>        <span class="keywordflow">return</span> view_.compare(v);</div>
-<div class="line"><a id="l00289" name="l00289"></a><span class="lineno">  289</span>    }</div>
-<div class="line"><a id="l00290" name="l00290"></a><span class="lineno">  290</span>    <span class="keyword">constexpr</span> <span class="keywordtype">int</span> compare(size_type pos1, size_type count1, <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; buf) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00291" name="l00291"></a><span class="lineno">  291</span>        <span class="keywordflow">return</span> view_.compare(pos1, count1, buf.view_);</div>
-<div class="line"><a id="l00292" name="l00292"></a><span class="lineno">  292</span>    }</div>
-<div class="line"><a id="l00293" name="l00293"></a><span class="lineno">  293</span>    <span class="keyword">constexpr</span> <span class="keywordtype">int</span> compare(size_type pos1, size_type count1, std::string_view <span class="keyword">const</span>&amp; v) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00294" name="l00294"></a><span class="lineno">  294</span>        <span class="keywordflow">return</span> view_.compare(pos1, count1, v);</div>
-<div class="line"><a id="l00295" name="l00295"></a><span class="lineno">  295</span>    }</div>
-<div class="line"><a id="l00296" name="l00296"></a><span class="lineno">  296</span>    <span class="keyword">constexpr</span> <span class="keywordtype">int</span> compare(</div>
-<div class="line"><a id="l00297" name="l00297"></a><span class="lineno">  297</span>        size_type pos1,</div>
-<div class="line"><a id="l00298" name="l00298"></a><span class="lineno">  298</span>        size_type count1,</div>
-<div class="line"><a id="l00299" name="l00299"></a><span class="lineno">  299</span>        <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; buf,</div>
-<div class="line"><a id="l00300" name="l00300"></a><span class="lineno">  300</span>        size_type pos2,</div>
-<div class="line"><a id="l00301" name="l00301"></a><span class="lineno">  301</span>        size_type count2</div>
-<div class="line"><a id="l00302" name="l00302"></a><span class="lineno">  302</span>    ) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00303" name="l00303"></a><span class="lineno">  303</span>        <span class="keywordflow">return</span> view_.compare(pos1, count1, buf.view_, pos2, count2);</div>
-<div class="line"><a id="l00304" name="l00304"></a><span class="lineno">  304</span>    }</div>
-<div class="line"><a id="l00305" name="l00305"></a><span class="lineno">  305</span>    <span class="keyword">constexpr</span> <span class="keywordtype">int</span> compare(</div>
-<div class="line"><a id="l00306" name="l00306"></a><span class="lineno">  306</span>        size_type pos1,</div>
-<div class="line"><a id="l00307" name="l00307"></a><span class="lineno">  307</span>        size_type count1,</div>
-<div class="line"><a id="l00308" name="l00308"></a><span class="lineno">  308</span>        std::string_view <span class="keyword">const</span>&amp; v,</div>
-<div class="line"><a id="l00309" name="l00309"></a><span class="lineno">  309</span>        size_type pos2,</div>
-<div class="line"><a id="l00310" name="l00310"></a><span class="lineno">  310</span>        size_type count2</div>
-<div class="line"><a id="l00311" name="l00311"></a><span class="lineno">  311</span>    ) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00312" name="l00312"></a><span class="lineno">  312</span>        <span class="keywordflow">return</span> view_.compare(pos1, count1, v, pos2, count2);</div>
-<div class="line"><a id="l00313" name="l00313"></a><span class="lineno">  313</span>    }</div>
-<div class="line"><a id="l00314" name="l00314"></a><span class="lineno">  314</span>    <span class="keyword">constexpr</span> <span class="keywordtype">int</span> compare(<span class="keywordtype">char</span> <span class="keyword">const</span>* s) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00315" name="l00315"></a><span class="lineno">  315</span>        <span class="keywordflow">return</span> view_.compare(s);</div>
-<div class="line"><a id="l00316" name="l00316"></a><span class="lineno">  316</span>    }</div>
-<div class="line"><a id="l00317" name="l00317"></a><span class="lineno">  317</span>    <span class="keyword">constexpr</span> <span class="keywordtype">int</span> compare(size_type pos1, size_type count1, <span class="keywordtype">char</span> <span class="keyword">const</span>* s) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00318" name="l00318"></a><span class="lineno">  318</span>        <span class="keywordflow">return</span> view_.compare(pos1, count1, s);</div>
-<div class="line"><a id="l00319" name="l00319"></a><span class="lineno">  319</span>    }</div>
-<div class="line"><a id="l00320" name="l00320"></a><span class="lineno">  320</span>    <span class="keyword">constexpr</span> <span class="keywordtype">int</span> compare(</div>
-<div class="line"><a id="l00321" name="l00321"></a><span class="lineno">  321</span>        size_type pos1,</div>
-<div class="line"><a id="l00322" name="l00322"></a><span class="lineno">  322</span>        size_type count1,</div>
-<div class="line"><a id="l00323" name="l00323"></a><span class="lineno">  323</span>        <span class="keywordtype">char</span> <span class="keyword">const</span>* s,</div>
-<div class="line"><a id="l00324" name="l00324"></a><span class="lineno">  324</span>        size_type pos2,</div>
-<div class="line"><a id="l00325" name="l00325"></a><span class="lineno">  325</span>        size_type count2</div>
-<div class="line"><a id="l00326" name="l00326"></a><span class="lineno">  326</span>    ) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00327" name="l00327"></a><span class="lineno">  327</span>        <span class="keywordflow">return</span> view_.compare(pos1, count1, s, pos2, count2);</div>
-<div class="line"><a id="l00328" name="l00328"></a><span class="lineno">  328</span>    }</div>
-<div class="line"><a id="l00329" name="l00329"></a><span class="lineno">  329</span> </div>
-<div class="line"><a id="l00330" name="l00330"></a><span class="lineno">  330</span>    <span class="keyword">constexpr</span> size_type find(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; buf, size_type pos = 0) const noexcept {</div>
-<div class="line"><a id="l00331" name="l00331"></a><span class="lineno">  331</span>        <span class="keywordflow">return</span> view_.find(buf.view_, pos);</div>
-<div class="line"><a id="l00332" name="l00332"></a><span class="lineno">  332</span>    }</div>
-<div class="line"><a id="l00333" name="l00333"></a><span class="lineno">  333</span>    <span class="keyword">constexpr</span> size_type find(std::string_view v, size_type pos = 0) const noexcept {</div>
-<div class="line"><a id="l00334" name="l00334"></a><span class="lineno">  334</span>        <span class="keywordflow">return</span> view_.find(v, pos);</div>
-<div class="line"><a id="l00335" name="l00335"></a><span class="lineno">  335</span>    }</div>
-<div class="line"><a id="l00336" name="l00336"></a><span class="lineno">  336</span>    <span class="keyword">constexpr</span> size_type find(<span class="keywordtype">char</span> ch, size_type pos = 0) const noexcept {</div>
-<div class="line"><a id="l00337" name="l00337"></a><span class="lineno">  337</span>        <span class="keywordflow">return</span> view_.find(ch, pos);</div>
-<div class="line"><a id="l00338" name="l00338"></a><span class="lineno">  338</span>    }</div>
-<div class="line"><a id="l00339" name="l00339"></a><span class="lineno">  339</span>    <span class="keyword">constexpr</span> size_type find(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos, size_type count)<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00340" name="l00340"></a><span class="lineno">  340</span>        <span class="keywordflow">return</span> view_.find(s, pos, count);</div>
-<div class="line"><a id="l00341" name="l00341"></a><span class="lineno">  341</span>    }</div>
-<div class="line"><a id="l00342" name="l00342"></a><span class="lineno">  342</span>    <span class="keyword">constexpr</span> size_type find(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos = 0)<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00343" name="l00343"></a><span class="lineno">  343</span>        <span class="keywordflow">return</span> view_.find(s, pos);</div>
-<div class="line"><a id="l00344" name="l00344"></a><span class="lineno">  344</span>    }</div>
-<div class="line"><a id="l00345" name="l00345"></a><span class="lineno">  345</span> </div>
-<div class="line"><a id="l00346" name="l00346"></a><span class="lineno">  346</span>    <span class="keyword">constexpr</span> size_type rfind(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; buf, size_type pos = npos) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00347" name="l00347"></a><span class="lineno">  347</span>        <span class="keywordflow">return</span> view_.rfind(buf.view_, pos);</div>
-<div class="line"><a id="l00348" name="l00348"></a><span class="lineno">  348</span>    }</div>
-<div class="line"><a id="l00349" name="l00349"></a><span class="lineno">  349</span>    <span class="keyword">constexpr</span> size_type rfind( std::string_view v, size_type pos = npos) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00350" name="l00350"></a><span class="lineno">  350</span>        <span class="keywordflow">return</span> view_.rfind(v, pos);</div>
-<div class="line"><a id="l00351" name="l00351"></a><span class="lineno">  351</span>    }</div>
-<div class="line"><a id="l00352" name="l00352"></a><span class="lineno">  352</span>    <span class="keyword">constexpr</span> size_type rfind(<span class="keywordtype">char</span> ch, size_type pos = npos) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00353" name="l00353"></a><span class="lineno">  353</span>        <span class="keywordflow">return</span> view_.rfind(ch, pos);</div>
-<div class="line"><a id="l00354" name="l00354"></a><span class="lineno">  354</span>    }</div>
-<div class="line"><a id="l00355" name="l00355"></a><span class="lineno">  355</span>    <span class="keyword">constexpr</span> size_type rfind(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos, size_type count)<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00356" name="l00356"></a><span class="lineno">  356</span>        <span class="keywordflow">return</span> view_.rfind(s, pos, count);</div>
-<div class="line"><a id="l00357" name="l00357"></a><span class="lineno">  357</span>    }</div>
-<div class="line"><a id="l00358" name="l00358"></a><span class="lineno">  358</span>    <span class="keyword">constexpr</span> size_type rfind(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos = npos)<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00359" name="l00359"></a><span class="lineno">  359</span>        <span class="keywordflow">return</span> view_.rfind(s, pos);</div>
-<div class="line"><a id="l00360" name="l00360"></a><span class="lineno">  360</span>    }</div>
-<div class="line"><a id="l00361" name="l00361"></a><span class="lineno">  361</span> </div>
-<div class="line"><a id="l00362" name="l00362"></a><span class="lineno">  362</span>    <span class="keyword">constexpr</span> size_type find_first_of(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; buf, size_type pos = 0) const noexcept {</div>
-<div class="line"><a id="l00363" name="l00363"></a><span class="lineno">  363</span>        <span class="keywordflow">return</span> view_.find_first_of(buf.view_, pos);</div>
-<div class="line"><a id="l00364" name="l00364"></a><span class="lineno">  364</span>    }</div>
-<div class="line"><a id="l00365" name="l00365"></a><span class="lineno">  365</span>    <span class="keyword">constexpr</span> size_type find_first_of( std::string_view v, size_type pos = 0) const noexcept {</div>
-<div class="line"><a id="l00366" name="l00366"></a><span class="lineno">  366</span>        <span class="keywordflow">return</span> view_.find_first_of(v, pos);</div>
-<div class="line"><a id="l00367" name="l00367"></a><span class="lineno">  367</span>    }</div>
-<div class="line"><a id="l00368" name="l00368"></a><span class="lineno">  368</span>    <span class="keyword">constexpr</span> size_type find_first_of(<span class="keywordtype">char</span> ch, size_type pos = 0) const noexcept {</div>
-<div class="line"><a id="l00369" name="l00369"></a><span class="lineno">  369</span>        <span class="keywordflow">return</span> view_.find_first_of(ch, pos);</div>
-<div class="line"><a id="l00370" name="l00370"></a><span class="lineno">  370</span>    }</div>
-<div class="line"><a id="l00371" name="l00371"></a><span class="lineno">  371</span>    <span class="keyword">constexpr</span> size_type find_first_of(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos, size_type count)<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00372" name="l00372"></a><span class="lineno">  372</span>        <span class="keywordflow">return</span> view_.find_first_of(s, pos, count);</div>
-<div class="line"><a id="l00373" name="l00373"></a><span class="lineno">  373</span>    }</div>
-<div class="line"><a id="l00374" name="l00374"></a><span class="lineno">  374</span>    <span class="keyword">constexpr</span> size_type find_first_of(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos = 0)<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00375" name="l00375"></a><span class="lineno">  375</span>        <span class="keywordflow">return</span> view_.find_first_of(s, pos);</div>
-<div class="line"><a id="l00376" name="l00376"></a><span class="lineno">  376</span>    }</div>
-<div class="line"><a id="l00377" name="l00377"></a><span class="lineno">  377</span> </div>
-<div class="line"><a id="l00378" name="l00378"></a><span class="lineno">  378</span>    <span class="keyword">constexpr</span> size_type find_last_of(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; buf, size_type pos = npos) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00379" name="l00379"></a><span class="lineno">  379</span>        <span class="keywordflow">return</span> view_.find_last_of(buf.view_, pos);</div>
-<div class="line"><a id="l00380" name="l00380"></a><span class="lineno">  380</span>    }</div>
-<div class="line"><a id="l00381" name="l00381"></a><span class="lineno">  381</span>    <span class="keyword">constexpr</span> size_type find_last_of( std::string_view v, size_type pos = npos) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00382" name="l00382"></a><span class="lineno">  382</span>        <span class="keywordflow">return</span> view_.find_last_of(v, pos);</div>
-<div class="line"><a id="l00383" name="l00383"></a><span class="lineno">  383</span>    }</div>
-<div class="line"><a id="l00384" name="l00384"></a><span class="lineno">  384</span>    <span class="keyword">constexpr</span> size_type find_last_of(<span class="keywordtype">char</span> ch, size_type pos = npos) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00385" name="l00385"></a><span class="lineno">  385</span>        <span class="keywordflow">return</span> view_.find_last_of(ch, pos);</div>
-<div class="line"><a id="l00386" name="l00386"></a><span class="lineno">  386</span>    }</div>
-<div class="line"><a id="l00387" name="l00387"></a><span class="lineno">  387</span>    <span class="keyword">constexpr</span> size_type find_last_of(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos, size_type count)<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00388" name="l00388"></a><span class="lineno">  388</span>        <span class="keywordflow">return</span> view_.find_last_of(s, pos, count);</div>
-<div class="line"><a id="l00389" name="l00389"></a><span class="lineno">  389</span>    }</div>
-<div class="line"><a id="l00390" name="l00390"></a><span class="lineno">  390</span>    <span class="keyword">constexpr</span> size_type find_last_of(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos = npos)<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00391" name="l00391"></a><span class="lineno">  391</span>        <span class="keywordflow">return</span> view_.find_last_of(s, pos);</div>
-<div class="line"><a id="l00392" name="l00392"></a><span class="lineno">  392</span>    }</div>
-<div class="line"><a id="l00393" name="l00393"></a><span class="lineno">  393</span> </div>
-<div class="line"><a id="l00394" name="l00394"></a><span class="lineno">  394</span>    <span class="keyword">constexpr</span> size_type find_first_not_of(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; buf, size_type pos = 0) const noexcept {</div>
-<div class="line"><a id="l00395" name="l00395"></a><span class="lineno">  395</span>        <span class="keywordflow">return</span> view_.find_first_not_of(buf.view_, pos);</div>
-<div class="line"><a id="l00396" name="l00396"></a><span class="lineno">  396</span>    }</div>
-<div class="line"><a id="l00397" name="l00397"></a><span class="lineno">  397</span>    <span class="keyword">constexpr</span> size_type find_first_not_of( std::string_view v, size_type pos = 0) const noexcept {</div>
-<div class="line"><a id="l00398" name="l00398"></a><span class="lineno">  398</span>        <span class="keywordflow">return</span> view_.find_first_not_of(v, pos);</div>
-<div class="line"><a id="l00399" name="l00399"></a><span class="lineno">  399</span>    }</div>
-<div class="line"><a id="l00400" name="l00400"></a><span class="lineno">  400</span>    <span class="keyword">constexpr</span> size_type find_first_not_of(<span class="keywordtype">char</span> ch, size_type pos = 0) const noexcept {</div>
-<div class="line"><a id="l00401" name="l00401"></a><span class="lineno">  401</span>        <span class="keywordflow">return</span> view_.find_first_not_of(ch, pos);</div>
-<div class="line"><a id="l00402" name="l00402"></a><span class="lineno">  402</span>    }</div>
-<div class="line"><a id="l00403" name="l00403"></a><span class="lineno">  403</span>    <span class="keyword">constexpr</span> size_type find_first_not_of(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos, size_type count)<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00404" name="l00404"></a><span class="lineno">  404</span>        <span class="keywordflow">return</span> view_.find_first_not_of(s, pos, count);</div>
-<div class="line"><a id="l00405" name="l00405"></a><span class="lineno">  405</span>    }</div>
-<div class="line"><a id="l00406" name="l00406"></a><span class="lineno">  406</span>    <span class="keyword">constexpr</span> size_type find_first_not_of(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos = 0)<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00407" name="l00407"></a><span class="lineno">  407</span>        <span class="keywordflow">return</span> view_.find_first_not_of(s, pos);</div>
-<div class="line"><a id="l00408" name="l00408"></a><span class="lineno">  408</span>    }</div>
-<div class="line"><a id="l00409" name="l00409"></a><span class="lineno">  409</span> </div>
-<div class="line"><a id="l00410" name="l00410"></a><span class="lineno">  410</span>    <span class="keyword">constexpr</span> size_type find_last_not_of(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; buf, size_type pos = npos) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00411" name="l00411"></a><span class="lineno">  411</span>        <span class="keywordflow">return</span> view_.find_last_not_of(buf.view_, pos);</div>
-<div class="line"><a id="l00412" name="l00412"></a><span class="lineno">  412</span>    }</div>
-<div class="line"><a id="l00413" name="l00413"></a><span class="lineno">  413</span>    <span class="keyword">constexpr</span> size_type find_last_not_of( std::string_view v, size_type pos = npos) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00414" name="l00414"></a><span class="lineno">  414</span>        <span class="keywordflow">return</span> view_.find_last_not_of(v, pos);</div>
-<div class="line"><a id="l00415" name="l00415"></a><span class="lineno">  415</span>    }</div>
-<div class="line"><a id="l00416" name="l00416"></a><span class="lineno">  416</span>    <span class="keyword">constexpr</span> size_type find_last_not_of(<span class="keywordtype">char</span> ch, size_type pos = npos) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00417" name="l00417"></a><span class="lineno">  417</span>        <span class="keywordflow">return</span> view_.find_last_not_of(ch, pos);</div>
-<div class="line"><a id="l00418" name="l00418"></a><span class="lineno">  418</span>    }</div>
-<div class="line"><a id="l00419" name="l00419"></a><span class="lineno">  419</span>    <span class="keyword">constexpr</span> size_type find_last_not_of(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos, size_type count)<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00420" name="l00420"></a><span class="lineno">  420</span>        <span class="keywordflow">return</span> view_.find_last_not_of(s, pos, count);</div>
-<div class="line"><a id="l00421" name="l00421"></a><span class="lineno">  421</span>    }</div>
-<div class="line"><a id="l00422" name="l00422"></a><span class="lineno">  422</span>    <span class="keyword">constexpr</span> size_type find_last_not_of(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos = npos)<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00423" name="l00423"></a><span class="lineno">  423</span>        <span class="keywordflow">return</span> view_.find_last_not_of(s, pos);</div>
-<div class="line"><a id="l00424" name="l00424"></a><span class="lineno">  424</span>    }</div>
-<div class="line"><a id="l00425" name="l00425"></a><span class="lineno">  425</span> </div>
-<div class="line"><a id="l00426" name="l00426"></a><span class="lineno">  426</span>    life_type <span class="keyword">const</span>&amp; get_life()<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00427" name="l00427"></a><span class="lineno">  427</span>        <span class="keywordflow">return</span> life_;</div>
-<div class="line"><a id="l00428" name="l00428"></a><span class="lineno">  428</span>    }</div>
-<div class="line"><a id="l00429" name="l00429"></a><span class="lineno">  429</span> </div>
-<div class="line"><a id="l00430" name="l00430"></a><span class="lineno">  430</span>    <span class="keyword">operator</span> as::const_buffer()<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00431" name="l00431"></a><span class="lineno">  431</span>        <span class="keywordflow">return</span> <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">as::buffer</a>(view_.data(), view_.size());</div>
-<div class="line"><a id="l00432" name="l00432"></a><span class="lineno">  432</span>    }</div>
-<div class="line"><a id="l00433" name="l00433"></a><span class="lineno">  433</span> </div>
-<div class="line"><a id="l00434" name="l00434"></a><span class="lineno">  434</span>    <span class="keyword">operator</span> std::string_view()<span class="keyword"> const </span>{</div>
-<div class="line"><a id="l00435" name="l00435"></a><span class="lineno">  435</span>        <span class="keywordflow">return</span> view_;</div>
-<div class="line"><a id="l00436" name="l00436"></a><span class="lineno">  436</span>    }</div>
-<div class="line"><a id="l00437" name="l00437"></a><span class="lineno">  437</span> </div>
-<div class="line"><a id="l00438" name="l00438"></a><span class="lineno">  438</span>    <span class="keyword">friend</span></div>
-<div class="line"><a id="l00439" name="l00439"></a><span class="lineno">  439</span>    <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> operator==(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; lhs, <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; rhs ) <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00440" name="l00440"></a><span class="lineno">  440</span>        <span class="keywordflow">return</span> lhs.view_ == rhs.view_;</div>
-<div class="line"><a id="l00441" name="l00441"></a><span class="lineno">  441</span>    }</div>
-<div class="line"><a id="l00442" name="l00442"></a><span class="lineno">  442</span>    <span class="keyword">friend</span></div>
-<div class="line"><a id="l00443" name="l00443"></a><span class="lineno">  443</span>    <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> operator!=(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; lhs, <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; rhs ) <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00444" name="l00444"></a><span class="lineno">  444</span>        <span class="keywordflow">return</span> lhs.view_ != rhs.view_;</div>
-<div class="line"><a id="l00445" name="l00445"></a><span class="lineno">  445</span>    }</div>
-<div class="line"><a id="l00446" name="l00446"></a><span class="lineno">  446</span>    <span class="keyword">friend</span></div>
-<div class="line"><a id="l00447" name="l00447"></a><span class="lineno">  447</span>    <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> operator&lt;(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; lhs, <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; rhs ) <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00448" name="l00448"></a><span class="lineno">  448</span>        <span class="keywordflow">return</span> lhs.view_ &lt; rhs.view_;</div>
-<div class="line"><a id="l00449" name="l00449"></a><span class="lineno">  449</span>    }</div>
-<div class="line"><a id="l00450" name="l00450"></a><span class="lineno">  450</span>    <span class="keyword">friend</span></div>
-<div class="line"><a id="l00451" name="l00451"></a><span class="lineno">  451</span>    <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> operator&lt;=(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; lhs, <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; rhs ) <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00452" name="l00452"></a><span class="lineno">  452</span>        <span class="keywordflow">return</span> lhs.view_ &lt;= rhs.view_;</div>
-<div class="line"><a id="l00453" name="l00453"></a><span class="lineno">  453</span>    }</div>
-<div class="line"><a id="l00454" name="l00454"></a><span class="lineno">  454</span>    <span class="keyword">friend</span></div>
-<div class="line"><a id="l00455" name="l00455"></a><span class="lineno">  455</span>    <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> operator&gt;(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; lhs, <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; rhs ) <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00456" name="l00456"></a><span class="lineno">  456</span>        <span class="keywordflow">return</span> lhs.view_ &gt; rhs.view_;</div>
-<div class="line"><a id="l00457" name="l00457"></a><span class="lineno">  457</span>    }</div>
-<div class="line"><a id="l00458" name="l00458"></a><span class="lineno">  458</span>    <span class="keyword">friend</span></div>
-<div class="line"><a id="l00459" name="l00459"></a><span class="lineno">  459</span>    <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> operator&gt;=(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; lhs, <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; rhs ) <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00460" name="l00460"></a><span class="lineno">  460</span>        <span class="keywordflow">return</span> lhs.view_ &gt;= rhs.view_;</div>
-<div class="line"><a id="l00461" name="l00461"></a><span class="lineno">  461</span>    }</div>
-<div class="line"><a id="l00462" name="l00462"></a><span class="lineno">  462</span> </div>
-<div class="line"><a id="l00463" name="l00463"></a><span class="lineno">  463</span>    <span class="keyword">friend</span></div>
-<div class="line"><a id="l00464" name="l00464"></a><span class="lineno">  464</span>    std::ostream&amp; operator&lt;&lt;(std::ostream&amp; o, <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; buf) {</div>
-<div class="line"><a id="l00465" name="l00465"></a><span class="lineno">  465</span>        o &lt;&lt; buf.view_;</div>
-<div class="line"><a id="l00466" name="l00466"></a><span class="lineno">  466</span>        <span class="keywordflow">return</span> o;</div>
-<div class="line"><a id="l00467" name="l00467"></a><span class="lineno">  467</span>    }</div>
-<div class="line"><a id="l00468" name="l00468"></a><span class="lineno">  468</span> </div>
-<div class="line"><a id="l00469" name="l00469"></a><span class="lineno">  469</span>    <span class="keywordtype">bool</span> has_life() const noexcept {</div>
-<div class="line"><a id="l00470" name="l00470"></a><span class="lineno">  470</span>        <span class="keywordflow">return</span> bool(life_);</div>
-<div class="line"><a id="l00471" name="l00471"></a><span class="lineno">  471</span>    }</div>
-<div class="line"><a id="l00472" name="l00472"></a><span class="lineno">  472</span> </div>
-<div class="line"><a id="l00473" name="l00473"></a><span class="lineno">  473</span><span class="keyword">private</span>:</div>
-<div class="line"><a id="l00474" name="l00474"></a><span class="lineno">  474</span>    std::string_view view_;</div>
-<div class="line"><a id="l00475" name="l00475"></a><span class="lineno">  475</span>    life_type life_;</div>
-<div class="line"><a id="l00476" name="l00476"></a><span class="lineno">  476</span>};</div>
+<div class="line"><a id="l00282" name="l00282"></a><span class="lineno">  282</span> </div>
+<div class="line"><a id="l00283" name="l00283"></a><span class="lineno">  283</span>    <span class="keyword">constexpr</span> <span class="keywordtype">int</span> compare(<a class="code hl_class" href="classasync__mqtt_1_1buffer.html">buffer</a> <span class="keyword">const</span>&amp; buf) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00284" name="l00284"></a><span class="lineno">  284</span>        <span class="keywordflow">return</span> view_.compare(buf.view_);</div>
+<div class="line"><a id="l00285" name="l00285"></a><span class="lineno">  285</span>    }</div>
+<div class="line"><a id="l00286" name="l00286"></a><span class="lineno">  286</span>    <span class="keyword">constexpr</span> <span class="keywordtype">int</span> compare(std::string_view <span class="keyword">const</span>&amp; v) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00287" name="l00287"></a><span class="lineno">  287</span>        <span class="keywordflow">return</span> view_.compare(v);</div>
+<div class="line"><a id="l00288" name="l00288"></a><span class="lineno">  288</span>    }</div>
+<div class="line"><a id="l00289" name="l00289"></a><span class="lineno">  289</span>    <span class="keyword">constexpr</span> <span class="keywordtype">int</span> compare(size_type pos1, size_type count1, <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; buf) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00290" name="l00290"></a><span class="lineno">  290</span>        <span class="keywordflow">return</span> view_.compare(pos1, count1, buf.view_);</div>
+<div class="line"><a id="l00291" name="l00291"></a><span class="lineno">  291</span>    }</div>
+<div class="line"><a id="l00292" name="l00292"></a><span class="lineno">  292</span>    <span class="keyword">constexpr</span> <span class="keywordtype">int</span> compare(size_type pos1, size_type count1, std::string_view <span class="keyword">const</span>&amp; v) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00293" name="l00293"></a><span class="lineno">  293</span>        <span class="keywordflow">return</span> view_.compare(pos1, count1, v);</div>
+<div class="line"><a id="l00294" name="l00294"></a><span class="lineno">  294</span>    }</div>
+<div class="line"><a id="l00295" name="l00295"></a><span class="lineno">  295</span>    <span class="keyword">constexpr</span> <span class="keywordtype">int</span> compare(</div>
+<div class="line"><a id="l00296" name="l00296"></a><span class="lineno">  296</span>        size_type pos1,</div>
+<div class="line"><a id="l00297" name="l00297"></a><span class="lineno">  297</span>        size_type count1,</div>
+<div class="line"><a id="l00298" name="l00298"></a><span class="lineno">  298</span>        <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; buf,</div>
+<div class="line"><a id="l00299" name="l00299"></a><span class="lineno">  299</span>        size_type pos2,</div>
+<div class="line"><a id="l00300" name="l00300"></a><span class="lineno">  300</span>        size_type count2</div>
+<div class="line"><a id="l00301" name="l00301"></a><span class="lineno">  301</span>    ) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00302" name="l00302"></a><span class="lineno">  302</span>        <span class="keywordflow">return</span> view_.compare(pos1, count1, buf.view_, pos2, count2);</div>
+<div class="line"><a id="l00303" name="l00303"></a><span class="lineno">  303</span>    }</div>
+<div class="line"><a id="l00304" name="l00304"></a><span class="lineno">  304</span>    <span class="keyword">constexpr</span> <span class="keywordtype">int</span> compare(</div>
+<div class="line"><a id="l00305" name="l00305"></a><span class="lineno">  305</span>        size_type pos1,</div>
+<div class="line"><a id="l00306" name="l00306"></a><span class="lineno">  306</span>        size_type count1,</div>
+<div class="line"><a id="l00307" name="l00307"></a><span class="lineno">  307</span>        std::string_view <span class="keyword">const</span>&amp; v,</div>
+<div class="line"><a id="l00308" name="l00308"></a><span class="lineno">  308</span>        size_type pos2,</div>
+<div class="line"><a id="l00309" name="l00309"></a><span class="lineno">  309</span>        size_type count2</div>
+<div class="line"><a id="l00310" name="l00310"></a><span class="lineno">  310</span>    ) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00311" name="l00311"></a><span class="lineno">  311</span>        <span class="keywordflow">return</span> view_.compare(pos1, count1, v, pos2, count2);</div>
+<div class="line"><a id="l00312" name="l00312"></a><span class="lineno">  312</span>    }</div>
+<div class="line"><a id="l00313" name="l00313"></a><span class="lineno">  313</span>    <span class="keyword">constexpr</span> <span class="keywordtype">int</span> compare(<span class="keywordtype">char</span> <span class="keyword">const</span>* s) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00314" name="l00314"></a><span class="lineno">  314</span>        <span class="keywordflow">return</span> view_.compare(s);</div>
+<div class="line"><a id="l00315" name="l00315"></a><span class="lineno">  315</span>    }</div>
+<div class="line"><a id="l00316" name="l00316"></a><span class="lineno">  316</span>    <span class="keyword">constexpr</span> <span class="keywordtype">int</span> compare(size_type pos1, size_type count1, <span class="keywordtype">char</span> <span class="keyword">const</span>* s) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00317" name="l00317"></a><span class="lineno">  317</span>        <span class="keywordflow">return</span> view_.compare(pos1, count1, s);</div>
+<div class="line"><a id="l00318" name="l00318"></a><span class="lineno">  318</span>    }</div>
+<div class="line"><a id="l00319" name="l00319"></a><span class="lineno">  319</span>    <span class="keyword">constexpr</span> <span class="keywordtype">int</span> compare(</div>
+<div class="line"><a id="l00320" name="l00320"></a><span class="lineno">  320</span>        size_type pos1,</div>
+<div class="line"><a id="l00321" name="l00321"></a><span class="lineno">  321</span>        size_type count1,</div>
+<div class="line"><a id="l00322" name="l00322"></a><span class="lineno">  322</span>        <span class="keywordtype">char</span> <span class="keyword">const</span>* s,</div>
+<div class="line"><a id="l00323" name="l00323"></a><span class="lineno">  323</span>        size_type pos2,</div>
+<div class="line"><a id="l00324" name="l00324"></a><span class="lineno">  324</span>        size_type count2</div>
+<div class="line"><a id="l00325" name="l00325"></a><span class="lineno">  325</span>    ) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00326" name="l00326"></a><span class="lineno">  326</span>        <span class="keywordflow">return</span> view_.compare(pos1, count1, s, pos2, count2);</div>
+<div class="line"><a id="l00327" name="l00327"></a><span class="lineno">  327</span>    }</div>
+<div class="line"><a id="l00328" name="l00328"></a><span class="lineno">  328</span> </div>
+<div class="line"><a id="l00329" name="l00329"></a><span class="lineno">  329</span>    <span class="keyword">constexpr</span> size_type find(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; buf, size_type pos = 0) const noexcept {</div>
+<div class="line"><a id="l00330" name="l00330"></a><span class="lineno">  330</span>        <span class="keywordflow">return</span> view_.find(buf.view_, pos);</div>
+<div class="line"><a id="l00331" name="l00331"></a><span class="lineno">  331</span>    }</div>
+<div class="line"><a id="l00332" name="l00332"></a><span class="lineno">  332</span>    <span class="keyword">constexpr</span> size_type find(std::string_view v, size_type pos = 0) const noexcept {</div>
+<div class="line"><a id="l00333" name="l00333"></a><span class="lineno">  333</span>        <span class="keywordflow">return</span> view_.find(v, pos);</div>
+<div class="line"><a id="l00334" name="l00334"></a><span class="lineno">  334</span>    }</div>
+<div class="line"><a id="l00335" name="l00335"></a><span class="lineno">  335</span>    <span class="keyword">constexpr</span> size_type find(<span class="keywordtype">char</span> ch, size_type pos = 0) const noexcept {</div>
+<div class="line"><a id="l00336" name="l00336"></a><span class="lineno">  336</span>        <span class="keywordflow">return</span> view_.find(ch, pos);</div>
+<div class="line"><a id="l00337" name="l00337"></a><span class="lineno">  337</span>    }</div>
+<div class="line"><a id="l00338" name="l00338"></a><span class="lineno">  338</span>    <span class="keyword">constexpr</span> size_type find(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos, size_type count)<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00339" name="l00339"></a><span class="lineno">  339</span>        <span class="keywordflow">return</span> view_.find(s, pos, count);</div>
+<div class="line"><a id="l00340" name="l00340"></a><span class="lineno">  340</span>    }</div>
+<div class="line"><a id="l00341" name="l00341"></a><span class="lineno">  341</span>    <span class="keyword">constexpr</span> size_type find(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos = 0)<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00342" name="l00342"></a><span class="lineno">  342</span>        <span class="keywordflow">return</span> view_.find(s, pos);</div>
+<div class="line"><a id="l00343" name="l00343"></a><span class="lineno">  343</span>    }</div>
+<div class="line"><a id="l00344" name="l00344"></a><span class="lineno">  344</span> </div>
+<div class="line"><a id="l00345" name="l00345"></a><span class="lineno">  345</span>    <span class="keyword">constexpr</span> size_type rfind(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; buf, size_type pos = npos) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00346" name="l00346"></a><span class="lineno">  346</span>        <span class="keywordflow">return</span> view_.rfind(buf.view_, pos);</div>
+<div class="line"><a id="l00347" name="l00347"></a><span class="lineno">  347</span>    }</div>
+<div class="line"><a id="l00348" name="l00348"></a><span class="lineno">  348</span>    <span class="keyword">constexpr</span> size_type rfind( std::string_view v, size_type pos = npos) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00349" name="l00349"></a><span class="lineno">  349</span>        <span class="keywordflow">return</span> view_.rfind(v, pos);</div>
+<div class="line"><a id="l00350" name="l00350"></a><span class="lineno">  350</span>    }</div>
+<div class="line"><a id="l00351" name="l00351"></a><span class="lineno">  351</span>    <span class="keyword">constexpr</span> size_type rfind(<span class="keywordtype">char</span> ch, size_type pos = npos) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00352" name="l00352"></a><span class="lineno">  352</span>        <span class="keywordflow">return</span> view_.rfind(ch, pos);</div>
+<div class="line"><a id="l00353" name="l00353"></a><span class="lineno">  353</span>    }</div>
+<div class="line"><a id="l00354" name="l00354"></a><span class="lineno">  354</span>    <span class="keyword">constexpr</span> size_type rfind(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos, size_type count)<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00355" name="l00355"></a><span class="lineno">  355</span>        <span class="keywordflow">return</span> view_.rfind(s, pos, count);</div>
+<div class="line"><a id="l00356" name="l00356"></a><span class="lineno">  356</span>    }</div>
+<div class="line"><a id="l00357" name="l00357"></a><span class="lineno">  357</span>    <span class="keyword">constexpr</span> size_type rfind(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos = npos)<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00358" name="l00358"></a><span class="lineno">  358</span>        <span class="keywordflow">return</span> view_.rfind(s, pos);</div>
+<div class="line"><a id="l00359" name="l00359"></a><span class="lineno">  359</span>    }</div>
+<div class="line"><a id="l00360" name="l00360"></a><span class="lineno">  360</span> </div>
+<div class="line"><a id="l00361" name="l00361"></a><span class="lineno">  361</span>    <span class="keyword">constexpr</span> size_type find_first_of(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; buf, size_type pos = 0) const noexcept {</div>
+<div class="line"><a id="l00362" name="l00362"></a><span class="lineno">  362</span>        <span class="keywordflow">return</span> view_.find_first_of(buf.view_, pos);</div>
+<div class="line"><a id="l00363" name="l00363"></a><span class="lineno">  363</span>    }</div>
+<div class="line"><a id="l00364" name="l00364"></a><span class="lineno">  364</span>    <span class="keyword">constexpr</span> size_type find_first_of( std::string_view v, size_type pos = 0) const noexcept {</div>
+<div class="line"><a id="l00365" name="l00365"></a><span class="lineno">  365</span>        <span class="keywordflow">return</span> view_.find_first_of(v, pos);</div>
+<div class="line"><a id="l00366" name="l00366"></a><span class="lineno">  366</span>    }</div>
+<div class="line"><a id="l00367" name="l00367"></a><span class="lineno">  367</span>    <span class="keyword">constexpr</span> size_type find_first_of(<span class="keywordtype">char</span> ch, size_type pos = 0) const noexcept {</div>
+<div class="line"><a id="l00368" name="l00368"></a><span class="lineno">  368</span>        <span class="keywordflow">return</span> view_.find_first_of(ch, pos);</div>
+<div class="line"><a id="l00369" name="l00369"></a><span class="lineno">  369</span>    }</div>
+<div class="line"><a id="l00370" name="l00370"></a><span class="lineno">  370</span>    <span class="keyword">constexpr</span> size_type find_first_of(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos, size_type count)<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00371" name="l00371"></a><span class="lineno">  371</span>        <span class="keywordflow">return</span> view_.find_first_of(s, pos, count);</div>
+<div class="line"><a id="l00372" name="l00372"></a><span class="lineno">  372</span>    }</div>
+<div class="line"><a id="l00373" name="l00373"></a><span class="lineno">  373</span>    <span class="keyword">constexpr</span> size_type find_first_of(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos = 0)<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00374" name="l00374"></a><span class="lineno">  374</span>        <span class="keywordflow">return</span> view_.find_first_of(s, pos);</div>
+<div class="line"><a id="l00375" name="l00375"></a><span class="lineno">  375</span>    }</div>
+<div class="line"><a id="l00376" name="l00376"></a><span class="lineno">  376</span> </div>
+<div class="line"><a id="l00377" name="l00377"></a><span class="lineno">  377</span>    <span class="keyword">constexpr</span> size_type find_last_of(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; buf, size_type pos = npos) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00378" name="l00378"></a><span class="lineno">  378</span>        <span class="keywordflow">return</span> view_.find_last_of(buf.view_, pos);</div>
+<div class="line"><a id="l00379" name="l00379"></a><span class="lineno">  379</span>    }</div>
+<div class="line"><a id="l00380" name="l00380"></a><span class="lineno">  380</span>    <span class="keyword">constexpr</span> size_type find_last_of( std::string_view v, size_type pos = npos) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00381" name="l00381"></a><span class="lineno">  381</span>        <span class="keywordflow">return</span> view_.find_last_of(v, pos);</div>
+<div class="line"><a id="l00382" name="l00382"></a><span class="lineno">  382</span>    }</div>
+<div class="line"><a id="l00383" name="l00383"></a><span class="lineno">  383</span>    <span class="keyword">constexpr</span> size_type find_last_of(<span class="keywordtype">char</span> ch, size_type pos = npos) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00384" name="l00384"></a><span class="lineno">  384</span>        <span class="keywordflow">return</span> view_.find_last_of(ch, pos);</div>
+<div class="line"><a id="l00385" name="l00385"></a><span class="lineno">  385</span>    }</div>
+<div class="line"><a id="l00386" name="l00386"></a><span class="lineno">  386</span>    <span class="keyword">constexpr</span> size_type find_last_of(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos, size_type count)<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00387" name="l00387"></a><span class="lineno">  387</span>        <span class="keywordflow">return</span> view_.find_last_of(s, pos, count);</div>
+<div class="line"><a id="l00388" name="l00388"></a><span class="lineno">  388</span>    }</div>
+<div class="line"><a id="l00389" name="l00389"></a><span class="lineno">  389</span>    <span class="keyword">constexpr</span> size_type find_last_of(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos = npos)<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00390" name="l00390"></a><span class="lineno">  390</span>        <span class="keywordflow">return</span> view_.find_last_of(s, pos);</div>
+<div class="line"><a id="l00391" name="l00391"></a><span class="lineno">  391</span>    }</div>
+<div class="line"><a id="l00392" name="l00392"></a><span class="lineno">  392</span> </div>
+<div class="line"><a id="l00393" name="l00393"></a><span class="lineno">  393</span>    <span class="keyword">constexpr</span> size_type find_first_not_of(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; buf, size_type pos = 0) const noexcept {</div>
+<div class="line"><a id="l00394" name="l00394"></a><span class="lineno">  394</span>        <span class="keywordflow">return</span> view_.find_first_not_of(buf.view_, pos);</div>
+<div class="line"><a id="l00395" name="l00395"></a><span class="lineno">  395</span>    }</div>
+<div class="line"><a id="l00396" name="l00396"></a><span class="lineno">  396</span>    <span class="keyword">constexpr</span> size_type find_first_not_of( std::string_view v, size_type pos = 0) const noexcept {</div>
+<div class="line"><a id="l00397" name="l00397"></a><span class="lineno">  397</span>        <span class="keywordflow">return</span> view_.find_first_not_of(v, pos);</div>
+<div class="line"><a id="l00398" name="l00398"></a><span class="lineno">  398</span>    }</div>
+<div class="line"><a id="l00399" name="l00399"></a><span class="lineno">  399</span>    <span class="keyword">constexpr</span> size_type find_first_not_of(<span class="keywordtype">char</span> ch, size_type pos = 0) const noexcept {</div>
+<div class="line"><a id="l00400" name="l00400"></a><span class="lineno">  400</span>        <span class="keywordflow">return</span> view_.find_first_not_of(ch, pos);</div>
+<div class="line"><a id="l00401" name="l00401"></a><span class="lineno">  401</span>    }</div>
+<div class="line"><a id="l00402" name="l00402"></a><span class="lineno">  402</span>    <span class="keyword">constexpr</span> size_type find_first_not_of(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos, size_type count)<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00403" name="l00403"></a><span class="lineno">  403</span>        <span class="keywordflow">return</span> view_.find_first_not_of(s, pos, count);</div>
+<div class="line"><a id="l00404" name="l00404"></a><span class="lineno">  404</span>    }</div>
+<div class="line"><a id="l00405" name="l00405"></a><span class="lineno">  405</span>    <span class="keyword">constexpr</span> size_type find_first_not_of(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos = 0)<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00406" name="l00406"></a><span class="lineno">  406</span>        <span class="keywordflow">return</span> view_.find_first_not_of(s, pos);</div>
+<div class="line"><a id="l00407" name="l00407"></a><span class="lineno">  407</span>    }</div>
+<div class="line"><a id="l00408" name="l00408"></a><span class="lineno">  408</span> </div>
+<div class="line"><a id="l00409" name="l00409"></a><span class="lineno">  409</span>    <span class="keyword">constexpr</span> size_type find_last_not_of(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; buf, size_type pos = npos) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00410" name="l00410"></a><span class="lineno">  410</span>        <span class="keywordflow">return</span> view_.find_last_not_of(buf.view_, pos);</div>
+<div class="line"><a id="l00411" name="l00411"></a><span class="lineno">  411</span>    }</div>
+<div class="line"><a id="l00412" name="l00412"></a><span class="lineno">  412</span>    <span class="keyword">constexpr</span> size_type find_last_not_of( std::string_view v, size_type pos = npos) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00413" name="l00413"></a><span class="lineno">  413</span>        <span class="keywordflow">return</span> view_.find_last_not_of(v, pos);</div>
+<div class="line"><a id="l00414" name="l00414"></a><span class="lineno">  414</span>    }</div>
+<div class="line"><a id="l00415" name="l00415"></a><span class="lineno">  415</span>    <span class="keyword">constexpr</span> size_type find_last_not_of(<span class="keywordtype">char</span> ch, size_type pos = npos) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00416" name="l00416"></a><span class="lineno">  416</span>        <span class="keywordflow">return</span> view_.find_last_not_of(ch, pos);</div>
+<div class="line"><a id="l00417" name="l00417"></a><span class="lineno">  417</span>    }</div>
+<div class="line"><a id="l00418" name="l00418"></a><span class="lineno">  418</span>    <span class="keyword">constexpr</span> size_type find_last_not_of(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos, size_type count)<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00419" name="l00419"></a><span class="lineno">  419</span>        <span class="keywordflow">return</span> view_.find_last_not_of(s, pos, count);</div>
+<div class="line"><a id="l00420" name="l00420"></a><span class="lineno">  420</span>    }</div>
+<div class="line"><a id="l00421" name="l00421"></a><span class="lineno">  421</span>    <span class="keyword">constexpr</span> size_type find_last_not_of(<span class="keywordtype">char</span> <span class="keyword">const</span>* s, size_type pos = npos)<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00422" name="l00422"></a><span class="lineno">  422</span>        <span class="keywordflow">return</span> view_.find_last_not_of(s, pos);</div>
+<div class="line"><a id="l00423" name="l00423"></a><span class="lineno">  423</span>    }</div>
+<div class="line"><a id="l00424" name="l00424"></a><span class="lineno">  424</span> </div>
+<div class="line"><a id="l00425" name="l00425"></a><span class="lineno">  425</span>    life_type <span class="keyword">const</span>&amp; get_life()<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00426" name="l00426"></a><span class="lineno">  426</span>        <span class="keywordflow">return</span> life_;</div>
+<div class="line"><a id="l00427" name="l00427"></a><span class="lineno">  427</span>    }</div>
+<div class="line"><a id="l00428" name="l00428"></a><span class="lineno">  428</span> </div>
+<div class="line"><a id="l00429" name="l00429"></a><span class="lineno">  429</span>    <span class="keyword">operator</span> as::const_buffer()<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00430" name="l00430"></a><span class="lineno">  430</span>        <span class="keywordflow">return</span> <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">as::buffer</a>(view_.data(), view_.size());</div>
+<div class="line"><a id="l00431" name="l00431"></a><span class="lineno">  431</span>    }</div>
+<div class="line"><a id="l00432" name="l00432"></a><span class="lineno">  432</span> </div>
+<div class="line"><a id="l00433" name="l00433"></a><span class="lineno">  433</span>    <span class="keyword">operator</span> std::string_view()<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00434" name="l00434"></a><span class="lineno">  434</span>        <span class="keywordflow">return</span> view_;</div>
+<div class="line"><a id="l00435" name="l00435"></a><span class="lineno">  435</span>    }</div>
+<div class="line"><a id="l00436" name="l00436"></a><span class="lineno">  436</span> </div>
+<div class="line"><a id="l00437" name="l00437"></a><span class="lineno">  437</span>    <span class="keyword">friend</span></div>
+<div class="line"><a id="l00438" name="l00438"></a><span class="lineno">  438</span>    <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> operator==(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; lhs, <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; rhs ) <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00439" name="l00439"></a><span class="lineno">  439</span>        <span class="keywordflow">return</span> lhs.view_ == rhs.view_;</div>
+<div class="line"><a id="l00440" name="l00440"></a><span class="lineno">  440</span>    }</div>
+<div class="line"><a id="l00441" name="l00441"></a><span class="lineno">  441</span>    <span class="keyword">friend</span></div>
+<div class="line"><a id="l00442" name="l00442"></a><span class="lineno">  442</span>    <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> operator!=(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; lhs, <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; rhs ) <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00443" name="l00443"></a><span class="lineno">  443</span>        <span class="keywordflow">return</span> lhs.view_ != rhs.view_;</div>
+<div class="line"><a id="l00444" name="l00444"></a><span class="lineno">  444</span>    }</div>
+<div class="line"><a id="l00445" name="l00445"></a><span class="lineno">  445</span>    <span class="keyword">friend</span></div>
+<div class="line"><a id="l00446" name="l00446"></a><span class="lineno">  446</span>    <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> operator&lt;(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; lhs, <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; rhs ) <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00447" name="l00447"></a><span class="lineno">  447</span>        <span class="keywordflow">return</span> lhs.view_ &lt; rhs.view_;</div>
+<div class="line"><a id="l00448" name="l00448"></a><span class="lineno">  448</span>    }</div>
+<div class="line"><a id="l00449" name="l00449"></a><span class="lineno">  449</span>    <span class="keyword">friend</span></div>
+<div class="line"><a id="l00450" name="l00450"></a><span class="lineno">  450</span>    <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> operator&lt;=(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; lhs, <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; rhs ) <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00451" name="l00451"></a><span class="lineno">  451</span>        <span class="keywordflow">return</span> lhs.view_ &lt;= rhs.view_;</div>
+<div class="line"><a id="l00452" name="l00452"></a><span class="lineno">  452</span>    }</div>
+<div class="line"><a id="l00453" name="l00453"></a><span class="lineno">  453</span>    <span class="keyword">friend</span></div>
+<div class="line"><a id="l00454" name="l00454"></a><span class="lineno">  454</span>    <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> operator&gt;(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; lhs, <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; rhs ) <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00455" name="l00455"></a><span class="lineno">  455</span>        <span class="keywordflow">return</span> lhs.view_ &gt; rhs.view_;</div>
+<div class="line"><a id="l00456" name="l00456"></a><span class="lineno">  456</span>    }</div>
+<div class="line"><a id="l00457" name="l00457"></a><span class="lineno">  457</span>    <span class="keyword">friend</span></div>
+<div class="line"><a id="l00458" name="l00458"></a><span class="lineno">  458</span>    <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> operator&gt;=(<a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; lhs, <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; rhs ) <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00459" name="l00459"></a><span class="lineno">  459</span>        <span class="keywordflow">return</span> lhs.view_ &gt;= rhs.view_;</div>
+<div class="line"><a id="l00460" name="l00460"></a><span class="lineno">  460</span>    }</div>
+<div class="line"><a id="l00461" name="l00461"></a><span class="lineno">  461</span> </div>
+<div class="line"><a id="l00462" name="l00462"></a><span class="lineno">  462</span>    <span class="keyword">friend</span></div>
+<div class="line"><a id="l00463" name="l00463"></a><span class="lineno">  463</span>    std::ostream&amp; operator&lt;&lt;(std::ostream&amp; o, <a class="code hl_function" href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">buffer</a> <span class="keyword">const</span>&amp; buf) {</div>
+<div class="line"><a id="l00464" name="l00464"></a><span class="lineno">  464</span>        o &lt;&lt; buf.view_;</div>
+<div class="line"><a id="l00465" name="l00465"></a><span class="lineno">  465</span>        <span class="keywordflow">return</span> o;</div>
+<div class="line"><a id="l00466" name="l00466"></a><span class="lineno">  466</span>    }</div>
+<div class="line"><a id="l00467" name="l00467"></a><span class="lineno">  467</span> </div>
+<div class="line"><a id="l00468" name="l00468"></a><span class="lineno">  468</span>    <span class="keywordtype">bool</span> has_life() const noexcept {</div>
+<div class="line"><a id="l00469" name="l00469"></a><span class="lineno">  469</span>        <span class="keywordflow">return</span> bool(life_);</div>
+<div class="line"><a id="l00470" name="l00470"></a><span class="lineno">  470</span>    }</div>
+<div class="line"><a id="l00471" name="l00471"></a><span class="lineno">  471</span> </div>
+<div class="line"><a id="l00472" name="l00472"></a><span class="lineno">  472</span><span class="keyword">private</span>:</div>
+<div class="line"><a id="l00473" name="l00473"></a><span class="lineno">  473</span>    std::string_view view_;</div>
+<div class="line"><a id="l00474" name="l00474"></a><span class="lineno">  474</span>    life_type life_;</div>
+<div class="line"><a id="l00475" name="l00475"></a><span class="lineno">  475</span>};</div>
 </div>
-<div class="line"><a id="l00477" name="l00477"></a><span class="lineno">  477</span> </div>
-<div class="line"><a id="l00478" name="l00478"></a><span class="lineno">  478</span><span class="keyword">inline</span> std::size_t hash_value(buffer <span class="keyword">const</span>&amp; v) <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00479" name="l00479"></a><span class="lineno">  479</span>    std::size_t result = 0;</div>
-<div class="line"><a id="l00480" name="l00480"></a><span class="lineno">  480</span>    boost::hash_combine(result, <span class="keyword">static_cast&lt;</span>std::string_view const&amp;<span class="keyword">&gt;</span>(v));</div>
-<div class="line"><a id="l00481" name="l00481"></a><span class="lineno">  481</span>    <span class="keywordflow">return</span> result;</div>
-<div class="line"><a id="l00482" name="l00482"></a><span class="lineno">  482</span>}</div>
-<div class="line"><a id="l00483" name="l00483"></a><span class="lineno">  483</span> </div>
-<div class="line"><a id="l00484" name="l00484"></a><span class="lineno">  484</span><span class="keyword">inline</span> <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">buffer</a> <span class="keyword">const</span>* buffer_sequence_begin(buffer <span class="keyword">const</span>&amp; buf) {</div>
-<div class="line"><a id="l00485" name="l00485"></a><span class="lineno">  485</span>    <span class="keywordflow">return</span> std::addressof(buf);</div>
-<div class="line"><a id="l00486" name="l00486"></a><span class="lineno">  486</span>}</div>
-<div class="line"><a id="l00487" name="l00487"></a><span class="lineno">  487</span> </div>
-<div class="line"><a id="l00488" name="l00488"></a><span class="lineno">  488</span><span class="keyword">inline</span> <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">buffer</a> <span class="keyword">const</span>* buffer_sequence_end(buffer <span class="keyword">const</span>&amp; buf) {</div>
-<div class="line"><a id="l00489" name="l00489"></a><span class="lineno">  489</span>    <span class="keywordflow">return</span> std::addressof(buf) + 1;</div>
-<div class="line"><a id="l00490" name="l00490"></a><span class="lineno">  490</span>}</div>
-<div class="line"><a id="l00491" name="l00491"></a><span class="lineno">  491</span> </div>
-<div class="line"><a id="l00492" name="l00492"></a><span class="lineno">  492</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> Col&gt;</div>
-<div class="line"><a id="l00493" name="l00493"></a><span class="lineno">  493</span><span class="keyword">inline</span> <span class="keyword">typename</span> Col::const_iterator buffer_sequence_begin(Col <span class="keyword">const</span>&amp; col) {</div>
-<div class="line"><a id="l00494" name="l00494"></a><span class="lineno">  494</span>    <span class="keywordflow">return</span> col.cbegin();</div>
-<div class="line"><a id="l00495" name="l00495"></a><span class="lineno">  495</span>}</div>
-<div class="line"><a id="l00496" name="l00496"></a><span class="lineno">  496</span> </div>
-<div class="line"><a id="l00497" name="l00497"></a><span class="lineno">  497</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> Col&gt;</div>
-<div class="line"><a id="l00498" name="l00498"></a><span class="lineno">  498</span><span class="keyword">inline</span> <span class="keyword">typename</span> Col::const_iterator buffer_sequence_end(Col <span class="keyword">const</span>&amp; col) {</div>
-<div class="line"><a id="l00499" name="l00499"></a><span class="lineno">  499</span>    <span class="keywordflow">return</span> col.cend();</div>
-<div class="line"><a id="l00500" name="l00500"></a><span class="lineno">  500</span>}</div>
-<div class="line"><a id="l00501" name="l00501"></a><span class="lineno">  501</span> </div>
-<div class="line"><a id="l00502" name="l00502"></a><span class="lineno">  502</span><span class="keyword">namespace </span>detail {</div>
-<div class="line"><a id="l00503" name="l00503"></a><span class="lineno">  503</span> </div>
-<div class="line"><a id="l00504" name="l00504"></a><span class="lineno">  504</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span>&gt;</div>
-<div class="line"><a id="l00505" name="l00505"></a><span class="lineno">  505</span><span class="keywordtype">char</span> buffer_sequence_begin_helper(...);</div>
-<div class="line"><a id="l00506" name="l00506"></a><span class="lineno">  506</span> </div>
-<div class="line"><a id="l00507" name="l00507"></a><span class="lineno">  507</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a id="l00508" name="l00508"></a><span class="lineno">  508</span>char (&amp;buffer_sequence_begin_helper(</div>
-<div class="line"><a id="l00509" name="l00509"></a><span class="lineno">  509</span>    T* t,</div>
-<div class="line"><a id="l00510" name="l00510"></a><span class="lineno">  510</span>    <span class="keyword">typename</span> std::enable_if&lt;</div>
-<div class="line"><a id="l00511" name="l00511"></a><span class="lineno">  511</span>        !std::is_same&lt;</div>
-<div class="line"><a id="l00512" name="l00512"></a><span class="lineno">  512</span>            <span class="keyword">decltype</span>(buffer_sequence_begin(*t)),</div>
-<div class="line"><a id="l00513" name="l00513"></a><span class="lineno">  513</span>            <span class="keywordtype">void</span></div>
-<div class="line"><a id="l00514" name="l00514"></a><span class="lineno">  514</span>        &gt;::value</div>
-<div class="line"><a id="l00515" name="l00515"></a><span class="lineno">  515</span>    &gt;::type*)</div>
-<div class="line"><a id="l00516" name="l00516"></a><span class="lineno">  516</span>)[2];</div>
-<div class="line"><a id="l00517" name="l00517"></a><span class="lineno">  517</span> </div>
-<div class="line"><a id="l00518" name="l00518"></a><span class="lineno">  518</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span>&gt;</div>
-<div class="line"><a id="l00519" name="l00519"></a><span class="lineno">  519</span><span class="keywordtype">char</span> buffer_sequence_end_helper(...);</div>
-<div class="line"><a id="l00520" name="l00520"></a><span class="lineno">  520</span> </div>
-<div class="line"><a id="l00521" name="l00521"></a><span class="lineno">  521</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a id="l00522" name="l00522"></a><span class="lineno">  522</span>char (&amp;buffer_sequence_end_helper(</div>
-<div class="line"><a id="l00523" name="l00523"></a><span class="lineno">  523</span>    T* t,</div>
-<div class="line"><a id="l00524" name="l00524"></a><span class="lineno">  524</span>    <span class="keyword">typename</span> std::enable_if&lt;</div>
-<div class="line"><a id="l00525" name="l00525"></a><span class="lineno">  525</span>        !std::is_same&lt;</div>
-<div class="line"><a id="l00526" name="l00526"></a><span class="lineno">  526</span>            <span class="keyword">decltype</span>(buffer_sequence_end(*t)),</div>
-<div class="line"><a id="l00527" name="l00527"></a><span class="lineno">  527</span>            <span class="keywordtype">void</span></div>
-<div class="line"><a id="l00528" name="l00528"></a><span class="lineno">  528</span>        &gt;::value</div>
-<div class="line"><a id="l00529" name="l00529"></a><span class="lineno">  529</span>    &gt;::type*)</div>
-<div class="line"><a id="l00530" name="l00530"></a><span class="lineno">  530</span>)[2];</div>
-<div class="line"><a id="l00531" name="l00531"></a><span class="lineno">  531</span> </div>
-<div class="line"><a id="l00532" name="l00532"></a><span class="lineno">  532</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span>, <span class="keyword">typename</span>&gt;</div>
-<div class="line"><a id="l00533" name="l00533"></a><span class="lineno">  533</span>char (&amp;buffer_sequence_element_type_helper(...))[2];</div>
-<div class="line"><a id="l00534" name="l00534"></a><span class="lineno">  534</span> </div>
-<div class="line"><a id="l00535" name="l00535"></a><span class="lineno">  535</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> Buffer&gt;</div>
-<div class="line"><a id="l00536" name="l00536"></a><span class="lineno">  536</span><span class="keywordtype">char</span> buffer_sequence_element_type_helper(</div>
-<div class="line"><a id="l00537" name="l00537"></a><span class="lineno">  537</span>    T* t,</div>
-<div class="line"><a id="l00538" name="l00538"></a><span class="lineno">  538</span>    <span class="keyword">typename</span> std::enable_if&lt;</div>
-<div class="line"><a id="l00539" name="l00539"></a><span class="lineno">  539</span>        std::is_convertible&lt;</div>
-<div class="line"><a id="l00540" name="l00540"></a><span class="lineno">  540</span>            <span class="keyword">decltype</span>(*buffer_sequence_begin(*t)),</div>
-<div class="line"><a id="l00541" name="l00541"></a><span class="lineno">  541</span>            Buffer</div>
-<div class="line"><a id="l00542" name="l00542"></a><span class="lineno">  542</span>        &gt;::value</div>
-<div class="line"><a id="l00543" name="l00543"></a><span class="lineno">  543</span>    &gt;::type*</div>
-<div class="line"><a id="l00544" name="l00544"></a><span class="lineno">  544</span>);</div>
-<div class="line"><a id="l00545" name="l00545"></a><span class="lineno">  545</span> </div>
-<div class="line"><a id="l00546" name="l00546"></a><span class="lineno">  546</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> Buffer&gt;</div>
-<div class="line"><a id="l00547" name="l00547"></a><span class="lineno">  547</span><span class="keyword">struct </span>is_buffer_sequence_class</div>
-<div class="line"><a id="l00548" name="l00548"></a><span class="lineno">  548</span>    : std::integral_constant&lt;bool,</div>
-<div class="line"><a id="l00549" name="l00549"></a><span class="lineno">  549</span>      sizeof(buffer_sequence_begin_helper&lt;T&gt;(0, 0)) != 1 &amp;&amp;</div>
-<div class="line"><a id="l00550" name="l00550"></a><span class="lineno">  550</span>      sizeof(buffer_sequence_end_helper&lt;T&gt;(0, 0)) != 1 &amp;&amp;</div>
-<div class="line"><a id="l00551" name="l00551"></a><span class="lineno">  551</span>      sizeof(buffer_sequence_element_type_helper&lt;T, Buffer&gt;(0, 0)) == 1&gt;</div>
-<div class="line"><a id="l00552" name="l00552"></a><span class="lineno">  552</span>{</div>
-<div class="line"><a id="l00553" name="l00553"></a><span class="lineno">  553</span>};</div>
-<div class="line"><a id="l00554" name="l00554"></a><span class="lineno">  554</span> </div>
-<div class="line"><a id="l00555" name="l00555"></a><span class="lineno">  555</span>} <span class="comment">// namespace detail</span></div>
-<div class="line"><a id="l00556" name="l00556"></a><span class="lineno">  556</span> </div>
-<div class="line"><a id="l00557" name="l00557"></a><span class="lineno">  557</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
-<div class="line"><a id="l00558" name="l00558"></a><span class="lineno">  558</span><span class="keyword">struct </span>is_buffer_sequence :</div>
-<div class="line"><a id="l00559" name="l00559"></a><span class="lineno">  559</span>    std::conditional&lt;</div>
-<div class="line"><a id="l00560" name="l00560"></a><span class="lineno">  560</span>        std::is_class&lt;T&gt;::value,</div>
-<div class="line"><a id="l00561" name="l00561"></a><span class="lineno">  561</span>        detail::is_buffer_sequence_class&lt;T, buffer&gt;,</div>
-<div class="line"><a id="l00562" name="l00562"></a><span class="lineno">  562</span>        std::false_type</div>
-<div class="line"><a id="l00563" name="l00563"></a><span class="lineno">  563</span>    &gt;::type</div>
-<div class="line"><a id="l00564" name="l00564"></a><span class="lineno">  564</span>{</div>
-<div class="line"><a id="l00565" name="l00565"></a><span class="lineno">  565</span>};</div>
-<div class="line"><a id="l00566" name="l00566"></a><span class="lineno">  566</span> </div>
-<div class="line"><a id="l00567" name="l00567"></a><span class="lineno">  567</span><span class="keyword">template</span> &lt;&gt;</div>
-<div class="line"><a id="l00568" name="l00568"></a><span class="lineno">  568</span><span class="keyword">struct </span>is_buffer_sequence&lt;<a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">buffer</a>&gt; : std::true_type</div>
-<div class="line"><a id="l00569" name="l00569"></a><span class="lineno">  569</span>{</div>
-<div class="line"><a id="l00570" name="l00570"></a><span class="lineno">  570</span>};</div>
-<div class="line"><a id="l00571" name="l00571"></a><span class="lineno">  571</span> </div>
-<div class="line"><a id="l00572" name="l00572"></a><span class="lineno">  572</span>} <span class="comment">// namespace async_mqtt</span></div>
-<div class="line"><a id="l00573" name="l00573"></a><span class="lineno">  573</span> </div>
-<div class="line"><a id="l00574" name="l00574"></a><span class="lineno">  574</span><span class="keyword">namespace </span>boost {</div>
-<div class="line"><a id="l00575" name="l00575"></a><span class="lineno">  575</span><span class="keyword">namespace </span>asio {</div>
-<div class="line"><a id="l00576" name="l00576"></a><span class="lineno">  576</span> </div>
-<div class="foldopen" id="foldopen00587" data-start="{" data-end="}">
-<div class="line"><a id="l00587" name="l00587"></a><span class="lineno"><a class="line" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">  587</a></span><span class="keyword">inline</span> const_buffer <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">buffer</a>(<a class="code hl_class" href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a> <span class="keyword">const</span>&amp; data) {</div>
-<div class="line"><a id="l00588" name="l00588"></a><span class="lineno">  588</span>    <span class="keywordflow">return</span> <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">buffer</a>(data.data(), data.size());</div>
-<div class="line"><a id="l00589" name="l00589"></a><span class="lineno">  589</span>}</div>
+<div class="line"><a id="l00476" name="l00476"></a><span class="lineno">  476</span> </div>
+<div class="line"><a id="l00477" name="l00477"></a><span class="lineno">  477</span><span class="keyword">inline</span> std::size_t hash_value(buffer <span class="keyword">const</span>&amp; v) <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00478" name="l00478"></a><span class="lineno">  478</span>    std::size_t result = 0;</div>
+<div class="line"><a id="l00479" name="l00479"></a><span class="lineno">  479</span>    boost::hash_combine(result, <span class="keyword">static_cast&lt;</span>std::string_view const&amp;<span class="keyword">&gt;</span>(v));</div>
+<div class="line"><a id="l00480" name="l00480"></a><span class="lineno">  480</span>    <span class="keywordflow">return</span> result;</div>
+<div class="line"><a id="l00481" name="l00481"></a><span class="lineno">  481</span>}</div>
+<div class="line"><a id="l00482" name="l00482"></a><span class="lineno">  482</span> </div>
+<div class="line"><a id="l00483" name="l00483"></a><span class="lineno">  483</span><span class="keyword">inline</span> <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">buffer</a> <span class="keyword">const</span>* buffer_sequence_begin(buffer <span class="keyword">const</span>&amp; buf) {</div>
+<div class="line"><a id="l00484" name="l00484"></a><span class="lineno">  484</span>    <span class="keywordflow">return</span> std::addressof(buf);</div>
+<div class="line"><a id="l00485" name="l00485"></a><span class="lineno">  485</span>}</div>
+<div class="line"><a id="l00486" name="l00486"></a><span class="lineno">  486</span> </div>
+<div class="line"><a id="l00487" name="l00487"></a><span class="lineno">  487</span><span class="keyword">inline</span> <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">buffer</a> <span class="keyword">const</span>* buffer_sequence_end(buffer <span class="keyword">const</span>&amp; buf) {</div>
+<div class="line"><a id="l00488" name="l00488"></a><span class="lineno">  488</span>    <span class="keywordflow">return</span> std::addressof(buf) + 1;</div>
+<div class="line"><a id="l00489" name="l00489"></a><span class="lineno">  489</span>}</div>
+<div class="line"><a id="l00490" name="l00490"></a><span class="lineno">  490</span> </div>
+<div class="line"><a id="l00491" name="l00491"></a><span class="lineno">  491</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> Col&gt;</div>
+<div class="line"><a id="l00492" name="l00492"></a><span class="lineno">  492</span><span class="keyword">inline</span> <span class="keyword">typename</span> Col::const_iterator buffer_sequence_begin(Col <span class="keyword">const</span>&amp; col) {</div>
+<div class="line"><a id="l00493" name="l00493"></a><span class="lineno">  493</span>    <span class="keywordflow">return</span> col.cbegin();</div>
+<div class="line"><a id="l00494" name="l00494"></a><span class="lineno">  494</span>}</div>
+<div class="line"><a id="l00495" name="l00495"></a><span class="lineno">  495</span> </div>
+<div class="line"><a id="l00496" name="l00496"></a><span class="lineno">  496</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> Col&gt;</div>
+<div class="line"><a id="l00497" name="l00497"></a><span class="lineno">  497</span><span class="keyword">inline</span> <span class="keyword">typename</span> Col::const_iterator buffer_sequence_end(Col <span class="keyword">const</span>&amp; col) {</div>
+<div class="line"><a id="l00498" name="l00498"></a><span class="lineno">  498</span>    <span class="keywordflow">return</span> col.cend();</div>
+<div class="line"><a id="l00499" name="l00499"></a><span class="lineno">  499</span>}</div>
+<div class="line"><a id="l00500" name="l00500"></a><span class="lineno">  500</span> </div>
+<div class="line"><a id="l00501" name="l00501"></a><span class="lineno">  501</span><span class="keyword">namespace </span>detail {</div>
+<div class="line"><a id="l00502" name="l00502"></a><span class="lineno">  502</span> </div>
+<div class="line"><a id="l00503" name="l00503"></a><span class="lineno">  503</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span>&gt;</div>
+<div class="line"><a id="l00504" name="l00504"></a><span class="lineno">  504</span><span class="keywordtype">char</span> buffer_sequence_begin_helper(...);</div>
+<div class="line"><a id="l00505" name="l00505"></a><span class="lineno">  505</span> </div>
+<div class="line"><a id="l00506" name="l00506"></a><span class="lineno">  506</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a id="l00507" name="l00507"></a><span class="lineno">  507</span>char (&amp;buffer_sequence_begin_helper(</div>
+<div class="line"><a id="l00508" name="l00508"></a><span class="lineno">  508</span>    T* t,</div>
+<div class="line"><a id="l00509" name="l00509"></a><span class="lineno">  509</span>    <span class="keyword">typename</span> std::enable_if&lt;</div>
+<div class="line"><a id="l00510" name="l00510"></a><span class="lineno">  510</span>        !std::is_same&lt;</div>
+<div class="line"><a id="l00511" name="l00511"></a><span class="lineno">  511</span>            <span class="keyword">decltype</span>(buffer_sequence_begin(*t)),</div>
+<div class="line"><a id="l00512" name="l00512"></a><span class="lineno">  512</span>            <span class="keywordtype">void</span></div>
+<div class="line"><a id="l00513" name="l00513"></a><span class="lineno">  513</span>        &gt;::value</div>
+<div class="line"><a id="l00514" name="l00514"></a><span class="lineno">  514</span>    &gt;::type*)</div>
+<div class="line"><a id="l00515" name="l00515"></a><span class="lineno">  515</span>)[2];</div>
+<div class="line"><a id="l00516" name="l00516"></a><span class="lineno">  516</span> </div>
+<div class="line"><a id="l00517" name="l00517"></a><span class="lineno">  517</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span>&gt;</div>
+<div class="line"><a id="l00518" name="l00518"></a><span class="lineno">  518</span><span class="keywordtype">char</span> buffer_sequence_end_helper(...);</div>
+<div class="line"><a id="l00519" name="l00519"></a><span class="lineno">  519</span> </div>
+<div class="line"><a id="l00520" name="l00520"></a><span class="lineno">  520</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a id="l00521" name="l00521"></a><span class="lineno">  521</span>char (&amp;buffer_sequence_end_helper(</div>
+<div class="line"><a id="l00522" name="l00522"></a><span class="lineno">  522</span>    T* t,</div>
+<div class="line"><a id="l00523" name="l00523"></a><span class="lineno">  523</span>    <span class="keyword">typename</span> std::enable_if&lt;</div>
+<div class="line"><a id="l00524" name="l00524"></a><span class="lineno">  524</span>        !std::is_same&lt;</div>
+<div class="line"><a id="l00525" name="l00525"></a><span class="lineno">  525</span>            <span class="keyword">decltype</span>(buffer_sequence_end(*t)),</div>
+<div class="line"><a id="l00526" name="l00526"></a><span class="lineno">  526</span>            <span class="keywordtype">void</span></div>
+<div class="line"><a id="l00527" name="l00527"></a><span class="lineno">  527</span>        &gt;::value</div>
+<div class="line"><a id="l00528" name="l00528"></a><span class="lineno">  528</span>    &gt;::type*)</div>
+<div class="line"><a id="l00529" name="l00529"></a><span class="lineno">  529</span>)[2];</div>
+<div class="line"><a id="l00530" name="l00530"></a><span class="lineno">  530</span> </div>
+<div class="line"><a id="l00531" name="l00531"></a><span class="lineno">  531</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span>, <span class="keyword">typename</span>&gt;</div>
+<div class="line"><a id="l00532" name="l00532"></a><span class="lineno">  532</span>char (&amp;buffer_sequence_element_type_helper(...))[2];</div>
+<div class="line"><a id="l00533" name="l00533"></a><span class="lineno">  533</span> </div>
+<div class="line"><a id="l00534" name="l00534"></a><span class="lineno">  534</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> Buffer&gt;</div>
+<div class="line"><a id="l00535" name="l00535"></a><span class="lineno">  535</span><span class="keywordtype">char</span> buffer_sequence_element_type_helper(</div>
+<div class="line"><a id="l00536" name="l00536"></a><span class="lineno">  536</span>    T* t,</div>
+<div class="line"><a id="l00537" name="l00537"></a><span class="lineno">  537</span>    <span class="keyword">typename</span> std::enable_if&lt;</div>
+<div class="line"><a id="l00538" name="l00538"></a><span class="lineno">  538</span>        std::is_convertible&lt;</div>
+<div class="line"><a id="l00539" name="l00539"></a><span class="lineno">  539</span>            <span class="keyword">decltype</span>(*buffer_sequence_begin(*t)),</div>
+<div class="line"><a id="l00540" name="l00540"></a><span class="lineno">  540</span>            Buffer</div>
+<div class="line"><a id="l00541" name="l00541"></a><span class="lineno">  541</span>        &gt;::value</div>
+<div class="line"><a id="l00542" name="l00542"></a><span class="lineno">  542</span>    &gt;::type*</div>
+<div class="line"><a id="l00543" name="l00543"></a><span class="lineno">  543</span>);</div>
+<div class="line"><a id="l00544" name="l00544"></a><span class="lineno">  544</span> </div>
+<div class="line"><a id="l00545" name="l00545"></a><span class="lineno">  545</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> Buffer&gt;</div>
+<div class="line"><a id="l00546" name="l00546"></a><span class="lineno">  546</span><span class="keyword">struct </span>is_buffer_sequence_class</div>
+<div class="line"><a id="l00547" name="l00547"></a><span class="lineno">  547</span>    : std::integral_constant&lt;bool,</div>
+<div class="line"><a id="l00548" name="l00548"></a><span class="lineno">  548</span>      sizeof(buffer_sequence_begin_helper&lt;T&gt;(0, 0)) != 1 &amp;&amp;</div>
+<div class="line"><a id="l00549" name="l00549"></a><span class="lineno">  549</span>      sizeof(buffer_sequence_end_helper&lt;T&gt;(0, 0)) != 1 &amp;&amp;</div>
+<div class="line"><a id="l00550" name="l00550"></a><span class="lineno">  550</span>      sizeof(buffer_sequence_element_type_helper&lt;T, Buffer&gt;(0, 0)) == 1&gt;</div>
+<div class="line"><a id="l00551" name="l00551"></a><span class="lineno">  551</span>{</div>
+<div class="line"><a id="l00552" name="l00552"></a><span class="lineno">  552</span>};</div>
+<div class="line"><a id="l00553" name="l00553"></a><span class="lineno">  553</span> </div>
+<div class="line"><a id="l00554" name="l00554"></a><span class="lineno">  554</span>} <span class="comment">// namespace detail</span></div>
+<div class="line"><a id="l00555" name="l00555"></a><span class="lineno">  555</span> </div>
+<div class="line"><a id="l00556" name="l00556"></a><span class="lineno">  556</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</div>
+<div class="line"><a id="l00557" name="l00557"></a><span class="lineno">  557</span><span class="keyword">struct </span>is_buffer_sequence :</div>
+<div class="line"><a id="l00558" name="l00558"></a><span class="lineno">  558</span>    std::conditional&lt;</div>
+<div class="line"><a id="l00559" name="l00559"></a><span class="lineno">  559</span>        std::is_class&lt;T&gt;::value,</div>
+<div class="line"><a id="l00560" name="l00560"></a><span class="lineno">  560</span>        detail::is_buffer_sequence_class&lt;T, buffer&gt;,</div>
+<div class="line"><a id="l00561" name="l00561"></a><span class="lineno">  561</span>        std::false_type</div>
+<div class="line"><a id="l00562" name="l00562"></a><span class="lineno">  562</span>    &gt;::type</div>
+<div class="line"><a id="l00563" name="l00563"></a><span class="lineno">  563</span>{</div>
+<div class="line"><a id="l00564" name="l00564"></a><span class="lineno">  564</span>};</div>
+<div class="line"><a id="l00565" name="l00565"></a><span class="lineno">  565</span> </div>
+<div class="line"><a id="l00566" name="l00566"></a><span class="lineno">  566</span><span class="keyword">template</span> &lt;&gt;</div>
+<div class="line"><a id="l00567" name="l00567"></a><span class="lineno">  567</span><span class="keyword">struct </span>is_buffer_sequence&lt;<a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">buffer</a>&gt; : std::true_type</div>
+<div class="line"><a id="l00568" name="l00568"></a><span class="lineno">  568</span>{</div>
+<div class="line"><a id="l00569" name="l00569"></a><span class="lineno">  569</span>};</div>
+<div class="line"><a id="l00570" name="l00570"></a><span class="lineno">  570</span> </div>
+<div class="line"><a id="l00571" name="l00571"></a><span class="lineno">  571</span>} <span class="comment">// namespace async_mqtt</span></div>
+<div class="line"><a id="l00572" name="l00572"></a><span class="lineno">  572</span> </div>
+<div class="line"><a id="l00573" name="l00573"></a><span class="lineno">  573</span><span class="keyword">namespace </span>boost {</div>
+<div class="line"><a id="l00574" name="l00574"></a><span class="lineno">  574</span><span class="keyword">namespace </span>asio {</div>
+<div class="line"><a id="l00575" name="l00575"></a><span class="lineno">  575</span> </div>
+<div class="foldopen" id="foldopen00586" data-start="{" data-end="}">
+<div class="line"><a id="l00586" name="l00586"></a><span class="lineno"><a class="line" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">  586</a></span><span class="keyword">inline</span> const_buffer <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">buffer</a>(<a class="code hl_class" href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a> <span class="keyword">const</span>&amp; data) {</div>
+<div class="line"><a id="l00587" name="l00587"></a><span class="lineno">  587</span>    <span class="keywordflow">return</span> <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">buffer</a>(data.data(), data.size());</div>
+<div class="line"><a id="l00588" name="l00588"></a><span class="lineno">  588</span>}</div>
 </div>
-<div class="line"><a id="l00590" name="l00590"></a><span class="lineno">  590</span> </div>
-<div class="line"><a id="l00591" name="l00591"></a><span class="lineno">  591</span>} <span class="comment">// namespace asio</span></div>
-<div class="line"><a id="l00592" name="l00592"></a><span class="lineno">  592</span>} <span class="comment">// namespace boost</span></div>
-<div class="line"><a id="l00593" name="l00593"></a><span class="lineno">  593</span> </div>
-<div class="line"><a id="l00594" name="l00594"></a><span class="lineno">  594</span><span class="keyword">namespace </span>std {</div>
-<div class="line"><a id="l00595" name="l00595"></a><span class="lineno">  595</span> </div>
-<div class="line"><a id="l00596" name="l00596"></a><span class="lineno">  596</span><span class="keyword">template</span> &lt;&gt;</div>
-<div class="line"><a id="l00597" name="l00597"></a><span class="lineno">  597</span><span class="keyword">class </span>hash&lt;async_mqtt::<a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">buffer</a>&gt; {</div>
-<div class="line"><a id="l00598" name="l00598"></a><span class="lineno">  598</span><span class="keyword">public</span>:</div>
-<div class="line"><a id="l00599" name="l00599"></a><span class="lineno">  599</span>    std::uint64_t operator()(<a class="code hl_class" href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a> <span class="keyword">const</span>&amp; v) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
-<div class="line"><a id="l00600" name="l00600"></a><span class="lineno">  600</span>        <span class="keywordflow">return</span> std::hash&lt;std::string_view&gt;()(<span class="keyword">static_cast&lt;</span>std::string_view const&amp;<span class="keyword">&gt;</span>(v));</div>
-<div class="line"><a id="l00601" name="l00601"></a><span class="lineno">  601</span>    }</div>
-<div class="line"><a id="l00602" name="l00602"></a><span class="lineno">  602</span>};</div>
-<div class="line"><a id="l00603" name="l00603"></a><span class="lineno">  603</span> </div>
-<div class="line"><a id="l00604" name="l00604"></a><span class="lineno">  604</span>} <span class="comment">// namespace std</span></div>
-<div class="line"><a id="l00605" name="l00605"></a><span class="lineno">  605</span> </div>
-<div class="line"><a id="l00606" name="l00606"></a><span class="lineno">  606</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_BUFFER_HPP</span></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a24b4b37514e88ef089ef7b52b8293d0d"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a24b4b37514e88ef089ef7b52b8293d0d">async_mqtt::buffer::buffer</a></div><div class="ttdeci">buffer(std::string s)</div><div class="ttdoc">string constructor</div><div class="ttdef"><b>Definition</b> buffer.hpp:134</div></div>
+<div class="line"><a id="l00589" name="l00589"></a><span class="lineno">  589</span> </div>
+<div class="line"><a id="l00590" name="l00590"></a><span class="lineno">  590</span>} <span class="comment">// namespace asio</span></div>
+<div class="line"><a id="l00591" name="l00591"></a><span class="lineno">  591</span>} <span class="comment">// namespace boost</span></div>
+<div class="line"><a id="l00592" name="l00592"></a><span class="lineno">  592</span> </div>
+<div class="line"><a id="l00593" name="l00593"></a><span class="lineno">  593</span><span class="keyword">namespace </span>std {</div>
+<div class="line"><a id="l00594" name="l00594"></a><span class="lineno">  594</span> </div>
+<div class="line"><a id="l00595" name="l00595"></a><span class="lineno">  595</span><span class="keyword">template</span> &lt;&gt;</div>
+<div class="line"><a id="l00596" name="l00596"></a><span class="lineno">  596</span><span class="keyword">class </span>hash&lt;async_mqtt::<a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">buffer</a>&gt; {</div>
+<div class="line"><a id="l00597" name="l00597"></a><span class="lineno">  597</span><span class="keyword">public</span>:</div>
+<div class="line"><a id="l00598" name="l00598"></a><span class="lineno">  598</span>    std::uint64_t operator()(<a class="code hl_class" href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a> <span class="keyword">const</span>&amp; v) <span class="keyword">const</span> <span class="keyword">noexcept</span> {</div>
+<div class="line"><a id="l00599" name="l00599"></a><span class="lineno">  599</span>        <span class="keywordflow">return</span> std::hash&lt;std::string_view&gt;()(<span class="keyword">static_cast&lt;</span>std::string_view const&amp;<span class="keyword">&gt;</span>(v));</div>
+<div class="line"><a id="l00600" name="l00600"></a><span class="lineno">  600</span>    }</div>
+<div class="line"><a id="l00601" name="l00601"></a><span class="lineno">  601</span>};</div>
+<div class="line"><a id="l00602" name="l00602"></a><span class="lineno">  602</span> </div>
+<div class="line"><a id="l00603" name="l00603"></a><span class="lineno">  603</span>} <span class="comment">// namespace std</span></div>
+<div class="line"><a id="l00604" name="l00604"></a><span class="lineno">  604</span> </div>
+<div class="line"><a id="l00605" name="l00605"></a><span class="lineno">  605</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_BUFFER_HPP</span></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a24b4b37514e88ef089ef7b52b8293d0d"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a24b4b37514e88ef089ef7b52b8293d0d">async_mqtt::buffer::buffer</a></div><div class="ttdeci">buffer(std::string s)</div><div class="ttdoc">string constructor</div><div class="ttdef"><b>Definition</b> buffer.hpp:133</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a322bad7e07196362bf2fa26d9c2b4f4f"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a322bad7e07196362bf2fa26d9c2b4f4f">async_mqtt::buffer::buffer</a></div><div class="ttdeci">constexpr buffer() noexcept=default</div><div class="ttdoc">default constructor</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a55447262777041aa99c4c260382670fc"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a55447262777041aa99c4c260382670fc">async_mqtt::buffer::buffer</a></div><div class="ttdeci">buffer(char const *s, std::size_t count, std::shared_ptr&lt; void &gt; life)</div><div class="ttdoc">pointer, size, and lifetime constructor</div><div class="ttdef"><b>Definition</b> buffer.hpp:158</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a55fb8cd69efe05757c164e8c87d0b76c"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a55fb8cd69efe05757c164e8c87d0b76c">async_mqtt::buffer::buffer</a></div><div class="ttdeci">buffer(std::string_view sv, std::shared_ptr&lt; void &gt; life)</div><div class="ttdoc">std::string_view and lifetime constructor</div><div class="ttdef"><b>Definition</b> buffer.hpp:146</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a6354f235a64c4441d85d5874f341e2fe"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a6354f235a64c4441d85d5874f341e2fe">async_mqtt::buffer::buffer</a></div><div class="ttdeci">constexpr buffer(It first, End last)</div><div class="ttdoc">move assign operator The buffer doesn't manage the lifetime. The memory between first and last must b...</div><div class="ttdef"><b>Definition</b> buffer.hpp:116</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:266</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a92d4036fb9070e0be851fa133b20c9b9"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a92d4036fb9070e0be851fa133b20c9b9">async_mqtt::buffer::buffer</a></div><div class="ttdeci">constexpr buffer(char const *s)</div><div class="ttdoc">constructor The buffer doesn't manage the lifetime</div><div class="ttdef"><b>Definition</b> buffer.hpp:97</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_ac8ec6154fe9b524a5722848ea21fa7e0"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#ac8ec6154fe9b524a5722848ea21fa7e0">async_mqtt::buffer::buffer</a></div><div class="ttdeci">constexpr buffer(std::string_view sv)</div><div class="ttdoc">std::string_view constructor</div><div class="ttdef"><b>Definition</b> buffer.hpp:126</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_aceb1698f2803378a97b415e53b9f6a1c"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#aceb1698f2803378a97b415e53b9f6a1c">async_mqtt::buffer::buffer</a></div><div class="ttdeci">buffer(It first, End last, std::shared_ptr&lt; void &gt; life)</div><div class="ttdoc">range and lifetime constructor</div><div class="ttdef"><b>Definition</b> buffer.hpp:178</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_ad3d64b3893dfec271b87d8f2e3dd6b65"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#ad3d64b3893dfec271b87d8f2e3dd6b65">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) &amp;&amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:279</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a55447262777041aa99c4c260382670fc"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a55447262777041aa99c4c260382670fc">async_mqtt::buffer::buffer</a></div><div class="ttdeci">buffer(char const *s, std::size_t count, std::shared_ptr&lt; void &gt; life)</div><div class="ttdoc">pointer, size, and lifetime constructor</div><div class="ttdef"><b>Definition</b> buffer.hpp:157</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a55fb8cd69efe05757c164e8c87d0b76c"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a55fb8cd69efe05757c164e8c87d0b76c">async_mqtt::buffer::buffer</a></div><div class="ttdeci">buffer(std::string_view sv, std::shared_ptr&lt; void &gt; life)</div><div class="ttdoc">std::string_view and lifetime constructor</div><div class="ttdef"><b>Definition</b> buffer.hpp:145</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a6354f235a64c4441d85d5874f341e2fe"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a6354f235a64c4441d85d5874f341e2fe">async_mqtt::buffer::buffer</a></div><div class="ttdeci">constexpr buffer(It first, End last)</div><div class="ttdoc">move assign operator The buffer doesn't manage the lifetime. The memory between first and last must b...</div><div class="ttdef"><b>Definition</b> buffer.hpp:115</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:265</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a92d4036fb9070e0be851fa133b20c9b9"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a92d4036fb9070e0be851fa133b20c9b9">async_mqtt::buffer::buffer</a></div><div class="ttdeci">constexpr buffer(char const *s)</div><div class="ttdoc">constructor The buffer doesn't manage the lifetime</div><div class="ttdef"><b>Definition</b> buffer.hpp:96</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_ac8ec6154fe9b524a5722848ea21fa7e0"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#ac8ec6154fe9b524a5722848ea21fa7e0">async_mqtt::buffer::buffer</a></div><div class="ttdeci">constexpr buffer(std::string_view sv)</div><div class="ttdoc">std::string_view constructor</div><div class="ttdef"><b>Definition</b> buffer.hpp:125</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_aceb1698f2803378a97b415e53b9f6a1c"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#aceb1698f2803378a97b415e53b9f6a1c">async_mqtt::buffer::buffer</a></div><div class="ttdeci">buffer(It first, End last, std::shared_ptr&lt; void &gt; life)</div><div class="ttdoc">range and lifetime constructor</div><div class="ttdef"><b>Definition</b> buffer.hpp:177</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_ad3d64b3893dfec271b87d8f2e3dd6b65"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#ad3d64b3893dfec271b87d8f2e3dd6b65">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) &amp;&amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:278</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
 <!-- start footer part -->
diff --git a/doc/api/customized__websocket__stream_8hpp_source.html b/doc/api/customized__websocket__stream_8hpp_source.html
index d19479503..225b3b2b1 100644
--- a/doc/api/customized__websocket__stream_8hpp_source.html
+++ b/doc/api/customized__websocket__stream_8hpp_source.html
@@ -276,7 +276,7 @@
 <div class="line"><a id="l00177" name="l00177"></a><span class="lineno">  177</span>} <span class="comment">// namespace async_mqtt</span></div>
 <div class="line"><a id="l00178" name="l00178"></a><span class="lineno">  178</span> </div>
 <div class="line"><a id="l00179" name="l00179"></a><span class="lineno">  179</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PREDEFINED_LAYER_CUSTOMIZED_WEBSOCKET_STREAM_HPP</span></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
 <div class="ttc" id="agroup__error_html_gaa100a3fca173f12e33f3b5711710033d"><div class="ttname"><a href="group__error.html#gaa100a3fca173f12e33f3b5711710033d">async_mqtt::error_code</a></div><div class="ttdeci">sys::error_code error_code</div><div class="ttdoc">type alias of boost::sytem.</div><div class="ttdef"><b>Definition</b> exception.hpp:36</div></div>
 <div class="ttc" id="agroup__log_html_gga3abd0c0ebf71c7d01def2a00423d1abfacaf9b6b99962bf5c2264824231d7a40c"><div class="ttname"><a href="group__log.html#gga3abd0c0ebf71c7d01def2a00423d1abfacaf9b6b99962bf5c2264824231d7a40c">async_mqtt::severity_level::info</a></div><div class="ttdeci">@ info</div><div class="ttdoc">info level api call is output</div></div>
 <div class="ttc" id="astructasync__mqtt_1_1layer__customize_html"><div class="ttname"><a href="structasync__mqtt_1_1layer__customize.html">async_mqtt::layer_customize</a></div><div class="ttdoc">customization class template for underlying layer In order to adapt your layer to async_mqtt,...</div><div class="ttdef"><b>Definition</b> stream_traits.hpp:102</div></div>
diff --git a/doc/api/dir_4a30554fdbbe434876011b5ec6e3c25e.html b/doc/api/dir_4a30554fdbbe434876011b5ec6e3c25e.html
index dea312956..7fbc37c5e 100644
--- a/doc/api/dir_4a30554fdbbe434876011b5ec6e3c25e.html
+++ b/doc/api/dir_4a30554fdbbe434876011b5ec6e3c25e.html
@@ -161,8 +161,6 @@
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><a href="stream__write__packet_8hpp_source.html"><span class="icondoc"></span></a>&#160;</td><td class="memItemRight" valign="bottom"><b>stream_write_packet.hpp</b></td></tr>
 <tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><a href="underlying__connect__impl_8hpp_source.html"><span class="icondoc"></span></a>&#160;</td><td class="memItemRight" valign="bottom"><b>underlying_connect_impl.hpp</b></td></tr>
-<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 </div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/dir_4a30554fdbbe434876011b5ec6e3c25e.js b/doc/api/dir_4a30554fdbbe434876011b5ec6e3c25e.js
index 5b01ba39e..929b487f9 100644
--- a/doc/api/dir_4a30554fdbbe434876011b5ec6e3c25e.js
+++ b/doc/api/dir_4a30554fdbbe434876011b5ec6e3c25e.js
@@ -26,6 +26,5 @@ var dir_4a30554fdbbe434876011b5ec6e3c25e =
     [ "endpoint_send.hpp", "endpoint__send_8hpp_source.html", null ],
     [ "stream_close.hpp", "stream__close_8hpp_source.html", null ],
     [ "stream_read_packet.hpp", "stream__read__packet_8hpp_source.html", null ],
-    [ "stream_write_packet.hpp", "stream__write__packet_8hpp_source.html", null ],
-    [ "underlying_connect_impl.hpp", "underlying__connect__impl_8hpp_source.html", null ]
+    [ "stream_write_packet.hpp", "stream__write__packet_8hpp_source.html", null ]
 ];
\ No newline at end of file
diff --git a/doc/api/doxygen_crawl.html b/doc/api/doxygen_crawl.html
index 7f2ed7ddc..4e55601d0 100644
--- a/doc/api/doxygen_crawl.html
+++ b/doc/api/doxygen_crawl.html
@@ -46,7 +46,6 @@
 <a href="stream__close_8hpp_source.html"/>
 <a href="stream__read__packet_8hpp_source.html"/>
 <a href="stream__write__packet_8hpp_source.html"/>
-<a href="underlying__connect__impl_8hpp_source.html"/>
 <a href="log_8hpp_source.html"/>
 <a href="connect__flags_8hpp_source.html"/>
 <a href="connect__return__code_8hpp_source.html"/>
diff --git a/doc/api/endpoint__recv_8hpp_source.html b/doc/api/endpoint__recv_8hpp_source.html
index 53a165534..010e329e3 100644
--- a/doc/api/endpoint__recv_8hpp_source.html
+++ b/doc/api/endpoint__recv_8hpp_source.html
@@ -999,7 +999,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1basic__endpoint_html_a30eb38c816f1003c04ead18fdb5040da"><div class="ttname"><a href="classasync__mqtt_1_1basic__endpoint.html#a30eb38c816f1003c04ead18fdb5040da">async_mqtt::basic_endpoint::recv</a></div><div class="ttdeci">recv(CompletionToken &amp;&amp;token=as::default_completion_token_t&lt; executor_type &gt;{})</div><div class="ttdoc">receive packet users CANNOT call recv() before the previous recv()'s CompletionToken is invoked</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__endpoint_html_a5fc1a9fe62d017b44fcc94a7fd9ab090"><div class="ttname"><a href="classasync__mqtt_1_1basic__endpoint.html#a5fc1a9fe62d017b44fcc94a7fd9ab090">async_mqtt::basic_endpoint::packet_id_t</a></div><div class="ttdeci">typename packet_id_type&lt; PacketIdBytes &gt;::type packet_id_t</div><div class="ttdoc">Type of MQTT Packet Identifier.</div><div class="ttdef"><b>Definition</b> endpoint.hpp:120</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__endpoint_html_abeddeaf9929c8fcec4f42aa4884e38f6"><div class="ttname"><a href="classasync__mqtt_1_1basic__endpoint.html#abeddeaf9929c8fcec4f42aa4884e38f6">async_mqtt::basic_endpoint::close</a></div><div class="ttdeci">close(CompletionToken &amp;&amp;token=as::default_completion_token_t&lt; executor_type &gt;{})</div><div class="ttdoc">close the underlying connection</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__connack__v3__1__1_html_gga8342d3b4108d9bb325b95dbd9c0c6109a3e4d891a5df3d6d0d7dd9432a1bc6470"><div class="ttname"><a href="group__connack__v3__1__1.html#gga8342d3b4108d9bb325b95dbd9c0c6109a3e4d891a5df3d6d0d7dd9432a1bc6470">async_mqtt::connect_return_code::accepted</a></div><div class="ttdeci">@ accepted</div><div class="ttdoc">Connection accepted.</div></div>
 <div class="ttc" id="agroup__endpoint_html_gaed6ebca93cac28c67f2b4fb8641e775a"><div class="ttname"><a href="group__endpoint.html#gaed6ebca93cac28c67f2b4fb8641e775a">async_mqtt::filter</a></div><div class="ttdeci">filter</div><div class="ttdoc">receive packet filter</div><div class="ttdef"><b>Definition</b> endpoint.hpp:45</div></div>
 <div class="ttc" id="agroup__endpoint_html_ggaed6ebca93cac28c67f2b4fb8641e775aad1cc652b86b9858fe78058511716e92f"><div class="ttname"><a href="group__endpoint.html#ggaed6ebca93cac28c67f2b4fb8641e775aad1cc652b86b9858fe78058511716e92f">async_mqtt::filter::except</a></div><div class="ttdeci">@ except</div><div class="ttdoc">no matched control_packet_type is target</div></div>
diff --git a/doc/api/files.html b/doc/api/files.html
index 5556f863e..e1e115d96 100644
--- a/doc/api/files.html
+++ b/doc/api/files.html
@@ -129,7 +129,6 @@
 <tr id="row_0_0_1_24_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a href="stream__close_8hpp_source.html"><span class="icondoc"></span></a><b>stream_close.hpp</b></td><td class="desc"></td></tr>
 <tr id="row_0_0_1_25_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a href="stream__read__packet_8hpp_source.html"><span class="icondoc"></span></a><b>stream_read_packet.hpp</b></td><td class="desc"></td></tr>
 <tr id="row_0_0_1_26_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a href="stream__write__packet_8hpp_source.html"><span class="icondoc"></span></a><b>stream_write_packet.hpp</b></td><td class="desc"></td></tr>
-<tr id="row_0_0_1_27_" class="even" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a href="underlying__connect__impl_8hpp_source.html"><span class="icondoc"></span></a><b>underlying_connect_impl.hpp</b></td><td class="desc"></td></tr>
 <tr id="row_0_0_2_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span id="arr_0_0_2_" class="arrow" onclick="dynsection.toggleFolder('0_0_2_')">&#9658;</span><span id="img_0_0_2_" class="iconfclosed" onclick="dynsection.toggleFolder('0_0_2_')">&#160;</span><a class="el" href="dir_cce41e6148f04805f4e76e6a36ba88d6.html" target="_self">packet</a></td><td class="desc"></td></tr>
 <tr id="row_0_0_2_0_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a href="connect__flags_8hpp_source.html"><span class="icondoc"></span></a><b>connect_flags.hpp</b></td><td class="desc"></td></tr>
 <tr id="row_0_0_2_1_" class="odd" style="display:none;"><td class="entry"><span style="width:64px;display:inline-block;">&#160;</span><a href="connect__return__code_8hpp_source.html"><span class="icondoc"></span></a><b>connect_return_code.hpp</b></td><td class="desc"></td></tr>
diff --git a/doc/api/group__buffer.html b/doc/api/group__buffer.html
index 7c5511cab..df69c950c 100644
--- a/doc/api/group__buffer.html
+++ b/doc/api/group__buffer.html
@@ -119,9 +119,67 @@
 <tr class="memitem:gafccb94aa6be5a8e224e1b900e9522b4f" id="r_gafccb94aa6be5a8e224e1b900e9522b4f"><td class="memItemLeft" align="right" valign="top">const_buffer&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a> (<a class="el" href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a> const &amp;data)</td></tr>
 <tr class="memdesc:gafccb94aa6be5a8e224e1b900e9522b4f"><td class="mdescLeft">&#160;</td><td class="mdescRight">create boost::asio::const_buffer from the <a class="el" href="classasync__mqtt_1_1buffer.html" title="buffer that has string_view interface and shared ownership This class is only for advanced usecase su...">async_mqtt::buffer</a> boost::asio::const_buffer is a kind of view class. So the class doesn't hold any lifetimes. The caller needs to manage data's lifetime.  <br /></td></tr>
 <tr class="separator:gafccb94aa6be5a8e224e1b900e9522b4f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga4c78376365b748051fe7385678fb6f68" id="r_ga4c78376365b748051fe7385678fb6f68"><td class="memItemLeft" align="right" valign="top">std::shared_ptr&lt; char[]&gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="#ga4c78376365b748051fe7385678fb6f68">async_mqtt::make_shared_ptr_char_array</a> (std::size_t size)</td></tr>
+<tr class="memdesc:ga4c78376365b748051fe7385678fb6f68"><td class="mdescLeft">&#160;</td><td class="mdescRight">shared_ptr&lt;char[]&gt; creating function. You can choose the target type.  <br /></td></tr>
+<tr class="separator:ga4c78376365b748051fe7385678fb6f68"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ga3fd86cf55e3842b607702b72c0617159" id="r_ga3fd86cf55e3842b607702b72c0617159"><td class="memTemplParams" colspan="2">template&lt;typename Alloc &gt; </td></tr>
+<tr class="memitem:ga3fd86cf55e3842b607702b72c0617159"><td class="memTemplItemLeft" align="right" valign="top">std::shared_ptr&lt; char[]&gt;&#160;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="#ga3fd86cf55e3842b607702b72c0617159">async_mqtt::allocate_shared_ptr_char_array</a> (Alloc &amp;&amp;alloc, std::size_t size)</td></tr>
+<tr class="memdesc:ga3fd86cf55e3842b607702b72c0617159"><td class="mdescLeft">&#160;</td><td class="mdescRight">shared_ptr&lt;char[]&gt; creating function with allocator. You can choose the target type.  <br /></td></tr>
+<tr class="separator:ga3fd86cf55e3842b607702b72c0617159"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <h2 class="groupheader">Function Documentation</h2>
+<a id="ga3fd86cf55e3842b607702b72c0617159" name="ga3fd86cf55e3842b607702b72c0617159"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga3fd86cf55e3842b607702b72c0617159">&#9670;&#160;</a></span>allocate_shared_ptr_char_array()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<div class="memtemplate">
+template&lt;typename Alloc &gt; </div>
+<table class="mlabels">
+  <tr>
+  <td class="mlabels-left">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::shared_ptr&lt; char[]&gt; async_mqtt::allocate_shared_ptr_char_array </td>
+          <td>(</td>
+          <td class="paramtype">Alloc &amp;&amp;</td>          <td class="paramname"><span class="paramname"><em>alloc</em>, </span></td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">std::size_t</td>          <td class="paramname"><span class="paramname"><em>size</em></span>&#160;)</td>
+        </tr>
+      </table>
+  </td>
+  <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span>  </td>
+  </tr>
+</table>
+</div><div class="memdoc">
+
+<p>shared_ptr&lt;char[]&gt; creating function with allocator. You can choose the target type. </p>
+<ul>
+<li>if your compiler setting is C++20 or later, then <code>std::make_shared&lt;char[]&gt;(size)</code> is used.<ul>
+<li>It can allocate an array of characters and the control block in a single allocation.</li>
+</ul>
+</li>
+<li>otherwise <code>std::shared_ptr&lt;char[]&gt;(new char[size])</code> is used.<ul>
+<li>It requires two times allocations. <dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">alloc</td><td>allocator </td></tr>
+    <tr><td class="paramname">size</td><td>of char array </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>shared_ptr of array </dd></dl>
+</li>
+</ul>
+</li>
+</ul>
+
+</div>
+</div>
 <a id="gafccb94aa6be5a8e224e1b900e9522b4f" name="gafccb94aa6be5a8e224e1b900e9522b4f"></a>
 <h2 class="memtitle"><span class="permalink"><a href="#gafccb94aa6be5a8e224e1b900e9522b4f">&#9670;&#160;</a></span>buffer()</h2>
 
@@ -154,6 +212,50 @@ <h2 class="memtitle"><span class="permalink"><a href="#gafccb94aa6be5a8e224e1b90
 </dl>
 <dl class="section return"><dt>Returns</dt><dd>boost::asio::const_buffer </dd></dl>
 
+</div>
+</div>
+<a id="ga4c78376365b748051fe7385678fb6f68" name="ga4c78376365b748051fe7385678fb6f68"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ga4c78376365b748051fe7385678fb6f68">&#9670;&#160;</a></span>make_shared_ptr_char_array()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+  <tr>
+  <td class="mlabels-left">
+      <table class="memname">
+        <tr>
+          <td class="memname">std::shared_ptr&lt; char[]&gt; async_mqtt::make_shared_ptr_char_array </td>
+          <td>(</td>
+          <td class="paramtype">std::size_t</td>          <td class="paramname"><span class="paramname"><em>size</em></span></td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+  </td>
+  <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inline</span></span>  </td>
+  </tr>
+</table>
+</div><div class="memdoc">
+
+<p>shared_ptr&lt;char[]&gt; creating function. You can choose the target type. </p>
+<ul>
+<li>if your compiler setting is C++20 or later, then <code>std::make_shared&lt;char[]&gt;(size)</code> is used.<ul>
+<li>It can allocate an array of characters and the control block in a single allocation.</li>
+</ul>
+</li>
+<li>otherwise <code>std::shared_ptr&lt;char[]&gt;(new char[size])</code> is used.<ul>
+<li>It requires two times allocations. <dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">size</td><td>of char array </td></tr>
+  </table>
+  </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>shared_ptr of array </dd></dl>
+</li>
+</ul>
+</li>
+</ul>
+
 </div>
 </div>
 </div><!-- contents -->
diff --git a/doc/api/group__buffer.js b/doc/api/group__buffer.js
index fa2b88d50..7c59b6506 100644
--- a/doc/api/group__buffer.js
+++ b/doc/api/group__buffer.js
@@ -17,5 +17,7 @@ var group__buffer =
       [ "substr", "classasync__mqtt_1_1buffer.html#ad3d64b3893dfec271b87d8f2e3dd6b65", null ],
       [ "substr", "classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756", null ]
     ] ],
-    [ "boost::asio::buffer", "group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f", null ]
+    [ "async_mqtt::allocate_shared_ptr_char_array", "group__buffer.html#ga3fd86cf55e3842b607702b72c0617159", null ],
+    [ "boost::asio::buffer", "group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f", null ],
+    [ "async_mqtt::make_shared_ptr_char_array", "group__buffer.html#ga4c78376365b748051fe7385678fb6f68", null ]
 ];
\ No newline at end of file
diff --git a/doc/api/navtreedata.js b/doc/api/navtreedata.js
index ee7dce978..8cbf78377 100644
--- a/doc/api/navtreedata.js
+++ b/doc/api/navtreedata.js
@@ -49,8 +49,8 @@ var NAVTREEINDEX =
 "all_8hpp_source.html",
 "classasync__mqtt_1_1v3__1__1_1_1basic__pubrec__packet.html#aad008c240c640426cedaf453dde96a2c",
 "classes.html",
-"group__qos.html#gad858b3dc3d6733e6ec7b1ff497f90583",
-"v3__1__1__disconnect_8hpp_source.html"
+"group__qos.html#ga73f26073eb57bd3ff1b64112a13987a2",
+"v3__1__1__connect_8hpp_source.html"
 ];
 
 var SYNCONMSG = 'click to disable panel synchronisation';
diff --git a/doc/api/navtreeindex2.js b/doc/api/navtreeindex2.js
index c4b9530d5..58b8d257b 100644
--- a/doc/api/navtreeindex2.js
+++ b/doc/api/navtreeindex2.js
@@ -97,7 +97,9 @@ var NAVTREEINDEX2 =
 "get__protocol__version_8hpp_source.html":[2,0,0,0,2,5],
 "group__auth__v5.html":[0,3,1,1],
 "group__buffer.html":[0,3,2,0],
-"group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f":[0,3,2,0,1],
+"group__buffer.html#ga3fd86cf55e3842b607702b72c0617159":[0,3,2,0,1],
+"group__buffer.html#ga4c78376365b748051fe7385678fb6f68":[0,3,2,0,3],
+"group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f":[0,3,2,0,2],
 "group__client.html":[0,0,0],
 "group__connack__v3__1__1.html":[0,3,0,0],
 "group__connack__v3__1__1.html#ga8342d3b4108d9bb325b95dbd9c0c6109":[0,3,0,0,1],
@@ -193,32 +195,32 @@ var NAVTREEINDEX2 =
 "group__publish__options.html":[0,3,1,9,0],
 "group__publish__options.html#ga1d01ae8614f9e61ba92cc019a04fdb11":[0,3,0,7,0,3],
 "group__publish__options.html#ga1d01ae8614f9e61ba92cc019a04fdb11":[0,3,1,9,0,3],
-"group__publish__options.html#ga406b2f851035de6200437191cff85141":[0,3,1,9,0,4],
 "group__publish__options.html#ga406b2f851035de6200437191cff85141":[0,3,0,7,0,4],
+"group__publish__options.html#ga406b2f851035de6200437191cff85141":[0,3,1,9,0,4],
 "group__publish__options.html#ga4f7a28146e2625b204fe7a47caac0cb0":[0,3,1,9,0,9],
 "group__publish__options.html#ga4f7a28146e2625b204fe7a47caac0cb0":[0,3,0,7,0,9],
-"group__publish__options.html#ga52fa7b3b39f4ce5c0bc770cbfbf2094f":[0,3,0,7,0,10],
 "group__publish__options.html#ga52fa7b3b39f4ce5c0bc770cbfbf2094f":[0,3,1,9,0,10],
+"group__publish__options.html#ga52fa7b3b39f4ce5c0bc770cbfbf2094f":[0,3,0,7,0,10],
 "group__publish__options.html#ga68e8eb150ce8a27b3ef1c709f6ce0726":[0,3,1,9,0,7],
 "group__publish__options.html#ga68e8eb150ce8a27b3ef1c709f6ce0726":[0,3,0,7,0,7],
 "group__publish__options.html#ga76577d10d924c0011cceee5fb3d9c000":[0,3,0,7,0,8],
 "group__publish__options.html#ga76577d10d924c0011cceee5fb3d9c000":[0,3,1,9,0,8],
-"group__publish__options.html#ga79ea84d5cef0b9d99ce87160957704ab":[0,3,0,7,0,6],
 "group__publish__options.html#ga79ea84d5cef0b9d99ce87160957704ab":[0,3,1,9,0,6],
-"group__publish__options.html#ga89fabc81d8448fa347b2146349ae4737":[0,3,0,7,0,2],
+"group__publish__options.html#ga79ea84d5cef0b9d99ce87160957704ab":[0,3,0,7,0,6],
 "group__publish__options.html#ga89fabc81d8448fa347b2146349ae4737":[0,3,1,9,0,2],
-"group__publish__options.html#gacb20c099f1b6d25577268f35b192a3cd":[0,3,0,7,0,1],
+"group__publish__options.html#ga89fabc81d8448fa347b2146349ae4737":[0,3,0,7,0,2],
 "group__publish__options.html#gacb20c099f1b6d25577268f35b192a3cd":[0,3,1,9,0,1],
+"group__publish__options.html#gacb20c099f1b6d25577268f35b192a3cd":[0,3,0,7,0,1],
 "group__publish__options.html#gaf2232b1c4d2dcd90452b5eaa869c40df":[0,3,0,7,0,5],
 "group__publish__options.html#gaf2232b1c4d2dcd90452b5eaa869c40df":[0,3,1,9,0,5],
-"group__publish__options.html#gga89fabc81d8448fa347b2146349ae4737a7fa3b767c460b54a2be4d49030b349c7":[0,3,0,7,0,2,1],
 "group__publish__options.html#gga89fabc81d8448fa347b2146349ae4737a7fa3b767c460b54a2be4d49030b349c7":[0,3,1,9,0,2,1],
-"group__publish__options.html#gga89fabc81d8448fa347b2146349ae4737aa6105c0a611b41b08f1209506350279e":[0,3,0,7,0,2,0],
+"group__publish__options.html#gga89fabc81d8448fa347b2146349ae4737a7fa3b767c460b54a2be4d49030b349c7":[0,3,0,7,0,2,1],
 "group__publish__options.html#gga89fabc81d8448fa347b2146349ae4737aa6105c0a611b41b08f1209506350279e":[0,3,1,9,0,2,0],
+"group__publish__options.html#gga89fabc81d8448fa347b2146349ae4737aa6105c0a611b41b08f1209506350279e":[0,3,0,7,0,2,0],
 "group__publish__options.html#ggacb20c099f1b6d25577268f35b192a3cda7fa3b767c460b54a2be4d49030b349c7":[0,3,0,7,0,1,1],
 "group__publish__options.html#ggacb20c099f1b6d25577268f35b192a3cda7fa3b767c460b54a2be4d49030b349c7":[0,3,1,9,0,1,1],
-"group__publish__options.html#ggacb20c099f1b6d25577268f35b192a3cdaa6105c0a611b41b08f1209506350279e":[0,3,1,9,0,1,0],
 "group__publish__options.html#ggacb20c099f1b6d25577268f35b192a3cdaa6105c0a611b41b08f1209506350279e":[0,3,0,7,0,1,0],
+"group__publish__options.html#ggacb20c099f1b6d25577268f35b192a3cdaa6105c0a611b41b08f1209506350279e":[0,3,1,9,0,1,0],
 "group__publish__v3__1__1.html":[0,3,0,7],
 "group__publish__v3__1__1.html#ga9db7a5336b9296dd1f7413b5c2f5290a":[0,3,0,7,3],
 "group__publish__v3__1__1__detail.html":[0,3,0,7,2],
@@ -238,16 +240,14 @@ var NAVTREEINDEX2 =
 "group__pubrel__v5.html#gac621c1b7011518ff60a9fbedde43b367":[0,3,1,11,1],
 "group__pubrel__v5__detail.html":[0,3,1,11,0],
 "group__qos.html":[0,3,1,9,1],
-"group__qos.html":[0,3,1,13,0],
 "group__qos.html":[0,3,0,7,1],
 "group__qos.html":[0,3,0,11,0],
-"group__qos.html#ga38e773082414bb272ab22275c56eb4df":[0,3,0,11,0,0],
-"group__qos.html#ga38e773082414bb272ab22275c56eb4df":[0,3,1,13,0,0],
+"group__qos.html":[0,3,1,13,0],
 "group__qos.html#ga38e773082414bb272ab22275c56eb4df":[0,3,0,7,1,0],
 "group__qos.html#ga38e773082414bb272ab22275c56eb4df":[0,3,1,9,1,0],
-"group__qos.html#ga73f26073eb57bd3ff1b64112a13987a2":[0,3,0,11,0,1],
-"group__qos.html#ga73f26073eb57bd3ff1b64112a13987a2":[0,3,0,7,1,1],
+"group__qos.html#ga38e773082414bb272ab22275c56eb4df":[0,3,0,11,0,0],
+"group__qos.html#ga38e773082414bb272ab22275c56eb4df":[0,3,1,13,0,0],
 "group__qos.html#ga73f26073eb57bd3ff1b64112a13987a2":[0,3,1,13,0,1],
-"group__qos.html#ga73f26073eb57bd3ff1b64112a13987a2":[0,3,1,9,1,1],
-"group__qos.html#gad858b3dc3d6733e6ec7b1ff497f90583":[0,3,1,13,0,2]
+"group__qos.html#ga73f26073eb57bd3ff1b64112a13987a2":[0,3,0,7,1,1],
+"group__qos.html#ga73f26073eb57bd3ff1b64112a13987a2":[0,3,0,11,0,1]
 };
diff --git a/doc/api/navtreeindex3.js b/doc/api/navtreeindex3.js
index 18ccf4fac..04f0de683 100644
--- a/doc/api/navtreeindex3.js
+++ b/doc/api/navtreeindex3.js
@@ -1,19 +1,21 @@
 var NAVTREEINDEX3 =
 {
-"group__qos.html#gad858b3dc3d6733e6ec7b1ff497f90583":[0,3,1,9,1,2],
+"group__qos.html#ga73f26073eb57bd3ff1b64112a13987a2":[0,3,1,9,1,1],
 "group__qos.html#gad858b3dc3d6733e6ec7b1ff497f90583":[0,3,0,11,0,2],
 "group__qos.html#gad858b3dc3d6733e6ec7b1ff497f90583":[0,3,0,7,1,2],
-"group__qos.html#gga38e773082414bb272ab22275c56eb4dfa64d245cf1d119a993a586e60738513a9":[0,3,0,7,1,0,2],
+"group__qos.html#gad858b3dc3d6733e6ec7b1ff497f90583":[0,3,1,9,1,2],
+"group__qos.html#gad858b3dc3d6733e6ec7b1ff497f90583":[0,3,1,13,0,2],
+"group__qos.html#gga38e773082414bb272ab22275c56eb4dfa64d245cf1d119a993a586e60738513a9":[0,3,1,13,0,0,2],
 "group__qos.html#gga38e773082414bb272ab22275c56eb4dfa64d245cf1d119a993a586e60738513a9":[0,3,0,11,0,0,2],
+"group__qos.html#gga38e773082414bb272ab22275c56eb4dfa64d245cf1d119a993a586e60738513a9":[0,3,0,7,1,0,2],
 "group__qos.html#gga38e773082414bb272ab22275c56eb4dfa64d245cf1d119a993a586e60738513a9":[0,3,1,9,1,0,2],
-"group__qos.html#gga38e773082414bb272ab22275c56eb4dfa64d245cf1d119a993a586e60738513a9":[0,3,1,13,0,0,2],
-"group__qos.html#gga38e773082414bb272ab22275c56eb4dfa9cb5367ca459f35c28917fa49ed97135":[0,3,0,11,0,0,0],
-"group__qos.html#gga38e773082414bb272ab22275c56eb4dfa9cb5367ca459f35c28917fa49ed97135":[0,3,1,13,0,0,0],
 "group__qos.html#gga38e773082414bb272ab22275c56eb4dfa9cb5367ca459f35c28917fa49ed97135":[0,3,1,9,1,0,0],
+"group__qos.html#gga38e773082414bb272ab22275c56eb4dfa9cb5367ca459f35c28917fa49ed97135":[0,3,0,11,0,0,0],
 "group__qos.html#gga38e773082414bb272ab22275c56eb4dfa9cb5367ca459f35c28917fa49ed97135":[0,3,0,7,1,0,0],
+"group__qos.html#gga38e773082414bb272ab22275c56eb4dfa9cb5367ca459f35c28917fa49ed97135":[0,3,1,13,0,0,0],
+"group__qos.html#gga38e773082414bb272ab22275c56eb4dfaeb48560f42da862548ffd999b87b7b9f":[0,3,1,9,1,0,1],
 "group__qos.html#gga38e773082414bb272ab22275c56eb4dfaeb48560f42da862548ffd999b87b7b9f":[0,3,0,7,1,0,1],
 "group__qos.html#gga38e773082414bb272ab22275c56eb4dfaeb48560f42da862548ffd999b87b7b9f":[0,3,0,11,0,0,1],
-"group__qos.html#gga38e773082414bb272ab22275c56eb4dfaeb48560f42da862548ffd999b87b7b9f":[0,3,1,9,1,0,1],
 "group__qos.html#gga38e773082414bb272ab22275c56eb4dfaeb48560f42da862548ffd999b87b7b9f":[0,3,1,13,0,0,1],
 "group__role.html":[0,0,4],
 "group__role.html#ga83492944f4f6b69eb11ce917d1f27c4a":[0,0,4,0],
@@ -144,50 +146,50 @@ var NAVTREEINDEX3 =
 "structasync__mqtt_1_1property_1_1detail_1_1variable__property.html#ac85966ce055fbf7a6e166c99a56bfd13":[0,3,1,0,0,3,0],
 "structasync__mqtt_1_1pub_1_1opts.html":[0,3,1,9,0,0],
 "structasync__mqtt_1_1pub_1_1opts.html":[0,3,0,7,0,0],
-"structasync__mqtt_1_1pub_1_1opts.html#a02ea6b0e93714fb1ca011e5f64ae959b":[0,3,0,7,0,0,7],
 "structasync__mqtt_1_1pub_1_1opts.html#a02ea6b0e93714fb1ca011e5f64ae959b":[0,3,1,9,0,0,7],
-"structasync__mqtt_1_1pub_1_1opts.html#a0e034b9ef96c2722428efe699759447b":[0,3,1,9,0,0,25],
+"structasync__mqtt_1_1pub_1_1opts.html#a02ea6b0e93714fb1ca011e5f64ae959b":[0,3,0,7,0,0,7],
 "structasync__mqtt_1_1pub_1_1opts.html#a0e034b9ef96c2722428efe699759447b":[0,3,0,7,0,0,25],
+"structasync__mqtt_1_1pub_1_1opts.html#a0e034b9ef96c2722428efe699759447b":[0,3,1,9,0,0,25],
 "structasync__mqtt_1_1pub_1_1opts.html#a2b95a445f5dfe29b0acc78f7a7ed6d17":[0,3,0,7,0,0,0],
 "structasync__mqtt_1_1pub_1_1opts.html#a2b95a445f5dfe29b0acc78f7a7ed6d17":[0,3,1,9,0,0,0],
 "structasync__mqtt_1_1pub_1_1opts.html#a2c15f792a5f4587887c81aaaf1f587dc":[0,3,0,7,0,0,2],
 "structasync__mqtt_1_1pub_1_1opts.html#a2c15f792a5f4587887c81aaaf1f587dc":[0,3,1,9,0,0,2],
-"structasync__mqtt_1_1pub_1_1opts.html#a39c7dbd5deb15a215574029fdeef13d7":[0,3,1,9,0,0,17],
 "structasync__mqtt_1_1pub_1_1opts.html#a39c7dbd5deb15a215574029fdeef13d7":[0,3,0,7,0,0,17],
+"structasync__mqtt_1_1pub_1_1opts.html#a39c7dbd5deb15a215574029fdeef13d7":[0,3,1,9,0,0,17],
 "structasync__mqtt_1_1pub_1_1opts.html#a536025fed3890379ae4efe4efd19ed08":[0,3,1,9,0,0,9],
 "structasync__mqtt_1_1pub_1_1opts.html#a536025fed3890379ae4efe4efd19ed08":[0,3,0,7,0,0,9],
-"structasync__mqtt_1_1pub_1_1opts.html#a54c52b87a9571cfedd7e51607a0bfea4":[0,3,0,7,0,0,27],
 "structasync__mqtt_1_1pub_1_1opts.html#a54c52b87a9571cfedd7e51607a0bfea4":[0,3,1,9,0,0,27],
+"structasync__mqtt_1_1pub_1_1opts.html#a54c52b87a9571cfedd7e51607a0bfea4":[0,3,0,7,0,0,27],
 "structasync__mqtt_1_1pub_1_1opts.html#a58dca155ddb9d0c1168dc83f3205722d":[0,3,1,9,0,0,4],
 "structasync__mqtt_1_1pub_1_1opts.html#a58dca155ddb9d0c1168dc83f3205722d":[0,3,0,7,0,0,4],
-"structasync__mqtt_1_1pub_1_1opts.html#a5c21cfa1e07fd3d4f39e730711f4769e":[0,3,1,9,0,0,8],
 "structasync__mqtt_1_1pub_1_1opts.html#a5c21cfa1e07fd3d4f39e730711f4769e":[0,3,0,7,0,0,8],
+"structasync__mqtt_1_1pub_1_1opts.html#a5c21cfa1e07fd3d4f39e730711f4769e":[0,3,1,9,0,0,8],
 "structasync__mqtt_1_1pub_1_1opts.html#a5fd5e62aaf11fde91b9f7dfe6929a20c":[0,3,0,7,0,0,24],
 "structasync__mqtt_1_1pub_1_1opts.html#a5fd5e62aaf11fde91b9f7dfe6929a20c":[0,3,1,9,0,0,24],
-"structasync__mqtt_1_1pub_1_1opts.html#a6c9a3ff52f84311f298c82398a9beb41":[0,3,1,9,0,0,6],
 "structasync__mqtt_1_1pub_1_1opts.html#a6c9a3ff52f84311f298c82398a9beb41":[0,3,0,7,0,0,6],
+"structasync__mqtt_1_1pub_1_1opts.html#a6c9a3ff52f84311f298c82398a9beb41":[0,3,1,9,0,0,6],
 "structasync__mqtt_1_1pub_1_1opts.html#a8c58455c58558a08e66e89febfd41ae5":[0,3,0,7,0,0,5],
 "structasync__mqtt_1_1pub_1_1opts.html#a8c58455c58558a08e66e89febfd41ae5":[0,3,1,9,0,0,5],
 "structasync__mqtt_1_1pub_1_1opts.html#a8c9f1580ac375e138a2bb343d1e7c2c4":[0,3,0,7,0,0,16],
 "structasync__mqtt_1_1pub_1_1opts.html#a8c9f1580ac375e138a2bb343d1e7c2c4":[0,3,1,9,0,0,16],
-"structasync__mqtt_1_1pub_1_1opts.html#a8caeacf74f1bdd2efaf500aeda3cd661":[0,3,1,9,0,0,11],
 "structasync__mqtt_1_1pub_1_1opts.html#a8caeacf74f1bdd2efaf500aeda3cd661":[0,3,0,7,0,0,11],
-"structasync__mqtt_1_1pub_1_1opts.html#a914b08eed4535b6ea7964d72182e95bf":[0,3,1,9,0,0,14],
+"structasync__mqtt_1_1pub_1_1opts.html#a8caeacf74f1bdd2efaf500aeda3cd661":[0,3,1,9,0,0,11],
 "structasync__mqtt_1_1pub_1_1opts.html#a914b08eed4535b6ea7964d72182e95bf":[0,3,0,7,0,0,14],
+"structasync__mqtt_1_1pub_1_1opts.html#a914b08eed4535b6ea7964d72182e95bf":[0,3,1,9,0,0,14],
 "structasync__mqtt_1_1pub_1_1opts.html#a94dcdd476765182d22f12d1de2502b2b":[0,3,0,7,0,0,1],
 "structasync__mqtt_1_1pub_1_1opts.html#a94dcdd476765182d22f12d1de2502b2b":[0,3,1,9,0,0,1],
-"structasync__mqtt_1_1pub_1_1opts.html#aa12464e63b57cec10ba45773ff5d4acc":[0,3,0,7,0,0,12],
 "structasync__mqtt_1_1pub_1_1opts.html#aa12464e63b57cec10ba45773ff5d4acc":[0,3,1,9,0,0,12],
+"structasync__mqtt_1_1pub_1_1opts.html#aa12464e63b57cec10ba45773ff5d4acc":[0,3,0,7,0,0,12],
 "structasync__mqtt_1_1pub_1_1opts.html#ad2c8e9d949c50537023afb4bdc477957":[0,3,1,9,0,0,28],
 "structasync__mqtt_1_1pub_1_1opts.html#ad2c8e9d949c50537023afb4bdc477957":[0,3,0,7,0,0,28],
-"structasync__mqtt_1_1pub_1_1opts.html#ad406db591c5f28508143b9f885b12be1":[0,3,1,9,0,0,26],
 "structasync__mqtt_1_1pub_1_1opts.html#ad406db591c5f28508143b9f885b12be1":[0,3,0,7,0,0,26],
+"structasync__mqtt_1_1pub_1_1opts.html#ad406db591c5f28508143b9f885b12be1":[0,3,1,9,0,0,26],
 "structasync__mqtt_1_1pub_1_1opts.html#ad9994dd66c0562a4a568da58065690e1":[0,3,1,9,0,0,29],
 "structasync__mqtt_1_1pub_1_1opts.html#ad9994dd66c0562a4a568da58065690e1":[0,3,0,7,0,0,29],
-"structasync__mqtt_1_1pub_1_1opts.html#aeaaed644f437a45bbc25b74d4b4a87ab":[0,3,0,7,0,0,3],
 "structasync__mqtt_1_1pub_1_1opts.html#aeaaed644f437a45bbc25b74d4b4a87ab":[0,3,1,9,0,0,3],
-"structasync__mqtt_1_1pub_1_1opts.html#aed9d362ea52a3e9e8a581bfdb6bad2bd":[0,3,0,7,0,0,10],
+"structasync__mqtt_1_1pub_1_1opts.html#aeaaed644f437a45bbc25b74d4b4a87ab":[0,3,0,7,0,0,3],
 "structasync__mqtt_1_1pub_1_1opts.html#aed9d362ea52a3e9e8a581bfdb6bad2bd":[0,3,1,9,0,0,10],
+"structasync__mqtt_1_1pub_1_1opts.html#aed9d362ea52a3e9e8a581bfdb6bad2bd":[0,3,0,7,0,0,10],
 "structasync__mqtt_1_1pub_1_1opts.html#aee108281dd64f85e4845e49f4fbbb6d0":[0,3,0,7,0,0,13],
 "structasync__mqtt_1_1pub_1_1opts.html#aee108281dd64f85e4845e49f4fbbb6d0":[0,3,1,9,0,0,13],
 "structasync__mqtt_1_1pub_1_1opts.html#af5796c98ffb5098ee1ced7d5012fff6c":[0,3,1,9,0,0,15],
@@ -246,8 +248,6 @@ var NAVTREEINDEX3 =
 "topic__subopts_8hpp_source.html":[2,0,0,0,2,24],
 "topics.html":[0],
 "type_8hpp_source.html":[2,0,0,0,26],
-"underlying__connect__impl_8hpp_source.html":[2,0,0,0,1,27],
 "utf8validate_8hpp_source.html":[2,0,0,0,4,14],
-"v3__1__1__connack_8hpp_source.html":[2,0,0,0,2,25],
-"v3__1__1__connect_8hpp_source.html":[2,0,0,0,2,26]
+"v3__1__1__connack_8hpp_source.html":[2,0,0,0,2,25]
 };
diff --git a/doc/api/navtreeindex4.js b/doc/api/navtreeindex4.js
index 844408926..d380fd7e1 100644
--- a/doc/api/navtreeindex4.js
+++ b/doc/api/navtreeindex4.js
@@ -1,5 +1,6 @@
 var NAVTREEINDEX4 =
 {
+"v3__1__1__connect_8hpp_source.html":[2,0,0,0,2,26],
 "v3__1__1__disconnect_8hpp_source.html":[2,0,0,0,2,27],
 "v3__1__1__pingreq_8hpp_source.html":[2,0,0,0,2,28],
 "v3__1__1__pingresp_8hpp_source.html":[2,0,0,0,2,29],
diff --git a/doc/api/packet_8hpp_source.html b/doc/api/packet_8hpp_source.html
index d745956bf..c6f324ff6 100644
--- a/doc/api/packet_8hpp_source.html
+++ b/doc/api/packet_8hpp_source.html
@@ -147,7 +147,7 @@
 <div class="line"><a id="l00067" name="l00067"></a><span class="lineno">   67</span>} <span class="comment">// namespace async_mqtt</span></div>
 <div class="line"><a id="l00068" name="l00068"></a><span class="lineno">   68</span> </div>
 <div class="line"><a id="l00069" name="l00069"></a><span class="lineno">   69</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_HPP</span></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
 <!-- start footer part -->
diff --git a/doc/api/property_8hpp_source.html b/doc/api/property_8hpp_source.html
index f90cab125..a231e45e5 100644
--- a/doc/api/property_8hpp_source.html
+++ b/doc/api/property_8hpp_source.html
@@ -1251,7 +1251,7 @@
 <div class="line"><a id="l01354" name="l01354"></a><span class="lineno"> 1354</span>} <span class="comment">// namespace async_mqtt</span></div>
 <div class="line"><a id="l01355" name="l01355"></a><span class="lineno"> 1355</span> </div>
 <div class="line"><a id="l01356" name="l01356"></a><span class="lineno"> 1356</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_PROPERTY_HPP</span></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1property_1_1assigned__client__identifier_html"><div class="ttname"><a href="classasync__mqtt_1_1property_1_1assigned__client__identifier.html">async_mqtt::property::assigned_client_identifier</a></div><div class="ttdoc">assigned_client_identifier property</div><div class="ttdef"><b>Definition</b> property.hpp:523</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1property_1_1assigned__client__identifier_html_ae1e91af57806b36ea10ec494c2f27be5"><div class="ttname"><a href="classasync__mqtt_1_1property_1_1assigned__client__identifier.html#ae1e91af57806b36ea10ec494c2f27be5">async_mqtt::property::assigned_client_identifier::assigned_client_identifier</a></div><div class="ttdeci">assigned_client_identifier(std::string val)</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> property.hpp:529</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1property_1_1authentication__data_html"><div class="ttname"><a href="classasync__mqtt_1_1property_1_1authentication__data.html">async_mqtt::property::authentication_data</a></div><div class="ttdoc">authentication_data property</div><div class="ttdef"><b>Definition</b> property.hpp:603</div></div>
@@ -1329,7 +1329,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1property_1_1will__delay__interval_html_a6422c7836e9d8116b2a0e6d30589a103"><div class="ttname"><a href="classasync__mqtt_1_1property_1_1will__delay__interval.html#a6422c7836e9d8116b2a0e6d30589a103">async_mqtt::property::will_delay_interval::will_delay_interval</a></div><div class="ttdeci">will_delay_interval(std::uint32_t val)</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> property.hpp:672</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1property_1_1will__delay__interval_html_afa98ddb78f6d7e5fa65b5fd68a00766c"><div class="ttname"><a href="classasync__mqtt_1_1property_1_1will__delay__interval.html#afa98ddb78f6d7e5fa65b5fd68a00766c">async_mqtt::property::will_delay_interval::val</a></div><div class="ttdeci">std::uint32_t val() const</div><div class="ttdoc">Get value.</div><div class="ttdef"><b>Definition</b> property.hpp:679</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1property__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1property__variant.html">async_mqtt::property_variant</a></div><div class="ttdoc">property variant</div><div class="ttdef"><b>Definition</b> property_variant.hpp:28</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__property_html_ga47c42be3d9afd2d518fad85c5480b1f9"><div class="ttname"><a href="group__property.html#ga47c42be3d9afd2d518fad85c5480b1f9">async_mqtt::payload_format</a></div><div class="ttdeci">payload_format</div><div class="ttdoc">payload_format</div><div class="ttdef"><b>Definition</b> property.hpp:58</div></div>
 <div class="ttc" id="agroup__property_html_gga47c42be3d9afd2d518fad85c5480b1f9a9d7183f16acce70658f686ae7f1a4d20"><div class="ttname"><a href="group__property.html#gga47c42be3d9afd2d518fad85c5480b1f9a9d7183f16acce70658f686ae7f1a4d20">async_mqtt::payload_format::binary</a></div><div class="ttdeci">@ binary</div><div class="ttdoc">binary</div></div>
 <div class="ttc" id="agroup__property_html_gga47c42be3d9afd2d518fad85c5480b1f9ab45cffe084dd3d20d928bee85e7b0f21"><div class="ttname"><a href="group__property.html#gga47c42be3d9afd2d518fad85c5480b1f9ab45cffe084dd3d20d928bee85e7b0f21">async_mqtt::payload_format::string</a></div><div class="ttdeci">@ string</div><div class="ttdoc">string</div></div>
diff --git a/doc/api/search/all_0.js b/doc/api/search/all_0.js
index 7b7ac7855..26dd01b7e 100644
--- a/doc/api/search/all_0.js
+++ b/doc/api/search/all_0.js
@@ -6,12 +6,13 @@ var searchData=
   ['add_5ftopic_3',['add_topic',['../classasync__mqtt_1_1v5_1_1basic__publish__packet.html#abd416ecf78a40ed18b585e50b60e69ca',1,'async_mqtt::v5::basic_publish_packet']]],
   ['add_5ftopic_5falias_4',['add_topic_alias',['../classasync__mqtt_1_1v5_1_1basic__publish__packet.html#a2278cb8c78042cac1e6a399efd87d988',1,'async_mqtt::v5::basic_publish_packet']]],
   ['all_5ftopic_5',['all_topic',['../classasync__mqtt_1_1topic__sharename.html#adf38956c1d8eff2ff98abc84b1c0bbf1',1,'async_mqtt::topic_sharename::all_topic()'],['../classasync__mqtt_1_1topic__subopts.html#af17fdcc743cb6d699462061ebdb84ede',1,'async_mqtt::topic_subopts::all_topic()']]],
-  ['any_6',['any',['../group__role.html#gga83492944f4f6b69eb11ce917d1f27c4aa100b8cad7cf2a56f6df78f171f97a1ec',1,'async_mqtt']]],
-  ['assigned_5fclient_5fidentifier_7',['assigned_client_identifier',['../classasync__mqtt_1_1property_1_1assigned__client__identifier.html',1,'async_mqtt::property::assigned_client_identifier'],['../classasync__mqtt_1_1property_1_1assigned__client__identifier.html#ae1e91af57806b36ea10ec494c2f27be5',1,'async_mqtt::property::assigned_client_identifier::assigned_client_identifier()']]],
-  ['at_5fleast_5fonce_8',['at_least_once',['../group__qos.html#gga38e773082414bb272ab22275c56eb4dfaeb48560f42da862548ffd999b87b7b9f',1,'async_mqtt']]],
-  ['at_5fmost_5fonce_9',['at_most_once',['../group__qos.html#gga38e773082414bb272ab22275c56eb4dfa9cb5367ca459f35c28917fa49ed97135',1,'async_mqtt']]],
-  ['auth_5fpacket_10',['auth_packet',['../classasync__mqtt_1_1v5_1_1auth__packet.html',1,'async_mqtt::v5::auth_packet'],['../classasync__mqtt_1_1v5_1_1auth__packet.html#a85c0fe69aff33ce7bed696c4f067d7fe',1,'async_mqtt::v5::auth_packet::auth_packet(auth_reason_code reason_code, properties props)'],['../classasync__mqtt_1_1v5_1_1auth__packet.html#ae1a1944b429d7cc792f9d8aaddc12e5d',1,'async_mqtt::v5::auth_packet::auth_packet()'],['../classasync__mqtt_1_1v5_1_1auth__packet.html#ac00241d1c5c7a5384c8ede676c05817b',1,'async_mqtt::v5::auth_packet::auth_packet(auth_reason_code reason_code)']]],
-  ['auth_5fv5_11',['Auth_v5',['../group__auth__v5.html',1,'']]],
-  ['authentication_5fdata_12',['authentication_data',['../classasync__mqtt_1_1property_1_1authentication__data.html',1,'async_mqtt::property::authentication_data'],['../classasync__mqtt_1_1property_1_1authentication__data.html#ade2641d61830fdee1544fafb0e45f15d',1,'async_mqtt::property::authentication_data::authentication_data()']]],
-  ['authentication_5fmethod_13',['authentication_method',['../classasync__mqtt_1_1property_1_1authentication__method.html',1,'async_mqtt::property::authentication_method'],['../classasync__mqtt_1_1property_1_1authentication__method.html#a6245471a227a452b733ec70574c074ed',1,'async_mqtt::property::authentication_method::authentication_method()']]]
+  ['allocate_5fshared_5fptr_5fchar_5farray_6',['allocate_shared_ptr_char_array',['../group__buffer.html#ga3fd86cf55e3842b607702b72c0617159',1,'async_mqtt']]],
+  ['any_7',['any',['../group__role.html#gga83492944f4f6b69eb11ce917d1f27c4aa100b8cad7cf2a56f6df78f171f97a1ec',1,'async_mqtt']]],
+  ['assigned_5fclient_5fidentifier_8',['assigned_client_identifier',['../classasync__mqtt_1_1property_1_1assigned__client__identifier.html',1,'async_mqtt::property::assigned_client_identifier'],['../classasync__mqtt_1_1property_1_1assigned__client__identifier.html#ae1e91af57806b36ea10ec494c2f27be5',1,'async_mqtt::property::assigned_client_identifier::assigned_client_identifier()']]],
+  ['at_5fleast_5fonce_9',['at_least_once',['../group__qos.html#gga38e773082414bb272ab22275c56eb4dfaeb48560f42da862548ffd999b87b7b9f',1,'async_mqtt']]],
+  ['at_5fmost_5fonce_10',['at_most_once',['../group__qos.html#gga38e773082414bb272ab22275c56eb4dfa9cb5367ca459f35c28917fa49ed97135',1,'async_mqtt']]],
+  ['auth_5fpacket_11',['auth_packet',['../classasync__mqtt_1_1v5_1_1auth__packet.html',1,'async_mqtt::v5::auth_packet'],['../classasync__mqtt_1_1v5_1_1auth__packet.html#a85c0fe69aff33ce7bed696c4f067d7fe',1,'async_mqtt::v5::auth_packet::auth_packet(auth_reason_code reason_code, properties props)'],['../classasync__mqtt_1_1v5_1_1auth__packet.html#ae1a1944b429d7cc792f9d8aaddc12e5d',1,'async_mqtt::v5::auth_packet::auth_packet()'],['../classasync__mqtt_1_1v5_1_1auth__packet.html#ac00241d1c5c7a5384c8ede676c05817b',1,'async_mqtt::v5::auth_packet::auth_packet(auth_reason_code reason_code)']]],
+  ['auth_5fv5_12',['Auth_v5',['../group__auth__v5.html',1,'']]],
+  ['authentication_5fdata_13',['authentication_data',['../classasync__mqtt_1_1property_1_1authentication__data.html',1,'async_mqtt::property::authentication_data'],['../classasync__mqtt_1_1property_1_1authentication__data.html#ade2641d61830fdee1544fafb0e45f15d',1,'async_mqtt::property::authentication_data::authentication_data()']]],
+  ['authentication_5fmethod_14',['authentication_method',['../classasync__mqtt_1_1property_1_1authentication__method.html',1,'async_mqtt::property::authentication_method'],['../classasync__mqtt_1_1property_1_1authentication__method.html#a6245471a227a452b733ec70574c074ed',1,'async_mqtt::property::authentication_method::authentication_method()']]]
 ];
diff --git a/doc/api/search/all_b.js b/doc/api/search/all_b.js
index c8330e25b..4fa733f00 100644
--- a/doc/api/search/all_b.js
+++ b/doc/api/search/all_b.js
@@ -1,12 +1,13 @@
 var searchData=
 [
   ['make_5ferror_0',['make_error',['../structasync__mqtt_1_1system__error.html#afc3e676213fb4532b32e9c675fce8294',1,'async_mqtt::system_error']]],
-  ['match_1',['match',['../group__endpoint.html#ggaed6ebca93cac28c67f2b4fb8641e775aae3cc92c14a5e6dd1a7d94b6ff634d7fc',1,'async_mqtt']]],
-  ['maximum_5fpacket_5fsize_2',['maximum_packet_size',['../classasync__mqtt_1_1property_1_1maximum__packet__size.html',1,'async_mqtt::property::maximum_packet_size'],['../classasync__mqtt_1_1property_1_1maximum__packet__size.html#a26611f590d9a5ea6a3914d2aedae2d8f',1,'async_mqtt::property::maximum_packet_size::maximum_packet_size()']]],
-  ['maximum_5fqos_3',['maximum_qos',['../classasync__mqtt_1_1property_1_1maximum__qos.html',1,'async_mqtt::property::maximum_qos'],['../classasync__mqtt_1_1property_1_1maximum__qos.html#ac0b48992952a2c87d7b8b9c182725427',1,'async_mqtt::property::maximum_qos::maximum_qos()']]],
-  ['message_4',['message',['../structasync__mqtt_1_1system__error.html#a5d1b40582f8c5421ce2e5d49b1614ab0',1,'async_mqtt::system_error']]],
-  ['message_5fexpiry_5finterval_5',['message_expiry_interval',['../classasync__mqtt_1_1property_1_1message__expiry__interval.html',1,'async_mqtt::property::message_expiry_interval'],['../classasync__mqtt_1_1property_1_1message__expiry__interval.html#a599ad258dabd588cda82ace5d95394ac',1,'async_mqtt::property::message_expiry_interval::message_expiry_interval()']]],
-  ['mqtt_6',['mqtt',['../group__predefined__layer__mqtt.html#gaf0fedc2324340e8a97a85d091e912983',1,'async_mqtt::protocol']]],
-  ['mqtt_7',['Mqtt',['../group__mqtt.html',1,'']]],
-  ['mqtts_8',['mqtts',['../group__predefined__layer__mqtts.html#ga2c89e72af39c22d974e557ad822a5601',1,'async_mqtt::protocol']]]
+  ['make_5fshared_5fptr_5fchar_5farray_1',['make_shared_ptr_char_array',['../group__buffer.html#ga4c78376365b748051fe7385678fb6f68',1,'async_mqtt']]],
+  ['match_2',['match',['../group__endpoint.html#ggaed6ebca93cac28c67f2b4fb8641e775aae3cc92c14a5e6dd1a7d94b6ff634d7fc',1,'async_mqtt']]],
+  ['maximum_5fpacket_5fsize_3',['maximum_packet_size',['../classasync__mqtt_1_1property_1_1maximum__packet__size.html',1,'async_mqtt::property::maximum_packet_size'],['../classasync__mqtt_1_1property_1_1maximum__packet__size.html#a26611f590d9a5ea6a3914d2aedae2d8f',1,'async_mqtt::property::maximum_packet_size::maximum_packet_size()']]],
+  ['maximum_5fqos_4',['maximum_qos',['../classasync__mqtt_1_1property_1_1maximum__qos.html',1,'async_mqtt::property::maximum_qos'],['../classasync__mqtt_1_1property_1_1maximum__qos.html#ac0b48992952a2c87d7b8b9c182725427',1,'async_mqtt::property::maximum_qos::maximum_qos()']]],
+  ['message_5',['message',['../structasync__mqtt_1_1system__error.html#a5d1b40582f8c5421ce2e5d49b1614ab0',1,'async_mqtt::system_error']]],
+  ['message_5fexpiry_5finterval_6',['message_expiry_interval',['../classasync__mqtt_1_1property_1_1message__expiry__interval.html',1,'async_mqtt::property::message_expiry_interval'],['../classasync__mqtt_1_1property_1_1message__expiry__interval.html#a599ad258dabd588cda82ace5d95394ac',1,'async_mqtt::property::message_expiry_interval::message_expiry_interval()']]],
+  ['mqtt_7',['mqtt',['../group__predefined__layer__mqtt.html#gaf0fedc2324340e8a97a85d091e912983',1,'async_mqtt::protocol']]],
+  ['mqtt_8',['Mqtt',['../group__mqtt.html',1,'']]],
+  ['mqtts_9',['mqtts',['../group__predefined__layer__mqtts.html#ga2c89e72af39c22d974e557ad822a5601',1,'async_mqtt::protocol']]]
 ];
diff --git a/doc/api/search/functions_0.js b/doc/api/search/functions_0.js
index d7dff0f1c..cbb7bfa7d 100644
--- a/doc/api/search/functions_0.js
+++ b/doc/api/search/functions_0.js
@@ -5,8 +5,9 @@ var searchData=
   ['add_5ftopic_2',['add_topic',['../classasync__mqtt_1_1v5_1_1basic__publish__packet.html#abd416ecf78a40ed18b585e50b60e69ca',1,'async_mqtt::v5::basic_publish_packet']]],
   ['add_5ftopic_5falias_3',['add_topic_alias',['../classasync__mqtt_1_1v5_1_1basic__publish__packet.html#a2278cb8c78042cac1e6a399efd87d988',1,'async_mqtt::v5::basic_publish_packet']]],
   ['all_5ftopic_4',['all_topic',['../classasync__mqtt_1_1topic__sharename.html#adf38956c1d8eff2ff98abc84b1c0bbf1',1,'async_mqtt::topic_sharename::all_topic()'],['../classasync__mqtt_1_1topic__subopts.html#af17fdcc743cb6d699462061ebdb84ede',1,'async_mqtt::topic_subopts::all_topic()']]],
-  ['assigned_5fclient_5fidentifier_5',['assigned_client_identifier',['../classasync__mqtt_1_1property_1_1assigned__client__identifier.html#ae1e91af57806b36ea10ec494c2f27be5',1,'async_mqtt::property::assigned_client_identifier']]],
-  ['auth_5fpacket_6',['auth_packet',['../classasync__mqtt_1_1v5_1_1auth__packet.html#a85c0fe69aff33ce7bed696c4f067d7fe',1,'async_mqtt::v5::auth_packet::auth_packet(auth_reason_code reason_code, properties props)'],['../classasync__mqtt_1_1v5_1_1auth__packet.html#ae1a1944b429d7cc792f9d8aaddc12e5d',1,'async_mqtt::v5::auth_packet::auth_packet()'],['../classasync__mqtt_1_1v5_1_1auth__packet.html#ac00241d1c5c7a5384c8ede676c05817b',1,'async_mqtt::v5::auth_packet::auth_packet(auth_reason_code reason_code)']]],
-  ['authentication_5fdata_7',['authentication_data',['../classasync__mqtt_1_1property_1_1authentication__data.html#ade2641d61830fdee1544fafb0e45f15d',1,'async_mqtt::property::authentication_data']]],
-  ['authentication_5fmethod_8',['authentication_method',['../classasync__mqtt_1_1property_1_1authentication__method.html#a6245471a227a452b733ec70574c074ed',1,'async_mqtt::property::authentication_method']]]
+  ['allocate_5fshared_5fptr_5fchar_5farray_5',['allocate_shared_ptr_char_array',['../group__buffer.html#ga3fd86cf55e3842b607702b72c0617159',1,'async_mqtt']]],
+  ['assigned_5fclient_5fidentifier_6',['assigned_client_identifier',['../classasync__mqtt_1_1property_1_1assigned__client__identifier.html#ae1e91af57806b36ea10ec494c2f27be5',1,'async_mqtt::property::assigned_client_identifier']]],
+  ['auth_5fpacket_7',['auth_packet',['../classasync__mqtt_1_1v5_1_1auth__packet.html#a85c0fe69aff33ce7bed696c4f067d7fe',1,'async_mqtt::v5::auth_packet::auth_packet(auth_reason_code reason_code, properties props)'],['../classasync__mqtt_1_1v5_1_1auth__packet.html#ae1a1944b429d7cc792f9d8aaddc12e5d',1,'async_mqtt::v5::auth_packet::auth_packet()'],['../classasync__mqtt_1_1v5_1_1auth__packet.html#ac00241d1c5c7a5384c8ede676c05817b',1,'async_mqtt::v5::auth_packet::auth_packet(auth_reason_code reason_code)']]],
+  ['authentication_5fdata_8',['authentication_data',['../classasync__mqtt_1_1property_1_1authentication__data.html#ade2641d61830fdee1544fafb0e45f15d',1,'async_mqtt::property::authentication_data']]],
+  ['authentication_5fmethod_9',['authentication_method',['../classasync__mqtt_1_1property_1_1authentication__method.html#a6245471a227a452b733ec70574c074ed',1,'async_mqtt::property::authentication_method']]]
 ];
diff --git a/doc/api/search/functions_a.js b/doc/api/search/functions_a.js
index 7896b993a..bc8b487d5 100644
--- a/doc/api/search/functions_a.js
+++ b/doc/api/search/functions_a.js
@@ -1,8 +1,9 @@
 var searchData=
 [
   ['make_5ferror_0',['make_error',['../structasync__mqtt_1_1system__error.html#afc3e676213fb4532b32e9c675fce8294',1,'async_mqtt::system_error']]],
-  ['maximum_5fpacket_5fsize_1',['maximum_packet_size',['../classasync__mqtt_1_1property_1_1maximum__packet__size.html#a26611f590d9a5ea6a3914d2aedae2d8f',1,'async_mqtt::property::maximum_packet_size']]],
-  ['maximum_5fqos_2',['maximum_qos',['../classasync__mqtt_1_1property_1_1maximum__qos.html#ac0b48992952a2c87d7b8b9c182725427',1,'async_mqtt::property::maximum_qos']]],
-  ['message_3',['message',['../structasync__mqtt_1_1system__error.html#a5d1b40582f8c5421ce2e5d49b1614ab0',1,'async_mqtt::system_error']]],
-  ['message_5fexpiry_5finterval_4',['message_expiry_interval',['../classasync__mqtt_1_1property_1_1message__expiry__interval.html#a599ad258dabd588cda82ace5d95394ac',1,'async_mqtt::property::message_expiry_interval']]]
+  ['make_5fshared_5fptr_5fchar_5farray_1',['make_shared_ptr_char_array',['../group__buffer.html#ga4c78376365b748051fe7385678fb6f68',1,'async_mqtt']]],
+  ['maximum_5fpacket_5fsize_2',['maximum_packet_size',['../classasync__mqtt_1_1property_1_1maximum__packet__size.html#a26611f590d9a5ea6a3914d2aedae2d8f',1,'async_mqtt::property::maximum_packet_size']]],
+  ['maximum_5fqos_3',['maximum_qos',['../classasync__mqtt_1_1property_1_1maximum__qos.html#ac0b48992952a2c87d7b8b9c182725427',1,'async_mqtt::property::maximum_qos']]],
+  ['message_4',['message',['../structasync__mqtt_1_1system__error.html#a5d1b40582f8c5421ce2e5d49b1614ab0',1,'async_mqtt::system_error']]],
+  ['message_5fexpiry_5finterval_5',['message_expiry_interval',['../classasync__mqtt_1_1property_1_1message__expiry__interval.html#a599ad258dabd588cda82ace5d95394ac',1,'async_mqtt::property::message_expiry_interval']]]
 ];
diff --git a/doc/api/shared__ptr__array_8hpp_source.html b/doc/api/shared__ptr__array_8hpp_source.html
index 338043e66..227674ce9 100644
--- a/doc/api/shared__ptr__array_8hpp_source.html
+++ b/doc/api/shared__ptr__array_8hpp_source.html
@@ -109,37 +109,39 @@
 <div class="line"><a id="l00007" name="l00007"></a><span class="lineno">    7</span><span class="preprocessor">#if !defined(ASYNC_MQTT_UTIL_SHARED_PTR_ARRAY_HPP)</span></div>
 <div class="line"><a id="l00008" name="l00008"></a><span class="lineno">    8</span><span class="preprocessor">#define ASYNC_MQTT_UTIL_SHARED_PTR_ARRAY_HPP</span></div>
 <div class="line"><a id="l00009" name="l00009"></a><span class="lineno">    9</span> </div>
-<div class="line"><a id="l00010" name="l00010"></a><span class="lineno">   10</span><span class="preprocessor">#if defined(_DOXYGEN_)</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno">   10</span><span class="preprocessor">#include &lt;memory&gt;</span></div>
 <div class="line"><a id="l00011" name="l00011"></a><span class="lineno">   11</span> </div>
-<div class="line"><a id="l00021" name="l00021"></a><span class="lineno">   21</span><span class="keyword">using </span>shared_ptr_array = std::shared_ptr&lt;char []&gt;;</div>
-<div class="line"><a id="l00022" name="l00022"></a><span class="lineno">   22</span><span class="keyword">using </span>const_shared_ptr_array = std::shared_ptr&lt;char const []&gt;;</div>
-<div class="line"><a id="l00023" name="l00023"></a><span class="lineno">   23</span> </div>
-<div class="line"><a id="l00036" name="l00036"></a><span class="lineno">   36</span><span class="keyword">inline</span> shared_ptr_array make_shared_ptr_array(std::size_t size);</div>
-<div class="line"><a id="l00037" name="l00037"></a><span class="lineno">   37</span> </div>
-<div class="line"><a id="l00038" name="l00038"></a><span class="lineno">   38</span><span class="preprocessor">#else  </span><span class="comment">// defined(_DOXYGEN_)</span></div>
-<div class="line"><a id="l00039" name="l00039"></a><span class="lineno">   39</span> </div>
-<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span> </div>
-<div class="line"><a id="l00041" name="l00041"></a><span class="lineno">   41</span><span class="preprocessor">#include &lt;memory&gt;</span></div>
-<div class="line"><a id="l00042" name="l00042"></a><span class="lineno">   42</span> </div>
-<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span><span class="keyword">namespace </span>async_mqtt {</div>
-<div class="line"><a id="l00044" name="l00044"></a><span class="lineno">   44</span> </div>
-<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span><span class="keyword">using </span>shared_ptr_array = std::shared_ptr&lt;char []&gt;;</div>
-<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span><span class="keyword">using </span>const_shared_ptr_array = std::shared_ptr&lt;char const []&gt;;</div>
-<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span> </div>
-<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span><span class="keyword">inline</span> shared_ptr_array make_shared_ptr_array(std::size_t size) {</div>
-<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span><span class="preprocessor">#if __cpp_lib_shared_ptr_arrays &gt;= 201707L</span></div>
-<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span>    <span class="keywordflow">return</span> std::make_shared&lt;char[]&gt;(size);</div>
-<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span><span class="preprocessor">#else  </span><span class="comment">// __cpp_lib_shared_ptr_arrays &gt;= 201707L</span></div>
-<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span>    <span class="keywordflow">return</span> std::shared_ptr&lt;char[]&gt;(<span class="keyword">new</span> <span class="keywordtype">char</span>[size]);</div>
-<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span><span class="preprocessor">#endif </span><span class="comment">// __cpp_lib_shared_ptr_arrays &gt;= 201707L</span></div>
-<div class="line"><a id="l00054" name="l00054"></a><span class="lineno">   54</span>}</div>
-<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span> </div>
-<div class="line"><a id="l00056" name="l00056"></a><span class="lineno">   56</span>} <span class="comment">// namespace async_mqtt</span></div>
-<div class="line"><a id="l00057" name="l00057"></a><span class="lineno">   57</span> </div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno">   12</span><span class="keyword">namespace </span>async_mqtt {</div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno">   13</span> </div>
+<div class="foldopen" id="foldopen00025" data-start="{" data-end="}">
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"><a class="line" href="group__buffer.html#ga4c78376365b748051fe7385678fb6f68">   25</a></span><span class="keyword">inline</span> std::shared_ptr&lt;char []&gt; <a class="code hl_function" href="group__buffer.html#ga4c78376365b748051fe7385678fb6f68">make_shared_ptr_char_array</a>(std::size_t size) {</div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span><span class="preprocessor">#if __cpp_lib_shared_ptr_arrays &gt;= 201707L</span></div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno">   27</span>    <span class="keywordflow">return</span> std::make_shared&lt;char[]&gt;(size);</div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span><span class="preprocessor">#else  </span><span class="comment">// __cpp_lib_shared_ptr_arrays &gt;= 201707L</span></div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno">   29</span>    <span class="keywordflow">return</span> std::shared_ptr&lt;char[]&gt;(<span class="keyword">new</span> <span class="keywordtype">char</span>[size]);</div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno">   30</span><span class="preprocessor">#endif </span><span class="comment">// __cpp_lib_shared_ptr_arrays &gt;= 201707Lhai</span></div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno">   31</span>}</div>
+</div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno">   32</span> </div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> Alloc&gt;</div>
+<div class="foldopen" id="foldopen00046" data-start="{" data-end="}">
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"><a class="line" href="group__buffer.html#ga3fd86cf55e3842b607702b72c0617159">   46</a></span><span class="keyword">inline</span> std::shared_ptr&lt;char []&gt; <a class="code hl_function" href="group__buffer.html#ga3fd86cf55e3842b607702b72c0617159">allocate_shared_ptr_char_array</a>(Alloc&amp;&amp; alloc, std::size_t size) {</div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span><span class="preprocessor">#if __cpp_lib_shared_ptr_arrays &gt;= 201707L</span></div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span>    <span class="keywordflow">return</span> std::allocate_shared&lt;char[]&gt;(alloc, size);</div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span><span class="preprocessor">#else  </span><span class="comment">// __cpp_lib_shared_ptr_arrays &gt;= 201707L</span></div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span>    <span class="keywordflow">return</span> std::shared_ptr&lt;char[]&gt;(</div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span>        alloc.allocate(size),</div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span>        [alloc, size](<span class="keywordtype">char</span>* ptr) <span class="keyword">mutable</span> { alloc.deallocate(ptr, size); }</div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span>    );</div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno">   54</span><span class="preprocessor">#endif </span><span class="comment">// __cpp_lib_shared_ptr_arrays &gt;= 201707Lhai</span></div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span>}</div>
+</div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno">   56</span> </div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno">   57</span>} <span class="comment">// namespace async_mqtt</span></div>
 <div class="line"><a id="l00058" name="l00058"></a><span class="lineno">   58</span> </div>
-<div class="line"><a id="l00059" name="l00059"></a><span class="lineno">   59</span><span class="preprocessor">#endif </span><span class="comment">// defined(_DOXYGEN_)</span></div>
-<div class="line"><a id="l00060" name="l00060"></a><span class="lineno">   60</span> </div>
-<div class="line"><a id="l00061" name="l00061"></a><span class="lineno">   61</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_UTIL_SHARED_PTR_ARRAY_HPP</span></div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno">   59</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_UTIL_SHARED_PTR_ARRAY_HPP</span></div>
+<div class="ttc" id="agroup__buffer_html_ga3fd86cf55e3842b607702b72c0617159"><div class="ttname"><a href="group__buffer.html#ga3fd86cf55e3842b607702b72c0617159">async_mqtt::allocate_shared_ptr_char_array</a></div><div class="ttdeci">std::shared_ptr&lt; char[]&gt; allocate_shared_ptr_char_array(Alloc &amp;&amp;alloc, std::size_t size)</div><div class="ttdoc">shared_ptr&lt;char[]&gt; creating function with allocator. You can choose the target type.</div><div class="ttdef"><b>Definition</b> shared_ptr_array.hpp:46</div></div>
+<div class="ttc" id="agroup__buffer_html_ga4c78376365b748051fe7385678fb6f68"><div class="ttname"><a href="group__buffer.html#ga4c78376365b748051fe7385678fb6f68">async_mqtt::make_shared_ptr_char_array</a></div><div class="ttdeci">std::shared_ptr&lt; char[]&gt; make_shared_ptr_char_array(std::size_t size)</div><div class="ttdoc">shared_ptr&lt;char[]&gt; creating function. You can choose the target type.</div><div class="ttdef"><b>Definition</b> shared_ptr_array.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
 <!-- start footer part -->
diff --git a/doc/api/stream__read__packet_8hpp_source.html b/doc/api/stream__read__packet_8hpp_source.html
index 2baaab0b4..7d4313f80 100644
--- a/doc/api/stream__read__packet_8hpp_source.html
+++ b/doc/api/stream__read__packet_8hpp_source.html
@@ -110,235 +110,247 @@
 <div class="line"><a id="l00008" name="l00008"></a><span class="lineno">    8</span><span class="preprocessor">#define ASYNC_MQTT_IMPL_STREAM_READ_PACKET_HPP</span></div>
 <div class="line"><a id="l00009" name="l00009"></a><span class="lineno">    9</span> </div>
 <div class="line"><a id="l00010" name="l00010"></a><span class="lineno">   10</span><span class="preprocessor">#include &lt;async_mqtt/stream.hpp&gt;</span></div>
-<div class="line"><a id="l00011" name="l00011"></a><span class="lineno">   11</span> </div>
-<div class="line"><a id="l00012" name="l00012"></a><span class="lineno">   12</span><span class="keyword">namespace </span>async_mqtt {</div>
-<div class="line"><a id="l00013" name="l00013"></a><span class="lineno">   13</span> </div>
-<div class="line"><a id="l00014" name="l00014"></a><span class="lineno">   14</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> NextLayer&gt;</div>
-<div class="line"><a id="l00015" name="l00015"></a><span class="lineno">   15</span><span class="keyword">struct </span>stream&lt;NextLayer&gt;::stream_read_packet_op {</div>
-<div class="line"><a id="l00016" name="l00016"></a><span class="lineno">   16</span>    <span class="keyword">using </span>stream_type = this_type;</div>
-<div class="line"><a id="l00017" name="l00017"></a><span class="lineno">   17</span>    <span class="keyword">using </span>stream_type_sp = std::shared_ptr&lt;stream_type&gt;;</div>
-<div class="line"><a id="l00018" name="l00018"></a><span class="lineno">   18</span>    <span class="keyword">using </span>next_layer_type = stream_type::next_layer_type;</div>
-<div class="line"><a id="l00019" name="l00019"></a><span class="lineno">   19</span> </div>
-<div class="line"><a id="l00020" name="l00020"></a><span class="lineno">   20</span>    stream_type&amp; strm;</div>
-<div class="line"><a id="l00021" name="l00021"></a><span class="lineno">   21</span>    std::size_t received = 0;</div>
-<div class="line"><a id="l00022" name="l00022"></a><span class="lineno">   22</span>    std::uint32_t mul = 1;</div>
-<div class="line"><a id="l00023" name="l00023"></a><span class="lineno">   23</span>    std::uint32_t rl = 0;</div>
-<div class="line"><a id="l00024" name="l00024"></a><span class="lineno">   24</span>    shared_ptr_array spa = <span class="keyword">nullptr</span>;</div>
-<div class="line"><a id="l00025" name="l00025"></a><span class="lineno">   25</span>    stream_type_sp life_keeper = strm.shared_from_this();</div>
-<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span>    <span class="keyword">enum</span> { dispatch, header, remaining_length, complete } state = dispatch;</div>
-<div class="line"><a id="l00027" name="l00027"></a><span class="lineno">   27</span> </div>
-<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span>    <span class="keyword">template</span> &lt;<span class="keyword">typename</span> Self&gt;</div>
-<div class="line"><a id="l00029" name="l00029"></a><span class="lineno">   29</span>    <span class="keywordtype">void</span> operator()(</div>
-<div class="line"><a id="l00030" name="l00030"></a><span class="lineno">   30</span>        Self&amp; self</div>
-<div class="line"><a id="l00031" name="l00031"></a><span class="lineno">   31</span>    ) {</div>
-<div class="line"><a id="l00032" name="l00032"></a><span class="lineno">   32</span>        <span class="keywordflow">switch</span> (state) {</div>
-<div class="line"><a id="l00033" name="l00033"></a><span class="lineno">   33</span>        <span class="keywordflow">case</span> dispatch: {</div>
-<div class="line"><a id="l00034" name="l00034"></a><span class="lineno">   34</span>            state = header;</div>
-<div class="line"><a id="l00035" name="l00035"></a><span class="lineno">   35</span>            <span class="keyword">auto</span>&amp; a_strm{strm};</div>
-<div class="line"><a id="l00036" name="l00036"></a><span class="lineno">   36</span>            as::dispatch(</div>
-<div class="line"><a id="l00037" name="l00037"></a><span class="lineno">   37</span>                as::bind_executor(</div>
-<div class="line"><a id="l00038" name="l00038"></a><span class="lineno">   38</span>                    a_strm.get_executor(),</div>
-<div class="line"><a id="l00039" name="l00039"></a><span class="lineno">   39</span>                    force_move(self)</div>
-<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span>                )</div>
-<div class="line"><a id="l00041" name="l00041"></a><span class="lineno">   41</span>            );</div>
-<div class="line"><a id="l00042" name="l00042"></a><span class="lineno">   42</span>        } <span class="keywordflow">break</span>;</div>
-<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span>        <span class="keywordflow">case</span> header: {</div>
-<div class="line"><a id="l00044" name="l00044"></a><span class="lineno">   44</span>            <span class="comment">// read fixed_header</span></div>
-<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span>            <span class="keyword">auto</span> address = &amp;strm.header_remaining_length_buf_[received];</div>
-<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span>            <span class="keyword">auto</span>&amp; a_strm{strm};</div>
-<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span>            <span class="keywordflow">if</span> <span class="keyword">constexpr</span> (</div>
-<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span>                has_async_read&lt;next_layer_type&gt;::value) {</div>
-<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span>                    layer_customize&lt;next_layer_type&gt;::async_read(</div>
-<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span>                        a_strm.nl_,</div>
-<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span>                        <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">as::buffer</a>(address, 1),</div>
-<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span>                        as::bind_executor(</div>
-<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span>                            a_strm.get_executor(),</div>
-<div class="line"><a id="l00054" name="l00054"></a><span class="lineno">   54</span>                            force_move(self)</div>
-<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span>                        )</div>
-<div class="line"><a id="l00056" name="l00056"></a><span class="lineno">   56</span>                    );</div>
-<div class="line"><a id="l00057" name="l00057"></a><span class="lineno">   57</span>                }</div>
-<div class="line"><a id="l00058" name="l00058"></a><span class="lineno">   58</span>            <span class="keywordflow">else</span> {</div>
-<div class="line"><a id="l00059" name="l00059"></a><span class="lineno">   59</span>                async_read(</div>
-<div class="line"><a id="l00060" name="l00060"></a><span class="lineno">   60</span>                    a_strm.nl_,</div>
-<div class="line"><a id="l00061" name="l00061"></a><span class="lineno">   61</span>                    <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">as::buffer</a>(address, 1),</div>
-<div class="line"><a id="l00062" name="l00062"></a><span class="lineno">   62</span>                    as::bind_executor(</div>
-<div class="line"><a id="l00063" name="l00063"></a><span class="lineno">   63</span>                        a_strm.get_executor(),</div>
-<div class="line"><a id="l00064" name="l00064"></a><span class="lineno">   64</span>                        force_move(self)</div>
-<div class="line"><a id="l00065" name="l00065"></a><span class="lineno">   65</span>                    )</div>
-<div class="line"><a id="l00066" name="l00066"></a><span class="lineno">   66</span>                );</div>
-<div class="line"><a id="l00067" name="l00067"></a><span class="lineno">   67</span>            }</div>
-<div class="line"><a id="l00068" name="l00068"></a><span class="lineno">   68</span>        } <span class="keywordflow">break</span>;</div>
-<div class="line"><a id="l00069" name="l00069"></a><span class="lineno">   69</span>        <span class="keywordflow">default</span>:</div>
-<div class="line"><a id="l00070" name="l00070"></a><span class="lineno">   70</span>            BOOST_ASSERT(<span class="keyword">false</span>);</div>
-<div class="line"><a id="l00071" name="l00071"></a><span class="lineno">   71</span>            <span class="keywordflow">break</span>;</div>
-<div class="line"><a id="l00072" name="l00072"></a><span class="lineno">   72</span>        }</div>
-<div class="line"><a id="l00073" name="l00073"></a><span class="lineno">   73</span>    }</div>
-<div class="line"><a id="l00074" name="l00074"></a><span class="lineno">   74</span> </div>
-<div class="line"><a id="l00075" name="l00075"></a><span class="lineno">   75</span>    <span class="keyword">template</span> &lt;<span class="keyword">typename</span> Self&gt;</div>
-<div class="line"><a id="l00076" name="l00076"></a><span class="lineno">   76</span>    <span class="keywordtype">void</span> operator()(</div>
-<div class="line"><a id="l00077" name="l00077"></a><span class="lineno">   77</span>        Self&amp; self,</div>
-<div class="line"><a id="l00078" name="l00078"></a><span class="lineno">   78</span>        <a class="code hl_typedef" href="group__error.html#gaa100a3fca173f12e33f3b5711710033d">error_code</a> ec,</div>
-<div class="line"><a id="l00079" name="l00079"></a><span class="lineno">   79</span>        std::size_t bytes_transferred</div>
-<div class="line"><a id="l00080" name="l00080"></a><span class="lineno">   80</span>    ) {</div>
-<div class="line"><a id="l00081" name="l00081"></a><span class="lineno">   81</span>        (void)bytes_transferred; <span class="comment">// Ignore unused argument in release build</span></div>
-<div class="line"><a id="l00082" name="l00082"></a><span class="lineno">   82</span> </div>
-<div class="line"><a id="l00083" name="l00083"></a><span class="lineno">   83</span>        <span class="keywordflow">if</span> (ec) {</div>
-<div class="line"><a id="l00084" name="l00084"></a><span class="lineno">   84</span>            self.complete(ec, buffer{});</div>
-<div class="line"><a id="l00085" name="l00085"></a><span class="lineno">   85</span>            <span class="keywordflow">return</span>;</div>
-<div class="line"><a id="l00086" name="l00086"></a><span class="lineno">   86</span>        }</div>
-<div class="line"><a id="l00087" name="l00087"></a><span class="lineno">   87</span> </div>
-<div class="line"><a id="l00088" name="l00088"></a><span class="lineno">   88</span>        <span class="keywordflow">switch</span> (state) {</div>
-<div class="line"><a id="l00089" name="l00089"></a><span class="lineno">   89</span>        <span class="keywordflow">case</span> header:</div>
-<div class="line"><a id="l00090" name="l00090"></a><span class="lineno">   90</span>            BOOST_ASSERT(bytes_transferred == 1);</div>
-<div class="line"><a id="l00091" name="l00091"></a><span class="lineno">   91</span>            state = remaining_length;</div>
-<div class="line"><a id="l00092" name="l00092"></a><span class="lineno">   92</span>            ++received;</div>
-<div class="line"><a id="l00093" name="l00093"></a><span class="lineno">   93</span>            <span class="comment">// read the first remaining_length</span></div>
-<div class="line"><a id="l00094" name="l00094"></a><span class="lineno">   94</span>            {</div>
-<div class="line"><a id="l00095" name="l00095"></a><span class="lineno">   95</span>                <span class="keyword">auto</span> address = &amp;strm.header_remaining_length_buf_[received];</div>
-<div class="line"><a id="l00096" name="l00096"></a><span class="lineno">   96</span>                <span class="keyword">auto</span>&amp; a_strm{strm};</div>
-<div class="line"><a id="l00097" name="l00097"></a><span class="lineno">   97</span>                <span class="keywordflow">if</span> <span class="keyword">constexpr</span> (</div>
-<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span>                    has_async_read&lt;next_layer_type&gt;::value) {</div>
-<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span>                        layer_customize&lt;next_layer_type&gt;::async_read(</div>
-<div class="line"><a id="l00100" name="l00100"></a><span class="lineno">  100</span>                            a_strm.nl_,</div>
-<div class="line"><a id="l00101" name="l00101"></a><span class="lineno">  101</span>                            <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">as::buffer</a>(address, 1),</div>
-<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">  102</span>                            as::bind_executor(</div>
-<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">  103</span>                                a_strm.get_executor(),</div>
-<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">  104</span>                                force_move(self)</div>
-<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">  105</span>                            )</div>
-<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">  106</span>                        );</div>
-<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">  107</span>                    }</div>
-<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">  108</span>                <span class="keywordflow">else</span> {</div>
-<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">  109</span>                    async_read(</div>
-<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">  110</span>                        a_strm.nl_,</div>
-<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">  111</span>                        <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">as::buffer</a>(address, 1),</div>
-<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">  112</span>                        as::bind_executor(</div>
-<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">  113</span>                            a_strm.get_executor(),</div>
-<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">  114</span>                            force_move(self)</div>
-<div class="line"><a id="l00115" name="l00115"></a><span class="lineno">  115</span>                        )</div>
-<div class="line"><a id="l00116" name="l00116"></a><span class="lineno">  116</span>                    );</div>
-<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">  117</span>                }</div>
-<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">  118</span>            }</div>
-<div class="line"><a id="l00119" name="l00119"></a><span class="lineno">  119</span>            <span class="keywordflow">break</span>;</div>
-<div class="line"><a id="l00120" name="l00120"></a><span class="lineno">  120</span>        <span class="keywordflow">case</span> remaining_length:</div>
-<div class="line"><a id="l00121" name="l00121"></a><span class="lineno">  121</span>            BOOST_ASSERT(bytes_transferred == 1);</div>
-<div class="line"><a id="l00122" name="l00122"></a><span class="lineno">  122</span>            ++received;</div>
-<div class="line"><a id="l00123" name="l00123"></a><span class="lineno">  123</span>            <span class="keywordflow">if</span> (strm.header_remaining_length_buf_[received - 1] &amp; 0b10000000) {</div>
-<div class="line"><a id="l00124" name="l00124"></a><span class="lineno">  124</span>                <span class="comment">// remaining_length continues</span></div>
-<div class="line"><a id="l00125" name="l00125"></a><span class="lineno">  125</span>                <span class="keywordflow">if</span> (received == 5) {</div>
-<div class="line"><a id="l00126" name="l00126"></a><span class="lineno">  126</span>                    ASYNC_MQTT_LOG(<span class="stringliteral">&quot;mqtt_impl&quot;</span>, <a class="code hl_enumvalue" href="group__log.html#gga3abd0c0ebf71c7d01def2a00423d1abfa7b83d3f08fa392b79e3f553b585971cd">warning</a>)</div>
-<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">  127</span>                        &lt;&lt; ASYNC_MQTT_ADD_VALUE(address, <span class="keyword">this</span>)</div>
-<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">  128</span>                        &lt;&lt; <span class="stringliteral">&quot;out of size remaining length&quot;</span>;</div>
-<div class="line"><a id="l00129" name="l00129"></a><span class="lineno">  129</span>                    self.complete(</div>
-<div class="line"><a id="l00130" name="l00130"></a><span class="lineno">  130</span>                        sys::errc::make_error_code(sys::errc::protocol_error),</div>
-<div class="line"><a id="l00131" name="l00131"></a><span class="lineno">  131</span>                        buffer{}</div>
-<div class="line"><a id="l00132" name="l00132"></a><span class="lineno">  132</span>                    );</div>
-<div class="line"><a id="l00133" name="l00133"></a><span class="lineno">  133</span>                    <span class="keywordflow">return</span>;</div>
-<div class="line"><a id="l00134" name="l00134"></a><span class="lineno">  134</span>                }</div>
-<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">  135</span>                rl += (strm.header_remaining_length_buf_[received - 1] &amp; 0b01111111) * mul;</div>
-<div class="line"><a id="l00136" name="l00136"></a><span class="lineno">  136</span>                mul *= 128;</div>
-<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">  137</span>                <span class="keyword">auto</span> address = &amp;strm.header_remaining_length_buf_[received];</div>
-<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">  138</span>                <span class="keyword">auto</span>&amp; a_strm{strm};</div>
-<div class="line"><a id="l00139" name="l00139"></a><span class="lineno">  139</span>                <span class="keywordflow">if</span> <span class="keyword">constexpr</span> (</div>
-<div class="line"><a id="l00140" name="l00140"></a><span class="lineno">  140</span>                    has_async_read&lt;next_layer_type&gt;::value) {</div>
-<div class="line"><a id="l00141" name="l00141"></a><span class="lineno">  141</span>                        layer_customize&lt;next_layer_type&gt;::async_read(</div>
-<div class="line"><a id="l00142" name="l00142"></a><span class="lineno">  142</span>                            a_strm.nl_,</div>
-<div class="line"><a id="l00143" name="l00143"></a><span class="lineno">  143</span>                            <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">as::buffer</a>(address, 1),</div>
-<div class="line"><a id="l00144" name="l00144"></a><span class="lineno">  144</span>                            as::bind_executor(</div>
-<div class="line"><a id="l00145" name="l00145"></a><span class="lineno">  145</span>                                a_strm.get_executor(),</div>
-<div class="line"><a id="l00146" name="l00146"></a><span class="lineno">  146</span>                                force_move(self)</div>
-<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">  147</span>                            )</div>
-<div class="line"><a id="l00148" name="l00148"></a><span class="lineno">  148</span>                        );</div>
-<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">  149</span>                    }</div>
-<div class="line"><a id="l00150" name="l00150"></a><span class="lineno">  150</span>                <span class="keywordflow">else</span> {</div>
-<div class="line"><a id="l00151" name="l00151"></a><span class="lineno">  151</span>                    async_read(</div>
-<div class="line"><a id="l00152" name="l00152"></a><span class="lineno">  152</span>                        a_strm.nl_,</div>
-<div class="line"><a id="l00153" name="l00153"></a><span class="lineno">  153</span>                        <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">as::buffer</a>(address, 1),</div>
-<div class="line"><a id="l00154" name="l00154"></a><span class="lineno">  154</span>                        as::bind_executor(</div>
-<div class="line"><a id="l00155" name="l00155"></a><span class="lineno">  155</span>                            a_strm.get_executor(),</div>
-<div class="line"><a id="l00156" name="l00156"></a><span class="lineno">  156</span>                            force_move(self)</div>
-<div class="line"><a id="l00157" name="l00157"></a><span class="lineno">  157</span>                        )</div>
-<div class="line"><a id="l00158" name="l00158"></a><span class="lineno">  158</span>                    );</div>
-<div class="line"><a id="l00159" name="l00159"></a><span class="lineno">  159</span>                }</div>
-<div class="line"><a id="l00160" name="l00160"></a><span class="lineno">  160</span>            }</div>
-<div class="line"><a id="l00161" name="l00161"></a><span class="lineno">  161</span>            <span class="keywordflow">else</span> {</div>
-<div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span>                <span class="comment">// remaining_length end</span></div>
-<div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span>                rl += (strm.header_remaining_length_buf_[received - 1] &amp; 0b01111111) * mul;</div>
-<div class="line"><a id="l00164" name="l00164"></a><span class="lineno">  164</span> </div>
-<div class="line"><a id="l00165" name="l00165"></a><span class="lineno">  165</span>                spa = make_shared_ptr_array(received + rl);</div>
-<div class="line"><a id="l00166" name="l00166"></a><span class="lineno">  166</span>                std::copy(</div>
-<div class="line"><a id="l00167" name="l00167"></a><span class="lineno">  167</span>                    strm.header_remaining_length_buf_.data(),</div>
-<div class="line"><a id="l00168" name="l00168"></a><span class="lineno">  168</span>                    strm.header_remaining_length_buf_.data() + received, spa.get()</div>
-<div class="line"><a id="l00169" name="l00169"></a><span class="lineno">  169</span>                );</div>
-<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">  170</span> </div>
-<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">  171</span>                <span class="keywordflow">if</span> (rl == 0) {</div>
-<div class="line"><a id="l00172" name="l00172"></a><span class="lineno">  172</span>                    <span class="keyword">auto</span> ptr = spa.get();</div>
-<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">  173</span>                    self.complete(ec, buffer{ptr, ptr + received + rl, force_move(spa)});</div>
-<div class="line"><a id="l00174" name="l00174"></a><span class="lineno">  174</span>                    <span class="keywordflow">return</span>;</div>
-<div class="line"><a id="l00175" name="l00175"></a><span class="lineno">  175</span>                }</div>
-<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">  176</span>                <span class="keywordflow">else</span> {</div>
-<div class="line"><a id="l00177" name="l00177"></a><span class="lineno">  177</span>                    state = complete;</div>
-<div class="line"><a id="l00178" name="l00178"></a><span class="lineno">  178</span>                    <span class="keyword">auto</span> address = &amp;spa[std::ptrdiff_t(received)];</div>
-<div class="line"><a id="l00179" name="l00179"></a><span class="lineno">  179</span>                    <span class="keyword">auto</span>&amp; a_strm{strm};</div>
-<div class="line"><a id="l00180" name="l00180"></a><span class="lineno">  180</span>                    <span class="keywordflow">if</span> <span class="keyword">constexpr</span> (</div>
-<div class="line"><a id="l00181" name="l00181"></a><span class="lineno">  181</span>                        has_async_read&lt;next_layer_type&gt;::value) {</div>
-<div class="line"><a id="l00182" name="l00182"></a><span class="lineno">  182</span>                            layer_customize&lt;next_layer_type&gt;::async_read(</div>
-<div class="line"><a id="l00183" name="l00183"></a><span class="lineno">  183</span>                                a_strm.nl_,</div>
-<div class="line"><a id="l00184" name="l00184"></a><span class="lineno">  184</span>                                <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">as::buffer</a>(address, rl),</div>
-<div class="line"><a id="l00185" name="l00185"></a><span class="lineno">  185</span>                                as::bind_executor(</div>
-<div class="line"><a id="l00186" name="l00186"></a><span class="lineno">  186</span>                                    a_strm.get_executor(),</div>
-<div class="line"><a id="l00187" name="l00187"></a><span class="lineno">  187</span>                                    force_move(self)</div>
-<div class="line"><a id="l00188" name="l00188"></a><span class="lineno">  188</span>                                )</div>
-<div class="line"><a id="l00189" name="l00189"></a><span class="lineno">  189</span>                            );</div>
-<div class="line"><a id="l00190" name="l00190"></a><span class="lineno">  190</span>                        }</div>
-<div class="line"><a id="l00191" name="l00191"></a><span class="lineno">  191</span>                    <span class="keywordflow">else</span> {</div>
-<div class="line"><a id="l00192" name="l00192"></a><span class="lineno">  192</span>                        async_read(</div>
-<div class="line"><a id="l00193" name="l00193"></a><span class="lineno">  193</span>                            a_strm.nl_,</div>
-<div class="line"><a id="l00194" name="l00194"></a><span class="lineno">  194</span>                            <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">as::buffer</a>(address, rl),</div>
-<div class="line"><a id="l00195" name="l00195"></a><span class="lineno">  195</span>                            as::bind_executor(</div>
-<div class="line"><a id="l00196" name="l00196"></a><span class="lineno">  196</span>                                a_strm.get_executor(),</div>
-<div class="line"><a id="l00197" name="l00197"></a><span class="lineno">  197</span>                                force_move(self)</div>
-<div class="line"><a id="l00198" name="l00198"></a><span class="lineno">  198</span>                            )</div>
-<div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span>                        );</div>
-<div class="line"><a id="l00200" name="l00200"></a><span class="lineno">  200</span>                    }</div>
-<div class="line"><a id="l00201" name="l00201"></a><span class="lineno">  201</span>                }</div>
-<div class="line"><a id="l00202" name="l00202"></a><span class="lineno">  202</span>            }</div>
-<div class="line"><a id="l00203" name="l00203"></a><span class="lineno">  203</span>            <span class="keywordflow">break</span>;</div>
-<div class="line"><a id="l00204" name="l00204"></a><span class="lineno">  204</span>        <span class="keywordflow">case</span> complete: {</div>
-<div class="line"><a id="l00205" name="l00205"></a><span class="lineno">  205</span>            <span class="keyword">auto</span> ptr = spa.get();</div>
-<div class="line"><a id="l00206" name="l00206"></a><span class="lineno">  206</span>            self.complete(ec, buffer{ptr, ptr + received + rl, force_move(spa)});</div>
-<div class="line"><a id="l00207" name="l00207"></a><span class="lineno">  207</span>        } <span class="keywordflow">break</span>;</div>
-<div class="line"><a id="l00208" name="l00208"></a><span class="lineno">  208</span>        <span class="keywordflow">default</span>:</div>
-<div class="line"><a id="l00209" name="l00209"></a><span class="lineno">  209</span>            BOOST_ASSERT(<span class="keyword">false</span>);</div>
-<div class="line"><a id="l00210" name="l00210"></a><span class="lineno">  210</span>            <span class="keywordflow">break</span>;</div>
-<div class="line"><a id="l00211" name="l00211"></a><span class="lineno">  211</span>        }</div>
-<div class="line"><a id="l00212" name="l00212"></a><span class="lineno">  212</span>    }</div>
-<div class="line"><a id="l00213" name="l00213"></a><span class="lineno">  213</span>};</div>
-<div class="line"><a id="l00214" name="l00214"></a><span class="lineno">  214</span> </div>
-<div class="line"><a id="l00215" name="l00215"></a><span class="lineno">  215</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> NextLayer&gt;</div>
-<div class="line"><a id="l00216" name="l00216"></a><span class="lineno">  216</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> CompletionToken&gt;</div>
-<div class="line"><a id="l00217" name="l00217"></a><span class="lineno">  217</span>BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(</div>
-<div class="line"><a id="l00218" name="l00218"></a><span class="lineno">  218</span>    CompletionToken,</div>
-<div class="line"><a id="l00219" name="l00219"></a><span class="lineno">  219</span>    <span class="keywordtype">void</span>(<a class="code hl_typedef" href="group__error.html#gaa100a3fca173f12e33f3b5711710033d">error_code</a>, buffer)</div>
-<div class="line"><a id="l00220" name="l00220"></a><span class="lineno">  220</span>)</div>
-<div class="line"><a id="l00221" name="l00221"></a><span class="lineno">  221</span>stream&lt;NextLayer&gt;::read_packet(</div>
-<div class="line"><a id="l00222" name="l00222"></a><span class="lineno">  222</span>    CompletionToken&amp;&amp; token</div>
-<div class="line"><a id="l00223" name="l00223"></a><span class="lineno">  223</span>) {</div>
-<div class="line"><a id="l00224" name="l00224"></a><span class="lineno">  224</span>    <span class="keywordflow">return</span></div>
-<div class="line"><a id="l00225" name="l00225"></a><span class="lineno">  225</span>        as::async_compose&lt;</div>
-<div class="line"><a id="l00226" name="l00226"></a><span class="lineno">  226</span>            CompletionToken,</div>
-<div class="line"><a id="l00227" name="l00227"></a><span class="lineno">  227</span>        void(<a class="code hl_typedef" href="group__error.html#gaa100a3fca173f12e33f3b5711710033d">error_code</a>, buffer)</div>
-<div class="line"><a id="l00228" name="l00228"></a><span class="lineno">  228</span>    &gt;(</div>
-<div class="line"><a id="l00229" name="l00229"></a><span class="lineno">  229</span>        stream_read_packet_op{</div>
-<div class="line"><a id="l00230" name="l00230"></a><span class="lineno">  230</span>            *<span class="keyword">this</span></div>
-<div class="line"><a id="l00231" name="l00231"></a><span class="lineno">  231</span>        },</div>
-<div class="line"><a id="l00232" name="l00232"></a><span class="lineno">  232</span>        token</div>
-<div class="line"><a id="l00233" name="l00233"></a><span class="lineno">  233</span>    );</div>
-<div class="line"><a id="l00234" name="l00234"></a><span class="lineno">  234</span>}</div>
-<div class="line"><a id="l00235" name="l00235"></a><span class="lineno">  235</span> </div>
-<div class="line"><a id="l00236" name="l00236"></a><span class="lineno">  236</span>} <span class="comment">// namespace async_mqtt</span></div>
-<div class="line"><a id="l00237" name="l00237"></a><span class="lineno">  237</span> </div>
-<div class="line"><a id="l00238" name="l00238"></a><span class="lineno">  238</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_IMPL_STREAM_READ_PACKET_HPP</span></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno">   11</span><span class="preprocessor">#include &lt;async_mqtt/util/shared_ptr_array.hpp&gt;</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno">   12</span> </div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno">   13</span><span class="keyword">namespace </span>async_mqtt {</div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno">   14</span> </div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno">   15</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> NextLayer&gt;</div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno">   16</span><span class="keyword">struct </span>stream&lt;NextLayer&gt;::stream_read_packet_op {</div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno">   17</span>    <span class="keyword">using </span>stream_type = this_type;</div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno">   18</span>    <span class="keyword">using </span>stream_type_sp = std::shared_ptr&lt;stream_type&gt;;</div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno">   19</span>    <span class="keyword">using </span>next_layer_type = stream_type::next_layer_type;</div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno">   20</span> </div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno">   21</span>    stream_type&amp; strm;</div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno">   22</span>    std::size_t received = 0;</div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno">   23</span>    std::uint32_t mul = 1;</div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno">   24</span>    std::uint32_t rl = 0;</div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno">   25</span>    std::shared_ptr&lt;char[]&gt; spca = <span class="keyword">nullptr</span>;</div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span>    stream_type_sp life_keeper = strm.shared_from_this();</div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno">   27</span>    <span class="keyword">enum</span> { dispatch, header, remaining_length, complete } state = dispatch;</div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span> </div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno">   29</span>    <span class="keyword">template</span> &lt;<span class="keyword">typename</span> Self&gt;</div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno">   30</span>    <span class="keywordtype">void</span> operator()(</div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno">   31</span>        Self&amp; self</div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno">   32</span>    ) {</div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno">   33</span>        <span class="keywordflow">switch</span> (state) {</div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno">   34</span>        <span class="keywordflow">case</span> dispatch: {</div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno">   35</span>            state = header;</div>
+<div class="line"><a id="l00036" name="l00036"></a><span class="lineno">   36</span>            <span class="keyword">auto</span>&amp; a_strm{strm};</div>
+<div class="line"><a id="l00037" name="l00037"></a><span class="lineno">   37</span>            as::dispatch(</div>
+<div class="line"><a id="l00038" name="l00038"></a><span class="lineno">   38</span>                as::bind_executor(</div>
+<div class="line"><a id="l00039" name="l00039"></a><span class="lineno">   39</span>                    a_strm.get_executor(),</div>
+<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span>                    force_move(self)</div>
+<div class="line"><a id="l00041" name="l00041"></a><span class="lineno">   41</span>                )</div>
+<div class="line"><a id="l00042" name="l00042"></a><span class="lineno">   42</span>            );</div>
+<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span>        } <span class="keywordflow">break</span>;</div>
+<div class="line"><a id="l00044" name="l00044"></a><span class="lineno">   44</span>        <span class="keywordflow">case</span> header: {</div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span>            <span class="comment">// read fixed_header</span></div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span>            <span class="keyword">auto</span> address = &amp;strm.header_remaining_length_buf_[received];</div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span>            <span class="keyword">auto</span>&amp; a_strm{strm};</div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span>            <span class="keywordflow">if</span> <span class="keyword">constexpr</span> (</div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span>                has_async_read&lt;next_layer_type&gt;::value) {</div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span>                    layer_customize&lt;next_layer_type&gt;::async_read(</div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span>                        a_strm.nl_,</div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span>                        <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">as::buffer</a>(address, 1),</div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span>                        as::bind_executor(</div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno">   54</span>                            a_strm.get_executor(),</div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span>                            force_move(self)</div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno">   56</span>                        )</div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno">   57</span>                    );</div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno">   58</span>                }</div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno">   59</span>            <span class="keywordflow">else</span> {</div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno">   60</span>                async_read(</div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno">   61</span>                    a_strm.nl_,</div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno">   62</span>                    <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">as::buffer</a>(address, 1),</div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno">   63</span>                    as::bind_executor(</div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno">   64</span>                        a_strm.get_executor(),</div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno">   65</span>                        force_move(self)</div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno">   66</span>                    )</div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno">   67</span>                );</div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno">   68</span>            }</div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno">   69</span>        } <span class="keywordflow">break</span>;</div>
+<div class="line"><a id="l00070" name="l00070"></a><span class="lineno">   70</span>        <span class="keywordflow">default</span>:</div>
+<div class="line"><a id="l00071" name="l00071"></a><span class="lineno">   71</span>            BOOST_ASSERT(<span class="keyword">false</span>);</div>
+<div class="line"><a id="l00072" name="l00072"></a><span class="lineno">   72</span>            <span class="keywordflow">break</span>;</div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno">   73</span>        }</div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno">   74</span>    }</div>
+<div class="line"><a id="l00075" name="l00075"></a><span class="lineno">   75</span> </div>
+<div class="line"><a id="l00076" name="l00076"></a><span class="lineno">   76</span>    <span class="keyword">template</span> &lt;<span class="keyword">typename</span> Self&gt;</div>
+<div class="line"><a id="l00077" name="l00077"></a><span class="lineno">   77</span>    <span class="keywordtype">void</span> operator()(</div>
+<div class="line"><a id="l00078" name="l00078"></a><span class="lineno">   78</span>        Self&amp; self,</div>
+<div class="line"><a id="l00079" name="l00079"></a><span class="lineno">   79</span>        <a class="code hl_typedef" href="group__error.html#gaa100a3fca173f12e33f3b5711710033d">error_code</a> ec,</div>
+<div class="line"><a id="l00080" name="l00080"></a><span class="lineno">   80</span>        std::size_t bytes_transferred</div>
+<div class="line"><a id="l00081" name="l00081"></a><span class="lineno">   81</span>    ) {</div>
+<div class="line"><a id="l00082" name="l00082"></a><span class="lineno">   82</span>        (void)bytes_transferred; <span class="comment">// Ignore unused argument in release build</span></div>
+<div class="line"><a id="l00083" name="l00083"></a><span class="lineno">   83</span> </div>
+<div class="line"><a id="l00084" name="l00084"></a><span class="lineno">   84</span>        <span class="keywordflow">if</span> (ec) {</div>
+<div class="line"><a id="l00085" name="l00085"></a><span class="lineno">   85</span>            self.complete(ec, buffer{});</div>
+<div class="line"><a id="l00086" name="l00086"></a><span class="lineno">   86</span>            <span class="keywordflow">return</span>;</div>
+<div class="line"><a id="l00087" name="l00087"></a><span class="lineno">   87</span>        }</div>
+<div class="line"><a id="l00088" name="l00088"></a><span class="lineno">   88</span> </div>
+<div class="line"><a id="l00089" name="l00089"></a><span class="lineno">   89</span>        <span class="keywordflow">switch</span> (state) {</div>
+<div class="line"><a id="l00090" name="l00090"></a><span class="lineno">   90</span>        <span class="keywordflow">case</span> header:</div>
+<div class="line"><a id="l00091" name="l00091"></a><span class="lineno">   91</span>            BOOST_ASSERT(bytes_transferred == 1);</div>
+<div class="line"><a id="l00092" name="l00092"></a><span class="lineno">   92</span>            state = remaining_length;</div>
+<div class="line"><a id="l00093" name="l00093"></a><span class="lineno">   93</span>            ++received;</div>
+<div class="line"><a id="l00094" name="l00094"></a><span class="lineno">   94</span>            <span class="comment">// read the first remaining_length</span></div>
+<div class="line"><a id="l00095" name="l00095"></a><span class="lineno">   95</span>            {</div>
+<div class="line"><a id="l00096" name="l00096"></a><span class="lineno">   96</span>                <span class="keyword">auto</span> address = &amp;strm.header_remaining_length_buf_[received];</div>
+<div class="line"><a id="l00097" name="l00097"></a><span class="lineno">   97</span>                <span class="keyword">auto</span>&amp; a_strm{strm};</div>
+<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span>                <span class="keywordflow">if</span> <span class="keyword">constexpr</span> (</div>
+<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span>                    has_async_read&lt;next_layer_type&gt;::value) {</div>
+<div class="line"><a id="l00100" name="l00100"></a><span class="lineno">  100</span>                        layer_customize&lt;next_layer_type&gt;::async_read(</div>
+<div class="line"><a id="l00101" name="l00101"></a><span class="lineno">  101</span>                            a_strm.nl_,</div>
+<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">  102</span>                            <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">as::buffer</a>(address, 1),</div>
+<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">  103</span>                            as::bind_executor(</div>
+<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">  104</span>                                a_strm.get_executor(),</div>
+<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">  105</span>                                force_move(self)</div>
+<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">  106</span>                            )</div>
+<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">  107</span>                        );</div>
+<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">  108</span>                    }</div>
+<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">  109</span>                <span class="keywordflow">else</span> {</div>
+<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">  110</span>                    async_read(</div>
+<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">  111</span>                        a_strm.nl_,</div>
+<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">  112</span>                        <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">as::buffer</a>(address, 1),</div>
+<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">  113</span>                        as::bind_executor(</div>
+<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">  114</span>                            a_strm.get_executor(),</div>
+<div class="line"><a id="l00115" name="l00115"></a><span class="lineno">  115</span>                            force_move(self)</div>
+<div class="line"><a id="l00116" name="l00116"></a><span class="lineno">  116</span>                        )</div>
+<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">  117</span>                    );</div>
+<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">  118</span>                }</div>
+<div class="line"><a id="l00119" name="l00119"></a><span class="lineno">  119</span>            }</div>
+<div class="line"><a id="l00120" name="l00120"></a><span class="lineno">  120</span>            <span class="keywordflow">break</span>;</div>
+<div class="line"><a id="l00121" name="l00121"></a><span class="lineno">  121</span>        <span class="keywordflow">case</span> remaining_length:</div>
+<div class="line"><a id="l00122" name="l00122"></a><span class="lineno">  122</span>            BOOST_ASSERT(bytes_transferred == 1);</div>
+<div class="line"><a id="l00123" name="l00123"></a><span class="lineno">  123</span>            ++received;</div>
+<div class="line"><a id="l00124" name="l00124"></a><span class="lineno">  124</span>            <span class="keywordflow">if</span> (strm.header_remaining_length_buf_[received - 1] &amp; 0b10000000) {</div>
+<div class="line"><a id="l00125" name="l00125"></a><span class="lineno">  125</span>                <span class="comment">// remaining_length continues</span></div>
+<div class="line"><a id="l00126" name="l00126"></a><span class="lineno">  126</span>                <span class="keywordflow">if</span> (received == 5) {</div>
+<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">  127</span>                    ASYNC_MQTT_LOG(<span class="stringliteral">&quot;mqtt_impl&quot;</span>, <a class="code hl_enumvalue" href="group__log.html#gga3abd0c0ebf71c7d01def2a00423d1abfa7b83d3f08fa392b79e3f553b585971cd">warning</a>)</div>
+<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">  128</span>                        &lt;&lt; ASYNC_MQTT_ADD_VALUE(address, <span class="keyword">this</span>)</div>
+<div class="line"><a id="l00129" name="l00129"></a><span class="lineno">  129</span>                        &lt;&lt; <span class="stringliteral">&quot;out of size remaining length&quot;</span>;</div>
+<div class="line"><a id="l00130" name="l00130"></a><span class="lineno">  130</span>                    self.complete(</div>
+<div class="line"><a id="l00131" name="l00131"></a><span class="lineno">  131</span>                        sys::errc::make_error_code(sys::errc::protocol_error),</div>
+<div class="line"><a id="l00132" name="l00132"></a><span class="lineno">  132</span>                        buffer{}</div>
+<div class="line"><a id="l00133" name="l00133"></a><span class="lineno">  133</span>                    );</div>
+<div class="line"><a id="l00134" name="l00134"></a><span class="lineno">  134</span>                    <span class="keywordflow">return</span>;</div>
+<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">  135</span>                }</div>
+<div class="line"><a id="l00136" name="l00136"></a><span class="lineno">  136</span>                rl += (strm.header_remaining_length_buf_[received - 1] &amp; 0b01111111) * mul;</div>
+<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">  137</span>                mul *= 128;</div>
+<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">  138</span>                <span class="keyword">auto</span> address = &amp;strm.header_remaining_length_buf_[received];</div>
+<div class="line"><a id="l00139" name="l00139"></a><span class="lineno">  139</span>                <span class="keyword">auto</span>&amp; a_strm{strm};</div>
+<div class="line"><a id="l00140" name="l00140"></a><span class="lineno">  140</span>                <span class="keywordflow">if</span> <span class="keyword">constexpr</span> (</div>
+<div class="line"><a id="l00141" name="l00141"></a><span class="lineno">  141</span>                    has_async_read&lt;next_layer_type&gt;::value) {</div>
+<div class="line"><a id="l00142" name="l00142"></a><span class="lineno">  142</span>                        layer_customize&lt;next_layer_type&gt;::async_read(</div>
+<div class="line"><a id="l00143" name="l00143"></a><span class="lineno">  143</span>                            a_strm.nl_,</div>
+<div class="line"><a id="l00144" name="l00144"></a><span class="lineno">  144</span>                            <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">as::buffer</a>(address, 1),</div>
+<div class="line"><a id="l00145" name="l00145"></a><span class="lineno">  145</span>                            as::bind_executor(</div>
+<div class="line"><a id="l00146" name="l00146"></a><span class="lineno">  146</span>                                a_strm.get_executor(),</div>
+<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">  147</span>                                force_move(self)</div>
+<div class="line"><a id="l00148" name="l00148"></a><span class="lineno">  148</span>                            )</div>
+<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">  149</span>                        );</div>
+<div class="line"><a id="l00150" name="l00150"></a><span class="lineno">  150</span>                    }</div>
+<div class="line"><a id="l00151" name="l00151"></a><span class="lineno">  151</span>                <span class="keywordflow">else</span> {</div>
+<div class="line"><a id="l00152" name="l00152"></a><span class="lineno">  152</span>                    async_read(</div>
+<div class="line"><a id="l00153" name="l00153"></a><span class="lineno">  153</span>                        a_strm.nl_,</div>
+<div class="line"><a id="l00154" name="l00154"></a><span class="lineno">  154</span>                        <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">as::buffer</a>(address, 1),</div>
+<div class="line"><a id="l00155" name="l00155"></a><span class="lineno">  155</span>                        as::bind_executor(</div>
+<div class="line"><a id="l00156" name="l00156"></a><span class="lineno">  156</span>                            a_strm.get_executor(),</div>
+<div class="line"><a id="l00157" name="l00157"></a><span class="lineno">  157</span>                            force_move(self)</div>
+<div class="line"><a id="l00158" name="l00158"></a><span class="lineno">  158</span>                        )</div>
+<div class="line"><a id="l00159" name="l00159"></a><span class="lineno">  159</span>                    );</div>
+<div class="line"><a id="l00160" name="l00160"></a><span class="lineno">  160</span>                }</div>
+<div class="line"><a id="l00161" name="l00161"></a><span class="lineno">  161</span>            }</div>
+<div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span>            <span class="keywordflow">else</span> {</div>
+<div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span>                <span class="comment">// remaining_length end</span></div>
+<div class="line"><a id="l00164" name="l00164"></a><span class="lineno">  164</span>                rl += (strm.header_remaining_length_buf_[received - 1] &amp; 0b01111111) * mul;</div>
+<div class="line"><a id="l00165" name="l00165"></a><span class="lineno">  165</span> </div>
+<div class="line"><a id="l00166" name="l00166"></a><span class="lineno">  166</span>                BOOST_ASIO_REBIND_ALLOC(</div>
+<div class="line"><a id="l00167" name="l00167"></a><span class="lineno">  167</span>                    <span class="keyword">typename</span> as::associated_allocator&lt;Self&gt;::type,</div>
+<div class="line"><a id="l00168" name="l00168"></a><span class="lineno">  168</span>                    <span class="keywordtype">char</span></div>
+<div class="line"><a id="l00169" name="l00169"></a><span class="lineno">  169</span>                )</div>
+<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">  170</span>                alloc{</div>
+<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">  171</span>                    as::get_associated_allocator(self)</div>
+<div class="line"><a id="l00172" name="l00172"></a><span class="lineno">  172</span>                };</div>
+<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">  173</span>                spca = <a class="code hl_function" href="group__buffer.html#ga3fd86cf55e3842b607702b72c0617159">allocate_shared_ptr_char_array</a>(</div>
+<div class="line"><a id="l00174" name="l00174"></a><span class="lineno">  174</span>                    alloc,</div>
+<div class="line"><a id="l00175" name="l00175"></a><span class="lineno">  175</span>                    received + rl</div>
+<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">  176</span>                );</div>
+<div class="line"><a id="l00177" name="l00177"></a><span class="lineno">  177</span>                std::copy(</div>
+<div class="line"><a id="l00178" name="l00178"></a><span class="lineno">  178</span>                    strm.header_remaining_length_buf_.data(),</div>
+<div class="line"><a id="l00179" name="l00179"></a><span class="lineno">  179</span>                    strm.header_remaining_length_buf_.data() + received, spca.get()</div>
+<div class="line"><a id="l00180" name="l00180"></a><span class="lineno">  180</span>                );</div>
+<div class="line"><a id="l00181" name="l00181"></a><span class="lineno">  181</span> </div>
+<div class="line"><a id="l00182" name="l00182"></a><span class="lineno">  182</span>                <span class="keywordflow">if</span> (rl == 0) {</div>
+<div class="line"><a id="l00183" name="l00183"></a><span class="lineno">  183</span>                    <span class="keyword">auto</span> ptr = spca.get();</div>
+<div class="line"><a id="l00184" name="l00184"></a><span class="lineno">  184</span>                    self.complete(ec, buffer{ptr, ptr + received + rl, force_move(spca)});</div>
+<div class="line"><a id="l00185" name="l00185"></a><span class="lineno">  185</span>                    <span class="keywordflow">return</span>;</div>
+<div class="line"><a id="l00186" name="l00186"></a><span class="lineno">  186</span>                }</div>
+<div class="line"><a id="l00187" name="l00187"></a><span class="lineno">  187</span>                <span class="keywordflow">else</span> {</div>
+<div class="line"><a id="l00188" name="l00188"></a><span class="lineno">  188</span>                    state = complete;</div>
+<div class="line"><a id="l00189" name="l00189"></a><span class="lineno">  189</span>                    <span class="keyword">auto</span> address = &amp;spca[std::ptrdiff_t(received)];</div>
+<div class="line"><a id="l00190" name="l00190"></a><span class="lineno">  190</span>                    <span class="keyword">auto</span>&amp; a_strm{strm};</div>
+<div class="line"><a id="l00191" name="l00191"></a><span class="lineno">  191</span>                    <span class="keywordflow">if</span> <span class="keyword">constexpr</span> (</div>
+<div class="line"><a id="l00192" name="l00192"></a><span class="lineno">  192</span>                        has_async_read&lt;next_layer_type&gt;::value) {</div>
+<div class="line"><a id="l00193" name="l00193"></a><span class="lineno">  193</span>                            layer_customize&lt;next_layer_type&gt;::async_read(</div>
+<div class="line"><a id="l00194" name="l00194"></a><span class="lineno">  194</span>                                a_strm.nl_,</div>
+<div class="line"><a id="l00195" name="l00195"></a><span class="lineno">  195</span>                                <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">as::buffer</a>(address, rl),</div>
+<div class="line"><a id="l00196" name="l00196"></a><span class="lineno">  196</span>                                as::bind_executor(</div>
+<div class="line"><a id="l00197" name="l00197"></a><span class="lineno">  197</span>                                    a_strm.get_executor(),</div>
+<div class="line"><a id="l00198" name="l00198"></a><span class="lineno">  198</span>                                    force_move(self)</div>
+<div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span>                                )</div>
+<div class="line"><a id="l00200" name="l00200"></a><span class="lineno">  200</span>                            );</div>
+<div class="line"><a id="l00201" name="l00201"></a><span class="lineno">  201</span>                        }</div>
+<div class="line"><a id="l00202" name="l00202"></a><span class="lineno">  202</span>                    <span class="keywordflow">else</span> {</div>
+<div class="line"><a id="l00203" name="l00203"></a><span class="lineno">  203</span>                        async_read(</div>
+<div class="line"><a id="l00204" name="l00204"></a><span class="lineno">  204</span>                            a_strm.nl_,</div>
+<div class="line"><a id="l00205" name="l00205"></a><span class="lineno">  205</span>                            <a class="code hl_function" href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">as::buffer</a>(address, rl),</div>
+<div class="line"><a id="l00206" name="l00206"></a><span class="lineno">  206</span>                            as::bind_executor(</div>
+<div class="line"><a id="l00207" name="l00207"></a><span class="lineno">  207</span>                                a_strm.get_executor(),</div>
+<div class="line"><a id="l00208" name="l00208"></a><span class="lineno">  208</span>                                force_move(self)</div>
+<div class="line"><a id="l00209" name="l00209"></a><span class="lineno">  209</span>                            )</div>
+<div class="line"><a id="l00210" name="l00210"></a><span class="lineno">  210</span>                        );</div>
+<div class="line"><a id="l00211" name="l00211"></a><span class="lineno">  211</span>                    }</div>
+<div class="line"><a id="l00212" name="l00212"></a><span class="lineno">  212</span>                }</div>
+<div class="line"><a id="l00213" name="l00213"></a><span class="lineno">  213</span>            }</div>
+<div class="line"><a id="l00214" name="l00214"></a><span class="lineno">  214</span>            <span class="keywordflow">break</span>;</div>
+<div class="line"><a id="l00215" name="l00215"></a><span class="lineno">  215</span>        <span class="keywordflow">case</span> complete: {</div>
+<div class="line"><a id="l00216" name="l00216"></a><span class="lineno">  216</span>            <span class="keyword">auto</span> ptr = spca.get();</div>
+<div class="line"><a id="l00217" name="l00217"></a><span class="lineno">  217</span>            self.complete(ec, buffer{ptr, ptr + received + rl, force_move(spca)});</div>
+<div class="line"><a id="l00218" name="l00218"></a><span class="lineno">  218</span>        } <span class="keywordflow">break</span>;</div>
+<div class="line"><a id="l00219" name="l00219"></a><span class="lineno">  219</span>        <span class="keywordflow">default</span>:</div>
+<div class="line"><a id="l00220" name="l00220"></a><span class="lineno">  220</span>            BOOST_ASSERT(<span class="keyword">false</span>);</div>
+<div class="line"><a id="l00221" name="l00221"></a><span class="lineno">  221</span>            <span class="keywordflow">break</span>;</div>
+<div class="line"><a id="l00222" name="l00222"></a><span class="lineno">  222</span>        }</div>
+<div class="line"><a id="l00223" name="l00223"></a><span class="lineno">  223</span>    }</div>
+<div class="line"><a id="l00224" name="l00224"></a><span class="lineno">  224</span>};</div>
+<div class="line"><a id="l00225" name="l00225"></a><span class="lineno">  225</span> </div>
+<div class="line"><a id="l00226" name="l00226"></a><span class="lineno">  226</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> NextLayer&gt;</div>
+<div class="line"><a id="l00227" name="l00227"></a><span class="lineno">  227</span><span class="keyword">template</span> &lt;<span class="keyword">typename</span> CompletionToken&gt;</div>
+<div class="line"><a id="l00228" name="l00228"></a><span class="lineno">  228</span>BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(</div>
+<div class="line"><a id="l00229" name="l00229"></a><span class="lineno">  229</span>    CompletionToken,</div>
+<div class="line"><a id="l00230" name="l00230"></a><span class="lineno">  230</span>    <span class="keywordtype">void</span>(<a class="code hl_typedef" href="group__error.html#gaa100a3fca173f12e33f3b5711710033d">error_code</a>, buffer)</div>
+<div class="line"><a id="l00231" name="l00231"></a><span class="lineno">  231</span>)</div>
+<div class="line"><a id="l00232" name="l00232"></a><span class="lineno">  232</span>stream&lt;NextLayer&gt;::read_packet(</div>
+<div class="line"><a id="l00233" name="l00233"></a><span class="lineno">  233</span>    CompletionToken&amp;&amp; token</div>
+<div class="line"><a id="l00234" name="l00234"></a><span class="lineno">  234</span>) {</div>
+<div class="line"><a id="l00235" name="l00235"></a><span class="lineno">  235</span>    <span class="keywordflow">return</span></div>
+<div class="line"><a id="l00236" name="l00236"></a><span class="lineno">  236</span>        as::async_compose&lt;</div>
+<div class="line"><a id="l00237" name="l00237"></a><span class="lineno">  237</span>            CompletionToken,</div>
+<div class="line"><a id="l00238" name="l00238"></a><span class="lineno">  238</span>        void(<a class="code hl_typedef" href="group__error.html#gaa100a3fca173f12e33f3b5711710033d">error_code</a>, buffer)</div>
+<div class="line"><a id="l00239" name="l00239"></a><span class="lineno">  239</span>    &gt;(</div>
+<div class="line"><a id="l00240" name="l00240"></a><span class="lineno">  240</span>        stream_read_packet_op{</div>
+<div class="line"><a id="l00241" name="l00241"></a><span class="lineno">  241</span>            *<span class="keyword">this</span></div>
+<div class="line"><a id="l00242" name="l00242"></a><span class="lineno">  242</span>        },</div>
+<div class="line"><a id="l00243" name="l00243"></a><span class="lineno">  243</span>        token</div>
+<div class="line"><a id="l00244" name="l00244"></a><span class="lineno">  244</span>    );</div>
+<div class="line"><a id="l00245" name="l00245"></a><span class="lineno">  245</span>}</div>
+<div class="line"><a id="l00246" name="l00246"></a><span class="lineno">  246</span> </div>
+<div class="line"><a id="l00247" name="l00247"></a><span class="lineno">  247</span>} <span class="comment">// namespace async_mqtt</span></div>
+<div class="line"><a id="l00248" name="l00248"></a><span class="lineno">  248</span> </div>
+<div class="line"><a id="l00249" name="l00249"></a><span class="lineno">  249</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_IMPL_STREAM_READ_PACKET_HPP</span></div>
+<div class="ttc" id="agroup__buffer_html_ga3fd86cf55e3842b607702b72c0617159"><div class="ttname"><a href="group__buffer.html#ga3fd86cf55e3842b607702b72c0617159">async_mqtt::allocate_shared_ptr_char_array</a></div><div class="ttdeci">std::shared_ptr&lt; char[]&gt; allocate_shared_ptr_char_array(Alloc &amp;&amp;alloc, std::size_t size)</div><div class="ttdoc">shared_ptr&lt;char[]&gt; creating function with allocator. You can choose the target type.</div><div class="ttdef"><b>Definition</b> shared_ptr_array.hpp:46</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__error_html_gaa100a3fca173f12e33f3b5711710033d"><div class="ttname"><a href="group__error.html#gaa100a3fca173f12e33f3b5711710033d">async_mqtt::error_code</a></div><div class="ttdeci">sys::error_code error_code</div><div class="ttdoc">type alias of boost::sytem.</div><div class="ttdef"><b>Definition</b> exception.hpp:36</div></div>
 <div class="ttc" id="agroup__log_html_gga3abd0c0ebf71c7d01def2a00423d1abfa7b83d3f08fa392b79e3f553b585971cd"><div class="ttname"><a href="group__log.html#gga3abd0c0ebf71c7d01def2a00423d1abfa7b83d3f08fa392b79e3f553b585971cd">async_mqtt::severity_level::warning</a></div><div class="ttdeci">@ warning</div><div class="ttdoc">warning level such as timeout</div></div>
 </div><!-- fragment --></div><!-- contents -->
diff --git a/doc/api/underlying__connect__impl_8hpp_source.html b/doc/api/underlying__connect__impl_8hpp_source.html
deleted file mode 100644
index 19456af6d..000000000
--- a/doc/api/underlying__connect__impl_8hpp_source.html
+++ /dev/null
@@ -1,184 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
-<head>
-<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=11"/>
-<meta name="generator" content="Doxygen 1.10.0"/>
-<meta name="viewport" content="width=device-width, initial-scale=1"/>
-<title>async_mqtt: /home/kondo/work/async_mqtt/include/async_mqtt/impl/underlying_connect_impl.hpp Source File</title>
-<link href="tabs.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="jquery.js"></script>
-<script type="text/javascript" src="dynsections.js"></script>
-<script type="text/javascript" src="clipboard.js"></script>
-<link href="navtree.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="resize.js"></script>
-<script type="text/javascript" src="navtreedata.js"></script>
-<script type="text/javascript" src="navtree.js"></script>
-<script type="text/javascript" src="cookie.js"></script>
-<link href="search/search.css" rel="stylesheet" type="text/css"/>
-<script type="text/javascript" src="search/searchdata.js"></script>
-<script type="text/javascript" src="search/search.js"></script>
-<link href="doxygen.css" rel="stylesheet" type="text/css" />
-<link href="doxygen-awesome.css" rel="stylesheet" type="text/css"/>
-</head>
-<body>
-<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-<div id="titlearea">
-<table cellspacing="0" cellpadding="0">
- <tbody>
- <tr id="projectrow">
-  <td id="projectalign">
-   <div id="projectname">async_mqtt<span id="projectnumber">&#160;6.0.0</span>
-   </div>
-  </td>
- </tr>
- </tbody>
-</table>
-</div>
-<!-- end header part -->
-<!-- Generated by Doxygen 1.10.0 -->
-<script type="text/javascript">
-/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
-var searchBox = new SearchBox("searchBox", "search/",'.html');
-/* @license-end */
-</script>
-<script type="text/javascript" src="menudata.js"></script>
-<script type="text/javascript" src="menu.js"></script>
-<script type="text/javascript">
-/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
-$(function() {
-  initMenu('',true,false,'search.php','Search');
-  $(function() { init_search(); });
-});
-/* @license-end */
-</script>
-<div id="main-nav"></div>
-<script type="text/javascript">
-/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
-$(function() { codefold.init(0); });
-/* @license-end */
-</script>
-</div><!-- top -->
-<div id="side-nav" class="ui-resizable side-nav-resizable">
-  <div id="nav-tree">
-    <div id="nav-tree-contents">
-      <div id="nav-sync" class="sync"></div>
-    </div>
-  </div>
-  <div id="splitbar" style="-moz-user-select:none;" 
-       class="ui-resizable-handle">
-  </div>
-</div>
-<script type="text/javascript">
-/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
-$(function(){initNavTree('underlying__connect__impl_8hpp_source.html',''); initResizable(); });
-/* @license-end */
-</script>
-<div id="doc-content">
-<!-- window showing the filter options -->
-<div id="MSearchSelectWindow"
-     onmouseover="return searchBox.OnSearchSelectShow()"
-     onmouseout="return searchBox.OnSearchSelectHide()"
-     onkeydown="return searchBox.OnSearchSelectKey(event)">
-</div>
-
-<!-- iframe showing the search results (closed by default) -->
-<div id="MSearchResultsWindow">
-<div id="MSearchResults">
-<div class="SRPage">
-<div id="SRIndex">
-<div id="SRResults"></div>
-<div class="SRStatus" id="Loading">Loading...</div>
-<div class="SRStatus" id="Searching">Searching...</div>
-<div class="SRStatus" id="NoMatches">No Matches</div>
-</div>
-</div>
-</div>
-</div>
-
-<div class="header">
-  <div class="headertitle"><div class="title">underlying_connect_impl.hpp</div></div>
-</div><!--header-->
-<div class="contents">
-<div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno">    1</span><span class="comment">// Copyright Takatoshi Kondo 2024</span></div>
-<div class="line"><a id="l00002" name="l00002"></a><span class="lineno">    2</span><span class="comment">//</span></div>
-<div class="line"><a id="l00003" name="l00003"></a><span class="lineno">    3</span><span class="comment">// Distributed under the Boost Software License, Version 1.0.</span></div>
-<div class="line"><a id="l00004" name="l00004"></a><span class="lineno">    4</span><span class="comment">// (See accompanying file LICENSE_1_0.txt or copy at</span></div>
-<div class="line"><a id="l00005" name="l00005"></a><span class="lineno">    5</span><span class="comment">// http://www.boost.org/LICENSE_1_0.txt)</span></div>
-<div class="line"><a id="l00006" name="l00006"></a><span class="lineno">    6</span> </div>
-<div class="line"><a id="l00007" name="l00007"></a><span class="lineno">    7</span><span class="preprocessor">#if !defined(ASYNC_MQTT_IMPL_UNDERLYING_CONNECT_IMPL_HPP)</span></div>
-<div class="line"><a id="l00008" name="l00008"></a><span class="lineno">    8</span><span class="preprocessor">#define ASYNC_MQTT_IMPL_UNDERLYING_CONNECT_IMPL_HPP</span></div>
-<div class="line"><a id="l00009" name="l00009"></a><span class="lineno">    9</span> </div>
-<div class="line"><a id="l00010" name="l00010"></a><span class="lineno">   10</span><span class="preprocessor">#include &lt;async_mqtt/underlying_connect.hpp&gt;</span></div>
-<div class="line"><a id="l00011" name="l00011"></a><span class="lineno">   11</span> </div>
-<div class="line"><a id="l00012" name="l00012"></a><span class="lineno">   12</span><span class="keyword">namespace </span>async_mqtt {</div>
-<div class="line"><a id="l00013" name="l00013"></a><span class="lineno">   13</span> </div>
-<div class="line"><a id="l00014" name="l00014"></a><span class="lineno">   14</span><span class="keyword">template</span> &lt;protocol_version Version, <span class="keyword">typename</span> NextLayer&gt;</div>
-<div class="line"><a id="l00015" name="l00015"></a><span class="lineno">   15</span><span class="keyword">struct </span><a class="code hl_enumvalue" href="group__role.html#gga83492944f4f6b69eb11ce917d1f27c4aa62608e08adc29a8d6dbc9754e659f125">client</a>&lt;Version, NextLayer&gt;::</div>
-<div class="line"><a id="l00016" name="l00016"></a><span class="lineno">   16</span>underlying_connect_op {</div>
-<div class="line"><a id="l00017" name="l00017"></a><span class="lineno">   17</span>    this_type&amp; cl;</div>
-<div class="line"><a id="l00018" name="l00018"></a><span class="lineno">   18</span>    ;</div>
-<div class="line"><a id="l00019" name="l00019"></a><span class="lineno">   19</span> </div>
-<div class="line"><a id="l00020" name="l00020"></a><span class="lineno">   20</span>    <span class="keyword">template</span> &lt;<span class="keyword">typename</span> Self&gt;</div>
-<div class="line"><a id="l00021" name="l00021"></a><span class="lineno">   21</span>    <span class="keywordtype">void</span> operator()(</div>
-<div class="line"><a id="l00022" name="l00022"></a><span class="lineno">   22</span>        Self&amp; self</div>
-<div class="line"><a id="l00023" name="l00023"></a><span class="lineno">   23</span>    ) {</div>
-<div class="line"><a id="l00024" name="l00024"></a><span class="lineno">   24</span>        <span class="keyword">auto</span>&amp; a_cl{cl};</div>
-<div class="line"><a id="l00025" name="l00025"></a><span class="lineno">   25</span>        <span class="keyword">auto</span> a_packet{packet};</div>
-<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span>        a_cl.ep_-&gt;send(</div>
-<div class="line"><a id="l00027" name="l00027"></a><span class="lineno">   27</span>            force_move(a_packet),</div>
-<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span>            force_move(self)</div>
-<div class="line"><a id="l00029" name="l00029"></a><span class="lineno">   29</span>        );</div>
-<div class="line"><a id="l00030" name="l00030"></a><span class="lineno">   30</span>    }</div>
-<div class="line"><a id="l00031" name="l00031"></a><span class="lineno">   31</span> </div>
-<div class="line"><a id="l00032" name="l00032"></a><span class="lineno">   32</span>    <span class="keyword">template</span> &lt;<span class="keyword">typename</span> Self&gt;</div>
-<div class="line"><a id="l00033" name="l00033"></a><span class="lineno">   33</span>    <span class="keywordtype">void</span> operator()(</div>
-<div class="line"><a id="l00034" name="l00034"></a><span class="lineno">   34</span>        Self&amp; self,</div>
-<div class="line"><a id="l00035" name="l00035"></a><span class="lineno">   35</span>        system_error <span class="keyword">const</span>&amp; se</div>
-<div class="line"><a id="l00036" name="l00036"></a><span class="lineno">   36</span>    ) {</div>
-<div class="line"><a id="l00037" name="l00037"></a><span class="lineno">   37</span>        self.complete(se.code());</div>
-<div class="line"><a id="l00038" name="l00038"></a><span class="lineno">   38</span>    }</div>
-<div class="line"><a id="l00039" name="l00039"></a><span class="lineno">   39</span>};</div>
-<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span> </div>
-<div class="line"><a id="l00041" name="l00041"></a><span class="lineno">   41</span> </div>
-<div class="line"><a id="l00042" name="l00042"></a><span class="lineno">   42</span><span class="keyword">template</span> &lt;</div>
-<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span>    <a class="code hl_enumeration" href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">protocol_version</a> Version,</div>
-<div class="line"><a id="l00044" name="l00044"></a><span class="lineno">   44</span>    <span class="keyword">typename</span> NextLayer,</div>
-<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span>    <span class="keyword">typename</span> CompletionToken = as::default_completion_token_t&lt;executor_type&gt;</div>
-<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span>&gt;</div>
-<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span>BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(</div>
-<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span>    CompletionToken,</div>
-<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span>    <span class="keywordtype">void</span>(<a class="code hl_typedef" href="group__error.html#gaa100a3fca173f12e33f3b5711710033d">error_code</a>)</div>
-<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span>)</div>
-<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span>underlying_connect(client&lt;Version, NextLayer&gt;&amp; c, CompletionToken&amp;&amp; token) {</div>
-<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span>    <span class="keywordflow">return</span></div>
-<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span>        as::async_compose&lt;</div>
-<div class="line"><a id="l00054" name="l00054"></a><span class="lineno">   54</span>            CompletionToken,</div>
-<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span>            void(<a class="code hl_typedef" href="group__error.html#gaa100a3fca173f12e33f3b5711710033d">error_code</a>)</div>
-<div class="line"><a id="l00056" name="l00056"></a><span class="lineno">   56</span>        &gt;(</div>
-<div class="line"><a id="l00057" name="l00057"></a><span class="lineno">   57</span>            underlying_connect_op{</div>
-<div class="line"><a id="l00058" name="l00058"></a><span class="lineno">   58</span>                std::ref(c)</div>
-<div class="line"><a id="l00059" name="l00059"></a><span class="lineno">   59</span>            },</div>
-<div class="line"><a id="l00060" name="l00060"></a><span class="lineno">   60</span>            token</div>
-<div class="line"><a id="l00061" name="l00061"></a><span class="lineno">   61</span>        );</div>
-<div class="line"><a id="l00062" name="l00062"></a><span class="lineno">   62</span>}</div>
-<div class="line"><a id="l00063" name="l00063"></a><span class="lineno">   63</span> </div>
-<div class="line"><a id="l00064" name="l00064"></a><span class="lineno">   64</span>} <span class="comment">// namespace async_mqtt</span></div>
-<div class="line"><a id="l00065" name="l00065"></a><span class="lineno">   65</span> </div>
-<div class="line"><a id="l00066" name="l00066"></a><span class="lineno">   66</span><span class="preprocessor">#include &lt;async_mqtt/impl/underlying_connect_impl.hpp&gt;</span></div>
-<div class="line"><a id="l00067" name="l00067"></a><span class="lineno">   67</span> </div>
-<div class="line"><a id="l00068" name="l00068"></a><span class="lineno">   68</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_IMPL_UNDERLYING_CONNECT_IMPL_HPP</span></div>
-<div class="ttc" id="agroup__error_html_gaa100a3fca173f12e33f3b5711710033d"><div class="ttname"><a href="group__error.html#gaa100a3fca173f12e33f3b5711710033d">async_mqtt::error_code</a></div><div class="ttdeci">sys::error_code error_code</div><div class="ttdoc">type alias of boost::sytem.</div><div class="ttdef"><b>Definition</b> exception.hpp:36</div></div>
-<div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
-<div class="ttc" id="agroup__role_html_gga83492944f4f6b69eb11ce917d1f27c4aa62608e08adc29a8d6dbc9754e659f125"><div class="ttname"><a href="group__role.html#gga83492944f4f6b69eb11ce917d1f27c4aa62608e08adc29a8d6dbc9754e659f125">async_mqtt::role::client</a></div><div class="ttdeci">@ client</div><div class="ttdoc">as client. Can't send CONNACK, SUBACK, UNSUBACK, PINGRESP. Can send Other packets.</div></div>
-</div><!-- fragment --></div><!-- contents -->
-</div><!-- doc-content -->
-<!-- start footer part -->
-<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
-  <ul>
-    <li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li><li class="navelem"><a class="el" href="dir_f8efeb8e1feb6bbd3b8b0bf040091d61.html">async_mqtt</a></li><li class="navelem"><a class="el" href="dir_4a30554fdbbe434876011b5ec6e3c25e.html">impl</a></li><li class="navelem"><b>underlying_connect_impl.hpp</b></li>
-    <li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.10.0 </li>
-  </ul>
-</div>
-</body>
-</html>
diff --git a/doc/api/v3__1__1__connack_8hpp_source.html b/doc/api/v3__1__1__connack_8hpp_source.html
index 63112dce3..4a9760c51 100644
--- a/doc/api/v3__1__1__connack_8hpp_source.html
+++ b/doc/api/v3__1__1__connack_8hpp_source.html
@@ -273,7 +273,7 @@
 <div class="line"><a id="l00205" name="l00205"></a><span class="lineno">  205</span> </div>
 <div class="line"><a id="l00206" name="l00206"></a><span class="lineno">  206</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V3_1_1_CONNACK_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1connack__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1connack__packet.html">async_mqtt::v3_1_1::connack_packet</a></div><div class="ttdoc">MQTT CONNACK packet (v3.1.1)</div><div class="ttdef"><b>Definition</b> v3_1_1_connack.hpp:40</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1connack__packet_html_a3605cbcab241002f7ad3f053292b6701"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1connack__packet.html#a3605cbcab241002f7ad3f053292b6701">async_mqtt::v3_1_1::connack_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v3_1_1_connack.hpp:67</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1connack__packet_html_a4067b786979f607c78f51d7722abfc55"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1connack__packet.html#a4067b786979f607c78f51d7722abfc55">async_mqtt::v3_1_1::connack_packet::num_of_const_buffer_sequence</a></div><div class="ttdeci">static constexpr std::size_t num_of_const_buffer_sequence()</div><div class="ttdoc">Get number of element of const_buffer_sequence.</div><div class="ttdef"><b>Definition</b> v3_1_1_connack.hpp:95</div></div>
@@ -283,7 +283,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1connack__packet_html_ae25c99c7067f346b64f652b880959f12"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1connack__packet.html#ae25c99c7067f346b64f652b880959f12">async_mqtt::v3_1_1::connack_packet::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;o, connack_packet const &amp;v)</div><div class="ttdoc">stream output operator</div><div class="ttdef"><b>Definition</b> v3_1_1_connack.hpp:195</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1connack__packet_html_ae6ad61f9bb52eb9c3eb0d5daae35ce9b"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1connack__packet.html#ae6ad61f9bb52eb9c3eb0d5daae35ce9b">async_mqtt::v3_1_1::connack_packet::connack_packet</a></div><div class="ttdeci">connack_packet(bool session_present, connect_return_code return_code)</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> v3_1_1_connack.hpp:50</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1connack__packet_html_aedf275b2c38240b7afe5b46493cd53c9"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1connack__packet.html#aedf275b2c38240b7afe5b46493cd53c9">async_mqtt::v3_1_1::connack_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence. it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v3_1_1_connack.hpp:76</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__connack__v3__1__1_html_ga8342d3b4108d9bb325b95dbd9c0c6109"><div class="ttname"><a href="group__connack__v3__1__1.html#ga8342d3b4108d9bb325b95dbd9c0c6109">async_mqtt::connect_return_code</a></div><div class="ttdeci">connect_return_code</div><div class="ttdoc">connect return code See https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1....</div><div class="ttdef"><b>Definition</b> connect_return_code.hpp:21</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
diff --git a/doc/api/v3__1__1__connect_8hpp_source.html b/doc/api/v3__1__1__connect_8hpp_source.html
index fbe678a36..7c4a90244 100644
--- a/doc/api/v3__1__1__connect_8hpp_source.html
+++ b/doc/api/v3__1__1__connect_8hpp_source.html
@@ -663,8 +663,8 @@
 <div class="line"><a id="l00647" name="l00647"></a><span class="lineno">  647</span> </div>
 <div class="line"><a id="l00648" name="l00648"></a><span class="lineno">  648</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V3_1_1_CONNECT_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:266</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:265</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1connect__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1connect__packet.html">async_mqtt::v3_1_1::connect_packet</a></div><div class="ttdoc">MQTT CONNECT packet (v3.1.1)</div><div class="ttdef"><b>Definition</b> v3_1_1_connect.hpp:46</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1connect__packet_html_a0b2fc596c4da3265296628bb379d3246"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1connect__packet.html#a0b2fc596c4da3265296628bb379d3246">async_mqtt::v3_1_1::connect_packet::password</a></div><div class="ttdeci">std::optional&lt; std::string &gt; password() const</div><div class="ttdoc">Get password.</div><div class="ttdef"><b>Definition</b> v3_1_1_connect.hpp:337</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1connect__packet_html_a2d37a0b8e09a6ef1897f76f44c0cbb06"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1connect__packet.html#a2d37a0b8e09a6ef1897f76f44c0cbb06">async_mqtt::v3_1_1::connect_packet::size</a></div><div class="ttdeci">std::size_t size() const</div><div class="ttdoc">Get packet size.</div><div class="ttdef"><b>Definition</b> v3_1_1_connect.hpp:253</div></div>
@@ -679,7 +679,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1connect__packet_html_ace621bafbe046cc352dbc355202408a0"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1connect__packet.html#ace621bafbe046cc352dbc355202408a0">async_mqtt::v3_1_1::connect_packet::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;o, connect_packet const &amp;v)</div><div class="ttdoc">stream output operator</div><div class="ttdef"><b>Definition</b> v3_1_1_connect.hpp:627</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1connect__packet_html_aece19e70a2c1a04be8ac6e50348b166b"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1connect__packet.html#aece19e70a2c1a04be8ac6e50348b166b">async_mqtt::v3_1_1::connect_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v3_1_1_connect.hpp:207</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1connect__packet_html_af19191067664e41b52dd657b1f947553"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1connect__packet.html#af19191067664e41b52dd657b1f947553">async_mqtt::v3_1_1::connect_packet::connect_packet</a></div><div class="ttdeci">connect_packet(bool clean_session, std::uint16_t keep_alive_sec, std::string client_id, std::optional&lt; std::string &gt; user_name=std::nullopt, std::optional&lt; std::string &gt; password=std::nullopt)</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> v3_1_1_connect.hpp:74</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 <div class="ttc" id="agroup__publish__options_html_gga89fabc81d8448fa347b2146349ae4737aa6105c0a611b41b08f1209506350279e"><div class="ttname"><a href="group__publish__options.html#gga89fabc81d8448fa347b2146349ae4737aa6105c0a611b41b08f1209506350279e">async_mqtt::pub::retain::yes</a></div><div class="ttdeci">@ yes</div><div class="ttdoc">Retain.</div></div>
 <div class="ttc" id="agroup__qos_html_gga38e773082414bb272ab22275c56eb4dfa64d245cf1d119a993a586e60738513a9"><div class="ttname"><a href="group__qos.html#gga38e773082414bb272ab22275c56eb4dfa64d245cf1d119a993a586e60738513a9">async_mqtt::qos::exactly_once</a></div><div class="ttdeci">@ exactly_once</div><div class="ttdoc">Exactly once delivery.</div></div>
diff --git a/doc/api/v3__1__1__disconnect_8hpp_source.html b/doc/api/v3__1__1__disconnect_8hpp_source.html
index 3e114bd72..1fda01295 100644
--- a/doc/api/v3__1__1__disconnect_8hpp_source.html
+++ b/doc/api/v3__1__1__disconnect_8hpp_source.html
@@ -232,7 +232,7 @@
 <div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span> </div>
 <div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V3_1_1_DISCONNECT_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1disconnect__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1disconnect__packet.html">async_mqtt::v3_1_1::disconnect_packet</a></div><div class="ttdoc">MQTT DISCONNECT packet (v3.1.1)</div><div class="ttdef"><b>Definition</b> v3_1_1_disconnect.hpp:49</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1disconnect__packet_html_a2c67050ca4a11551765180fa7d62039b"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1disconnect__packet.html#a2c67050ca4a11551765180fa7d62039b">async_mqtt::v3_1_1::disconnect_packet::size</a></div><div class="ttdeci">std::size_t size() const</div><div class="ttdoc">Get packet size.</div><div class="ttdef"><b>Definition</b> v3_1_1_disconnect.hpp:85</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1disconnect__packet_html_a4052d9af1c2cf517eba3414ca85b6977"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1disconnect__packet.html#a4052d9af1c2cf517eba3414ca85b6977">async_mqtt::v3_1_1::disconnect_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v3_1_1_disconnect.hpp:65</div></div>
@@ -240,7 +240,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1disconnect__packet_html_ab2267735ea344dcd9771a53955fda0a3"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1disconnect__packet.html#ab2267735ea344dcd9771a53955fda0a3">async_mqtt::v3_1_1::disconnect_packet::num_of_const_buffer_sequence</a></div><div class="ttdeci">static constexpr std::size_t num_of_const_buffer_sequence()</div><div class="ttdoc">Get number of element of const_buffer_sequence.</div><div class="ttdef"><b>Definition</b> v3_1_1_disconnect.hpp:93</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1disconnect__packet_html_ac145097343110f56fe6b11701c5f940c"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1disconnect__packet.html#ac145097343110f56fe6b11701c5f940c">async_mqtt::v3_1_1::disconnect_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v3_1_1_disconnect.hpp:74</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1disconnect__packet_html_ae286f63053d4ad95c3b5898c6d3d9b95"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1disconnect__packet.html#ae286f63053d4ad95c3b5898c6d3d9b95">async_mqtt::v3_1_1::disconnect_packet::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;o, disconnect_packet const &amp;)</div><div class="ttdoc">stream output operator</div><div class="ttdef"><b>Definition</b> v3_1_1_disconnect.hpp:155</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v3__1__1__pingreq_8hpp_source.html b/doc/api/v3__1__1__pingreq_8hpp_source.html
index a4e434c8a..880688753 100644
--- a/doc/api/v3__1__1__pingreq_8hpp_source.html
+++ b/doc/api/v3__1__1__pingreq_8hpp_source.html
@@ -234,7 +234,7 @@
 <div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span> </div>
 <div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V3_1_1_PINGREQ_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1pingreq__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1pingreq__packet.html">async_mqtt::v3_1_1::pingreq_packet</a></div><div class="ttdoc">MQTT PINGREQ packet (v3.1.1)</div><div class="ttdef"><b>Definition</b> v3_1_1_pingreq.hpp:47</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1pingreq__packet_html_a2d1a7d71a227201fad6cee6c1387a641"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1pingreq__packet.html#a2d1a7d71a227201fad6cee6c1387a641">async_mqtt::v3_1_1::pingreq_packet::num_of_const_buffer_sequence</a></div><div class="ttdeci">static constexpr std::size_t num_of_const_buffer_sequence()</div><div class="ttdoc">Get number of element of const_buffer_sequence.</div><div class="ttdef"><b>Definition</b> v3_1_1_pingreq.hpp:92</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1pingreq__packet_html_a45c11f40101d5997ec0d4e406f3b275a"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1pingreq__packet.html#a45c11f40101d5997ec0d4e406f3b275a">async_mqtt::v3_1_1::pingreq_packet::pingreq_packet</a></div><div class="ttdeci">pingreq_packet()</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> v3_1_1_pingreq.hpp:53</div></div>
@@ -242,7 +242,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1pingreq__packet_html_a83cf6dc8b65e35c2414abbbe496f38db"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1pingreq__packet.html#a83cf6dc8b65e35c2414abbbe496f38db">async_mqtt::v3_1_1::pingreq_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v3_1_1_pingreq.hpp:73</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1pingreq__packet_html_ac96a10e6e0442450e10c342620cf7953"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1pingreq__packet.html#ac96a10e6e0442450e10c342620cf7953">async_mqtt::v3_1_1::pingreq_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v3_1_1_pingreq.hpp:64</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1pingreq__packet_html_ae8f845776d61cced7df729f440a54830"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1pingreq__packet.html#ae8f845776d61cced7df729f440a54830">async_mqtt::v3_1_1::pingreq_packet::size</a></div><div class="ttdeci">std::size_t size() const</div><div class="ttdoc">Get packet size.</div><div class="ttdef"><b>Definition</b> v3_1_1_pingreq.hpp:84</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v3__1__1__pingresp_8hpp_source.html b/doc/api/v3__1__1__pingresp_8hpp_source.html
index d6cfb4407..80e5dced9 100644
--- a/doc/api/v3__1__1__pingresp_8hpp_source.html
+++ b/doc/api/v3__1__1__pingresp_8hpp_source.html
@@ -234,7 +234,7 @@
 <div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span> </div>
 <div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V3_1_1_PINGRESP_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1pingresp__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1pingresp__packet.html">async_mqtt::v3_1_1::pingresp_packet</a></div><div class="ttdoc">MQTT PINGRESP packet (v3.1.1)</div><div class="ttdef"><b>Definition</b> v3_1_1_pingresp.hpp:47</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1pingresp__packet_html_a24bda6c6eb11a3ab3e86fb12034228da"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1pingresp__packet.html#a24bda6c6eb11a3ab3e86fb12034228da">async_mqtt::v3_1_1::pingresp_packet::pingresp_packet</a></div><div class="ttdeci">pingresp_packet()</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> v3_1_1_pingresp.hpp:53</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1pingresp__packet_html_a33a2508ec08439ba312c906c3ba67a0f"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1pingresp__packet.html#a33a2508ec08439ba312c906c3ba67a0f">async_mqtt::v3_1_1::pingresp_packet::num_of_const_buffer_sequence</a></div><div class="ttdeci">static constexpr std::size_t num_of_const_buffer_sequence()</div><div class="ttdoc">Get number of element of const_buffer_sequence.</div><div class="ttdef"><b>Definition</b> v3_1_1_pingresp.hpp:92</div></div>
@@ -242,7 +242,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1pingresp__packet_html_ab074b326b3d3a2b1d1a2d98b3781a316"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1pingresp__packet.html#ab074b326b3d3a2b1d1a2d98b3781a316">async_mqtt::v3_1_1::pingresp_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v3_1_1_pingresp.hpp:73</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1pingresp__packet_html_ab8b47870d486af93440f26159bf419c5"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1pingresp__packet.html#ab8b47870d486af93440f26159bf419c5">async_mqtt::v3_1_1::pingresp_packet::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;o, pingresp_packet const &amp;v)</div><div class="ttdoc">stream output operator</div><div class="ttdef"><b>Definition</b> v3_1_1_pingresp.hpp:154</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1pingresp__packet_html_af45952f755094f3ea9cdb27d23cea787"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1pingresp__packet.html#af45952f755094f3ea9cdb27d23cea787">async_mqtt::v3_1_1::pingresp_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v3_1_1_pingresp.hpp:64</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v3__1__1__puback_8hpp_source.html b/doc/api/v3__1__1__puback_8hpp_source.html
index 7d238e05b..508741633 100644
--- a/doc/api/v3__1__1__puback_8hpp_source.html
+++ b/doc/api/v3__1__1__puback_8hpp_source.html
@@ -258,7 +258,7 @@
 <div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span> </div>
 <div class="line"><a id="l00200" name="l00200"></a><span class="lineno">  200</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V3_1_1_PUBACK_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__puback__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__puback__packet.html">async_mqtt::v3_1_1::basic_puback_packet</a></div><div class="ttdoc">MQTT PUBACK packet (v3.1.1)</div><div class="ttdef"><b>Definition</b> v3_1_1_puback.hpp:53</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__puback__packet_html_a39b815412dbe87383e3c4e02352401e1"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__puback__packet.html#a39b815412dbe87383e3c4e02352401e1">async_mqtt::v3_1_1::basic_puback_packet::basic_puback_packet</a></div><div class="ttdeci">basic_puback_packet(packet_id_t packet_id)</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> v3_1_1_puback.hpp:61</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__puback__packet_html_a410d33237c5267c84463a84a52332ee0"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__puback__packet.html#a410d33237c5267c84463a84a52332ee0">async_mqtt::v3_1_1::basic_puback_packet::num_of_const_buffer_sequence</a></div><div class="ttdeci">static constexpr std::size_t num_of_const_buffer_sequence()</div><div class="ttdoc">Get number of element of const_buffer_sequence.</div><div class="ttdef"><b>Definition</b> v3_1_1_puback.hpp:103</div></div>
@@ -267,7 +267,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__puback__packet_html_a6d1bed4565fe7367f4bef6715feebd12"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__puback__packet.html#a6d1bed4565fe7367f4bef6715feebd12">async_mqtt::v3_1_1::basic_puback_packet::packet_id</a></div><div class="ttdeci">packet_id_t packet_id() const</div><div class="ttdoc">Get packet_id.</div><div class="ttdef"><b>Definition</b> v3_1_1_puback.hpp:111</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__puback__packet_html_ab5a00f7ccb2ad27920bddcc1a164ddca"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__puback__packet.html#ab5a00f7ccb2ad27920bddcc1a164ddca">async_mqtt::v3_1_1::basic_puback_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v3_1_1_puback.hpp:75</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__puback__packet_html_ab68b9199a1ace4615cdceff2d48f0758"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__puback__packet.html#ab68b9199a1ace4615cdceff2d48f0758">async_mqtt::v3_1_1::basic_puback_packet::size</a></div><div class="ttdeci">std::size_t size() const</div><div class="ttdoc">Get packet size.</div><div class="ttdef"><b>Definition</b> v3_1_1_puback.hpp:95</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v3__1__1__pubcomp_8hpp_source.html b/doc/api/v3__1__1__pubcomp_8hpp_source.html
index c0397bbe5..fa0df044b 100644
--- a/doc/api/v3__1__1__pubcomp_8hpp_source.html
+++ b/doc/api/v3__1__1__pubcomp_8hpp_source.html
@@ -258,7 +258,7 @@
 <div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span> </div>
 <div class="line"><a id="l00200" name="l00200"></a><span class="lineno">  200</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V3_1_1_PUBCOMP_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__pubcomp__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__pubcomp__packet.html">async_mqtt::v3_1_1::basic_pubcomp_packet</a></div><div class="ttdoc">MQTT PUBCOMP packet (v3.1.1)</div><div class="ttdef"><b>Definition</b> v3_1_1_pubcomp.hpp:53</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__pubcomp__packet_html_a602aa95eff45ac9e1f420500f2e60042"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__pubcomp__packet.html#a602aa95eff45ac9e1f420500f2e60042">async_mqtt::v3_1_1::basic_pubcomp_packet::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;o, basic_pubcomp_packet&lt; PacketIdBytes &gt; const &amp;v)</div><div class="ttdoc">stream output operator</div><div class="ttdef"><b>Definition</b> v3_1_1_pubcomp.hpp:183</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__pubcomp__packet_html_ab0d143ba83acee3429f775432d9e0446"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__pubcomp__packet.html#ab0d143ba83acee3429f775432d9e0446">async_mqtt::v3_1_1::basic_pubcomp_packet::num_of_const_buffer_sequence</a></div><div class="ttdeci">static constexpr std::size_t num_of_const_buffer_sequence()</div><div class="ttdoc">Get number of element of const_buffer_sequence.</div><div class="ttdef"><b>Definition</b> v3_1_1_pubcomp.hpp:103</div></div>
@@ -267,7 +267,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__pubcomp__packet_html_adaa4850e0e66f74cbf26b5fc6babc193"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__pubcomp__packet.html#adaa4850e0e66f74cbf26b5fc6babc193">async_mqtt::v3_1_1::basic_pubcomp_packet::packet_id</a></div><div class="ttdeci">packet_id_t packet_id() const</div><div class="ttdoc">Get packet_id.</div><div class="ttdef"><b>Definition</b> v3_1_1_pubcomp.hpp:111</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__pubcomp__packet_html_aea0cb067e557010ef6ddf64defb95e48"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__pubcomp__packet.html#aea0cb067e557010ef6ddf64defb95e48">async_mqtt::v3_1_1::basic_pubcomp_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v3_1_1_pubcomp.hpp:84</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__pubcomp__packet_html_afc31ddaf11633b431ca12f9df6745f1e"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__pubcomp__packet.html#afc31ddaf11633b431ca12f9df6745f1e">async_mqtt::v3_1_1::basic_pubcomp_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v3_1_1_pubcomp.hpp:75</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v3__1__1__publish_8hpp_source.html b/doc/api/v3__1__1__publish_8hpp_source.html
index 97c2c1029..032b1c76c 100644
--- a/doc/api/v3__1__1__publish_8hpp_source.html
+++ b/doc/api/v3__1__1__publish_8hpp_source.html
@@ -503,8 +503,8 @@
 <div class="line"><a id="l00484" name="l00484"></a><span class="lineno">  484</span> </div>
 <div class="line"><a id="l00485" name="l00485"></a><span class="lineno">  485</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V3_1_1_PUBLISH_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:266</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:265</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__publish__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__publish__packet.html">async_mqtt::v3_1_1::basic_publish_packet</a></div><div class="ttdoc">MQTT PUBLISH packet (v3.1.1)</div><div class="ttdef"><b>Definition</b> v3_1_1_publish.hpp:63</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__publish__packet_html_a0afe1a9ae51e7d2a2dbe16df87adf119"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__publish__packet.html#a0afe1a9ae51e7d2a2dbe16df87adf119">async_mqtt::v3_1_1::basic_publish_packet::payload</a></div><div class="ttdeci">std::string payload() const</div><div class="ttdoc">Get payload.</div><div class="ttdef"><b>Definition</b> v3_1_1_publish.hpp:309</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__publish__packet_html_a12d95e068f2ff4241ece5b666fb8cdcd"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__publish__packet.html#a12d95e068f2ff4241ece5b666fb8cdcd">async_mqtt::v3_1_1::basic_publish_packet::payload_as_buffer</a></div><div class="ttdeci">std::vector&lt; buffer &gt; const &amp; payload_as_buffer() const</div><div class="ttdoc">Get payload as a sequence of buffer.</div><div class="ttdef"><b>Definition</b> v3_1_1_publish.hpp:325</div></div>
@@ -521,7 +521,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__publish__packet_html_ad6a9207d4560aa73023351bffbf93b0f"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__publish__packet.html#ad6a9207d4560aa73023351bffbf93b0f">async_mqtt::v3_1_1::basic_publish_packet::topic</a></div><div class="ttdeci">std::string topic() const</div><div class="ttdoc">Get topic name.</div><div class="ttdef"><b>Definition</b> v3_1_1_publish.hpp:293</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__publish__packet_html_aea417c58c69bf5378f7ab14c5446e0c0"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__publish__packet.html#aea417c58c69bf5378f7ab14c5446e0c0">async_mqtt::v3_1_1::basic_publish_packet::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;o, basic_publish_packet&lt; PacketIdBytes &gt; const &amp;v)</div><div class="ttdoc">stream output operator</div><div class="ttdef"><b>Definition</b> v3_1_1_publish.hpp:456</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__publish__packet_html_af14f7deb4643ba6589e4191331a50f33"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__publish__packet.html#af14f7deb4643ba6589e4191331a50f33">async_mqtt::v3_1_1::basic_publish_packet::opts</a></div><div class="ttdeci">constexpr pub::opts opts() const</div><div class="ttdoc">Get publish_options.</div><div class="ttdef"><b>Definition</b> v3_1_1_publish.hpp:285</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 <div class="ttc" id="agroup__qos_html_gga38e773082414bb272ab22275c56eb4dfa64d245cf1d119a993a586e60738513a9"><div class="ttname"><a href="group__qos.html#gga38e773082414bb272ab22275c56eb4dfa64d245cf1d119a993a586e60738513a9">async_mqtt::qos::exactly_once</a></div><div class="ttdeci">@ exactly_once</div><div class="ttdoc">Exactly once delivery.</div></div>
 <div class="ttc" id="agroup__qos_html_gga38e773082414bb272ab22275c56eb4dfa9cb5367ca459f35c28917fa49ed97135"><div class="ttname"><a href="group__qos.html#gga38e773082414bb272ab22275c56eb4dfa9cb5367ca459f35c28917fa49ed97135">async_mqtt::qos::at_most_once</a></div><div class="ttdeci">@ at_most_once</div><div class="ttdoc">At most once delivery.</div></div>
diff --git a/doc/api/v3__1__1__pubrec_8hpp_source.html b/doc/api/v3__1__1__pubrec_8hpp_source.html
index f57d72275..2bc229088 100644
--- a/doc/api/v3__1__1__pubrec_8hpp_source.html
+++ b/doc/api/v3__1__1__pubrec_8hpp_source.html
@@ -258,7 +258,7 @@
 <div class="line"><a id="l00198" name="l00198"></a><span class="lineno">  198</span> </div>
 <div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V3_1_1_PUBREC_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__pubrec__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__pubrec__packet.html">async_mqtt::v3_1_1::basic_pubrec_packet</a></div><div class="ttdoc">MQTT PUBREC packet (v3.1.1)</div><div class="ttdef"><b>Definition</b> v3_1_1_pubrec.hpp:52</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__pubrec__packet_html_a0f75612fbe33cf7fd2e8135fe37f12a8"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__pubrec__packet.html#a0f75612fbe33cf7fd2e8135fe37f12a8">async_mqtt::v3_1_1::basic_pubrec_packet::packet_id</a></div><div class="ttdeci">packet_id_t packet_id() const</div><div class="ttdoc">Get packet_id.</div><div class="ttdef"><b>Definition</b> v3_1_1_pubrec.hpp:110</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__pubrec__packet_html_a15f7f55fe27daa4e32af8ff5f47fa908"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__pubrec__packet.html#a15f7f55fe27daa4e32af8ff5f47fa908">async_mqtt::v3_1_1::basic_pubrec_packet::size</a></div><div class="ttdeci">std::size_t size() const</div><div class="ttdoc">Get packet size.</div><div class="ttdef"><b>Definition</b> v3_1_1_pubrec.hpp:94</div></div>
@@ -267,7 +267,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__pubrec__packet_html_aad008c240c640426cedaf453dde96a2c"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__pubrec__packet.html#aad008c240c640426cedaf453dde96a2c">async_mqtt::v3_1_1::basic_pubrec_packet::basic_pubrec_packet</a></div><div class="ttdeci">basic_pubrec_packet(packet_id_t packet_id)</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> v3_1_1_pubrec.hpp:60</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__pubrec__packet_html_aed5477fdcdfb3960e31e7a705cf22779"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__pubrec__packet.html#aed5477fdcdfb3960e31e7a705cf22779">async_mqtt::v3_1_1::basic_pubrec_packet::num_of_const_buffer_sequence</a></div><div class="ttdeci">static constexpr std::size_t num_of_const_buffer_sequence()</div><div class="ttdoc">Get number of element of const_buffer_sequence.</div><div class="ttdef"><b>Definition</b> v3_1_1_pubrec.hpp:102</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__pubrec__packet_html_af4deb7135b049fd43085bc7178b8e74a"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__pubrec__packet.html#af4deb7135b049fd43085bc7178b8e74a">async_mqtt::v3_1_1::basic_pubrec_packet::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;o, basic_pubrec_packet&lt; PacketIdBytes &gt; const &amp;v)</div><div class="ttdoc">stream output operator</div><div class="ttdef"><b>Definition</b> v3_1_1_pubrec.hpp:182</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v3__1__1__pubrel_8hpp_source.html b/doc/api/v3__1__1__pubrel_8hpp_source.html
index e2626c64c..904b2f7a1 100644
--- a/doc/api/v3__1__1__pubrel_8hpp_source.html
+++ b/doc/api/v3__1__1__pubrel_8hpp_source.html
@@ -258,7 +258,7 @@
 <div class="line"><a id="l00200" name="l00200"></a><span class="lineno">  200</span> </div>
 <div class="line"><a id="l00201" name="l00201"></a><span class="lineno">  201</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V3_1_1_PUBREL_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__pubrel__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__pubrel__packet.html">async_mqtt::v3_1_1::basic_pubrel_packet</a></div><div class="ttdoc">MQTT PUBREL packet (v3.1.1)</div><div class="ttdef"><b>Definition</b> v3_1_1_pubrel.hpp:54</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__pubrel__packet_html_a07efede6ec6010305f8bd056f8f4a25c"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__pubrel__packet.html#a07efede6ec6010305f8bd056f8f4a25c">async_mqtt::v3_1_1::basic_pubrel_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v3_1_1_pubrel.hpp:85</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__pubrel__packet_html_a63fffcedf0a20de70400f448487b306f"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__pubrel__packet.html#a63fffcedf0a20de70400f448487b306f">async_mqtt::v3_1_1::basic_pubrel_packet::num_of_const_buffer_sequence</a></div><div class="ttdeci">static constexpr std::size_t num_of_const_buffer_sequence()</div><div class="ttdoc">Get number of element of const_buffer_sequence.</div><div class="ttdef"><b>Definition</b> v3_1_1_pubrel.hpp:104</div></div>
@@ -267,7 +267,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__pubrel__packet_html_ae94bf6bf405ea182d707f877407859b6"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__pubrel__packet.html#ae94bf6bf405ea182d707f877407859b6">async_mqtt::v3_1_1::basic_pubrel_packet::packet_id</a></div><div class="ttdeci">packet_id_t packet_id() const</div><div class="ttdoc">Get packet_id.</div><div class="ttdef"><b>Definition</b> v3_1_1_pubrel.hpp:112</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__pubrel__packet_html_af288c1857ca5ed1bcc84dff835d2d630"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__pubrel__packet.html#af288c1857ca5ed1bcc84dff835d2d630">async_mqtt::v3_1_1::basic_pubrel_packet::basic_pubrel_packet</a></div><div class="ttdeci">basic_pubrel_packet(packet_id_t packet_id)</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> v3_1_1_pubrel.hpp:62</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__pubrel__packet_html_afe275faeb7f7c422468987acb6689d74"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__pubrel__packet.html#afe275faeb7f7c422468987acb6689d74">async_mqtt::v3_1_1::basic_pubrel_packet::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;o, basic_pubrel_packet&lt; PacketIdBytes &gt; const &amp;v)</div><div class="ttdoc">stream output operator</div><div class="ttdef"><b>Definition</b> v3_1_1_pubrel.hpp:184</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v3__1__1__suback_8hpp_source.html b/doc/api/v3__1__1__suback_8hpp_source.html
index 51dbce395..cf2736b9b 100644
--- a/doc/api/v3__1__1__suback_8hpp_source.html
+++ b/doc/api/v3__1__1__suback_8hpp_source.html
@@ -308,7 +308,7 @@
 <div class="line"><a id="l00249" name="l00249"></a><span class="lineno">  249</span> </div>
 <div class="line"><a id="l00250" name="l00250"></a><span class="lineno">  250</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V3_1_1_SUBACK_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__suback__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__suback__packet.html">async_mqtt::v3_1_1::basic_suback_packet</a></div><div class="ttdoc">MQTT SUBACK packet (v3.1.1)</div><div class="ttdef"><b>Definition</b> v3_1_1_suback.hpp:53</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__suback__packet_html_a172d7821a86d6db462c95eaa03f7ab26"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__suback__packet.html#a172d7821a86d6db462c95eaa03f7ab26">async_mqtt::v3_1_1::basic_suback_packet::packet_id</a></div><div class="ttdeci">packet_id_t packet_id() const</div><div class="ttdoc">Get packet_id.</div><div class="ttdef"><b>Definition</b> v3_1_1_suback.hpp:130</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__suback__packet_html_a1dd79e206646e3fad200d0200ab5c8af"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__suback__packet.html#a1dd79e206646e3fad200d0200ab5c8af">async_mqtt::v3_1_1::basic_suback_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v3_1_1_suback.hpp:88</div></div>
@@ -318,7 +318,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__suback__packet_html_a6f539e07613be39b58f0abdd0c9f1b8c"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__suback__packet.html#a6f539e07613be39b58f0abdd0c9f1b8c">async_mqtt::v3_1_1::basic_suback_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v3_1_1_suback.hpp:79</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__suback__packet_html_a6fa63c24d7c04448c452af1d6f0c20b5"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__suback__packet.html#a6fa63c24d7c04448c452af1d6f0c20b5">async_mqtt::v3_1_1::basic_suback_packet::size</a></div><div class="ttdeci">std::size_t size() const</div><div class="ttdoc">Get packet size.</div><div class="ttdef"><b>Definition</b> v3_1_1_suback.hpp:107</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__suback__packet_html_aae58d5ae7d00a9e8904720da7ee15020"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__suback__packet.html#aae58d5ae7d00a9e8904720da7ee15020">async_mqtt::v3_1_1::basic_suback_packet::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;o, basic_suback_packet&lt; PacketIdBytes &gt; const &amp;v)</div><div class="ttdoc">stream output operator</div><div class="ttdef"><b>Definition</b> v3_1_1_suback.hpp:225</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 <div class="ttc" id="agroup__packet_html_gad3470deb20130512c7ad76c4314f1816"><div class="ttname"><a href="group__packet.html#gad3470deb20130512c7ad76c4314f1816">async_mqtt::suback_return_code</a></div><div class="ttdeci">suback_return_code</div><div class="ttdoc">MQTT suback_return_code.</div><div class="ttdef"><b>Definition</b> suback_return_code.hpp:25</div></div>
 <div class="ttc" id="asuback__return__code_8hpp_html"><div class="ttname"><a href="suback__return__code_8hpp.html">suback_return_code.hpp</a></div></div>
diff --git a/doc/api/v3__1__1__subscribe_8hpp_source.html b/doc/api/v3__1__1__subscribe_8hpp_source.html
index 10d8b9b00..0207884fd 100644
--- a/doc/api/v3__1__1__subscribe_8hpp_source.html
+++ b/doc/api/v3__1__1__subscribe_8hpp_source.html
@@ -418,8 +418,8 @@
 <div class="line"><a id="l00360" name="l00360"></a><span class="lineno">  360</span> </div>
 <div class="line"><a id="l00361" name="l00361"></a><span class="lineno">  361</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V3_1_1_SUBSCRIBE_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:266</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:265</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__subscribe__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__subscribe__packet.html">async_mqtt::v3_1_1::basic_subscribe_packet</a></div><div class="ttdoc">MQTT SUBSCRIBE packet (v3.1.1)</div><div class="ttdef"><b>Definition</b> v3_1_1_subscribe.hpp:51</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__subscribe__packet_html_a11ba51614e617ffd93b0c40da24272c4"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__subscribe__packet.html#a11ba51614e617ffd93b0c40da24272c4">async_mqtt::v3_1_1::basic_subscribe_packet::basic_subscribe_packet</a></div><div class="ttdeci">basic_subscribe_packet(packet_id_t packet_id, std::vector&lt; topic_subopts &gt; params)</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> v3_1_1_subscribe.hpp:61</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__subscribe__packet_html_a169510ad1625b07d158899270194217f"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__subscribe__packet.html#a169510ad1625b07d158899270194217f">async_mqtt::v3_1_1::basic_subscribe_packet::packet_id</a></div><div class="ttdeci">packet_id_t packet_id() const</div><div class="ttdoc">Get packet_id.</div><div class="ttdef"><b>Definition</b> v3_1_1_subscribe.hpp:186</div></div>
@@ -429,7 +429,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__subscribe__packet_html_a9128a74a35ec84e62bdd606120723884"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__subscribe__packet.html#a9128a74a35ec84e62bdd606120723884">async_mqtt::v3_1_1::basic_subscribe_packet::size</a></div><div class="ttdeci">std::size_t size() const</div><div class="ttdoc">Get packet size.</div><div class="ttdef"><b>Definition</b> v3_1_1_subscribe.hpp:163</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__subscribe__packet_html_acd042c2ea694ca14fa3625e60170f9e0"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__subscribe__packet.html#acd042c2ea694ca14fa3625e60170f9e0">async_mqtt::v3_1_1::basic_subscribe_packet::entries</a></div><div class="ttdeci">std::vector&lt; topic_subopts &gt; const &amp; entries() const</div><div class="ttdoc">Get entries.</div><div class="ttdef"><b>Definition</b> v3_1_1_subscribe.hpp:194</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__subscribe__packet_html_af7bcbcd72844ea7b6afd21b1d0c1aac0"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__subscribe__packet.html#af7bcbcd72844ea7b6afd21b1d0c1aac0">async_mqtt::v3_1_1::basic_subscribe_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v3_1_1_subscribe.hpp:137</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 <div class="ttc" id="agroup__qos_html_gga38e773082414bb272ab22275c56eb4dfa64d245cf1d119a993a586e60738513a9"><div class="ttname"><a href="group__qos.html#gga38e773082414bb272ab22275c56eb4dfa64d245cf1d119a993a586e60738513a9">async_mqtt::qos::exactly_once</a></div><div class="ttdeci">@ exactly_once</div><div class="ttdoc">Exactly once delivery.</div></div>
 <div class="ttc" id="agroup__qos_html_gga38e773082414bb272ab22275c56eb4dfa9cb5367ca459f35c28917fa49ed97135"><div class="ttname"><a href="group__qos.html#gga38e773082414bb272ab22275c56eb4dfa9cb5367ca459f35c28917fa49ed97135">async_mqtt::qos::at_most_once</a></div><div class="ttdeci">@ at_most_once</div><div class="ttdoc">At most once delivery.</div></div>
diff --git a/doc/api/v3__1__1__unsuback_8hpp_source.html b/doc/api/v3__1__1__unsuback_8hpp_source.html
index 967b23fea..248e84735 100644
--- a/doc/api/v3__1__1__unsuback_8hpp_source.html
+++ b/doc/api/v3__1__1__unsuback_8hpp_source.html
@@ -258,7 +258,7 @@
 <div class="line"><a id="l00196" name="l00196"></a><span class="lineno">  196</span> </div>
 <div class="line"><a id="l00197" name="l00197"></a><span class="lineno">  197</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V3_1_1_UNSUBACK_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__unsuback__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__unsuback__packet.html">async_mqtt::v3_1_1::basic_unsuback_packet</a></div><div class="ttdoc">MQTT UNSUBACK packet (v3.1.1)</div><div class="ttdef"><b>Definition</b> v3_1_1_unsuback.hpp:50</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__unsuback__packet_html_a6ab54aec5a34ef9b4fddeedbc839189b"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__unsuback__packet.html#a6ab54aec5a34ef9b4fddeedbc839189b">async_mqtt::v3_1_1::basic_unsuback_packet::num_of_const_buffer_sequence</a></div><div class="ttdeci">static constexpr std::size_t num_of_const_buffer_sequence()</div><div class="ttdoc">Get number of element of const_buffer_sequence.</div><div class="ttdef"><b>Definition</b> v3_1_1_unsuback.hpp:100</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__unsuback__packet_html_a963dbdb1ad5cc45639a7c3f43c14eb9f"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__unsuback__packet.html#a963dbdb1ad5cc45639a7c3f43c14eb9f">async_mqtt::v3_1_1::basic_unsuback_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v3_1_1_unsuback.hpp:72</div></div>
@@ -267,7 +267,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__unsuback__packet_html_ac8cbe3ee981d903f3e8e92d2e1168a61"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__unsuback__packet.html#ac8cbe3ee981d903f3e8e92d2e1168a61">async_mqtt::v3_1_1::basic_unsuback_packet::basic_unsuback_packet</a></div><div class="ttdeci">basic_unsuback_packet(packet_id_t packet_id)</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> v3_1_1_unsuback.hpp:58</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__unsuback__packet_html_ace3c38f18536bc5f97aa5dc27a03f451"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__unsuback__packet.html#ace3c38f18536bc5f97aa5dc27a03f451">async_mqtt::v3_1_1::basic_unsuback_packet::size</a></div><div class="ttdeci">std::size_t size() const</div><div class="ttdoc">Get packet size.</div><div class="ttdef"><b>Definition</b> v3_1_1_unsuback.hpp:92</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__unsuback__packet_html_af3a3189b9aad060108ca4df2c3e6bfd4"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__unsuback__packet.html#af3a3189b9aad060108ca4df2c3e6bfd4">async_mqtt::v3_1_1::basic_unsuback_packet::packet_id</a></div><div class="ttdeci">packet_id_t packet_id() const</div><div class="ttdoc">Get packet_id.</div><div class="ttdef"><b>Definition</b> v3_1_1_unsuback.hpp:108</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v3__1__1__unsubscribe_8hpp_source.html b/doc/api/v3__1__1__unsubscribe_8hpp_source.html
index 326f47f8f..f870f365d 100644
--- a/doc/api/v3__1__1__unsubscribe_8hpp_source.html
+++ b/doc/api/v3__1__1__unsubscribe_8hpp_source.html
@@ -365,8 +365,8 @@
 <div class="line"><a id="l00307" name="l00307"></a><span class="lineno">  307</span> </div>
 <div class="line"><a id="l00308" name="l00308"></a><span class="lineno">  308</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V3_1_1_UNSUBSCRIBE_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:266</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:265</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__unsubscribe__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__unsubscribe__packet.html">async_mqtt::v3_1_1::basic_unsubscribe_packet</a></div><div class="ttdoc">MQTT UNSUBSCRIBE packet (v3.1.1)</div><div class="ttdef"><b>Definition</b> v3_1_1_unsubscribe.hpp:51</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__unsubscribe__packet_html_a0402f12af7af1dc29ca27a6da18e4a49"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__unsubscribe__packet.html#a0402f12af7af1dc29ca27a6da18e4a49">async_mqtt::v3_1_1::basic_unsubscribe_packet::basic_unsubscribe_packet</a></div><div class="ttdeci">basic_unsubscribe_packet(packet_id_t packet_id, std::vector&lt; topic_sharename &gt; params)</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> v3_1_1_unsubscribe.hpp:61</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__unsubscribe__packet_html_a0b779ea8ece0fc8a85a80fb8ff311541"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__unsubscribe__packet.html#a0b779ea8ece0fc8a85a80fb8ff311541">async_mqtt::v3_1_1::basic_unsubscribe_packet::num_of_const_buffer_sequence</a></div><div class="ttdeci">std::size_t num_of_const_buffer_sequence() const</div><div class="ttdoc">Get number of element of const_buffer_sequence.</div><div class="ttdef"><b>Definition</b> v3_1_1_unsubscribe.hpp:153</div></div>
@@ -376,7 +376,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__unsubscribe__packet_html_a84913b89d154d78600e67d8de535414e"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__unsubscribe__packet.html#a84913b89d154d78600e67d8de535414e">async_mqtt::v3_1_1::basic_unsubscribe_packet::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;o, basic_unsubscribe_packet&lt; PacketIdBytes &gt; const &amp;v)</div><div class="ttdoc">stream output operator</div><div class="ttdef"><b>Definition</b> v3_1_1_unsubscribe.hpp:278</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__unsubscribe__packet_html_a886a07c56a61e5de253dfc9cbf24b5ea"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__unsubscribe__packet.html#a886a07c56a61e5de253dfc9cbf24b5ea">async_mqtt::v3_1_1::basic_unsubscribe_packet::size</a></div><div class="ttdeci">std::size_t size() const</div><div class="ttdoc">Get packet size.</div><div class="ttdef"><b>Definition</b> v3_1_1_unsubscribe.hpp:142</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v3__1__1_1_1basic__unsubscribe__packet_html_a9c95087c0f98411469461c3231760235"><div class="ttname"><a href="classasync__mqtt_1_1v3__1__1_1_1basic__unsubscribe__packet.html#a9c95087c0f98411469461c3231760235">async_mqtt::v3_1_1::basic_unsubscribe_packet::entries</a></div><div class="ttdeci">std::vector&lt; topic_sharename &gt; const &amp; entries() const</div><div class="ttdoc">Get entries.</div><div class="ttdef"><b>Definition</b> v3_1_1_unsubscribe.hpp:173</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v5__auth_8hpp_source.html b/doc/api/v5__auth_8hpp_source.html
index 2d1de520f..3180c678f 100644
--- a/doc/api/v5__auth_8hpp_source.html
+++ b/doc/api/v5__auth_8hpp_source.html
@@ -423,7 +423,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1auth__packet_html_ac00241d1c5c7a5384c8ede676c05817b"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1auth__packet.html#ac00241d1c5c7a5384c8ede676c05817b">async_mqtt::v5::auth_packet::auth_packet</a></div><div class="ttdeci">auth_packet(auth_reason_code reason_code)</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> v5_auth.hpp:80</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1auth__packet_html_ac2fa59e1a485205a319cddc9b9ace7cd"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1auth__packet.html#ac2fa59e1a485205a319cddc9b9ace7cd">async_mqtt::v5::auth_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v5_auth.hpp:101</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1auth__packet_html_ae1a1944b429d7cc792f9d8aaddc12e5d"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1auth__packet.html#ae1a1944b429d7cc792f9d8aaddc12e5d">async_mqtt::v5::auth_packet::auth_packet</a></div><div class="ttdeci">auth_packet()</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> v5_auth.hpp:68</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v5__connack_8hpp_source.html b/doc/api/v5__connack_8hpp_source.html
index e94a74393..36a36814c 100644
--- a/doc/api/v5__connack_8hpp_source.html
+++ b/doc/api/v5__connack_8hpp_source.html
@@ -394,8 +394,8 @@
 <div class="line"><a id="l00328" name="l00328"></a><span class="lineno">  328</span> </div>
 <div class="line"><a id="l00329" name="l00329"></a><span class="lineno">  329</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V5_CONNACK_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:266</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:265</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1connack__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1connack__packet.html">async_mqtt::v5::connack_packet</a></div><div class="ttdoc">MQTT CONNACK packet (v5)</div><div class="ttdef"><b>Definition</b> v5_connack.hpp:42</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1connack__packet_html_a19306b5ff86ccd3fe3fb9669b3145ac3"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1connack__packet.html#a19306b5ff86ccd3fe3fb9669b3145ac3">async_mqtt::v5::connack_packet::size</a></div><div class="ttdeci">std::size_t size() const</div><div class="ttdoc">Get packet size.</div><div class="ttdef"><b>Definition</b> v5_connack.hpp:130</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1connack__packet_html_a1e30d317bfe82b1805470d663d42bafd"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1connack__packet.html#a1e30d317bfe82b1805470d663d42bafd">async_mqtt::v5::connack_packet::props</a></div><div class="ttdeci">properties const &amp; props() const</div><div class="ttdoc">Get properties.</div><div class="ttdef"><b>Definition</b> v5_connack.hpp:167</div></div>
@@ -405,7 +405,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1connack__packet_html_a97281950549aa14a8c8f9c9c4ae76ba6"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1connack__packet.html#a97281950549aa14a8c8f9c9c4ae76ba6">async_mqtt::v5::connack_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v5_connack.hpp:101</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1connack__packet_html_acf9cc373c1b30493e23d6a7d3c93a8f5"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1connack__packet.html#acf9cc373c1b30493e23d6a7d3c93a8f5">async_mqtt::v5::connack_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v5_connack.hpp:110</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1connack__packet_html_ae25c99c7067f346b64f652b880959f12"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1connack__packet.html#ae25c99c7067f346b64f652b880959f12">async_mqtt::v5::connack_packet::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;o, connack_packet const &amp;v)</div><div class="ttdoc">stream output operator</div><div class="ttdef"><b>Definition</b> v5_connack.hpp:315</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v5__connect_8hpp_source.html b/doc/api/v5__connect_8hpp_source.html
index 4b46406f0..d477f1226 100644
--- a/doc/api/v5__connect_8hpp_source.html
+++ b/doc/api/v5__connect_8hpp_source.html
@@ -783,8 +783,8 @@
 <div class="line"><a id="l00769" name="l00769"></a><span class="lineno">  769</span> </div>
 <div class="line"><a id="l00770" name="l00770"></a><span class="lineno">  770</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V5_CONNECT_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:266</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:265</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1connect__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1connect__packet.html">async_mqtt::v5::connect_packet</a></div><div class="ttdoc">MQTT CONNECT packet (v5)</div><div class="ttdef"><b>Definition</b> v5_connect.hpp:47</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1connect__packet_html_a0711c1f259481db3fc0aefff6c9832d3"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1connect__packet.html#a0711c1f259481db3fc0aefff6c9832d3">async_mqtt::v5::connect_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v5_connect.hpp:252</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1connect__packet_html_a210f0a43750fb4621d62a774c27eb730"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1connect__packet.html#a210f0a43750fb4621d62a774c27eb730">async_mqtt::v5::connect_packet::connect_packet</a></div><div class="ttdeci">connect_packet(bool clean_start, std::uint16_t keep_alive_sec, std::string client_id, std::optional&lt; std::string &gt; user_name=std::nullopt, std::optional&lt; std::string &gt; password=std::nullopt, properties props={})</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> v5_connect.hpp:75</div></div>
@@ -800,7 +800,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1connect__packet_html_ad848da633f2ab6b25ead12d2331cc5f7"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1connect__packet.html#ad848da633f2ab6b25ead12d2331cc5f7">async_mqtt::v5::connect_packet::get_will</a></div><div class="ttdeci">std::optional&lt; will &gt; get_will() const</div><div class="ttdoc">Get will.</div><div class="ttdef"><b>Definition</b> v5_connect.hpp:406</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1connect__packet_html_aef1e4808dd66b1685807395d4ab17558"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1connect__packet.html#aef1e4808dd66b1685807395d4ab17558">async_mqtt::v5::connect_packet::num_of_const_buffer_sequence</a></div><div class="ttdeci">std::size_t num_of_const_buffer_sequence() const</div><div class="ttdoc">Get number of element of const_buffer_sequence.</div><div class="ttdef"><b>Definition</b> v5_connect.hpp:316</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1connect__packet_html_afed0e65fc571e2b8eacef71c034525f0"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1connect__packet.html#afed0e65fc571e2b8eacef71c034525f0">async_mqtt::v5::connect_packet::password</a></div><div class="ttdeci">std::optional&lt; std::string &gt; password() const</div><div class="ttdoc">Get password.</div><div class="ttdef"><b>Definition</b> v5_connect.hpp:393</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 <div class="ttc" id="agroup__publish__options_html_gga89fabc81d8448fa347b2146349ae4737aa6105c0a611b41b08f1209506350279e"><div class="ttname"><a href="group__publish__options.html#gga89fabc81d8448fa347b2146349ae4737aa6105c0a611b41b08f1209506350279e">async_mqtt::pub::retain::yes</a></div><div class="ttdeci">@ yes</div><div class="ttdoc">Retain.</div></div>
 <div class="ttc" id="agroup__qos_html_gga38e773082414bb272ab22275c56eb4dfa64d245cf1d119a993a586e60738513a9"><div class="ttname"><a href="group__qos.html#gga38e773082414bb272ab22275c56eb4dfa64d245cf1d119a993a586e60738513a9">async_mqtt::qos::exactly_once</a></div><div class="ttdeci">@ exactly_once</div><div class="ttdoc">Exactly once delivery.</div></div>
diff --git a/doc/api/v5__disconnect_8hpp_source.html b/doc/api/v5__disconnect_8hpp_source.html
index 8adf0fadb..c3a2f2de0 100644
--- a/doc/api/v5__disconnect_8hpp_source.html
+++ b/doc/api/v5__disconnect_8hpp_source.html
@@ -448,7 +448,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1disconnect__packet_html_aadaa986a859a89e92173d04c679563fd"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1disconnect__packet.html#aadaa986a859a89e92173d04c679563fd">async_mqtt::v5::disconnect_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v5_disconnect.hpp:108</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1disconnect__packet_html_ad2b7e7097556ba4f6076282b632115ff"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1disconnect__packet.html#ad2b7e7097556ba4f6076282b632115ff">async_mqtt::v5::disconnect_packet::disconnect_packet</a></div><div class="ttdeci">disconnect_packet(disconnect_reason_code reason_code)</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> v5_disconnect.hpp:87</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1disconnect__packet_html_af325a03bd1419c64dd7cfc8b72b15fa4"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1disconnect__packet.html#af325a03bd1419c64dd7cfc8b72b15fa4">async_mqtt::v5::disconnect_packet::operator&lt;&lt;</a></div><div class="ttdeci">friend std::ostream &amp; operator&lt;&lt;(std::ostream &amp;o, disconnect_packet const &amp;v)</div><div class="ttdoc">stream output operator</div><div class="ttdef"><b>Definition</b> v5_disconnect.hpp:185</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v5__pingreq_8hpp_source.html b/doc/api/v5__pingreq_8hpp_source.html
index adcf80637..2ac671706 100644
--- a/doc/api/v5__pingreq_8hpp_source.html
+++ b/doc/api/v5__pingreq_8hpp_source.html
@@ -233,7 +233,7 @@
 <div class="line"><a id="l00161" name="l00161"></a><span class="lineno">  161</span> </div>
 <div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V5_PINGREQ_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1pingreq__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1pingreq__packet.html">async_mqtt::v5::pingreq_packet</a></div><div class="ttdoc">MQTT PINGREQ packet (v5)</div><div class="ttdef"><b>Definition</b> v5_pingreq.hpp:47</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1pingreq__packet_html_a3183721e90cb05c28afd555804240e9f"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1pingreq__packet.html#a3183721e90cb05c28afd555804240e9f">async_mqtt::v5::pingreq_packet::pingreq_packet</a></div><div class="ttdeci">pingreq_packet()</div><div class="ttdoc">Constructor.</div><div class="ttdef"><b>Definition</b> v5_pingreq.hpp:53</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1pingreq__packet_html_a6e602bb1e96b31452d5fee7cb31132f9"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1pingreq__packet.html#a6e602bb1e96b31452d5fee7cb31132f9">async_mqtt::v5::pingreq_packet::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;o, pingreq_packet const &amp;v)</div><div class="ttdoc">stream output operator</div><div class="ttdef"><b>Definition</b> v5_pingreq.hpp:153</div></div>
@@ -241,7 +241,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1pingreq__packet_html_a704edae59b63e3534e171f0eddf41654"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1pingreq__packet.html#a704edae59b63e3534e171f0eddf41654">async_mqtt::v5::pingreq_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v5_pingreq.hpp:64</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1pingreq__packet_html_a76e1a2704a52f9eb0fc7d0f0139849ba"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1pingreq__packet.html#a76e1a2704a52f9eb0fc7d0f0139849ba">async_mqtt::v5::pingreq_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v5_pingreq.hpp:73</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1pingreq__packet_html_a9a83a6da39ef7365d6255efd266b87ad"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1pingreq__packet.html#a9a83a6da39ef7365d6255efd266b87ad">async_mqtt::v5::pingreq_packet::size</a></div><div class="ttdeci">std::size_t size() const</div><div class="ttdoc">Get packet size.</div><div class="ttdef"><b>Definition</b> v5_pingreq.hpp:84</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v5__pingresp_8hpp_source.html b/doc/api/v5__pingresp_8hpp_source.html
index 44a270a43..ed569c54a 100644
--- a/doc/api/v5__pingresp_8hpp_source.html
+++ b/doc/api/v5__pingresp_8hpp_source.html
@@ -233,7 +233,7 @@
 <div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span> </div>
 <div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V5_PINGRESP_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1pingresp__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1pingresp__packet.html">async_mqtt::v5::pingresp_packet</a></div><div class="ttdoc">MQTT PINGRESP packet (v5)</div><div class="ttdef"><b>Definition</b> v5_pingresp.hpp:48</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1pingresp__packet_html_a30898ee1237b9f32232e2b722d401755"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1pingresp__packet.html#a30898ee1237b9f32232e2b722d401755">async_mqtt::v5::pingresp_packet::size</a></div><div class="ttdeci">std::size_t size() const</div><div class="ttdoc">Get packet size.</div><div class="ttdef"><b>Definition</b> v5_pingresp.hpp:85</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1pingresp__packet_html_a84e9bee6217c92ad82917300fadfd6aa"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1pingresp__packet.html#a84e9bee6217c92ad82917300fadfd6aa">async_mqtt::v5::pingresp_packet::pingresp_packet</a></div><div class="ttdeci">pingresp_packet()</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> v5_pingresp.hpp:54</div></div>
@@ -241,7 +241,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1pingresp__packet_html_a99feda0ac57ec4f707ffefbd16d2bf04"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1pingresp__packet.html#a99feda0ac57ec4f707ffefbd16d2bf04">async_mqtt::v5::pingresp_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v5_pingresp.hpp:65</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1pingresp__packet_html_ab8b47870d486af93440f26159bf419c5"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1pingresp__packet.html#ab8b47870d486af93440f26159bf419c5">async_mqtt::v5::pingresp_packet::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;o, pingresp_packet const &amp;v)</div><div class="ttdoc">stream output operator</div><div class="ttdef"><b>Definition</b> v5_pingresp.hpp:154</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1pingresp__packet_html_af189d099e9cba22e4f28ad9346acfa9c"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1pingresp__packet.html#af189d099e9cba22e4f28ad9346acfa9c">async_mqtt::v5::pingresp_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v5_pingresp.hpp:74</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v5__puback_8hpp_source.html b/doc/api/v5__puback_8hpp_source.html
index 13d2c0be9..f29b2d5c2 100644
--- a/doc/api/v5__puback_8hpp_source.html
+++ b/doc/api/v5__puback_8hpp_source.html
@@ -462,7 +462,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__puback__packet_html_aac06ae179c16d0ce0ed0cf0458468d95"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__puback__packet.html#aac06ae179c16d0ce0ed0cf0458468d95">async_mqtt::v5::basic_puback_packet::packet_id</a></div><div class="ttdeci">packet_id_t packet_id() const</div><div class="ttdoc">Get packet_id.</div><div class="ttdef"><b>Definition</b> v5_puback.hpp:184</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__puback__packet_html_ad9ab7a1fef2f0be038ab214d159e34ae"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__puback__packet.html#ad9ab7a1fef2f0be038ab214d159e34ae">async_mqtt::v5::basic_puback_packet::num_of_const_buffer_sequence</a></div><div class="ttdeci">constexpr std::size_t num_of_const_buffer_sequence() const</div><div class="ttdoc">Get number of element of const_buffer_sequence.</div><div class="ttdef"><b>Definition</b> v5_puback.hpp:160</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__puback__packet_html_ae49dca1f3e93ea83f7f79b48d3a22f24"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__puback__packet.html#ae49dca1f3e93ea83f7f79b48d3a22f24">async_mqtt::v5::basic_puback_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v5_puback.hpp:116</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v5__pubcomp_8hpp_source.html b/doc/api/v5__pubcomp_8hpp_source.html
index 77adb7f70..1fc6395b1 100644
--- a/doc/api/v5__pubcomp_8hpp_source.html
+++ b/doc/api/v5__pubcomp_8hpp_source.html
@@ -456,7 +456,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__pubcomp__packet_html_ae45ee1b9fbec8ce80dd00d0e934546ee"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__pubcomp__packet.html#ae45ee1b9fbec8ce80dd00d0e934546ee">async_mqtt::v5::basic_pubcomp_packet::size</a></div><div class="ttdeci">std::size_t size() const</div><div class="ttdoc">Get packet size.</div><div class="ttdef"><b>Definition</b> v5_pubcomp.hpp:148</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__pubcomp__packet_html_ae4f4193e2bf6097b592307a4b44c846f"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__pubcomp__packet.html#ae4f4193e2bf6097b592307a4b44c846f">async_mqtt::v5::basic_pubcomp_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v5_pubcomp.hpp:114</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__pubcomp__packet_html_aef8c0bbce9d49f2218dfa2e0c4873e29"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__pubcomp__packet.html#aef8c0bbce9d49f2218dfa2e0c4873e29">async_mqtt::v5::basic_pubcomp_packet::basic_pubcomp_packet</a></div><div class="ttdeci">basic_pubcomp_packet(packet_id_t packet_id, pubcomp_reason_code reason_code)</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> v5_pubcomp.hpp:100</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v5__publish_8hpp_source.html b/doc/api/v5__publish_8hpp_source.html
index d40abb537..4520aa5db 100644
--- a/doc/api/v5__publish_8hpp_source.html
+++ b/doc/api/v5__publish_8hpp_source.html
@@ -698,8 +698,8 @@
 <div class="line"><a id="l00693" name="l00693"></a><span class="lineno">  693</span>} <span class="comment">// namespace async_mqtt::v5</span></div>
 <div class="line"><a id="l00694" name="l00694"></a><span class="lineno">  694</span> </div>
 <div class="line"><a id="l00695" name="l00695"></a><span class="lineno">  695</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V5_PUBLISH_HPP</span></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:266</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:265</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1property_1_1message__expiry__interval_html"><div class="ttname"><a href="classasync__mqtt_1_1property_1_1message__expiry__interval.html">async_mqtt::property::message_expiry_interval</a></div><div class="ttdoc">message_expiry_interval property</div><div class="ttdef"><b>Definition</b> property.hpp:375</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1property_1_1topic__alias_html"><div class="ttname"><a href="classasync__mqtt_1_1property_1_1topic__alias.html">async_mqtt::property::topic_alias</a></div><div class="ttdoc">topic_alias property</div><div class="ttdef"><b>Definition</b> property.hpp:886</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__publish__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__publish__packet.html">async_mqtt::v5::basic_publish_packet</a></div><div class="ttdoc">MQTT PUBLISH packet (v5)</div><div class="ttdef"><b>Definition</b> v5_publish.hpp:64</div></div>
@@ -723,7 +723,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__publish__packet_html_af767e7b18aebfeefb600c10526e4521b"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__publish__packet.html#af767e7b18aebfeefb600c10526e4521b">async_mqtt::v5::basic_publish_packet::basic_publish_packet</a></div><div class="ttdeci">basic_publish_packet(StringViewLike &amp;&amp;topic_name, BufferSequence &amp;&amp;payloads, pub::opts pubopts, properties props={})</div><div class="ttdoc">constructor for QoS0</div><div class="ttdef"><b>Definition</b> v5_publish.hpp:216</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__publish__packet_html_af7838e4773ab0ed359251d959cd4a31d"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__publish__packet.html#af7838e4773ab0ed359251d959cd4a31d">async_mqtt::v5::basic_publish_packet::size</a></div><div class="ttdeci">std::size_t size() const</div><div class="ttdoc">Get packet size.</div><div class="ttdef"><b>Definition</b> v5_publish.hpp:267</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__publish__packet_html_afed8ad2fcd7f27ebd43f0c66f26e1176"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__publish__packet.html#afed8ad2fcd7f27ebd43f0c66f26e1176">async_mqtt::v5::basic_publish_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v5_publish.hpp:244</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 <div class="ttc" id="agroup__property_html_gga47c42be3d9afd2d518fad85c5480b1f9ab45cffe084dd3d20d928bee85e7b0f21"><div class="ttname"><a href="group__property.html#gga47c42be3d9afd2d518fad85c5480b1f9ab45cffe084dd3d20d928bee85e7b0f21">async_mqtt::payload_format::string</a></div><div class="ttdeci">@ string</div><div class="ttdoc">string</div></div>
 <div class="ttc" id="agroup__qos_html_ga38e773082414bb272ab22275c56eb4df"><div class="ttname"><a href="group__qos.html#ga38e773082414bb272ab22275c56eb4df">async_mqtt::qos</a></div><div class="ttdeci">qos</div><div class="ttdoc">MQTT QoS.</div><div class="ttdef"><b>Definition</b> qos.hpp:30</div></div>
diff --git a/doc/api/v5__pubrec_8hpp_source.html b/doc/api/v5__pubrec_8hpp_source.html
index 08b0b744e..534ac710b 100644
--- a/doc/api/v5__pubrec_8hpp_source.html
+++ b/doc/api/v5__pubrec_8hpp_source.html
@@ -463,7 +463,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__pubrec__packet_html_abbc510b248813a8c8be4e1282e58df5a"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__pubrec__packet.html#abbc510b248813a8c8be4e1282e58df5a">async_mqtt::v5::basic_pubrec_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v5_pubrec.hpp:113</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__pubrec__packet_html_ae08d04deab4ff91d195cfc667f2222b3"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__pubrec__packet.html#ae08d04deab4ff91d195cfc667f2222b3">async_mqtt::v5::basic_pubrec_packet::num_of_const_buffer_sequence</a></div><div class="ttdeci">constexpr std::size_t num_of_const_buffer_sequence() const</div><div class="ttdoc">Get number of element of const_buffer_sequence.</div><div class="ttdef"><b>Definition</b> v5_pubrec.hpp:158</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__pubrec__packet_html_afaa77ca90a3d6b2e81cd197ba1c18cc0"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__pubrec__packet.html#afaa77ca90a3d6b2e81cd197ba1c18cc0">async_mqtt::v5::basic_pubrec_packet::basic_pubrec_packet</a></div><div class="ttdeci">basic_pubrec_packet(packet_id_t packet_id)</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> v5_pubrec.hpp:84</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v5__pubrel_8hpp_source.html b/doc/api/v5__pubrel_8hpp_source.html
index 644c0f3e0..593a7f1fc 100644
--- a/doc/api/v5__pubrel_8hpp_source.html
+++ b/doc/api/v5__pubrel_8hpp_source.html
@@ -456,7 +456,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__pubrel__packet_html_a832f0b1538efcd479ca5e6bd6a7f112d"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__pubrel__packet.html#a832f0b1538efcd479ca5e6bd6a7f112d">async_mqtt::v5::basic_pubrel_packet::packet_id</a></div><div class="ttdeci">packet_id_t packet_id() const</div><div class="ttdoc">Get packet_id.</div><div class="ttdef"><b>Definition</b> v5_pubrel.hpp:183</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__pubrel__packet_html_ad01efda9e59fe1f2108c6726839c2b67"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__pubrel__packet.html#ad01efda9e59fe1f2108c6726839c2b67">async_mqtt::v5::basic_pubrel_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v5_pubrel.hpp:123</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__pubrel__packet_html_afcf7e96ab2f4947924a6ad45b34bf196"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__pubrel__packet.html#afcf7e96ab2f4947924a6ad45b34bf196">async_mqtt::v5::basic_pubrel_packet::num_of_const_buffer_sequence</a></div><div class="ttdeci">constexpr std::size_t num_of_const_buffer_sequence() const</div><div class="ttdoc">Get number of element of const_buffer_sequence.</div><div class="ttdef"><b>Definition</b> v5_pubrel.hpp:159</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v5__suback_8hpp_source.html b/doc/api/v5__suback_8hpp_source.html
index ef8800985..2bd079898 100644
--- a/doc/api/v5__suback_8hpp_source.html
+++ b/doc/api/v5__suback_8hpp_source.html
@@ -371,8 +371,8 @@
 <div class="line"><a id="l00316" name="l00316"></a><span class="lineno">  316</span> </div>
 <div class="line"><a id="l00317" name="l00317"></a><span class="lineno">  317</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V5_SUBACK_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:266</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:265</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__suback__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__suback__packet.html">async_mqtt::v5::basic_suback_packet</a></div><div class="ttdoc">MQTT SUBACK packet (v5)</div><div class="ttdef"><b>Definition</b> v5_suback.hpp:49</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__suback__packet_html_a1922fd28f8db58b02f108d3e06a94fd0"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__suback__packet.html#a1922fd28f8db58b02f108d3e06a94fd0">async_mqtt::v5::basic_suback_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v5_suback.hpp:106</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__suback__packet_html_a266b7f62154932143315ed6ff66df63d"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__suback__packet.html#a266b7f62154932143315ed6ff66df63d">async_mqtt::v5::basic_suback_packet::entries</a></div><div class="ttdeci">std::vector&lt; suback_reason_code &gt; const &amp; entries() const</div><div class="ttdoc">Get entries.</div><div class="ttdef"><b>Definition</b> v5_suback.hpp:166</div></div>
@@ -383,7 +383,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__suback__packet_html_aae58d5ae7d00a9e8904720da7ee15020"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__suback__packet.html#aae58d5ae7d00a9e8904720da7ee15020">async_mqtt::v5::basic_suback_packet::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;o, basic_suback_packet&lt; PacketIdBytes &gt; const &amp;v)</div><div class="ttdoc">stream output operator</div><div class="ttdef"><b>Definition</b> v5_suback.hpp:288</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__suback__packet_html_ab5ba77ea5455e2e3db21c278b8aeb240"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__suback__packet.html#ab5ba77ea5455e2e3db21c278b8aeb240">async_mqtt::v5::basic_suback_packet::props</a></div><div class="ttdeci">properties const &amp; props() const</div><div class="ttdoc">Get properties.</div><div class="ttdef"><b>Definition</b> v5_suback.hpp:174</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__suback__packet_html_ae39d429d44147449654029d1335d1e9c"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__suback__packet.html#ae39d429d44147449654029d1335d1e9c">async_mqtt::v5::basic_suback_packet::num_of_const_buffer_sequence</a></div><div class="ttdeci">std::size_t num_of_const_buffer_sequence() const</div><div class="ttdoc">Get number of element of const_buffer_sequence.</div><div class="ttdef"><b>Definition</b> v5_suback.hpp:140</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v5__subscribe_8hpp_source.html b/doc/api/v5__subscribe_8hpp_source.html
index 730ad5680..5a1efcb40 100644
--- a/doc/api/v5__subscribe_8hpp_source.html
+++ b/doc/api/v5__subscribe_8hpp_source.html
@@ -522,8 +522,8 @@
 <div class="line"><a id="l00468" name="l00468"></a><span class="lineno">  468</span> </div>
 <div class="line"><a id="l00469" name="l00469"></a><span class="lineno">  469</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V5_SUBSCRIBE_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:266</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:265</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__subscribe__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__subscribe__packet.html">async_mqtt::v5::basic_subscribe_packet</a></div><div class="ttdoc">MQTT SUBSCRIBE packet (v5)</div><div class="ttdef"><b>Definition</b> v5_subscribe.hpp:52</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__subscribe__packet_html_a4ff7552175889a5a274fdbd72a4e2241"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__subscribe__packet.html#a4ff7552175889a5a274fdbd72a4e2241">async_mqtt::v5::basic_subscribe_packet::size</a></div><div class="ttdeci">std::size_t size() const</div><div class="ttdoc">Get packet size.</div><div class="ttdef"><b>Definition</b> v5_subscribe.hpp:203</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__subscribe__packet_html_a6c26136f87b584986128b432570cadf4"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__subscribe__packet.html#a6c26136f87b584986128b432570cadf4">async_mqtt::v5::basic_subscribe_packet::entries</a></div><div class="ttdeci">std::vector&lt; topic_subopts &gt; const &amp; entries() const</div><div class="ttdoc">Get entries.</div><div class="ttdef"><b>Definition</b> v5_subscribe.hpp:240</div></div>
@@ -534,7 +534,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__subscribe__packet_html_ac36635c2917bb42b3c0a01965ffdc5d5"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__subscribe__packet.html#ac36635c2917bb42b3c0a01965ffdc5d5">async_mqtt::v5::basic_subscribe_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v5_subscribe.hpp:173</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__subscribe__packet_html_ad8cd5b3076523e7b442808c582a73f03"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__subscribe__packet.html#ad8cd5b3076523e7b442808c582a73f03">async_mqtt::v5::basic_subscribe_packet::num_of_const_buffer_sequence</a></div><div class="ttdeci">std::size_t num_of_const_buffer_sequence() const</div><div class="ttdoc">Get number of element of const_buffer_sequence.</div><div class="ttdef"><b>Definition</b> v5_subscribe.hpp:214</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__subscribe__packet_html_aeb0bd30573bb6ab89ced426361027394"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__subscribe__packet.html#aeb0bd30573bb6ab89ced426361027394">async_mqtt::v5::basic_subscribe_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v5_subscribe.hpp:164</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 <div class="ttc" id="agroup__qos_html_gga38e773082414bb272ab22275c56eb4dfa64d245cf1d119a993a586e60738513a9"><div class="ttname"><a href="group__qos.html#gga38e773082414bb272ab22275c56eb4dfa64d245cf1d119a993a586e60738513a9">async_mqtt::qos::exactly_once</a></div><div class="ttdeci">@ exactly_once</div><div class="ttdoc">Exactly once delivery.</div></div>
 <div class="ttc" id="agroup__qos_html_gga38e773082414bb272ab22275c56eb4dfa9cb5367ca459f35c28917fa49ed97135"><div class="ttname"><a href="group__qos.html#gga38e773082414bb272ab22275c56eb4dfa9cb5367ca459f35c28917fa49ed97135">async_mqtt::qos::at_most_once</a></div><div class="ttdeci">@ at_most_once</div><div class="ttdoc">At most once delivery.</div></div>
diff --git a/doc/api/v5__unsuback_8hpp_source.html b/doc/api/v5__unsuback_8hpp_source.html
index 00e96778b..940e5c190 100644
--- a/doc/api/v5__unsuback_8hpp_source.html
+++ b/doc/api/v5__unsuback_8hpp_source.html
@@ -370,8 +370,8 @@
 <div class="line"><a id="l00315" name="l00315"></a><span class="lineno">  315</span> </div>
 <div class="line"><a id="l00316" name="l00316"></a><span class="lineno">  316</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V5_UNSUBACK_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:266</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:265</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__unsuback__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__unsuback__packet.html">async_mqtt::v5::basic_unsuback_packet</a></div><div class="ttdoc">MQTT UNSUBACK packet (v5)</div><div class="ttdef"><b>Definition</b> v5_unsuback.hpp:48</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__unsuback__packet_html_a0186b93896b851ea9f214011c47d77b9"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__unsuback__packet.html#a0186b93896b851ea9f214011c47d77b9">async_mqtt::v5::basic_unsuback_packet::packet_id</a></div><div class="ttdeci">packet_id_t packet_id() const</div><div class="ttdoc">Get packet_id.</div><div class="ttdef"><b>Definition</b> v5_unsuback.hpp:157</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__unsuback__packet_html_a09e6ef82030a96d223c5026f33238c67"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__unsuback__packet.html#a09e6ef82030a96d223c5026f33238c67">async_mqtt::v5::basic_unsuback_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v5_unsuback.hpp:105</div></div>
@@ -382,7 +382,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__unsuback__packet_html_ae2640d2d627a669fd19d59eae8d78683"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__unsuback__packet.html#ae2640d2d627a669fd19d59eae8d78683">async_mqtt::v5::basic_unsuback_packet::props</a></div><div class="ttdeci">properties const &amp; props() const</div><div class="ttdoc">Get properties.</div><div class="ttdef"><b>Definition</b> v5_unsuback.hpp:173</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__unsuback__packet_html_ae5c83d53c0224e82ab6715082d3237f8"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__unsuback__packet.html#ae5c83d53c0224e82ab6715082d3237f8">async_mqtt::v5::basic_unsuback_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v5_unsuback.hpp:96</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__unsuback__packet_html_af3a8cb2d404218135d10b4d6f63aa086"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__unsuback__packet.html#af3a8cb2d404218135d10b4d6f63aa086">async_mqtt::v5::basic_unsuback_packet::entries</a></div><div class="ttdeci">std::vector&lt; unsuback_reason_code &gt; const &amp; entries() const</div><div class="ttdoc">Get entries.</div><div class="ttdef"><b>Definition</b> v5_unsuback.hpp:165</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/v5__unsubscribe_8hpp_source.html b/doc/api/v5__unsubscribe_8hpp_source.html
index 33fc25310..6bc1f1793 100644
--- a/doc/api/v5__unsubscribe_8hpp_source.html
+++ b/doc/api/v5__unsubscribe_8hpp_source.html
@@ -433,8 +433,8 @@
 <div class="line"><a id="l00379" name="l00379"></a><span class="lineno">  379</span> </div>
 <div class="line"><a id="l00380" name="l00380"></a><span class="lineno">  380</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_V5_UNSUBSCRIBE_HPP</span></div>
 <div class="ttc" id="aclassasync__mqtt_1_1basic__packet__variant_html"><div class="ttname"><a href="classasync__mqtt_1_1basic__packet__variant.html">async_mqtt::basic_packet_variant</a></div><div class="ttdoc">The varaint type of all packets and system_error.</div><div class="ttdef"><b>Definition</b> packet_variant.hpp:68</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:38</div></div>
-<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:266</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html">async_mqtt::buffer</a></div><div class="ttdoc">buffer that has string_view interface and shared ownership This class is only for advanced usecase su...</div><div class="ttdef"><b>Definition</b> buffer.hpp:37</div></div>
+<div class="ttc" id="aclassasync__mqtt_1_1buffer_html_a7895963705a5671147e3cfb366f48756"><div class="ttname"><a href="classasync__mqtt_1_1buffer.html#a7895963705a5671147e3cfb366f48756">async_mqtt::buffer::substr</a></div><div class="ttdeci">buffer substr(size_type pos=0, size_type count=npos) const &amp;</div><div class="ttdoc">get substring The returned buffer ragnge is the same as std::string_view::substr()....</div><div class="ttdef"><b>Definition</b> buffer.hpp:265</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__unsubscribe__packet_html"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__unsubscribe__packet.html">async_mqtt::v5::basic_unsubscribe_packet</a></div><div class="ttdoc">MQTT UNSUBSCRIBE packet (v5)</div><div class="ttdef"><b>Definition</b> v5_unsubscribe.hpp:52</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__unsubscribe__packet_html_a1b0e30e71ba92678298ac45fb2922b80"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__unsubscribe__packet.html#a1b0e30e71ba92678298ac45fb2922b80">async_mqtt::v5::basic_unsubscribe_packet::basic_unsubscribe_packet</a></div><div class="ttdeci">basic_unsubscribe_packet(packet_id_t packet_id, std::vector&lt; topic_sharename &gt; params, properties props={})</div><div class="ttdoc">constructor</div><div class="ttdef"><b>Definition</b> v5_unsubscribe.hpp:64</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__unsubscribe__packet_html_a1be9d37d7e65f12aefa13f1c0b67fbc7"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__unsubscribe__packet.html#a1be9d37d7e65f12aefa13f1c0b67fbc7">async_mqtt::v5::basic_unsubscribe_packet::const_buffer_sequence</a></div><div class="ttdeci">std::vector&lt; as::const_buffer &gt; const_buffer_sequence() const</div><div class="ttdoc">Create const buffer sequence it is for boost asio APIs.</div><div class="ttdef"><b>Definition</b> v5_unsubscribe.hpp:140</div></div>
@@ -445,7 +445,7 @@
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__unsubscribe__packet_html_ab7171186e9ccc4d934e6a6beae3a0bcf"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__unsubscribe__packet.html#ab7171186e9ccc4d934e6a6beae3a0bcf">async_mqtt::v5::basic_unsubscribe_packet::type</a></div><div class="ttdeci">constexpr control_packet_type type() const</div><div class="ttdoc">Get MQTT control packet type.</div><div class="ttdef"><b>Definition</b> v5_unsubscribe.hpp:131</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__unsubscribe__packet_html_abc77f5a53259c8bbb752de0c842e08d6"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__unsubscribe__packet.html#abc77f5a53259c8bbb752de0c842e08d6">async_mqtt::v5::basic_unsubscribe_packet::entries</a></div><div class="ttdeci">std::vector&lt; topic_sharename &gt; const &amp; entries() const</div><div class="ttdoc">Get entries.</div><div class="ttdef"><b>Definition</b> v5_unsubscribe.hpp:206</div></div>
 <div class="ttc" id="aclassasync__mqtt_1_1v5_1_1basic__unsubscribe__packet_html_acba682272b5b6b96b7e7fe54e18f2f6f"><div class="ttname"><a href="classasync__mqtt_1_1v5_1_1basic__unsubscribe__packet.html#acba682272b5b6b96b7e7fe54e18f2f6f">async_mqtt::v5::basic_unsubscribe_packet::packet_id</a></div><div class="ttdeci">packet_id_t packet_id() const</div><div class="ttdoc">Get packet_id.</div><div class="ttdef"><b>Definition</b> v5_unsubscribe.hpp:198</div></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__mqtt_html_ga133d6d106d4e527d07fea2d12544c0c0"><div class="ttname"><a href="group__mqtt.html#ga133d6d106d4e527d07fea2d12544c0c0">async_mqtt::protocol_version</a></div><div class="ttdeci">protocol_version</div><div class="ttdoc">MQTT protocol version.</div><div class="ttdef"><b>Definition</b> protocol_version.hpp:25</div></div>
 </div><!-- fragment --></div><!-- contents -->
 </div><!-- doc-content -->
diff --git a/doc/api/will_8hpp_source.html b/doc/api/will_8hpp_source.html
index 8e704139a..beae52381 100644
--- a/doc/api/will_8hpp_source.html
+++ b/doc/api/will_8hpp_source.html
@@ -218,7 +218,7 @@
 <div class="line"><a id="l00175" name="l00175"></a><span class="lineno">  175</span>} <span class="comment">// namespace async_mqtt</span></div>
 <div class="line"><a id="l00176" name="l00176"></a><span class="lineno">  176</span> </div>
 <div class="line"><a id="l00177" name="l00177"></a><span class="lineno">  177</span><span class="preprocessor">#endif </span><span class="comment">// ASYNC_MQTT_PACKET_WILL_HPP</span></div>
-<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:587</div></div>
+<div class="ttc" id="agroup__buffer_html_gafccb94aa6be5a8e224e1b900e9522b4f"><div class="ttname"><a href="group__buffer.html#gafccb94aa6be5a8e224e1b900e9522b4f">boost::asio::buffer</a></div><div class="ttdeci">const_buffer buffer(async_mqtt::buffer const &amp;data)</div><div class="ttdoc">create boost::asio::const_buffer from the async_mqtt::buffer boost::asio::const_buffer is a kind of v...</div><div class="ttdef"><b>Definition</b> buffer.hpp:586</div></div>
 <div class="ttc" id="agroup__property_html_gga47c42be3d9afd2d518fad85c5480b1f9ab45cffe084dd3d20d928bee85e7b0f21"><div class="ttname"><a href="group__property.html#gga47c42be3d9afd2d518fad85c5480b1f9ab45cffe084dd3d20d928bee85e7b0f21">async_mqtt::payload_format::string</a></div><div class="ttdeci">@ string</div><div class="ttdoc">string</div></div>
 <div class="ttc" id="agroup__publish__options_html_ga89fabc81d8448fa347b2146349ae4737"><div class="ttname"><a href="group__publish__options.html#ga89fabc81d8448fa347b2146349ae4737">async_mqtt::pub::retain</a></div><div class="ttdeci">retain</div><div class="ttdoc">MQTT RETAIN.</div><div class="ttdef"><b>Definition</b> pubopts.hpp:75</div></div>
 <div class="ttc" id="agroup__qos_html_ga38e773082414bb272ab22275c56eb4df"><div class="ttname"><a href="group__qos.html#ga38e773082414bb272ab22275c56eb4df">async_mqtt::qos</a></div><div class="ttdeci">qos</div><div class="ttdoc">MQTT QoS.</div><div class="ttdef"><b>Definition</b> qos.hpp:30</div></div>
diff --git a/include/async_mqtt/buffer.hpp b/include/async_mqtt/buffer.hpp
index ad6f28495..7e7fd0f82 100644
--- a/include/async_mqtt/buffer.hpp
+++ b/include/async_mqtt/buffer.hpp
@@ -15,7 +15,6 @@
 #include <boost/container_hash/hash.hpp>
 
 #include <async_mqtt/util/move.hpp>
-#include <async_mqtt/util/shared_ptr_array.hpp>
 #include <async_mqtt/util/is_iterator.hpp>
 
 /**
diff --git a/include/async_mqtt/impl/stream_read_packet.hpp b/include/async_mqtt/impl/stream_read_packet.hpp
index b3bac3da7..1418c37aa 100644
--- a/include/async_mqtt/impl/stream_read_packet.hpp
+++ b/include/async_mqtt/impl/stream_read_packet.hpp
@@ -8,6 +8,7 @@
 #define ASYNC_MQTT_IMPL_STREAM_READ_PACKET_HPP
 
 #include <async_mqtt/stream.hpp>
+#include <async_mqtt/util/shared_ptr_array.hpp>
 
 namespace async_mqtt {
 
@@ -21,7 +22,7 @@ struct stream<NextLayer>::stream_read_packet_op {
     std::size_t received = 0;
     std::uint32_t mul = 1;
     std::uint32_t rl = 0;
-    shared_ptr_array spa = nullptr;
+    std::shared_ptr<char[]> spca = nullptr;
     stream_type_sp life_keeper = strm.shared_from_this();
     enum { dispatch, header, remaining_length, complete } state = dispatch;
 
@@ -162,20 +163,30 @@ struct stream<NextLayer>::stream_read_packet_op {
                 // remaining_length end
                 rl += (strm.header_remaining_length_buf_[received - 1] & 0b01111111) * mul;
 
-                spa = make_shared_ptr_array(received + rl);
+                BOOST_ASIO_REBIND_ALLOC(
+                    typename as::associated_allocator<Self>::type,
+                    char
+                )
+                alloc{
+                    as::get_associated_allocator(self)
+                };
+                spca = allocate_shared_ptr_char_array(
+                    alloc,
+                    received + rl
+                );
                 std::copy(
                     strm.header_remaining_length_buf_.data(),
-                    strm.header_remaining_length_buf_.data() + received, spa.get()
+                    strm.header_remaining_length_buf_.data() + received, spca.get()
                 );
 
                 if (rl == 0) {
-                    auto ptr = spa.get();
-                    self.complete(ec, buffer{ptr, ptr + received + rl, force_move(spa)});
+                    auto ptr = spca.get();
+                    self.complete(ec, buffer{ptr, ptr + received + rl, force_move(spca)});
                     return;
                 }
                 else {
                     state = complete;
-                    auto address = &spa[std::ptrdiff_t(received)];
+                    auto address = &spca[std::ptrdiff_t(received)];
                     auto& a_strm{strm};
                     if constexpr (
                         has_async_read<next_layer_type>::value) {
@@ -202,8 +213,8 @@ struct stream<NextLayer>::stream_read_packet_op {
             }
             break;
         case complete: {
-            auto ptr = spa.get();
-            self.complete(ec, buffer{ptr, ptr + received + rl, force_move(spa)});
+            auto ptr = spca.get();
+            self.complete(ec, buffer{ptr, ptr + received + rl, force_move(spca)});
         } break;
         default:
             BOOST_ASSERT(false);
diff --git a/include/async_mqtt/util/shared_ptr_array.hpp b/include/async_mqtt/util/shared_ptr_array.hpp
index 741b081c9..2fa784bda 100644
--- a/include/async_mqtt/util/shared_ptr_array.hpp
+++ b/include/async_mqtt/util/shared_ptr_array.hpp
@@ -7,55 +7,53 @@
 #if !defined(ASYNC_MQTT_UTIL_SHARED_PTR_ARRAY_HPP)
 #define ASYNC_MQTT_UTIL_SHARED_PTR_ARRAY_HPP
 
-#if defined(_DOXYGEN_)
+#include <memory>
+
+namespace async_mqtt {
 
 /**
- * @ingroup packet
- * @brief Type alias of shared_ptr char array.
+ * @ingroup buffer
+ * @brief shared_ptr<char[]> creating function.
  * You can choose the target type.
- * - If ASYNC_MQTT_STD_SHARED_PTR_ARRAY is defined, `std::shared_ptr<char []>` is used.
- *   - std::shared_ptr<char []> is supported since C++17.
- * - If ASYNC_MQTT_STD_SHARED_PTR_ARRAY is not defined (default), `boost::shared_ptr<char []>` is used.
- *   - `boost::shared_ptr<char []>` can be used on C++14.
+ *   - if your compiler setting is C++20 or later, then `std::make_shared<char[]>(size)` is used.
+ *      - It can allocate an array of characters and the control block in a single allocation.
+ *   - otherwise `std::shared_ptr<char[]>(new char[size])` is used.
+ *      - It requires two times allocations.
+ * @param size of char array
+ * @return shared_ptr of array
  */
-using shared_ptr_array = std::shared_ptr<char []>;
-using const_shared_ptr_array = std::shared_ptr<char const []>;
+inline std::shared_ptr<char []> make_shared_ptr_char_array(std::size_t size) {
+#if __cpp_lib_shared_ptr_arrays >= 201707L
+    return std::make_shared<char[]>(size);
+#else  // __cpp_lib_shared_ptr_arrays >= 201707L
+    return std::shared_ptr<char[]>(new char[size]);
+#endif // __cpp_lib_shared_ptr_arrays >= 201707Lhai
+}
 
 /**
- * @ingroup packet
- * @brief shared_ptr_array creating function.
+ * @ingroup buffer
+ * @brief shared_ptr<char[]> creating function with allocator.
  * You can choose the target type.
- * - If ASYNC_MQTT_STD_SHARED_PTR_ARRAY is defined,
- *   - and if your compiler setting is C++20 or later, then `std::make_shared<char[]>(size)` is used.
+ *   - if your compiler setting is C++20 or later, then `std::make_shared<char[]>(size)` is used.
  *      - It can allocate an array of characters and the control block in a single allocation.
  *   - otherwise `std::shared_ptr<char[]>(new char[size])` is used.
  *      - It requires two times allocations.
- * - If ASYNC_MQTT_STD_SHARED_PTR_ARRAY is not defined (default), then `boost::make_shared<char[]>(size)` is used.
- *      - It can allocate an array of characters and the control block in a single allocation.
+ * @param alloc allocator
+ * @param size of char array
+ * @return shared_ptr of array
  */
-inline shared_ptr_array make_shared_ptr_array(std::size_t size);
-
-#else  // defined(_DOXYGEN_)
-
-
-#include <memory>
-
-namespace async_mqtt {
-
-using shared_ptr_array = std::shared_ptr<char []>;
-using const_shared_ptr_array = std::shared_ptr<char const []>;
-
-inline shared_ptr_array make_shared_ptr_array(std::size_t size) {
+template <typename Alloc>
+inline std::shared_ptr<char []> allocate_shared_ptr_char_array(Alloc&& alloc, std::size_t size) {
 #if __cpp_lib_shared_ptr_arrays >= 201707L
-    return std::make_shared<char[]>(size);
+    return std::allocate_shared<char[]>(alloc, size);
 #else  // __cpp_lib_shared_ptr_arrays >= 201707L
-    return std::shared_ptr<char[]>(new char[size]);
-#endif // __cpp_lib_shared_ptr_arrays >= 201707L
+    return std::shared_ptr<char[]>(
+        alloc.allocate(size),
+        [alloc, size](char* ptr) mutable { alloc.deallocate(ptr, size); }
+    );
+#endif // __cpp_lib_shared_ptr_arrays >= 201707Lhai
 }
 
 } // namespace async_mqtt
 
-
-#endif // defined(_DOXYGEN_)
-
 #endif // ASYNC_MQTT_UTIL_SHARED_PTR_ARRAY_HPP


Test patch:
diff --git a/test/unit/stub_socket.hpp b/test/unit/stub_socket.hpp
index 94d6115c0..2b4abf18d 100644
--- a/test/unit/stub_socket.hpp
+++ b/test/unit/stub_socket.hpp
@@ -51,8 +51,12 @@ struct basic_stub_socket {
         close_checker_ = force_move(c);
     }
 
-    void set_associated_cheker(std::size_t num) {
-        associated_allocator_num_ = num;
+    void set_associated_cheker_for_read(std::size_t num) {
+        associated_allocator_num_for_read_ = num;
+    }
+
+    void set_associated_cheker_for_write(std::size_t num) {
+        associated_allocator_num_for_write_ = num;
     }
 
     auto get_executor() const {
@@ -72,7 +76,7 @@ struct basic_stub_socket {
         ConstBufferSequence const& buffers,
         CompletionToken&& token
     ) {
-        if (associated_allocator_num_ != 0) {
+        if (associated_allocator_num_for_write_ != 0) {
             BOOST_ASIO_REBIND_ALLOC(
                 typename as::associated_allocator<CompletionToken>::type,
                 char
@@ -80,8 +84,8 @@ struct basic_stub_socket {
                 as::get_associated_allocator(token)
             );
             alloc1.deallocate(
-                alloc1.allocate(associated_allocator_num_),
-                associated_allocator_num_
+                alloc1.allocate(associated_allocator_num_for_write_),
+                associated_allocator_num_for_write_
             );
         }
 
@@ -162,6 +166,20 @@ struct basic_stub_socket {
                 self.complete(ec->code(), 0);
                 return;
             }
+
+            if (socket.associated_allocator_num_for_read_ != 0) {
+                BOOST_ASIO_REBIND_ALLOC(
+                    typename as::associated_allocator<Self>::type,
+                    char
+                ) alloc1(
+                    as::get_associated_allocator(self)
+                );
+                alloc1.deallocate(
+                    alloc1.allocate(socket.associated_allocator_num_for_read_),
+                    socket.associated_allocator_num_for_read_
+                );
+            }
+
             if (!socket.pv_r_) {
                 socket.cbs_ = socket.recv_pvs_it_->const_buffer_sequence();
                 socket.pv_r_ = make_packet_range(socket.cbs_);
@@ -198,6 +216,8 @@ struct basic_stub_socket {
 
 private:
 
+    template <typename MutableBufferSequence>
+    friend struct async_read_some_impl;
     protocol_version version_;
     as::any_io_executor exe_;
     pv_queue_t recv_pvs_;
@@ -207,7 +227,8 @@ struct basic_stub_socket {
     std::function<void(basic_packet_variant<PacketIdBytes> const& pv)> write_packet_checker_;
     std::function<void()> close_checker_;
     bool open_ = true;
-    std::size_t associated_allocator_num_ = 0;
+    std::size_t associated_allocator_num_for_read_ = 0;
+    std::size_t associated_allocator_num_for_write_ = 0;
 };
 
 using stub_socket = basic_stub_socket<2>;
diff --git a/test/unit/test_allocate_buffer.hpp b/test/unit/test_allocate_buffer.hpp
index 7f11adc5f..8427d05a6 100644
--- a/test/unit/test_allocate_buffer.hpp
+++ b/test/unit/test_allocate_buffer.hpp
@@ -8,6 +8,7 @@
 #define ASYNC_MQTT_TEST_UNI_ALLOCATE_BUFFER_HPP
 
 #include <async_mqtt/buffer.hpp>
+#include <async_mqtt/util/shared_ptr_array.hpp>
 
 namespace async_mqtt {
 
@@ -15,10 +16,10 @@ template <typename Iterator>
 inline buffer allocate_buffer(Iterator b, Iterator e) {
     auto size = static_cast<std::size_t>(std::distance(b, e));
     if (size == 0) return buffer(&*b, size);
-    auto spa = make_shared_ptr_array(size);
-    std::copy(b, e, spa.get());
-    auto p = spa.get();
-    return buffer(p, size, force_move(spa));
+    auto spca = make_shared_ptr_char_array(size);
+    std::copy(b, e, spca.get());
+    auto p = spca.get();
+    return buffer(p, size, force_move(spca));
 }
 
 inline buffer allocate_buffer(std::string_view sv) {
diff --git a/test/unit/ut_ep_alloc.cpp b/test/unit/ut_ep_alloc.cpp
index d98f50480..653cd79a6 100644
--- a/test/unit/ut_ep_alloc.cpp
+++ b/test/unit/ut_ep_alloc.cpp
@@ -25,37 +25,37 @@ namespace as = boost::asio;
 // but users need to get packet_id via ep->acquire_unique_packet_id(...)
 // see other test cases.
 
-static constexpr std::size_t check_digit = 12345;
-static bool allocate_called = false;
-static bool deallocate_called = false;
+static constexpr std::size_t check_digit_read = 12345;
+static bool allocate_called_read = false;
+static bool deallocate_called_read = false;
 
 template <typename T>
-struct my_alloc : std::allocator<T> {
+struct my_alloc_read : std::allocator<T> {
     using base_type = std::allocator<T>;
     using base_type::base_type;
 
     template <typename U>
     struct rebind {
-        using other = my_alloc<U>;
+        using other = my_alloc_read<U>;
     };
 
     T* allocate(std::size_t n, void const* hint = nullptr) {
         (void)hint;
-        if (n == check_digit) {
-            allocate_called = true;
+        if (n == check_digit_read) {
+            allocate_called_read = true;
         }
         return base_type::allocate(n);
     }
     void deallocate(T* p, std::size_t n) {
-        if (n == check_digit) {
-            deallocate_called = true;
+        if (n == check_digit_read) {
+            deallocate_called_read = true;
         }
         return base_type::deallocate(p, n);
     }
 
 };
 
-BOOST_AUTO_TEST_CASE(custom) {
+BOOST_AUTO_TEST_CASE(custom_read) {
     auto version = am::protocol_version::v3_1_1;
     as::io_context ioc;
 
@@ -84,10 +84,92 @@ BOOST_AUTO_TEST_CASE(custom) {
             connack
         }
     );
-    ep->next_layer().set_associated_cheker(check_digit);
-    my_alloc<int> ma;
-    BOOST_CHECK(!allocate_called);
-    BOOST_CHECK(!deallocate_called);
+    ep->next_layer().set_associated_cheker_for_read(check_digit_read);
+    my_alloc_read<int> ma;
+    BOOST_CHECK(!allocate_called_read);
+    BOOST_CHECK(!deallocate_called_read);
+    ep->send(
+        connect,
+        [&](auto se) {
+            BOOST_CHECK(!se);
+            ep->recv(
+                as::bind_allocator(
+                    ma,
+                    [&](auto pv) {
+                        BOOST_TEST(pv == connack);
+                    }
+                )
+            );
+        }
+    );
+    ioc.run();
+    BOOST_CHECK(allocate_called_read);
+    BOOST_CHECK(deallocate_called_read);
+}
+
+static constexpr std::size_t check_digit_write = 23456;
+static bool allocate_called_write = false;
+static bool deallocate_called_write = false;
+
+template <typename T>
+struct my_alloc_write : std::allocator<T> {
+    using base_type = std::allocator<T>;
+    using base_type::base_type;
+
+    template <typename U>
+    struct rebind {
+        using other = my_alloc_write<U>;
+    };
+
+    T* allocate(std::size_t n, void const* hint = nullptr) {
+        (void)hint;
+        if (n == check_digit_write) {
+            allocate_called_write = true;
+        }
+        return base_type::allocate(n);
+    }
+    void deallocate(T* p, std::size_t n) {
+        if (n == check_digit_write) {
+            deallocate_called_write = true;
+        }
+        return base_type::deallocate(p, n);
+    }
+
+};
+
+BOOST_AUTO_TEST_CASE(custom_write) {
+    auto version = am::protocol_version::v3_1_1;
+    as::io_context ioc;
+
+    auto ep = am::endpoint<async_mqtt::role::client, async_mqtt::stub_socket>::create(
+        version,
+        // for stub_socket args
+        version,
+        ioc.get_executor()
+    );
+
+    auto connect = am::v3_1_1::connect_packet{
+        true,   // clean_session
+        0x0, // keep_alive
+        "cid1",
+        std::nullopt, // will
+        "user1",
+        "pass1"
+    };
+    auto connack = am::v3_1_1::connack_packet{
+        true,   // session_present
+        am::connect_return_code::accepted
+    };
+    ep->next_layer().set_recv_packets(
+        {
+            // receive packets
+            connack
+        }
+    );
+    ep->next_layer().set_associated_cheker_for_write(check_digit_write);
+    my_alloc_write<int> ma;
+    BOOST_CHECK(!allocate_called_write);
+    BOOST_CHECK(!deallocate_called_write);
     ep->send(
         connect,
         as::bind_allocator(
@@ -103,8 +185,8 @@ BOOST_AUTO_TEST_CASE(custom) {
         )
     );
     ioc.run();
-    BOOST_CHECK(allocate_called);
-    BOOST_CHECK(deallocate_called);
+    BOOST_CHECK(allocate_called_write);
+    BOOST_CHECK(deallocate_called_write);
 }
 
 BOOST_AUTO_TEST_SUITE_END()