Wrapping a callback-based API
There are many asynchronous APIs based on callbacks. Typically, an asynchronous function takes a callback function provided by the caller. The asynchronous function returns immediately and then eventually invokes the callback (completion handler) when the asynchronous function has a computed value or is done waiting for something.
To show you what an asynchronous callback-based API can look like, we will take a peek at a Boost library for asynchronous I/O named Boost.Asio. There is a lot to learn about Boost.Asio that won't be covered here; I will only describe the absolute minimum of the Boost code and instead focus on the parts directly related to C++ coroutines.
To make the code fit the pages of the book, the examples assume that the following namespace alias has been defined whenever we use code from Boost.Asio:
namespace asio = boost::asio;
Here is a complete example of using Boost.Asio for delaying a function call but without...