1 // 2 // async_result.hpp 3 // ~~~~~~~~~~~~~~~~ 4 // 5 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) 6 // 7 // Distributed under the Boost Software License, Version 1.0. (See accompanying 8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 // 10 11 #ifndef ASIO_ASYNC_RESULT_HPP 12 #define ASIO_ASYNC_RESULT_HPP 13 14 15 #include "asio/detail/config.hpp" 16 #include "asio/handler_type.hpp" 17 18 #include "asio/detail/push_options.hpp" 19 20 namespace asio { 21 22 /// An interface for customising the behaviour of an initiating function. 23 /** 24 * This template may be specialised for user-defined handler types. 25 */ 26 template <typename Handler> 27 class async_result 28 { 29 public: 30 /// The return type of the initiating function. 31 typedef void type; 32 33 /// Construct an async result from a given handler. 34 /** 35 * When using a specalised async_result, the constructor has an opportunity 36 * to initialise some state associated with the handler, which is then 37 * returned from the initiating function. 38 */ async_result(Handler &)39 explicit async_result(Handler&) 40 { 41 } 42 43 /// Obtain the value to be returned from the initiating function. get()44 type get() 45 { 46 } 47 }; 48 49 namespace detail { 50 51 // Helper template to deduce the true type of a handler, capture a local copy 52 // of the handler, and then create an async_result for the handler. 53 template <typename Handler, typename Signature> 54 struct async_result_init 55 { async_result_initasio::detail::async_result_init56 explicit async_result_init(ASIO_MOVE_ARG(Handler) orig_handler) 57 : handler(ASIO_MOVE_CAST(Handler)(orig_handler)), 58 result(handler) 59 { 60 } 61 62 typename handler_type<Handler, Signature>::type handler; 63 async_result<typename handler_type<Handler, Signature>::type> result; 64 }; 65 66 template <typename Handler, typename Signature> 67 struct async_result_type_helper 68 { 69 typedef typename async_result< 70 typename handler_type<Handler, Signature>::type 71 >::type type; 72 }; 73 74 } // namespace detail 75 } // namespace asio 76 77 #include "asio/detail/pop_options.hpp" 78 79 # define ASIO_INITFN_RESULT_TYPE(h, sig) typename ::asio::async_result< typename ::asio::handler_type<h, sig>::type>::type 80 81 #endif // ASIO_ASYNC_RESULT_HPP 82