// // detail/bind_handler.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef BOOST_ASIO_DETAIL_BIND_HANDLER_HPP #define BOOST_ASIO_DETAIL_BIND_HANDLER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include #include #include #include #include namespace boost { namespace asio { namespace detail { template class binder0 { public: template binder0(int, T&& handler) : handler_(static_cast(handler)) { } binder0(Handler& handler) : handler_(static_cast(handler)) { } binder0(const binder0& other) : handler_(other.handler_) { } binder0(binder0&& other) : handler_(static_cast(other.handler_)) { } void operator()() { static_cast(handler_)(); } void operator()() const { handler_(); } //private: Handler handler_; }; template inline bool asio_handler_is_continuation( binder0* this_handler) { return boost_asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline binder0> bind_handler( Handler&& handler) { return binder0>( 0, static_cast(handler)); } template class binder1 { public: template binder1(int, T&& handler, const Arg1& arg1) : handler_(static_cast(handler)), arg1_(arg1) { } binder1(Handler& handler, const Arg1& arg1) : handler_(static_cast(handler)), arg1_(arg1) { } binder1(const binder1& other) : handler_(other.handler_), arg1_(other.arg1_) { } binder1(binder1&& other) : handler_(static_cast(other.handler_)), arg1_(static_cast(other.arg1_)) { } void operator()() { static_cast(handler_)( static_cast(arg1_)); } void operator()() const { handler_(arg1_); } //private: Handler handler_; Arg1 arg1_; }; template inline bool asio_handler_is_continuation( binder1* this_handler) { return boost_asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline binder1, Arg1> bind_handler( Handler&& handler, const Arg1& arg1) { return binder1, Arg1>(0, static_cast(handler), arg1); } template class binder2 { public: template binder2(int, T&& handler, const Arg1& arg1, const Arg2& arg2) : handler_(static_cast(handler)), arg1_(arg1), arg2_(arg2) { } binder2(Handler& handler, const Arg1& arg1, const Arg2& arg2) : handler_(static_cast(handler)), arg1_(arg1), arg2_(arg2) { } binder2(const binder2& other) : handler_(other.handler_), arg1_(other.arg1_), arg2_(other.arg2_) { } binder2(binder2&& other) : handler_(static_cast(other.handler_)), arg1_(static_cast(other.arg1_)), arg2_(static_cast(other.arg2_)) { } void operator()() { static_cast(handler_)( static_cast(arg1_), static_cast(arg2_)); } void operator()() const { handler_(arg1_, arg2_); } //private: Handler handler_; Arg1 arg1_; Arg2 arg2_; }; template inline bool asio_handler_is_continuation( binder2* this_handler) { return boost_asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline binder2, Arg1, Arg2> bind_handler( Handler&& handler, const Arg1& arg1, const Arg2& arg2) { return binder2, Arg1, Arg2>(0, static_cast(handler), arg1, arg2); } template class binder3 { public: template binder3(int, T&& handler, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) : handler_(static_cast(handler)), arg1_(arg1), arg2_(arg2), arg3_(arg3) { } binder3(Handler& handler, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) : handler_(static_cast(handler)), arg1_(arg1), arg2_(arg2), arg3_(arg3) { } binder3(const binder3& other) : handler_(other.handler_), arg1_(other.arg1_), arg2_(other.arg2_), arg3_(other.arg3_) { } binder3(binder3&& other) : handler_(static_cast(other.handler_)), arg1_(static_cast(other.arg1_)), arg2_(static_cast(other.arg2_)), arg3_(static_cast(other.arg3_)) { } void operator()() { static_cast(handler_)( static_cast(arg1_), static_cast(arg2_), static_cast(arg3_)); } void operator()() const { handler_(arg1_, arg2_, arg3_); } //private: Handler handler_; Arg1 arg1_; Arg2 arg2_; Arg3 arg3_; }; template inline bool asio_handler_is_continuation( binder3* this_handler) { return boost_asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline binder3, Arg1, Arg2, Arg3> bind_handler( Handler&& handler, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) { return binder3, Arg1, Arg2, Arg3>(0, static_cast(handler), arg1, arg2, arg3); } template class binder4 { public: template binder4(int, T&& handler, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4) : handler_(static_cast(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_(static_cast(handler)), arg1_(arg1), arg2_(arg2), arg3_(arg3), arg4_(arg4) { } binder4(const binder4& other) : handler_(other.handler_), arg1_(other.arg1_), arg2_(other.arg2_), arg3_(other.arg3_), arg4_(other.arg4_) { } binder4(binder4&& other) : handler_(static_cast(other.handler_)), arg1_(static_cast(other.arg1_)), arg2_(static_cast(other.arg2_)), arg3_(static_cast(other.arg3_)), arg4_(static_cast(other.arg4_)) { } void operator()() { static_cast(handler_)( static_cast(arg1_), static_cast(arg2_), static_cast(arg3_), static_cast(arg4_)); } void operator()() const { handler_(arg1_, arg2_, arg3_, arg4_); } //private: Handler handler_; Arg1 arg1_; Arg2 arg2_; Arg3 arg3_; Arg4 arg4_; }; template inline bool asio_handler_is_continuation( binder4* this_handler) { return boost_asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline binder4, Arg1, Arg2, Arg3, Arg4> bind_handler(Handler&& handler, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4) { return binder4, Arg1, Arg2, Arg3, Arg4>(0, static_cast(handler), arg1, arg2, arg3, arg4); } template class binder5 { public: template binder5(int, T&& handler, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) : handler_(static_cast(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_(static_cast(handler)), arg1_(arg1), arg2_(arg2), arg3_(arg3), arg4_(arg4), arg5_(arg5) { } binder5(const binder5& other) : handler_(other.handler_), arg1_(other.arg1_), arg2_(other.arg2_), arg3_(other.arg3_), arg4_(other.arg4_), arg5_(other.arg5_) { } binder5(binder5&& other) : handler_(static_cast(other.handler_)), arg1_(static_cast(other.arg1_)), arg2_(static_cast(other.arg2_)), arg3_(static_cast(other.arg3_)), arg4_(static_cast(other.arg4_)), arg5_(static_cast(other.arg5_)) { } void operator()() { static_cast(handler_)( static_cast(arg1_), static_cast(arg2_), static_cast(arg3_), static_cast(arg4_), static_cast(arg5_)); } void operator()() const { handler_(arg1_, arg2_, arg3_, arg4_, arg5_); } //private: Handler handler_; Arg1 arg1_; Arg2 arg2_; Arg3 arg3_; Arg4 arg4_; Arg5 arg5_; }; template inline bool asio_handler_is_continuation( binder5* this_handler) { return boost_asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline binder5, 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, Arg1, Arg2, Arg3, Arg4, Arg5>(0, static_cast(handler), arg1, arg2, arg3, arg4, arg5); } template class move_binder1 { public: move_binder1(int, Handler&& handler, Arg1&& arg1) : handler_(static_cast(handler)), arg1_(static_cast(arg1)) { } move_binder1(move_binder1&& other) : handler_(static_cast(other.handler_)), arg1_(static_cast(other.arg1_)) { } void operator()() { static_cast(handler_)( static_cast(arg1_)); } //private: Handler handler_; Arg1 arg1_; }; template inline bool asio_handler_is_continuation( move_binder1* this_handler) { return boost_asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template class move_binder2 { public: move_binder2(int, Handler&& handler, const Arg1& arg1, Arg2&& arg2) : handler_(static_cast(handler)), arg1_(arg1), arg2_(static_cast(arg2)) { } move_binder2(move_binder2&& other) : handler_(static_cast(other.handler_)), arg1_(static_cast(other.arg1_)), arg2_(static_cast(other.arg2_)) { } void operator()() { static_cast(handler_)( static_cast(arg1_), static_cast(arg2_)); } //private: Handler handler_; Arg1 arg1_; Arg2 arg2_; }; template inline bool asio_handler_is_continuation( move_binder2* this_handler) { return boost_asio_handler_cont_helpers::is_continuation( this_handler->handler_); } } // namespace detail template