1 // 2 // detail/handler_invoke_helpers.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_DETAIL_HANDLER_INVOKE_HELPERS_HPP 12 #define ASIO_DETAIL_HANDLER_INVOKE_HELPERS_HPP 13 14 15 #include "asio/detail/config.hpp" 16 #include "asio/detail/addressof.hpp" 17 #include "asio/handler_invoke_hook.hpp" 18 19 #include "asio/detail/push_options.hpp" 20 21 // Calls to asio_handler_invoke must be made from a namespace that does not 22 // contain overloads of this function. The asio_handler_invoke_helpers 23 // namespace is defined here for that purpose. 24 namespace asio_handler_invoke_helpers { 25 26 template <typename Function, typename Context> invoke(Function & function,Context & context)27inline void invoke(Function& function, Context& context) 28 { 29 #if !defined(ASIO_HAS_HANDLER_HOOKS) 30 Function tmp(function); 31 tmp(); 32 #else 33 using asio::asio_handler_invoke; 34 asio_handler_invoke(function, asio::detail::addressof(context)); 35 #endif 36 } 37 38 template <typename Function, typename Context> invoke(const Function & function,Context & context)39inline void invoke(const Function& function, Context& context) 40 { 41 #if !defined(ASIO_HAS_HANDLER_HOOKS) 42 Function tmp(function); 43 tmp(); 44 #else 45 using asio::asio_handler_invoke; 46 asio_handler_invoke(function, asio::detail::addressof(context)); 47 #endif 48 } 49 50 } // namespace asio_handler_invoke_helpers 51 52 #include "asio/detail/pop_options.hpp" 53 54 #endif // ASIO_DETAIL_HANDLER_INVOKE_HELPERS_HPP 55