2 // detail/bind_handler.hpp
3 // ~~~~~~~~~~~~~~~~~~~~~~~
5 // Copyright (c) 2003-2022 Christopher M. Kohlhoff (chris at kohlhoff dot com)
7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
11 #ifndef BOOST_ASIO_DETAIL_BIND_HANDLER_HPP
12 #define BOOST_ASIO_DETAIL_BIND_HANDLER_HPP
14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
18 #include <boost/asio/detail/config.hpp>
19 #include <boost/asio/associator.hpp>
20 #include <boost/asio/detail/handler_alloc_helpers.hpp>
21 #include <boost/asio/detail/handler_cont_helpers.hpp>
22 #include <boost/asio/detail/handler_invoke_helpers.hpp>
23 #include <boost/asio/detail/type_traits.hpp>
25 #include <boost/asio/detail/push_options.hpp>
31 template <typename Handler>
36 binder0(int, BOOST_ASIO_MOVE_ARG(T) handler)
37 : handler_(BOOST_ASIO_MOVE_CAST(T)(handler))
41 binder0(Handler& handler)
42 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler))
46 #if defined(BOOST_ASIO_HAS_MOVE)
47 binder0(const binder0& other)
48 : handler_(other.handler_)
52 binder0(binder0&& other)
53 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(other.handler_))
56 #endif // defined(BOOST_ASIO_HAS_MOVE)
60 BOOST_ASIO_MOVE_OR_LVALUE(Handler)(handler_)();
63 void operator()() const
72 template <typename Handler>
73 inline asio_handler_allocate_is_deprecated
74 asio_handler_allocate(std::size_t size,
75 binder0<Handler>* this_handler)
77 #if defined(BOOST_ASIO_NO_DEPRECATED)
78 boost_asio_handler_alloc_helpers::allocate(size, this_handler->handler_);
79 return asio_handler_allocate_is_no_longer_used();
80 #else // defined(BOOST_ASIO_NO_DEPRECATED)
81 return boost_asio_handler_alloc_helpers::allocate(
82 size, this_handler->handler_);
83 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
86 template <typename Handler>
87 inline asio_handler_deallocate_is_deprecated
88 asio_handler_deallocate(void* pointer, std::size_t size,
89 binder0<Handler>* this_handler)
91 boost_asio_handler_alloc_helpers::deallocate(
92 pointer, size, this_handler->handler_);
93 #if defined(BOOST_ASIO_NO_DEPRECATED)
94 return asio_handler_deallocate_is_no_longer_used();
95 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
98 template <typename Handler>
99 inline bool asio_handler_is_continuation(
100 binder0<Handler>* this_handler)
102 return boost_asio_handler_cont_helpers::is_continuation(
103 this_handler->handler_);
106 template <typename Function, typename Handler>
107 inline asio_handler_invoke_is_deprecated
108 asio_handler_invoke(Function& function,
109 binder0<Handler>* this_handler)
111 boost_asio_handler_invoke_helpers::invoke(
112 function, this_handler->handler_);
113 #if defined(BOOST_ASIO_NO_DEPRECATED)
114 return asio_handler_invoke_is_no_longer_used();
115 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
118 template <typename Function, typename Handler>
119 inline asio_handler_invoke_is_deprecated
120 asio_handler_invoke(const Function& function,
121 binder0<Handler>* this_handler)
123 boost_asio_handler_invoke_helpers::invoke(
124 function, this_handler->handler_);
125 #if defined(BOOST_ASIO_NO_DEPRECATED)
126 return asio_handler_invoke_is_no_longer_used();
127 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
130 template <typename Handler>
131 inline binder0<typename decay<Handler>::type> bind_handler(
132 BOOST_ASIO_MOVE_ARG(Handler) handler)
134 return binder0<typename decay<Handler>::type>(
135 0, BOOST_ASIO_MOVE_CAST(Handler)(handler));
138 template <typename Handler, typename Arg1>
142 template <typename T>
143 binder1(int, BOOST_ASIO_MOVE_ARG(T) handler, const Arg1& arg1)
144 : handler_(BOOST_ASIO_MOVE_CAST(T)(handler)),
149 binder1(Handler& handler, const Arg1& arg1)
150 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
155 #if defined(BOOST_ASIO_HAS_MOVE)
156 binder1(const binder1& other)
157 : handler_(other.handler_),
162 binder1(binder1&& other)
163 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(other.handler_)),
164 arg1_(BOOST_ASIO_MOVE_CAST(Arg1)(other.arg1_))
167 #endif // defined(BOOST_ASIO_HAS_MOVE)
171 BOOST_ASIO_MOVE_OR_LVALUE(Handler)(handler_)(
172 static_cast<const Arg1&>(arg1_));
175 void operator()() const
185 template <typename Handler, typename Arg1>
186 inline asio_handler_allocate_is_deprecated
187 asio_handler_allocate(std::size_t size,
188 binder1<Handler, Arg1>* this_handler)
190 #if defined(BOOST_ASIO_NO_DEPRECATED)
191 boost_asio_handler_alloc_helpers::allocate(size, this_handler->handler_);
192 return asio_handler_allocate_is_no_longer_used();
193 #else // defined(BOOST_ASIO_NO_DEPRECATED)
194 return boost_asio_handler_alloc_helpers::allocate(
195 size, this_handler->handler_);
196 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
199 template <typename Handler, typename Arg1>
200 inline asio_handler_deallocate_is_deprecated
201 asio_handler_deallocate(void* pointer, std::size_t size,
202 binder1<Handler, Arg1>* this_handler)
204 boost_asio_handler_alloc_helpers::deallocate(
205 pointer, size, this_handler->handler_);
206 #if defined(BOOST_ASIO_NO_DEPRECATED)
207 return asio_handler_deallocate_is_no_longer_used();
208 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
211 template <typename Handler, typename Arg1>
212 inline bool asio_handler_is_continuation(
213 binder1<Handler, Arg1>* this_handler)
215 return boost_asio_handler_cont_helpers::is_continuation(
216 this_handler->handler_);
219 template <typename Function, typename Handler, typename Arg1>
220 inline asio_handler_invoke_is_deprecated
221 asio_handler_invoke(Function& function,
222 binder1<Handler, Arg1>* this_handler)
224 boost_asio_handler_invoke_helpers::invoke(
225 function, this_handler->handler_);
226 #if defined(BOOST_ASIO_NO_DEPRECATED)
227 return asio_handler_invoke_is_no_longer_used();
228 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
231 template <typename Function, typename Handler, typename Arg1>
232 inline asio_handler_invoke_is_deprecated
233 asio_handler_invoke(const Function& function,
234 binder1<Handler, Arg1>* this_handler)
236 boost_asio_handler_invoke_helpers::invoke(
237 function, this_handler->handler_);
238 #if defined(BOOST_ASIO_NO_DEPRECATED)
239 return asio_handler_invoke_is_no_longer_used();
240 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
243 template <typename Handler, typename Arg1>
244 inline binder1<typename decay<Handler>::type, Arg1> bind_handler(
245 BOOST_ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1)
247 return binder1<typename decay<Handler>::type, Arg1>(0,
248 BOOST_ASIO_MOVE_CAST(Handler)(handler), arg1);
251 template <typename Handler, typename Arg1, typename Arg2>
255 template <typename T>
256 binder2(int, BOOST_ASIO_MOVE_ARG(T) handler,
257 const Arg1& arg1, const Arg2& arg2)
258 : handler_(BOOST_ASIO_MOVE_CAST(T)(handler)),
264 binder2(Handler& handler, const Arg1& arg1, const Arg2& arg2)
265 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
271 #if defined(BOOST_ASIO_HAS_MOVE)
272 binder2(const binder2& other)
273 : handler_(other.handler_),
279 binder2(binder2&& other)
280 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(other.handler_)),
281 arg1_(BOOST_ASIO_MOVE_CAST(Arg1)(other.arg1_)),
282 arg2_(BOOST_ASIO_MOVE_CAST(Arg2)(other.arg2_))
285 #endif // defined(BOOST_ASIO_HAS_MOVE)
289 BOOST_ASIO_MOVE_OR_LVALUE(Handler)(handler_)(
290 static_cast<const Arg1&>(arg1_),
291 static_cast<const Arg2&>(arg2_));
294 void operator()() const
296 handler_(arg1_, arg2_);
305 template <typename Handler, typename Arg1, typename Arg2>
306 inline asio_handler_allocate_is_deprecated
307 asio_handler_allocate(std::size_t size,
308 binder2<Handler, Arg1, Arg2>* this_handler)
310 #if defined(BOOST_ASIO_NO_DEPRECATED)
311 boost_asio_handler_alloc_helpers::allocate(size, this_handler->handler_);
312 return asio_handler_allocate_is_no_longer_used();
313 #else // defined(BOOST_ASIO_NO_DEPRECATED)
314 return boost_asio_handler_alloc_helpers::allocate(
315 size, this_handler->handler_);
316 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
319 template <typename Handler, typename Arg1, typename Arg2>
320 inline asio_handler_deallocate_is_deprecated
321 asio_handler_deallocate(void* pointer, std::size_t size,
322 binder2<Handler, Arg1, Arg2>* this_handler)
324 boost_asio_handler_alloc_helpers::deallocate(
325 pointer, size, this_handler->handler_);
326 #if defined(BOOST_ASIO_NO_DEPRECATED)
327 return asio_handler_deallocate_is_no_longer_used();
328 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
331 template <typename Handler, typename Arg1, typename Arg2>
332 inline bool asio_handler_is_continuation(
333 binder2<Handler, Arg1, Arg2>* this_handler)
335 return boost_asio_handler_cont_helpers::is_continuation(
336 this_handler->handler_);
339 template <typename Function, typename Handler, typename Arg1, typename Arg2>
340 inline asio_handler_invoke_is_deprecated
341 asio_handler_invoke(Function& function,
342 binder2<Handler, Arg1, Arg2>* this_handler)
344 boost_asio_handler_invoke_helpers::invoke(
345 function, this_handler->handler_);
346 #if defined(BOOST_ASIO_NO_DEPRECATED)
347 return asio_handler_invoke_is_no_longer_used();
348 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
351 template <typename Function, typename Handler, typename Arg1, typename Arg2>
352 inline asio_handler_invoke_is_deprecated
353 asio_handler_invoke(const Function& function,
354 binder2<Handler, Arg1, Arg2>* this_handler)
356 boost_asio_handler_invoke_helpers::invoke(
357 function, this_handler->handler_);
358 #if defined(BOOST_ASIO_NO_DEPRECATED)
359 return asio_handler_invoke_is_no_longer_used();
360 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
363 template <typename Handler, typename Arg1, typename Arg2>
364 inline binder2<typename decay<Handler>::type, Arg1, Arg2> bind_handler(
365 BOOST_ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1, const Arg2& arg2)
367 return binder2<typename decay<Handler>::type, Arg1, Arg2>(0,
368 BOOST_ASIO_MOVE_CAST(Handler)(handler), arg1, arg2);
371 template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
375 template <typename T>
376 binder3(int, BOOST_ASIO_MOVE_ARG(T) handler, const Arg1& arg1,
377 const Arg2& arg2, const Arg3& arg3)
378 : handler_(BOOST_ASIO_MOVE_CAST(T)(handler)),
385 binder3(Handler& handler, const Arg1& arg1,
386 const Arg2& arg2, const Arg3& arg3)
387 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
394 #if defined(BOOST_ASIO_HAS_MOVE)
395 binder3(const binder3& other)
396 : handler_(other.handler_),
403 binder3(binder3&& other)
404 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(other.handler_)),
405 arg1_(BOOST_ASIO_MOVE_CAST(Arg1)(other.arg1_)),
406 arg2_(BOOST_ASIO_MOVE_CAST(Arg2)(other.arg2_)),
407 arg3_(BOOST_ASIO_MOVE_CAST(Arg3)(other.arg3_))
410 #endif // defined(BOOST_ASIO_HAS_MOVE)
414 BOOST_ASIO_MOVE_OR_LVALUE(Handler)(handler_)(
415 static_cast<const Arg1&>(arg1_),
416 static_cast<const Arg2&>(arg2_),
417 static_cast<const Arg3&>(arg3_));
420 void operator()() const
422 handler_(arg1_, arg2_, arg3_);
432 template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
433 inline asio_handler_allocate_is_deprecated
434 asio_handler_allocate(std::size_t size,
435 binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
437 #if defined(BOOST_ASIO_NO_DEPRECATED)
438 boost_asio_handler_alloc_helpers::allocate(size, this_handler->handler_);
439 return asio_handler_allocate_is_no_longer_used();
440 #else // defined(BOOST_ASIO_NO_DEPRECATED)
441 return boost_asio_handler_alloc_helpers::allocate(
442 size, this_handler->handler_);
443 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
446 template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
447 inline asio_handler_deallocate_is_deprecated
448 asio_handler_deallocate(void* pointer, std::size_t size,
449 binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
451 boost_asio_handler_alloc_helpers::deallocate(
452 pointer, size, this_handler->handler_);
453 #if defined(BOOST_ASIO_NO_DEPRECATED)
454 return asio_handler_deallocate_is_no_longer_used();
455 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
458 template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
459 inline bool asio_handler_is_continuation(
460 binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
462 return boost_asio_handler_cont_helpers::is_continuation(
463 this_handler->handler_);
466 template <typename Function, typename Handler,
467 typename Arg1, typename Arg2, typename Arg3>
468 inline asio_handler_invoke_is_deprecated
469 asio_handler_invoke(Function& function,
470 binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
472 boost_asio_handler_invoke_helpers::invoke(
473 function, this_handler->handler_);
474 #if defined(BOOST_ASIO_NO_DEPRECATED)
475 return asio_handler_invoke_is_no_longer_used();
476 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
479 template <typename Function, typename Handler,
480 typename Arg1, typename Arg2, typename Arg3>
481 inline asio_handler_invoke_is_deprecated
482 asio_handler_invoke(const Function& function,
483 binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
485 boost_asio_handler_invoke_helpers::invoke(
486 function, this_handler->handler_);
487 #if defined(BOOST_ASIO_NO_DEPRECATED)
488 return asio_handler_invoke_is_no_longer_used();
489 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
492 template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
493 inline binder3<typename decay<Handler>::type, Arg1, Arg2, Arg3> bind_handler(
494 BOOST_ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1, const Arg2& arg2,
497 return binder3<typename decay<Handler>::type, Arg1, Arg2, Arg3>(0,
498 BOOST_ASIO_MOVE_CAST(Handler)(handler), arg1, arg2, arg3);
501 template <typename Handler, typename Arg1,
502 typename Arg2, typename Arg3, typename Arg4>
506 template <typename T>
507 binder4(int, BOOST_ASIO_MOVE_ARG(T) handler, const Arg1& arg1,
508 const Arg2& arg2, const Arg3& arg3, const Arg4& arg4)
509 : handler_(BOOST_ASIO_MOVE_CAST(T)(handler)),
517 binder4(Handler& handler, const Arg1& arg1,
518 const Arg2& arg2, const Arg3& arg3, const Arg4& arg4)
519 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
527 #if defined(BOOST_ASIO_HAS_MOVE)
528 binder4(const binder4& other)
529 : handler_(other.handler_),
537 binder4(binder4&& other)
538 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(other.handler_)),
539 arg1_(BOOST_ASIO_MOVE_CAST(Arg1)(other.arg1_)),
540 arg2_(BOOST_ASIO_MOVE_CAST(Arg2)(other.arg2_)),
541 arg3_(BOOST_ASIO_MOVE_CAST(Arg3)(other.arg3_)),
542 arg4_(BOOST_ASIO_MOVE_CAST(Arg4)(other.arg4_))
545 #endif // defined(BOOST_ASIO_HAS_MOVE)
549 BOOST_ASIO_MOVE_OR_LVALUE(Handler)(handler_)(
550 static_cast<const Arg1&>(arg1_),
551 static_cast<const Arg2&>(arg2_),
552 static_cast<const Arg3&>(arg3_),
553 static_cast<const Arg4&>(arg4_));
556 void operator()() const
558 handler_(arg1_, arg2_, arg3_, arg4_);
569 template <typename Handler, typename Arg1,
570 typename Arg2, typename Arg3, typename Arg4>
571 inline asio_handler_allocate_is_deprecated
572 asio_handler_allocate(std::size_t size,
573 binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
575 #if defined(BOOST_ASIO_NO_DEPRECATED)
576 boost_asio_handler_alloc_helpers::allocate(size, this_handler->handler_);
577 return asio_handler_allocate_is_no_longer_used();
578 #else // defined(BOOST_ASIO_NO_DEPRECATED)
579 return boost_asio_handler_alloc_helpers::allocate(
580 size, this_handler->handler_);
581 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
584 template <typename Handler, typename Arg1,
585 typename Arg2, typename Arg3, typename Arg4>
586 inline asio_handler_deallocate_is_deprecated
587 asio_handler_deallocate(void* pointer, std::size_t size,
588 binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
590 boost_asio_handler_alloc_helpers::deallocate(
591 pointer, size, this_handler->handler_);
592 #if defined(BOOST_ASIO_NO_DEPRECATED)
593 return asio_handler_deallocate_is_no_longer_used();
594 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
597 template <typename Handler, typename Arg1,
598 typename Arg2, typename Arg3, typename Arg4>
599 inline bool asio_handler_is_continuation(
600 binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
602 return boost_asio_handler_cont_helpers::is_continuation(
603 this_handler->handler_);
606 template <typename Function, typename Handler, typename Arg1,
607 typename Arg2, typename Arg3, typename Arg4>
608 inline asio_handler_invoke_is_deprecated
609 asio_handler_invoke(Function& function,
610 binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
612 boost_asio_handler_invoke_helpers::invoke(
613 function, this_handler->handler_);
614 #if defined(BOOST_ASIO_NO_DEPRECATED)
615 return asio_handler_invoke_is_no_longer_used();
616 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
619 template <typename Function, typename Handler, typename Arg1,
620 typename Arg2, typename Arg3, typename Arg4>
621 inline asio_handler_invoke_is_deprecated
622 asio_handler_invoke(const Function& function,
623 binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
625 boost_asio_handler_invoke_helpers::invoke(
626 function, this_handler->handler_);
627 #if defined(BOOST_ASIO_NO_DEPRECATED)
628 return asio_handler_invoke_is_no_longer_used();
629 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
632 template <typename Handler, typename Arg1,
633 typename Arg2, typename Arg3, typename Arg4>
634 inline binder4<typename decay<Handler>::type, Arg1, Arg2, Arg3, Arg4>
635 bind_handler(BOOST_ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1,
636 const Arg2& arg2, const Arg3& arg3, const Arg4& arg4)
638 return binder4<typename decay<Handler>::type, Arg1, Arg2, Arg3, Arg4>(0,
639 BOOST_ASIO_MOVE_CAST(Handler)(handler), arg1, arg2, arg3, arg4);
642 template <typename Handler, typename Arg1, typename Arg2,
643 typename Arg3, typename Arg4, typename Arg5>
647 template <typename T>
648 binder5(int, BOOST_ASIO_MOVE_ARG(T) handler, const Arg1& arg1,
649 const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5)
650 : handler_(BOOST_ASIO_MOVE_CAST(T)(handler)),
659 binder5(Handler& handler, const Arg1& arg1, const Arg2& arg2,
660 const Arg3& arg3, const Arg4& arg4, const Arg5& arg5)
661 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
670 #if defined(BOOST_ASIO_HAS_MOVE)
671 binder5(const binder5& other)
672 : handler_(other.handler_),
681 binder5(binder5&& other)
682 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(other.handler_)),
683 arg1_(BOOST_ASIO_MOVE_CAST(Arg1)(other.arg1_)),
684 arg2_(BOOST_ASIO_MOVE_CAST(Arg2)(other.arg2_)),
685 arg3_(BOOST_ASIO_MOVE_CAST(Arg3)(other.arg3_)),
686 arg4_(BOOST_ASIO_MOVE_CAST(Arg4)(other.arg4_)),
687 arg5_(BOOST_ASIO_MOVE_CAST(Arg5)(other.arg5_))
690 #endif // defined(BOOST_ASIO_HAS_MOVE)
694 BOOST_ASIO_MOVE_OR_LVALUE(Handler)(handler_)(
695 static_cast<const Arg1&>(arg1_),
696 static_cast<const Arg2&>(arg2_),
697 static_cast<const Arg3&>(arg3_),
698 static_cast<const Arg4&>(arg4_),
699 static_cast<const Arg5&>(arg5_));
702 void operator()() const
704 handler_(arg1_, arg2_, arg3_, arg4_, arg5_);
716 template <typename Handler, typename Arg1, typename Arg2,
717 typename Arg3, typename Arg4, typename Arg5>
718 inline asio_handler_allocate_is_deprecated
719 asio_handler_allocate(std::size_t size,
720 binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
722 #if defined(BOOST_ASIO_NO_DEPRECATED)
723 boost_asio_handler_alloc_helpers::allocate(size, this_handler->handler_);
724 return asio_handler_allocate_is_no_longer_used();
725 #else // defined(BOOST_ASIO_NO_DEPRECATED)
726 return boost_asio_handler_alloc_helpers::allocate(
727 size, this_handler->handler_);
728 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
731 template <typename Handler, typename Arg1, typename Arg2,
732 typename Arg3, typename Arg4, typename Arg5>
733 inline asio_handler_deallocate_is_deprecated
734 asio_handler_deallocate(void* pointer, std::size_t size,
735 binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
737 boost_asio_handler_alloc_helpers::deallocate(
738 pointer, size, this_handler->handler_);
739 #if defined(BOOST_ASIO_NO_DEPRECATED)
740 return asio_handler_deallocate_is_no_longer_used();
741 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
744 template <typename Handler, typename Arg1, typename Arg2,
745 typename Arg3, typename Arg4, typename Arg5>
746 inline bool asio_handler_is_continuation(
747 binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
749 return boost_asio_handler_cont_helpers::is_continuation(
750 this_handler->handler_);
753 template <typename Function, typename Handler, typename Arg1,
754 typename Arg2, typename Arg3, typename Arg4, typename Arg5>
755 inline asio_handler_invoke_is_deprecated
756 asio_handler_invoke(Function& function,
757 binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
759 boost_asio_handler_invoke_helpers::invoke(
760 function, this_handler->handler_);
761 #if defined(BOOST_ASIO_NO_DEPRECATED)
762 return asio_handler_invoke_is_no_longer_used();
763 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
766 template <typename Function, typename Handler, typename Arg1,
767 typename Arg2, typename Arg3, typename Arg4, typename Arg5>
768 inline asio_handler_invoke_is_deprecated
769 asio_handler_invoke(const Function& function,
770 binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
772 boost_asio_handler_invoke_helpers::invoke(
773 function, this_handler->handler_);
774 #if defined(BOOST_ASIO_NO_DEPRECATED)
775 return asio_handler_invoke_is_no_longer_used();
776 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
779 template <typename Handler, typename Arg1, typename Arg2,
780 typename Arg3, typename Arg4, typename Arg5>
781 inline binder5<typename decay<Handler>::type, Arg1, Arg2, Arg3, Arg4, Arg5>
782 bind_handler(BOOST_ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1,
783 const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5)
785 return binder5<typename decay<Handler>::type, Arg1, Arg2, Arg3, Arg4, Arg5>(0,
786 BOOST_ASIO_MOVE_CAST(Handler)(handler), arg1, arg2, arg3, arg4, arg5);
789 #if defined(BOOST_ASIO_HAS_MOVE)
791 template <typename Handler, typename Arg1>
795 move_binder1(int, BOOST_ASIO_MOVE_ARG(Handler) handler,
796 BOOST_ASIO_MOVE_ARG(Arg1) arg1)
797 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
798 arg1_(BOOST_ASIO_MOVE_CAST(Arg1)(arg1))
802 move_binder1(move_binder1&& other)
803 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(other.handler_)),
804 arg1_(BOOST_ASIO_MOVE_CAST(Arg1)(other.arg1_))
810 BOOST_ASIO_MOVE_OR_LVALUE(Handler)(handler_)(
811 BOOST_ASIO_MOVE_CAST(Arg1)(arg1_));
819 template <typename Handler, typename Arg1>
820 inline asio_handler_allocate_is_deprecated
821 asio_handler_allocate(std::size_t size,
822 move_binder1<Handler, Arg1>* this_handler)
824 #if defined(BOOST_ASIO_NO_DEPRECATED)
825 boost_asio_handler_alloc_helpers::allocate(size, this_handler->handler_);
826 return asio_handler_allocate_is_no_longer_used();
827 #else // defined(BOOST_ASIO_NO_DEPRECATED)
828 return boost_asio_handler_alloc_helpers::allocate(
829 size, this_handler->handler_);
830 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
833 template <typename Handler, typename Arg1>
834 inline asio_handler_deallocate_is_deprecated
835 asio_handler_deallocate(void* pointer, std::size_t size,
836 move_binder1<Handler, Arg1>* this_handler)
838 boost_asio_handler_alloc_helpers::deallocate(
839 pointer, size, this_handler->handler_);
840 #if defined(BOOST_ASIO_NO_DEPRECATED)
841 return asio_handler_deallocate_is_no_longer_used();
842 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
845 template <typename Handler, typename Arg1>
846 inline bool asio_handler_is_continuation(
847 move_binder1<Handler, Arg1>* this_handler)
849 return boost_asio_handler_cont_helpers::is_continuation(
850 this_handler->handler_);
853 template <typename Function, typename Handler, typename Arg1>
854 inline asio_handler_invoke_is_deprecated
855 asio_handler_invoke(BOOST_ASIO_MOVE_ARG(Function) function,
856 move_binder1<Handler, Arg1>* this_handler)
858 boost_asio_handler_invoke_helpers::invoke(
859 BOOST_ASIO_MOVE_CAST(Function)(function), this_handler->handler_);
860 #if defined(BOOST_ASIO_NO_DEPRECATED)
861 return asio_handler_invoke_is_no_longer_used();
862 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
865 template <typename Handler, typename Arg1, typename Arg2>
869 move_binder2(int, BOOST_ASIO_MOVE_ARG(Handler) handler,
870 const Arg1& arg1, BOOST_ASIO_MOVE_ARG(Arg2) arg2)
871 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
873 arg2_(BOOST_ASIO_MOVE_CAST(Arg2)(arg2))
877 move_binder2(move_binder2&& other)
878 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(other.handler_)),
879 arg1_(BOOST_ASIO_MOVE_CAST(Arg1)(other.arg1_)),
880 arg2_(BOOST_ASIO_MOVE_CAST(Arg2)(other.arg2_))
886 BOOST_ASIO_MOVE_OR_LVALUE(Handler)(handler_)(
887 static_cast<const Arg1&>(arg1_),
888 BOOST_ASIO_MOVE_CAST(Arg2)(arg2_));
897 template <typename Handler, typename Arg1, typename Arg2>
898 inline asio_handler_allocate_is_deprecated
899 asio_handler_allocate(std::size_t size,
900 move_binder2<Handler, Arg1, Arg2>* this_handler)
902 #if defined(BOOST_ASIO_NO_DEPRECATED)
903 boost_asio_handler_alloc_helpers::allocate(size, this_handler->handler_);
904 return asio_handler_allocate_is_no_longer_used();
905 #else // defined(BOOST_ASIO_NO_DEPRECATED)
906 return boost_asio_handler_alloc_helpers::allocate(
907 size, this_handler->handler_);
908 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
911 template <typename Handler, typename Arg1, typename Arg2>
912 inline asio_handler_deallocate_is_deprecated
913 asio_handler_deallocate(void* pointer, std::size_t size,
914 move_binder2<Handler, Arg1, Arg2>* this_handler)
916 boost_asio_handler_alloc_helpers::deallocate(
917 pointer, size, this_handler->handler_);
918 #if defined(BOOST_ASIO_NO_DEPRECATED)
919 return asio_handler_deallocate_is_no_longer_used();
920 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
923 template <typename Handler, typename Arg1, typename Arg2>
924 inline bool asio_handler_is_continuation(
925 move_binder2<Handler, Arg1, Arg2>* this_handler)
927 return boost_asio_handler_cont_helpers::is_continuation(
928 this_handler->handler_);
931 template <typename Function, typename Handler, typename Arg1, typename Arg2>
932 inline asio_handler_invoke_is_deprecated
933 asio_handler_invoke(BOOST_ASIO_MOVE_ARG(Function) function,
934 move_binder2<Handler, Arg1, Arg2>* this_handler)
936 boost_asio_handler_invoke_helpers::invoke(
937 BOOST_ASIO_MOVE_CAST(Function)(function), this_handler->handler_);
938 #if defined(BOOST_ASIO_NO_DEPRECATED)
939 return asio_handler_invoke_is_no_longer_used();
940 #endif // defined(BOOST_ASIO_NO_DEPRECATED)
943 #endif // defined(BOOST_ASIO_HAS_MOVE)
945 } // namespace detail
947 template <template <typename, typename> class Associator,
948 typename Handler, typename DefaultCandidate>
949 struct associator<Associator,
950 detail::binder0<Handler>, DefaultCandidate>
951 : Associator<Handler, DefaultCandidate>
953 static typename Associator<Handler, DefaultCandidate>::type get(
954 const detail::binder0<Handler>& h,
955 const DefaultCandidate& c = DefaultCandidate()) BOOST_ASIO_NOEXCEPT
957 return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
961 template <template <typename, typename> class Associator,
962 typename Handler, typename Arg1, typename DefaultCandidate>
963 struct associator<Associator,
964 detail::binder1<Handler, Arg1>, DefaultCandidate>
965 : Associator<Handler, DefaultCandidate>
967 static typename Associator<Handler, DefaultCandidate>::type get(
968 const detail::binder1<Handler, Arg1>& h,
969 const DefaultCandidate& c = DefaultCandidate()) BOOST_ASIO_NOEXCEPT
971 return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
975 template <template <typename, typename> class Associator,
976 typename Handler, typename Arg1, typename Arg2,
977 typename DefaultCandidate>
978 struct associator<Associator,
979 detail::binder2<Handler, Arg1, Arg2>, DefaultCandidate>
980 : Associator<Handler, DefaultCandidate>
982 static typename Associator<Handler, DefaultCandidate>::type get(
983 const detail::binder2<Handler, Arg1, Arg2>& h,
984 const DefaultCandidate& c = DefaultCandidate()) BOOST_ASIO_NOEXCEPT
986 return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
990 template <template <typename, typename> class Associator,
991 typename Handler, typename Arg1, typename Arg2, typename Arg3,
992 typename DefaultCandidate>
993 struct associator<Associator,
994 detail::binder3<Handler, Arg1, Arg2, Arg3>, DefaultCandidate>
995 : Associator<Handler, DefaultCandidate>
997 static typename Associator<Handler, DefaultCandidate>::type get(
998 const detail::binder3<Handler, Arg1, Arg2, Arg3>& h,
999 const DefaultCandidate& c = DefaultCandidate()) BOOST_ASIO_NOEXCEPT
1001 return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
1005 template <template <typename, typename> class Associator,
1006 typename Handler, typename Arg1, typename Arg2, typename Arg3,
1007 typename Arg4, typename DefaultCandidate>
1008 struct associator<Associator,
1009 detail::binder4<Handler, Arg1, Arg2, Arg3, Arg4>, DefaultCandidate>
1010 : Associator<Handler, DefaultCandidate>
1012 static typename Associator<Handler, DefaultCandidate>::type get(
1013 const detail::binder4<Handler, Arg1, Arg2, Arg3, Arg4>& h,
1014 const DefaultCandidate& c = DefaultCandidate()) BOOST_ASIO_NOEXCEPT
1016 return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
1020 template <template <typename, typename> class Associator,
1021 typename Handler, typename Arg1, typename Arg2, typename Arg3,
1022 typename Arg4, typename Arg5, typename DefaultCandidate>
1023 struct associator<Associator,
1024 detail::binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>, DefaultCandidate>
1025 : Associator<Handler, DefaultCandidate>
1027 static typename Associator<Handler, DefaultCandidate>::type get(
1028 const detail::binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>& h,
1029 const DefaultCandidate& c = DefaultCandidate()) BOOST_ASIO_NOEXCEPT
1031 return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
1035 #if defined(BOOST_ASIO_HAS_MOVE)
1037 template <template <typename, typename> class Associator,
1038 typename Handler, typename Arg1, typename DefaultCandidate>
1039 struct associator<Associator,
1040 detail::move_binder1<Handler, Arg1>, DefaultCandidate>
1041 : Associator<Handler, DefaultCandidate>
1043 static typename Associator<Handler, DefaultCandidate>::type get(
1044 const detail::move_binder1<Handler, Arg1>& h,
1045 const DefaultCandidate& c = DefaultCandidate()) BOOST_ASIO_NOEXCEPT
1047 return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
1051 template <template <typename, typename> class Associator,
1052 typename Handler, typename Arg1, typename Arg2,
1053 typename DefaultCandidate>
1054 struct associator<Associator,
1055 detail::move_binder2<Handler, Arg1, Arg2>, DefaultCandidate>
1056 : Associator<Handler, DefaultCandidate>
1058 static typename Associator<Handler, DefaultCandidate>::type get(
1059 const detail::move_binder2<Handler, Arg1, Arg2>& h,
1060 const DefaultCandidate& c = DefaultCandidate()) BOOST_ASIO_NOEXCEPT
1062 return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
1066 #endif // defined(BOOST_ASIO_HAS_MOVE)
1069 } // namespace boost
1071 #include <boost/asio/detail/pop_options.hpp>
1073 #endif // BOOST_ASIO_DETAIL_BIND_HANDLER_HPP