[/
 / Copyright (c) 2003-2016 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)
 /]

[section:coroutine Stackless Coroutines]

The [link asio.reference.coroutine `coroutine`] class provides support for
stackless coroutines. Stackless coroutines enable programs to implement
asynchronous logic in a synchronous manner, with minimal overhead, as shown in
the following example:

  struct session : asio::coroutine
  {
    boost::shared_ptr<tcp::socket> socket_;
    boost::shared_ptr<std::vector<char> > buffer_;

    session(boost::shared_ptr<tcp::socket> socket)
      : socket_(socket),
        buffer_(new std::vector<char>(1024))
    {
    }

    void operator()(asio::error_code ec = asio::error_code(), std::size_t n = 0)
    {
      if (!ec) reenter (this)
      {
        for (;;)
        {
          yield socket_->async_read_some(asio::buffer(*buffer_), *this);
          yield asio::async_write(*socket_, asio::buffer(*buffer_, n), *this);
        }
      }
    }
  };

The `coroutine` class is used in conjunction with the pseudo-keywords
`reenter`, `yield` and `fork`. These are preprocessor macros, and are
implemented in terms of a `switch` statement using a technique similar to
Duff's Device. The [link asio.reference.coroutine `coroutine`] class's
documentation provides a complete description of these pseudo-keywords.

[heading See Also]

[link asio.reference.coroutine coroutine],
[link asio.examples.cpp03_examples.http_server_4 HTTP Server 4 example],
[link asio.overview.core.spawn Stackful Coroutines].

[endsect]
