forked from boostorg/beast
Add detail::bind_continuation
This commit is contained in:
1 parent
c08ce90e2c
commit
96b2944f70
7 files changed
+476
-1
No files matched your search
@@ -0,0 +1,55 @@
|
||||
//
|
||||
// Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail 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)
|
||||
//
|
||||
// Official repository: https://github.com/boostorg/beast
|
||||
//
|
||||
|
||||
#ifndef BOOST_BEAST_BIND_CONTINUATION_HPP
|
||||
#define BOOST_BEAST_BIND_CONTINUATION_HPP
|
||||
|
||||
#include <boost/beast/core/detail/config.hpp>
|
||||
#include <boost/beast/core/detail/remap_post_to_defer.hpp>
|
||||
#include <boost/asio/bind_executor.hpp>
|
||||
#include <boost/core/empty_value.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
namespace boost {
|
||||
namespace beast {
|
||||
|
||||
/** Mark a completion handler as a continuation.
|
||||
|
||||
This function wraps a completion handler to associate it with an
|
||||
executor whose `post` operation is remapped to the `defer` operation.
|
||||
It is used by composed asynchronous operation implementations to
|
||||
indicate that a completion handler submitted to an initiating
|
||||
function represents a continuation of the current asynchronous
|
||||
flow of control.
|
||||
|
||||
@see
|
||||
|
||||
@li <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4242.html">[N4242] Executors and Asynchronous Operations, Revision 1</a>
|
||||
*/
|
||||
template<class Executor, class CompletionHandler>
|
||||
#if BOOST_BEAST_DOXYGEN
|
||||
__implementation_defined__
|
||||
#else
|
||||
net::executor_binder<typename
|
||||
std::decay<CompletionHandler>::type,
|
||||
detail::remap_post_to_defer<Executor>>
|
||||
#endif
|
||||
bind_continuation(
|
||||
Executor const& ex, CompletionHandler&& handler)
|
||||
{
|
||||
return net::bind_executor(
|
||||
detail::remap_post_to_defer<Executor>(ex),
|
||||
std::forward<CompletionHandler>(handler));
|
||||
}
|
||||
|
||||
} // beast
|
||||
} // boost
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,109 @@
|
||||
//
|
||||
// Copyright (c) 2019 Vinnie Falco (vinnie dot falco at gmail 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)
|
||||
//
|
||||
// Official repository: https://github.com/boostorg/beast
|
||||
//
|
||||
|
||||
#ifndef BOOST_BEAST_DETAIL_REMAP_POST_TO_DEFER_HPP
|
||||
#define BOOST_BEAST_DETAIL_REMAP_POST_TO_DEFER_HPP
|
||||
|
||||
#include <boost/asio/bind_executor.hpp>
|
||||
#include <boost/asio/is_executor.hpp>
|
||||
#include <boost/core/empty_value.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
namespace boost {
|
||||
namespace beast {
|
||||
namespace detail {
|
||||
|
||||
template<class Executor>
|
||||
class remap_post_to_defer
|
||||
: private boost::empty_value<Executor>
|
||||
{
|
||||
BOOST_STATIC_ASSERT(
|
||||
net::is_executor<Executor>::value);
|
||||
|
||||
Executor const&
|
||||
ex() const noexcept
|
||||
{
|
||||
return this->get();
|
||||
}
|
||||
|
||||
public:
|
||||
remap_post_to_defer(
|
||||
remap_post_to_defer&&) = default;
|
||||
|
||||
remap_post_to_defer(
|
||||
remap_post_to_defer const&) = default;
|
||||
|
||||
explicit
|
||||
remap_post_to_defer(
|
||||
Executor const& ex)
|
||||
: boost::empty_value<Executor>(
|
||||
boost::empty_init_t{}, ex)
|
||||
{
|
||||
}
|
||||
|
||||
bool
|
||||
operator==(
|
||||
remap_post_to_defer const& other) const noexcept
|
||||
{
|
||||
return ex() == other.ex();
|
||||
}
|
||||
|
||||
bool
|
||||
operator!=(
|
||||
remap_post_to_defer const& other) const noexcept
|
||||
{
|
||||
return ex() != other.ex();
|
||||
}
|
||||
|
||||
decltype(std::declval<Executor const&>().context())
|
||||
context() const noexcept
|
||||
{
|
||||
return ex().context();
|
||||
}
|
||||
|
||||
void
|
||||
on_work_started() const noexcept
|
||||
{
|
||||
ex().on_work_started();
|
||||
}
|
||||
|
||||
void
|
||||
on_work_finished() const noexcept
|
||||
{
|
||||
ex().on_work_finished();
|
||||
}
|
||||
|
||||
template<class F, class A>
|
||||
void
|
||||
dispatch(F&& f, A const& a) const
|
||||
{
|
||||
ex().dispatch(std::forward<F>(f), a);
|
||||
}
|
||||
|
||||
template<class F, class A>
|
||||
void
|
||||
post(F&& f, A const& a) const
|
||||
{
|
||||
ex().defer(std::forward<F>(f), a);
|
||||
}
|
||||
|
||||
template<class F, class A>
|
||||
void
|
||||
defer(F&& f, A const& a) const
|
||||
{
|
||||
ex().defer(std::forward<F>(f), a);
|
||||
}
|
||||
};
|
||||
|
||||
} // detail
|
||||
} // beast
|
||||
} // boost
|
||||
|
||||
#endif
|
||||
Reference in new issue
Block a user