#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>
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);
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<
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>
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
allocator_type
get_allocator() const noexcept
{
- return boost::asio::get_associated_allocator(h_);
+ return (boost::asio::get_associated_allocator)(h_);
}
friend
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)