<table>
<tbody>
<tr class="odd">
<td align="left">Doc. No.:</td>
<td align="left">P1259R0</td>
</tr>
<tr class="even">
<td align="left">Date:</td>
<td align="left">2018-10-08</td>
</tr>
<tr class="odd">
<td align="left">Reply to:</td>
<td align="left">Detlef Vollmann, dv@vollmann.ch</td>
</tr>
<tr class="even">
<td align="left">Audience:</td>
<td align="left">SG1, LEWG, WG21</td>
</tr>
</tbody>
</table>
<h1 id="merge-most-of-networking-ts-into-c-working-draft">Merge most of Networking TS into C++ Working Draft</h1>
<h2 id="introduction">Introduction</h2>
<p>The Networking TS grew out of Boost::ASIO and has got a lot of usage experience as part of Boost and in standalone implementations of the TS. Most of the Networking TS is uncontroversial.</p>
<p>One specific part of the Networking TS however clashes with the executor work in SG1. The executor work from SG1 is not yet ready to be merged into the C++ working paper. So this part of the Networking TS should not be merged. But most of the Networking TS can work without an explicitly specified executor model. This paper proposes to merge the executor independent parts of the Networking TS into the C++ working paper and solve any open issues on the Networking TS inside the C++ working paper.</p>
<h2 id="wording-overview">Wording Overview</h2>
<p>The proposal is to merge the Networking TS into the C++ working paper with the following changes:</p>
<ul>
<li><p>Move the contents of the namespace <code>std::experimental</code> to namespace <code>std</code>.</p></li>
<li><p>Rename the headers <code>&lt;experimental/*&gt;</code> to <code>&lt;*&gt;</code>.</p></li>
<li><p>From table 3 remove <code>ExecutionContext</code> and <code>Executor</code>.</p></li>
<li>From header <code>&lt;netfwd&gt;</code> ([fwd.decl.synop]) remove:
<ul>
<li><code>executor_binder</code></li>
<li><code>executor_work_guard</code></li>
<li><code>system_executor</code></li>
<li><code>executor</code></li>
<li><code>strand</code>.</li>
</ul></li>
<li>From header <code>&lt;executor&gt;</code> ([async]) remove all but:
<ul>
<li><code>async_result</code>, but remove specializations with <code>use_future_t</code> and <code>packaged_task</code></li>
<li><code>async_completion</code></li>
<li><code>associated_allocator</code></li>
<li><code>associated_allocator_t</code></li>
<li><code>get_associated_allocator</code></li>
<li><code>fork_event</code></li>
<li><code>uses_allocator</code>.</li>
<li>Also remove the respective specifications.</li>
</ul></li>
</ul>
<ul>
<li>From [async.reqmts] remove:
<ul>
<li>[async.reqmts.executor]</li>
<li>[async.reqmts.executioncontext]</li>
<li>[async.reqmts.service]</li>
<li>[async.reqmts.async.assoc.exec]</li>
<li>[async.reqmts.async.io.exec]</li>
<li>[async.reqmts.async.handler.exec]</li>
<li>[async.reqmts.async.work]</li>
<li>[async.reqmts.async.completion]</li>
<li>[async.reqmts.async.exceptions]</li>
<li>[async.reqmts.async.composed].</li>
</ul></li>
<li><p>From [async.reqmts.async]p1 remove <code>Executor1</code>, <code>Executor2</code>, <code>ex1</code>, <code>ex2</code>, <code>work1</code> and <code>work2</code>.</p></li>
<li>From class <code>io_context</code> ([io__context]) remove:
<ul>
<li>the public base class <code>execution_context</code></li>
<li><code>executor_type</code></li>
<li><code>get_executor</code></li>
<li>paragraphs 1, 2, 4.1 and 4.2.</li>
</ul></li>
<li><p>In class <code>io_context</code> ([io__context]) change paragraph 6 remove <code>get_executor,</code> and &quot;, and the <code>io_context::executor_type</code> copy constructors, member functions and comparison operators,&quot;.</p></li>
<li><p>Remove [io__context.exec].</p></li>
<li>From <code>basic_waitable_timer</code> ([timer.waitable]),<br /> <code>basic_socket</code> ([socket.basic]),<br /> <code>basic_socket_acceptor</code> ([socket.acceptor]),<br /> and <code>ip::basic_resolver</code> ([internet.resolver]) remove:
<ul>
<li><code>executor_type</code></li>
<li><code>get_executor</code></li>
<li>from the constructors and assignment the postcondition about <code>get_executor</code></li>
</ul></li>
<li><p>From table 17 ([buffer.stream.reqmts.asyncreadstream]) and table 19 ([buffer.stream.reqmts.asyncwritestream]) remove the <code>get_executor</code> requirement.</p></li>
<li><p>In <code>basic_socket_acceptor</code> ([socket.acceptor]) in the <code>accept</code> functions that don't take an <code>io_context&amp;</code> as argument replace in the Returns clause <code>get_executor().context()</code> with <code>io_context()</code>.</p></li>
</ul>
