summaryrefslogtreecommitdiff
path: root/boost/beast/core/detail/bind_handler.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/beast/core/detail/bind_handler.hpp')
-rw-r--r--boost/beast/core/detail/bind_handler.hpp42
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)