diff options
Diffstat (limited to 'boost/beast/core/detail/remap_post_to_defer.hpp')
-rw-r--r-- | boost/beast/core/detail/remap_post_to_defer.hpp | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/boost/beast/core/detail/remap_post_to_defer.hpp b/boost/beast/core/detail/remap_post_to_defer.hpp new file mode 100644 index 0000000000..77f7d8ab20 --- /dev/null +++ b/boost/beast/core/detail/remap_post_to_defer.hpp @@ -0,0 +1,109 @@ +// +// Copyright (c) 2016-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 |