Fix Windows build.
diff --git a/asio/include/asio/detail/bind_handler.hpp b/asio/include/asio/detail/bind_handler.hpp index 1747777..0148eec 100644 --- a/asio/include/asio/detail/bind_handler.hpp +++ b/asio/include/asio/detail/bind_handler.hpp
@@ -31,8 +31,8 @@ class binder1 { public: - binder1(const Handler& handler, const Arg1& arg1) - : handler_(handler), + binder1(int, ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1) + : handler_(ASIO_MOVE_CAST(Handler)(handler)), arg1_(arg1) { } @@ -43,6 +43,20 @@ { } +#if defined(ASIO_HAS_MOVE) + binder1(const binder1& other) + : handler_(other.handler_), + arg1_(other.arg1_) + { + } + + binder1(binder1&& other) + : handler_(ASIO_MOVE_CAST(Handler)(other.handler_)), + arg1_(ASIO_MOVE_CAST(Arg1)(other.arg1_)) + { + } +#endif // defined(ASIO_HAS_MOVE) + void operator()() { handler_(static_cast<const Arg1&>(arg1_)); @@ -99,18 +113,20 @@ } template <typename Handler, typename Arg1> -inline binder1<Handler, Arg1> bind_handler(Handler handler, - const Arg1& arg1) +inline binder1<Handler, Arg1> bind_handler( + ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1) { - return binder1<Handler, Arg1>(handler, arg1); + return binder1<Handler, Arg1>(0, + ASIO_MOVE_CAST(Handler)(handler), arg1); } template <typename Handler, typename Arg1, typename Arg2> class binder2 { public: - binder2(const Handler& handler, const Arg1& arg1, const Arg2& arg2) - : handler_(handler), + binder2(int, ASIO_MOVE_ARG(Handler) handler, + const Arg1& arg1, const Arg2& arg2) + : handler_(ASIO_MOVE_CAST(Handler)(handler)), arg1_(arg1), arg2_(arg2) { @@ -123,6 +139,22 @@ { } +#if defined(ASIO_HAS_MOVE) + binder2(const binder2& other) + : handler_(other.handler_), + arg1_(other.arg1_), + arg2_(other.arg2_) + { + } + + binder2(binder2&& other) + : handler_(ASIO_MOVE_CAST(Handler)(other.handler_)), + arg1_(ASIO_MOVE_CAST(Arg1)(other.arg1_)), + arg2_(ASIO_MOVE_CAST(Arg2)(other.arg2_)) + { + } +#endif // defined(ASIO_HAS_MOVE) + void operator()() { handler_(static_cast<const Arg1&>(arg1_), @@ -181,306 +213,11 @@ } template <typename Handler, typename Arg1, typename Arg2> -inline binder2<Handler, Arg1, Arg2> bind_handler(Handler handler, - const Arg1& arg1, const Arg2& arg2) +inline binder2<Handler, Arg1, Arg2> bind_handler( + ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1, const Arg2& arg2) { - return binder2<Handler, Arg1, Arg2>(handler, arg1, arg2); -} - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3> -class binder3 -{ -public: - binder3(const Handler& handler, const Arg1& arg1, const Arg2& arg2, - const Arg3& arg3) - : handler_(handler), - arg1_(arg1), - arg2_(arg2), - arg3_(arg3) - { - } - - binder3(Handler& handler, const Arg1& arg1, const Arg2& arg2, - const Arg3& arg3) - : handler_(ASIO_MOVE_CAST(Handler)(handler)), - arg1_(arg1), - arg2_(arg2), - arg3_(arg3) - { - } - - void operator()() - { - handler_(static_cast<const Arg1&>(arg1_), - static_cast<const Arg2&>(arg2_), - static_cast<const Arg3&>(arg3_)); - } - - void operator()() const - { - handler_(arg1_, arg2_, arg3_); - } - -//private: - Handler handler_; - Arg1 arg1_; - Arg2 arg2_; - Arg3 arg3_; -}; - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3> -inline void* asio_handler_allocate(std::size_t size, - binder3<Handler, Arg1, Arg2, Arg3>* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); -} - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3> -inline void asio_handler_deallocate(void* pointer, std::size_t size, - binder3<Handler, Arg1, Arg2, Arg3>* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); -} - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3> -inline bool asio_handler_is_continuation( - binder3<Handler, Arg1, Arg2, Arg3>* this_handler) -{ - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); -} - -template <typename Function, typename Handler, typename Arg1, typename Arg2, - typename Arg3> -inline void asio_handler_invoke(Function& function, - binder3<Handler, Arg1, Arg2, Arg3>* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template <typename Function, typename Handler, typename Arg1, typename Arg2, - typename Arg3> -inline void asio_handler_invoke(const Function& function, - binder3<Handler, Arg1, Arg2, Arg3>* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3> -inline binder3<Handler, Arg1, Arg2, Arg3> bind_handler(Handler handler, - const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) -{ - return binder3<Handler, Arg1, Arg2, Arg3>(handler, arg1, arg2, arg3); -} - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3, - typename Arg4> -class binder4 -{ -public: - binder4(const Handler& handler, const Arg1& arg1, const Arg2& arg2, - const Arg3& arg3, const Arg4& arg4) - : handler_(handler), - arg1_(arg1), - arg2_(arg2), - arg3_(arg3), - arg4_(arg4) - { - } - - binder4(Handler& handler, const Arg1& arg1, const Arg2& arg2, - const Arg3& arg3, const Arg4& arg4) - : handler_(ASIO_MOVE_CAST(Handler)(handler)), - arg1_(arg1), - arg2_(arg2), - arg3_(arg3), - arg4_(arg4) - { - } - - void operator()() - { - handler_(static_cast<const Arg1&>(arg1_), - static_cast<const Arg2&>(arg2_), - static_cast<const Arg3&>(arg3_), - static_cast<const Arg4&>(arg4_)); - } - - void operator()() const - { - handler_(arg1_, arg2_, arg3_, arg4_); - } - -//private: - Handler handler_; - Arg1 arg1_; - Arg2 arg2_; - Arg3 arg3_; - Arg4 arg4_; -}; - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3, - typename Arg4> -inline void* asio_handler_allocate(std::size_t size, - binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); -} - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3, - typename Arg4> -inline void asio_handler_deallocate(void* pointer, std::size_t size, - binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); -} - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3, - typename Arg4> -inline bool asio_handler_is_continuation( - binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler) -{ - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); -} - -template <typename Function, typename Handler, typename Arg1, typename Arg2, - typename Arg3, typename Arg4> -inline void asio_handler_invoke(Function& function, - binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template <typename Function, typename Handler, typename Arg1, typename Arg2, - typename Arg3, typename Arg4> -inline void asio_handler_invoke(const Function& function, - binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3, - typename Arg4> -inline binder4<Handler, Arg1, Arg2, Arg3, Arg4> bind_handler( - Handler handler, const Arg1& arg1, const Arg2& arg2, - const Arg3& arg3, const Arg4& arg4) -{ - return binder4<Handler, Arg1, Arg2, Arg3, Arg4>(handler, arg1, arg2, arg3, - arg4); -} - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3, - typename Arg4, typename Arg5> -class binder5 -{ -public: - binder5(const Handler& handler, const Arg1& arg1, const Arg2& arg2, - const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) - : handler_(handler), - arg1_(arg1), - arg2_(arg2), - arg3_(arg3), - arg4_(arg4), - arg5_(arg5) - { - } - - binder5(Handler& handler, const Arg1& arg1, const Arg2& arg2, - const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) - : handler_(ASIO_MOVE_CAST(Handler)(handler)), - arg1_(arg1), - arg2_(arg2), - arg3_(arg3), - arg4_(arg4), - arg5_(arg5) - { - } - - void operator()() - { - handler_(static_cast<const Arg1&>(arg1_), - static_cast<const Arg2&>(arg2_), - static_cast<const Arg3&>(arg3_), - static_cast<const Arg4&>(arg4_), - static_cast<const Arg5&>(arg5_)); - } - - void operator()() const - { - handler_(arg1_, arg2_, arg3_, arg4_, arg5_); - } - -//private: - Handler handler_; - Arg1 arg1_; - Arg2 arg2_; - Arg3 arg3_; - Arg4 arg4_; - Arg5 arg5_; -}; - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3, - typename Arg4, typename Arg5> -inline void* asio_handler_allocate(std::size_t size, - binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); -} - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3, - typename Arg4, typename Arg5> -inline void asio_handler_deallocate(void* pointer, std::size_t size, - binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); -} - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3, - typename Arg4, typename Arg5> -inline bool asio_handler_is_continuation( - binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler) -{ - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); -} - -template <typename Function, typename Handler, typename Arg1, typename Arg2, - typename Arg3, typename Arg4, typename Arg5> -inline void asio_handler_invoke(Function& function, - binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template <typename Function, typename Handler, typename Arg1, typename Arg2, - typename Arg3, typename Arg4, typename Arg5> -inline void asio_handler_invoke(const Function& function, - binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3, - typename Arg4, typename Arg5> -inline binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5> bind_handler( - Handler handler, const Arg1& arg1, const Arg2& arg2, - const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) -{ - return binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>(handler, arg1, arg2, - arg3, arg4, arg5); + return binder2<Handler, Arg1, Arg2>(0, + ASIO_MOVE_CAST(Handler)(handler), arg1, arg2); } } // namespace detail @@ -509,49 +246,6 @@ } }; -template <typename Handler, typename Arg1, typename Arg2, typename Arg3, - typename Allocator> -struct associated_allocator<detail::binder3<Handler, Arg1, Arg2, Arg3>, - Allocator> -{ - typedef typename associated_allocator<Handler, Allocator>::type type; - - static type get(const detail::binder3<Handler, Arg1, Arg2, Arg3>& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator<Handler, Allocator>::get(h.handler_, a); - } -}; - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3, - typename Arg4, typename Allocator> -struct associated_allocator<detail::binder4<Handler, Arg1, Arg2, Arg3, Arg4>, - Allocator> -{ - typedef typename associated_allocator<Handler, Allocator>::type type; - - static type get(const detail::binder4<Handler, Arg1, Arg2, Arg3, Arg4>& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator<Handler, Allocator>::get(h.handler_, a); - } -}; - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3, - typename Arg4, typename Arg5, typename Allocator> -struct associated_allocator< - detail::binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>, Allocator> -{ - typedef typename associated_allocator<Handler, Allocator>::type type; - - static type get( - const detail::binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator<Handler, Allocator>::get(h.handler_, a); - } -}; - template <typename Handler, typename Arg1, typename Executor> struct associated_executor<detail::binder1<Handler, Arg1>, Executor> { @@ -576,49 +270,6 @@ } }; -template <typename Handler, typename Arg1, typename Arg2, typename Arg3, - typename Executor> -struct associated_executor<detail::binder3<Handler, Arg1, Arg2, Arg3>, - Executor> -{ - typedef typename associated_executor<Handler, Executor>::type type; - - static type get(const detail::binder3<Handler, Arg1, Arg2, Arg3>& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor<Handler, Executor>::get(h.handler_, ex); - } -}; - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3, - typename Arg4, typename Executor> -struct associated_executor<detail::binder4<Handler, Arg1, Arg2, Arg3, Arg4>, - Executor> -{ - typedef typename associated_executor<Handler, Executor>::type type; - - static type get(const detail::binder4<Handler, Arg1, Arg2, Arg3, Arg4>& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor<Handler, Executor>::get(h.handler_, ex); - } -}; - -template <typename Handler, typename Arg1, typename Arg2, typename Arg3, - typename Arg4, typename Arg5, typename Executor> -struct associated_executor< - detail::binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>, Executor> -{ - typedef typename associated_executor<Handler, Executor>::type type; - - static type get( - const detail::binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor<Handler, Executor>::get(h.handler_, ex); - } -}; - } // namespace asio #include "asio/detail/pop_options.hpp"
diff --git a/asio/include/asio/detail/executor_op.hpp b/asio/include/asio/detail/executor_op.hpp index 6bace4d..a8b97ca 100644 --- a/asio/include/asio/detail/executor_op.hpp +++ b/asio/include/asio/detail/executor_op.hpp
@@ -25,21 +25,21 @@ namespace asio { namespace detail { -template <typename Handler, typename Alloc> -class executor_op : public scheduler_operation +template <typename Handler, typename Alloc, + typename Operation = scheduler_operation> +class executor_op : public Operation { public: ASIO_DEFINE_HANDLER_ALLOCATOR_PTR(executor_op, Alloc); executor_op(Handler& h, const Alloc& allocator) - : scheduler_operation(&executor_op::do_complete), + : Operation(&executor_op::do_complete), handler_(ASIO_MOVE_CAST(Handler)(h)), allocator_(allocator) { } - static void do_complete(void* owner, - scheduler_operation* base, + static void do_complete(void* owner, Operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) {
diff --git a/asio/include/asio/detail/work_dispatcher.hpp b/asio/include/asio/detail/work_dispatcher.hpp index 3ee4797..c4124b9 100644 --- a/asio/include/asio/detail/work_dispatcher.hpp +++ b/asio/include/asio/detail/work_dispatcher.hpp
@@ -35,6 +35,21 @@ { } +#if defined(ASIO_HAS_MOVE) + work_dispatcher(const work_dispatcher& other) + : work_(other.work_), + handler_(other.handler_) + { + } + + work_dispatcher(work_dispatcher&& other) + : work_(ASIO_MOVE_CAST(executor_work< + typename associated_executor<Handler>::type>)(other.work_)), + handler_(ASIO_MOVE_CAST(Handler)(other.handler_)) + { + } +#endif // defined(ASIO_HAS_MOVE) + void operator()() { typename associated_executor<Handler>::type ex(work_.get_executor());
diff --git a/asio/include/asio/impl/io_service.hpp b/asio/include/asio/impl/io_service.hpp index d113056..f1a887f 100644 --- a/asio/include/asio/impl/io_service.hpp +++ b/asio/include/asio/impl/io_service.hpp
@@ -180,7 +180,7 @@ alloc_type allocator(detail::get_recycling_allocator<Allocator>::get(a)); // Allocate and construct an operation to wrap the function. - typedef detail::executor_op<function_type, alloc_type> op; + typedef detail::executor_op<function_type, alloc_type, detail::operation> op; typename op::ptr p = { allocator, 0, 0 }; p.v = p.a.allocate(1); p.p = new (p.v) op(tmp, allocator); @@ -204,7 +204,7 @@ alloc_type allocator(detail::get_recycling_allocator<Allocator>::get(a)); // Allocate and construct an operation to wrap the function. - typedef detail::executor_op<function_type, alloc_type> op; + typedef detail::executor_op<function_type, alloc_type, detail::operation> op; typename op::ptr p = { allocator, 0, 0 }; p.v = p.a.allocate(1); p.p = new (p.v) op(tmp, allocator); @@ -228,7 +228,7 @@ alloc_type allocator(detail::get_recycling_allocator<Allocator>::get(a)); // Allocate and construct an operation to wrap the function. - typedef detail::executor_op<function_type, alloc_type> op; + typedef detail::executor_op<function_type, alloc_type, detail::operation> op; typename op::ptr p = { allocator, 0, 0 }; p.v = p.a.allocate(1); p.p = new (p.v) op(tmp, allocator);