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