Christopher Kohlhoff
|
1c0f3c36be
|
Add experimental::co_composed.
The following example illustrates a simple asynchronous operation that
implements an echo protocol in terms of a coroutine:
template <typename CompletionToken>
auto async_echo(tcp::socket& socket,
CompletionToken&& token)
{
return boost::asio::async_initiate<
CompletionToken, void(boost::system::error_code)>(
boost::asio::experimental::co_composed<
void(boost::system::error_code)>(
[](auto state, tcp::socket& socket) -> void
{
try
{
state.throw_if_cancelled(true);
state.reset_cancellation_state(
boost::asio::enable_terminal_cancellation());
for (;;)
{
char data[1024];
std::size_t n = co_await socket.async_read_some(
boost::asio::buffer(data), boost::asio::deferred);
co_await boost::asio::async_write(socket,
boost::asio::buffer(data, n), boost::asio::deferred);
}
}
catch (const boost::system::system_error& e)
{
co_return {e.code()};
}
}, socket),
token, std::ref(socket));
}
|
2022-11-01 11:35:07 +11:00 |
|