diff options
Diffstat (limited to 'boost/beast/core/detail/bind_handler.hpp')
-rw-r--r-- | boost/beast/core/detail/bind_handler.hpp | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/boost/beast/core/detail/bind_handler.hpp b/boost/beast/core/detail/bind_handler.hpp index 5a9059b8e3..48046df923 100644 --- a/boost/beast/core/detail/bind_handler.hpp +++ b/boost/beast/core/detail/bind_handler.hpp @@ -14,7 +14,9 @@ #include <boost/asio/associated_allocator.hpp> #include <boost/asio/associated_executor.hpp> #include <boost/asio/handler_continuation_hook.hpp> +#include <boost/asio/handler_invoke_hook.hpp> #include <boost/core/ignore_unused.hpp> +#include <boost/is_placeholder.hpp> #include <functional> #include <utility> @@ -45,8 +47,10 @@ class bound_handler static typename std::enable_if< std::is_placeholder<typename + std::decay<Arg>::type>::value == 0 && + boost::is_placeholder<typename std::decay<Arg>::type>::value == 0, - Arg&&>::type + Arg&&>::type extract(Arg&& arg, Vals& vals) { boost::ignore_unused(vals); @@ -58,10 +62,10 @@ class bound_handler typename std::enable_if< std::is_placeholder<typename std::decay<Arg>::type>::value != 0, - typename std::tuple_element< - std::is_placeholder< - typename std::decay<Arg>::type>::value - 1, - Vals>::type&&>::type + typename std::tuple_element< + std::is_placeholder< + typename std::decay<Arg>::type>::value - 1, + Vals>>::type::type&& extract(Arg&&, Vals&& vals) { return std::get<std::is_placeholder< @@ -69,6 +73,22 @@ class bound_handler std::forward<Vals>(vals)); } + template<class Arg, class Vals> + static + typename std::enable_if< + boost::is_placeholder<typename + std::decay<Arg>::type>::value != 0, + typename std::tuple_element< + boost::is_placeholder< + typename std::decay<Arg>::type>::value - 1, + Vals>>::type::type&& + extract(Arg&&, Vals&& vals) + { + return std::get<boost::is_placeholder< + typename std::decay<Arg>::type>::value - 1>( + std::forward<Vals>(vals)); + } + template< class ArgsTuple, std::size_t... S> @@ -109,7 +129,7 @@ public: boost::asio::associated_allocator_t<Handler>; bound_handler(bound_handler&&) = default; - bound_handler(bound_handler const&) = default; + bound_handler(bound_handler const&) = delete; template<class DeducedHandler> explicit @@ -123,7 +143,7 @@ public: allocator_type get_allocator() const noexcept { - return boost::asio::get_associated_allocator(h_); + return (boost::asio::get_associated_allocator)(h_); } friend @@ -134,6 +154,14 @@ public: return asio_handler_is_continuation(std::addressof(h->h_)); } + template<class Function> + friend + void asio_handler_invoke(Function&& f, bound_handler* h) + { + using boost::asio::asio_handler_invoke; + asio_handler_invoke(f, std::addressof(h->h_)); + } + template<class... Values> void operator()(Values&&... values) |