// // Copyright (c) 2013-2016 Vinnie Falco (vinnie dot falco at gmail 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) // #ifndef BEAST_ASYNC_COMPLETION_HPP #define BEAST_ASYNC_COMPLETION_HPP #include #include #include #include #include namespace beast { /** Helper for customizing the return type of asynchronous initiation functions. This class template is used to transform caller-provided completion handlers in calls to asynchronous initiation functions. The transformation allows customization of the return type of the initiating function, and the function signature of the final handler. @tparam CompletionHandler A completion handler, or a user defined type with specializations for customizing the return type (for example, `boost::asio::use_future` or `boost::asio::yield_context`). @tparam Signature The callable signature of the final completion handler. Example: @code ... template typename async_completion::result_type async_initfn(..., CompletionHandler&& handler) { async_completion completion(handler); ... return completion.result.get(); } @endcode @note See Library Foundations For Asynchronous Operations */ template struct async_completion { /** The type of the final handler called by the asynchronous initiation function. Objects of this type will be callable with the specified signature. */ using handler_type = typename boost::asio::handler_type< CompletionHandler, Signature>::type; /// The type of the value returned by the asynchronous initiation function. using result_type = typename boost::asio::async_result::type; /** Construct the helper. @param token The completion handler. Copies will be made as required. If `CompletionHandler` is movable, it may also be moved. */ async_completion(typename std::remove_reference::type& token) : handler(std::forward(token)) , result(handler) { static_assert(is_CompletionHandler::value, "Handler requirements not met"); } /// The final completion handler, callable with the specified signature. handler_type handler; /// The return value of the asynchronous initiation function. boost::asio::async_result result; }; } // beast #endif