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. 24namespace asio_handler_invoke_helpers { 25 26template <typename Function, typename 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 38template <typename Function, typename 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