2
0
mirror of https://github.com/boostorg/asio.git synced 2026-02-28 03:22:08 +00:00
Files
asio/test/experimental/Jamfile.v2
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

60 lines
2.0 KiB
Plaintext

#
# Copyright (c) 2003-2022 Christopher M. Kohlhoff (chris at kohlhoff dot com)
#
# Distributed under the Boost Software License, Version 1.0. (See accompanying
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#
import os ;
import feature ;
lib socket ; # SOLARIS
lib nsl ; # SOLARIS
lib ws2_32 ; # NT
lib mswsock ; # NT
lib ipv6 ; # HPUX
lib network ; # HAIKU
local USE_SELECT =
<define>BOOST_ASIO_DISABLE_EPOLL
<define>BOOST_ASIO_DISABLE_KQUEUE
<define>BOOST_ASIO_DISABLE_IOCP
;
project
: requirements
<library>/boost/date_time//boost_date_time
<library>/boost/system//boost_system
<library>/boost/chrono//boost_chrono
<define>BOOST_ALL_NO_LIB=1
<threading>multi
<target-os>solaris:<library>socket
<target-os>solaris:<library>nsl
<target-os>windows:<define>_WIN32_WINNT=0x0501
<target-os>windows,<toolset>gcc:<library>ws2_32
<target-os>windows,<toolset>gcc:<library>mswsock
<target-os>windows,<toolset>gcc-cygwin:<define>__USE_W32_SOCKETS
<target-os>hpux,<toolset>gcc:<define>_XOPEN_SOURCE_EXTENDED
<target-os>hpux:<library>ipv6
<target-os>haiku:<library>network
;
test-suite "asio-experimental" :
[ run awaitable_operators.cpp ]
[ run awaitable_operators.cpp : : : $(USE_SELECT) : awaitable_operators_select ]
[ run basic_channel.cpp ]
[ run basic_channel.cpp : : : $(USE_SELECT) : basic_channel_select ]
[ run basic_concurrent_channel.cpp ]
[ run basic_concurrent_channel.cpp : : : $(USE_SELECT) : basic_concurrent_channel_select ]
[ run channel.cpp ]
[ run channel.cpp : : : $(USE_SELECT) : channel_select ]
[ run channel_traits.cpp ]
[ run channel_traits.cpp : : : $(USE_SELECT) : channel_traits_select ]
[ run co_composed.cpp ]
[ run co_composed.cpp : : : $(USE_SELECT) : co_composed_select ]
[ run concurrent_channel.cpp ]
[ run concurrent_channel.cpp : : : $(USE_SELECT) : concurrent_channel_select ]
[ run promise.cpp ]
[ run promise.cpp : : : $(USE_SELECT) : promise_select ]
;