src/cxx_supportlib/vendor-modified/boost/asio/defer.hpp in passenger-6.0.7 vs src/cxx_supportlib/vendor-modified/boost/asio/defer.hpp in passenger-6.0.8

- old
+ new

@@ -1,10 +1,10 @@ // // defer.hpp // ~~~~~~~~~ // -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff 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) // @@ -17,10 +17,11 @@ #include <boost/asio/detail/config.hpp> #include <boost/asio/async_result.hpp> #include <boost/asio/detail/type_traits.hpp> #include <boost/asio/execution_context.hpp> +#include <boost/asio/execution/executor.hpp> #include <boost/asio/is_executor.hpp> #include <boost/asio/detail/push_options.hpp> namespace boost { @@ -30,10 +31,15 @@ /** * This function submits an object for execution using the object's associated * executor. The function object is queued for execution, and is never called * from the current thread prior to returning from <tt>defer()</tt>. * + * The use of @c defer(), rather than @ref post(), indicates the caller's + * preference that the executor defer the queueing of the function object. This + * may allow the executor to optimise queueing for cases when the function + * object represents a continuation of the current call context. + * * This function has the following effects: * * @li Constructs a function object handler of type @c Handler, initialized * with <tt>handler(forward<CompletionToken>(token))</tt>. * @@ -48,20 +54,25 @@ * * @li Performs <tt>ex.defer(std::move(handler), alloc)</tt>. * * @li Returns <tt>result.get()</tt>. */ -template <typename CompletionToken> -BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer( +template <BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken> +BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) defer( BOOST_ASIO_MOVE_ARG(CompletionToken) token); /// Submits a completion token or function object for execution. /** * This function submits an object for execution using the specified executor. * The function object is queued for execution, and is never called from the * current thread prior to returning from <tt>defer()</tt>. * + * The use of @c defer(), rather than @ref post(), indicates the caller's + * preference that the executor defer the queueing of the function object. This + * may allow the executor to optimise queueing for cases when the function + * object represents a continuation of the current call context. + * * This function has the following effects: * * @li Constructs a function object handler of type @c Handler, initialized * with <tt>handler(forward<CompletionToken>(token))</tt>. * @@ -82,21 +93,33 @@ * * @li Performs <tt>Executor(ex).defer(std::move(f), alloc)</tt>. * * @li Returns <tt>result.get()</tt>. */ -template <typename Executor, typename CompletionToken> -BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer( - const Executor& ex, BOOST_ASIO_MOVE_ARG(CompletionToken) token, - typename enable_if<is_executor<Executor>::value>::type* = 0); +template <typename Executor, + BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken + BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)> +BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) defer( + const Executor& ex, + BOOST_ASIO_MOVE_ARG(CompletionToken) token + BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor), + typename enable_if< + execution::is_executor<Executor>::value || is_executor<Executor>::value + >::type* = 0); /// Submits a completion token or function object for execution. /** * @returns <tt>defer(ctx.get_executor(), forward<CompletionToken>(token))</tt>. */ -template <typename ExecutionContext, typename CompletionToken> -BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer( - ExecutionContext& ctx, BOOST_ASIO_MOVE_ARG(CompletionToken) token, +template <typename ExecutionContext, + BOOST_ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken + BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE( + typename ExecutionContext::executor_type)> +BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void()) defer( + ExecutionContext& ctx, + BOOST_ASIO_MOVE_ARG(CompletionToken) token + BOOST_ASIO_DEFAULT_COMPLETION_TOKEN( + typename ExecutionContext::executor_type), typename enable_if<is_convertible< ExecutionContext&, execution_context&>::value>::type* = 0); } // namespace asio } // namespace boost