Chris@16: // Chris@16: // detail/bind_handler.hpp Chris@16: // ~~~~~~~~~~~~~~~~~~~~~~~ Chris@16: // Chris@101: // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: Chris@16: #ifndef BOOST_ASIO_DETAIL_BIND_HANDLER_HPP Chris@16: #define BOOST_ASIO_DETAIL_BIND_HANDLER_HPP Chris@16: Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: # pragma once Chris@16: #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace asio { Chris@16: namespace detail { Chris@16: Chris@16: template Chris@16: class binder1 Chris@16: { Chris@16: public: Chris@16: binder1(const Handler& handler, const Arg1& arg1) Chris@16: : handler_(handler), Chris@16: arg1_(arg1) Chris@16: { Chris@16: } Chris@16: Chris@16: binder1(Handler& handler, const Arg1& arg1) Chris@16: : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)), Chris@16: arg1_(arg1) Chris@16: { Chris@16: } Chris@16: Chris@16: void operator()() Chris@16: { Chris@16: handler_(static_cast(arg1_)); Chris@16: } Chris@16: Chris@16: void operator()() const Chris@16: { Chris@16: handler_(arg1_); Chris@16: } Chris@16: Chris@16: //private: Chris@16: Handler handler_; Chris@16: Arg1 arg1_; Chris@16: }; Chris@16: Chris@16: template Chris@16: inline void* asio_handler_allocate(std::size_t size, Chris@16: binder1* this_handler) Chris@16: { Chris@16: return boost_asio_handler_alloc_helpers::allocate( Chris@16: size, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void asio_handler_deallocate(void* pointer, std::size_t size, Chris@16: binder1* this_handler) Chris@16: { Chris@16: boost_asio_handler_alloc_helpers::deallocate( Chris@16: pointer, size, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool asio_handler_is_continuation( Chris@16: binder1* this_handler) Chris@16: { Chris@16: return boost_asio_handler_cont_helpers::is_continuation( Chris@16: this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void asio_handler_invoke(Function& function, Chris@16: binder1* this_handler) Chris@16: { Chris@16: boost_asio_handler_invoke_helpers::invoke( Chris@16: function, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void asio_handler_invoke(const Function& function, Chris@16: binder1* this_handler) Chris@16: { Chris@16: boost_asio_handler_invoke_helpers::invoke( Chris@16: function, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline binder1 bind_handler(Handler handler, Chris@16: const Arg1& arg1) Chris@16: { Chris@16: return binder1(handler, arg1); Chris@16: } Chris@16: Chris@16: template Chris@16: class binder2 Chris@16: { Chris@16: public: Chris@16: binder2(const Handler& handler, const Arg1& arg1, const Arg2& arg2) Chris@16: : handler_(handler), Chris@16: arg1_(arg1), Chris@16: arg2_(arg2) Chris@16: { Chris@16: } Chris@16: Chris@16: binder2(Handler& handler, const Arg1& arg1, const Arg2& arg2) Chris@16: : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)), Chris@16: arg1_(arg1), Chris@16: arg2_(arg2) Chris@16: { Chris@16: } Chris@16: Chris@16: void operator()() Chris@16: { Chris@16: handler_(static_cast(arg1_), Chris@16: static_cast(arg2_)); Chris@16: } Chris@16: Chris@16: void operator()() const Chris@16: { Chris@16: handler_(arg1_, arg2_); Chris@16: } Chris@16: Chris@16: //private: Chris@16: Handler handler_; Chris@16: Arg1 arg1_; Chris@16: Arg2 arg2_; Chris@16: }; Chris@16: Chris@16: template Chris@16: inline void* asio_handler_allocate(std::size_t size, Chris@16: binder2* this_handler) Chris@16: { Chris@16: return boost_asio_handler_alloc_helpers::allocate( Chris@16: size, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void asio_handler_deallocate(void* pointer, std::size_t size, Chris@16: binder2* this_handler) Chris@16: { Chris@16: boost_asio_handler_alloc_helpers::deallocate( Chris@16: pointer, size, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool asio_handler_is_continuation( Chris@16: binder2* this_handler) Chris@16: { Chris@16: return boost_asio_handler_cont_helpers::is_continuation( Chris@16: this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void asio_handler_invoke(Function& function, Chris@16: binder2* this_handler) Chris@16: { Chris@16: boost_asio_handler_invoke_helpers::invoke( Chris@16: function, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void asio_handler_invoke(const Function& function, Chris@16: binder2* this_handler) Chris@16: { Chris@16: boost_asio_handler_invoke_helpers::invoke( Chris@16: function, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline binder2 bind_handler(Handler handler, Chris@16: const Arg1& arg1, const Arg2& arg2) Chris@16: { Chris@16: return binder2(handler, arg1, arg2); Chris@16: } Chris@16: Chris@16: template Chris@16: class binder3 Chris@16: { Chris@16: public: Chris@16: binder3(const Handler& handler, const Arg1& arg1, const Arg2& arg2, Chris@16: const Arg3& arg3) Chris@16: : handler_(handler), Chris@16: arg1_(arg1), Chris@16: arg2_(arg2), Chris@16: arg3_(arg3) Chris@16: { Chris@16: } Chris@16: Chris@16: binder3(Handler& handler, const Arg1& arg1, const Arg2& arg2, Chris@16: const Arg3& arg3) Chris@16: : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)), Chris@16: arg1_(arg1), Chris@16: arg2_(arg2), Chris@16: arg3_(arg3) Chris@16: { Chris@16: } Chris@16: Chris@16: void operator()() Chris@16: { Chris@16: handler_(static_cast(arg1_), Chris@16: static_cast(arg2_), Chris@16: static_cast(arg3_)); Chris@16: } Chris@16: Chris@16: void operator()() const Chris@16: { Chris@16: handler_(arg1_, arg2_, arg3_); Chris@16: } Chris@16: Chris@16: //private: Chris@16: Handler handler_; Chris@16: Arg1 arg1_; Chris@16: Arg2 arg2_; Chris@16: Arg3 arg3_; Chris@16: }; Chris@16: Chris@16: template Chris@16: inline void* asio_handler_allocate(std::size_t size, Chris@16: binder3* this_handler) Chris@16: { Chris@16: return boost_asio_handler_alloc_helpers::allocate( Chris@16: size, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void asio_handler_deallocate(void* pointer, std::size_t size, Chris@16: binder3* this_handler) Chris@16: { Chris@16: boost_asio_handler_alloc_helpers::deallocate( Chris@16: pointer, size, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool asio_handler_is_continuation( Chris@16: binder3* this_handler) Chris@16: { Chris@16: return boost_asio_handler_cont_helpers::is_continuation( Chris@16: this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void asio_handler_invoke(Function& function, Chris@16: binder3* this_handler) Chris@16: { Chris@16: boost_asio_handler_invoke_helpers::invoke( Chris@16: function, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void asio_handler_invoke(const Function& function, Chris@16: binder3* this_handler) Chris@16: { Chris@16: boost_asio_handler_invoke_helpers::invoke( Chris@16: function, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline binder3 bind_handler(Handler handler, Chris@16: const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) Chris@16: { Chris@16: return binder3(handler, arg1, arg2, arg3); Chris@16: } Chris@16: Chris@16: template Chris@16: class binder4 Chris@16: { Chris@16: public: Chris@16: binder4(const Handler& handler, const Arg1& arg1, const Arg2& arg2, Chris@16: const Arg3& arg3, const Arg4& arg4) Chris@16: : handler_(handler), Chris@16: arg1_(arg1), Chris@16: arg2_(arg2), Chris@16: arg3_(arg3), Chris@16: arg4_(arg4) Chris@16: { Chris@16: } Chris@16: Chris@16: binder4(Handler& handler, const Arg1& arg1, const Arg2& arg2, Chris@16: const Arg3& arg3, const Arg4& arg4) Chris@16: : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)), Chris@16: arg1_(arg1), Chris@16: arg2_(arg2), Chris@16: arg3_(arg3), Chris@16: arg4_(arg4) Chris@16: { Chris@16: } Chris@16: Chris@16: void operator()() Chris@16: { Chris@16: handler_(static_cast(arg1_), Chris@16: static_cast(arg2_), Chris@16: static_cast(arg3_), Chris@16: static_cast(arg4_)); Chris@16: } Chris@16: Chris@16: void operator()() const Chris@16: { Chris@16: handler_(arg1_, arg2_, arg3_, arg4_); Chris@16: } Chris@16: Chris@16: //private: Chris@16: Handler handler_; Chris@16: Arg1 arg1_; Chris@16: Arg2 arg2_; Chris@16: Arg3 arg3_; Chris@16: Arg4 arg4_; Chris@16: }; Chris@16: Chris@16: template Chris@16: inline void* asio_handler_allocate(std::size_t size, Chris@16: binder4* this_handler) Chris@16: { Chris@16: return boost_asio_handler_alloc_helpers::allocate( Chris@16: size, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void asio_handler_deallocate(void* pointer, std::size_t size, Chris@16: binder4* this_handler) Chris@16: { Chris@16: boost_asio_handler_alloc_helpers::deallocate( Chris@16: pointer, size, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool asio_handler_is_continuation( Chris@16: binder4* this_handler) Chris@16: { Chris@16: return boost_asio_handler_cont_helpers::is_continuation( Chris@16: this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void asio_handler_invoke(Function& function, Chris@16: binder4* this_handler) Chris@16: { Chris@16: boost_asio_handler_invoke_helpers::invoke( Chris@16: function, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void asio_handler_invoke(const Function& function, Chris@16: binder4* this_handler) Chris@16: { Chris@16: boost_asio_handler_invoke_helpers::invoke( Chris@16: function, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline binder4 bind_handler( Chris@16: Handler handler, const Arg1& arg1, const Arg2& arg2, Chris@16: const Arg3& arg3, const Arg4& arg4) Chris@16: { Chris@16: return binder4(handler, arg1, arg2, arg3, Chris@16: arg4); Chris@16: } Chris@16: Chris@16: template Chris@16: class binder5 Chris@16: { Chris@16: public: Chris@16: binder5(const Handler& handler, const Arg1& arg1, const Arg2& arg2, Chris@16: const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) Chris@16: : handler_(handler), Chris@16: arg1_(arg1), Chris@16: arg2_(arg2), Chris@16: arg3_(arg3), Chris@16: arg4_(arg4), Chris@16: arg5_(arg5) Chris@16: { Chris@16: } Chris@16: Chris@16: binder5(Handler& handler, const Arg1& arg1, const Arg2& arg2, Chris@16: const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) Chris@16: : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)), Chris@16: arg1_(arg1), Chris@16: arg2_(arg2), Chris@16: arg3_(arg3), Chris@16: arg4_(arg4), Chris@16: arg5_(arg5) Chris@16: { Chris@16: } Chris@16: Chris@16: void operator()() Chris@16: { Chris@16: handler_(static_cast(arg1_), Chris@16: static_cast(arg2_), Chris@16: static_cast(arg3_), Chris@16: static_cast(arg4_), Chris@16: static_cast(arg5_)); Chris@16: } Chris@16: Chris@16: void operator()() const Chris@16: { Chris@16: handler_(arg1_, arg2_, arg3_, arg4_, arg5_); Chris@16: } Chris@16: Chris@16: //private: Chris@16: Handler handler_; Chris@16: Arg1 arg1_; Chris@16: Arg2 arg2_; Chris@16: Arg3 arg3_; Chris@16: Arg4 arg4_; Chris@16: Arg5 arg5_; Chris@16: }; Chris@16: Chris@16: template Chris@16: inline void* asio_handler_allocate(std::size_t size, Chris@16: binder5* this_handler) Chris@16: { Chris@16: return boost_asio_handler_alloc_helpers::allocate( Chris@16: size, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void asio_handler_deallocate(void* pointer, std::size_t size, Chris@16: binder5* this_handler) Chris@16: { Chris@16: boost_asio_handler_alloc_helpers::deallocate( Chris@16: pointer, size, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool asio_handler_is_continuation( Chris@16: binder5* this_handler) Chris@16: { Chris@16: return boost_asio_handler_cont_helpers::is_continuation( Chris@16: this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void asio_handler_invoke(Function& function, Chris@16: binder5* this_handler) Chris@16: { Chris@16: boost_asio_handler_invoke_helpers::invoke( Chris@16: function, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void asio_handler_invoke(const Function& function, Chris@16: binder5* this_handler) Chris@16: { Chris@16: boost_asio_handler_invoke_helpers::invoke( Chris@16: function, this_handler->handler_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline binder5 bind_handler( Chris@16: Handler handler, const Arg1& arg1, const Arg2& arg2, Chris@16: const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) Chris@16: { Chris@16: return binder5(handler, arg1, arg2, Chris@16: arg3, arg4, arg5); Chris@16: } Chris@16: Chris@16: } // namespace detail Chris@16: } // namespace asio Chris@16: } // namespace boost Chris@16: Chris@16: #include Chris@16: Chris@16: #endif // BOOST_ASIO_DETAIL_BIND_HANDLER_HPP