bind_handler.hpp 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147
  1. //
  2. // detail/bind_handler.hpp
  3. // ~~~~~~~~~~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com)
  6. //
  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)
  9. //
  10. #ifndef BOOST_ASIO_DETAIL_BIND_HANDLER_HPP
  11. #define BOOST_ASIO_DETAIL_BIND_HANDLER_HPP
  12. #if defined(_MSC_VER) && (_MSC_VER >= 1200)
  13. # pragma once
  14. #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
  15. #include <boost/asio/detail/config.hpp>
  16. #include <boost/asio/associator.hpp>
  17. #include <boost/asio/detail/handler_alloc_helpers.hpp>
  18. #include <boost/asio/detail/handler_cont_helpers.hpp>
  19. #include <boost/asio/detail/handler_invoke_helpers.hpp>
  20. #include <boost/asio/detail/type_traits.hpp>
  21. #include <boost/asio/detail/push_options.hpp>
  22. namespace boost {
  23. namespace asio {
  24. namespace detail {
  25. template <typename Handler>
  26. class binder0
  27. {
  28. public:
  29. template <typename T>
  30. binder0(int, BOOST_ASIO_MOVE_ARG(T) handler)
  31. : handler_(BOOST_ASIO_MOVE_CAST(T)(handler))
  32. {
  33. }
  34. binder0(Handler& handler)
  35. : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler))
  36. {
  37. }
  38. #if defined(BOOST_ASIO_HAS_MOVE)
  39. binder0(const binder0& other)
  40. : handler_(other.handler_)
  41. {
  42. }
  43. binder0(binder0&& other)
  44. : handler_(BOOST_ASIO_MOVE_CAST(Handler)(other.handler_))
  45. {
  46. }
  47. #endif // defined(BOOST_ASIO_HAS_MOVE)
  48. void operator()()
  49. {
  50. BOOST_ASIO_MOVE_OR_LVALUE(Handler)(handler_)();
  51. }
  52. void operator()() const
  53. {
  54. handler_();
  55. }
  56. //private:
  57. Handler handler_;
  58. };
  59. template <typename Handler>
  60. inline asio_handler_allocate_is_deprecated
  61. asio_handler_allocate(std::size_t size,
  62. binder0<Handler>* this_handler)
  63. {
  64. #if defined(BOOST_ASIO_NO_DEPRECATED)
  65. boost_asio_handler_alloc_helpers::allocate(size, this_handler->handler_);
  66. return asio_handler_allocate_is_no_longer_used();
  67. #else // defined(BOOST_ASIO_NO_DEPRECATED)
  68. return boost_asio_handler_alloc_helpers::allocate(
  69. size, this_handler->handler_);
  70. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  71. }
  72. template <typename Handler>
  73. inline asio_handler_deallocate_is_deprecated
  74. asio_handler_deallocate(void* pointer, std::size_t size,
  75. binder0<Handler>* this_handler)
  76. {
  77. boost_asio_handler_alloc_helpers::deallocate(
  78. pointer, size, this_handler->handler_);
  79. #if defined(BOOST_ASIO_NO_DEPRECATED)
  80. return asio_handler_deallocate_is_no_longer_used();
  81. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  82. }
  83. template <typename Handler>
  84. inline bool asio_handler_is_continuation(
  85. binder0<Handler>* this_handler)
  86. {
  87. return boost_asio_handler_cont_helpers::is_continuation(
  88. this_handler->handler_);
  89. }
  90. template <typename Function, typename Handler>
  91. inline asio_handler_invoke_is_deprecated
  92. asio_handler_invoke(Function& function,
  93. binder0<Handler>* this_handler)
  94. {
  95. boost_asio_handler_invoke_helpers::invoke(
  96. function, this_handler->handler_);
  97. #if defined(BOOST_ASIO_NO_DEPRECATED)
  98. return asio_handler_invoke_is_no_longer_used();
  99. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  100. }
  101. template <typename Function, typename Handler>
  102. inline asio_handler_invoke_is_deprecated
  103. asio_handler_invoke(const Function& function,
  104. binder0<Handler>* this_handler)
  105. {
  106. boost_asio_handler_invoke_helpers::invoke(
  107. function, this_handler->handler_);
  108. #if defined(BOOST_ASIO_NO_DEPRECATED)
  109. return asio_handler_invoke_is_no_longer_used();
  110. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  111. }
  112. template <typename Handler>
  113. inline binder0<typename decay<Handler>::type> bind_handler(
  114. BOOST_ASIO_MOVE_ARG(Handler) handler)
  115. {
  116. return binder0<typename decay<Handler>::type>(
  117. 0, BOOST_ASIO_MOVE_CAST(Handler)(handler));
  118. }
  119. template <typename Handler, typename Arg1>
  120. class binder1
  121. {
  122. public:
  123. template <typename T>
  124. binder1(int, BOOST_ASIO_MOVE_ARG(T) handler, const Arg1& arg1)
  125. : handler_(BOOST_ASIO_MOVE_CAST(T)(handler)),
  126. arg1_(arg1)
  127. {
  128. }
  129. binder1(Handler& handler, const Arg1& arg1)
  130. : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
  131. arg1_(arg1)
  132. {
  133. }
  134. #if defined(BOOST_ASIO_HAS_MOVE)
  135. binder1(const binder1& other)
  136. : handler_(other.handler_),
  137. arg1_(other.arg1_)
  138. {
  139. }
  140. binder1(binder1&& other)
  141. : handler_(BOOST_ASIO_MOVE_CAST(Handler)(other.handler_)),
  142. arg1_(BOOST_ASIO_MOVE_CAST(Arg1)(other.arg1_))
  143. {
  144. }
  145. #endif // defined(BOOST_ASIO_HAS_MOVE)
  146. void operator()()
  147. {
  148. BOOST_ASIO_MOVE_OR_LVALUE(Handler)(handler_)(
  149. static_cast<const Arg1&>(arg1_));
  150. }
  151. void operator()() const
  152. {
  153. handler_(arg1_);
  154. }
  155. //private:
  156. Handler handler_;
  157. Arg1 arg1_;
  158. };
  159. template <typename Handler, typename Arg1>
  160. inline asio_handler_allocate_is_deprecated
  161. asio_handler_allocate(std::size_t size,
  162. binder1<Handler, Arg1>* this_handler)
  163. {
  164. #if defined(BOOST_ASIO_NO_DEPRECATED)
  165. boost_asio_handler_alloc_helpers::allocate(size, this_handler->handler_);
  166. return asio_handler_allocate_is_no_longer_used();
  167. #else // defined(BOOST_ASIO_NO_DEPRECATED)
  168. return boost_asio_handler_alloc_helpers::allocate(
  169. size, this_handler->handler_);
  170. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  171. }
  172. template <typename Handler, typename Arg1>
  173. inline asio_handler_deallocate_is_deprecated
  174. asio_handler_deallocate(void* pointer, std::size_t size,
  175. binder1<Handler, Arg1>* this_handler)
  176. {
  177. boost_asio_handler_alloc_helpers::deallocate(
  178. pointer, size, this_handler->handler_);
  179. #if defined(BOOST_ASIO_NO_DEPRECATED)
  180. return asio_handler_deallocate_is_no_longer_used();
  181. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  182. }
  183. template <typename Handler, typename Arg1>
  184. inline bool asio_handler_is_continuation(
  185. binder1<Handler, Arg1>* this_handler)
  186. {
  187. return boost_asio_handler_cont_helpers::is_continuation(
  188. this_handler->handler_);
  189. }
  190. template <typename Function, typename Handler, typename Arg1>
  191. inline asio_handler_invoke_is_deprecated
  192. asio_handler_invoke(Function& function,
  193. binder1<Handler, Arg1>* this_handler)
  194. {
  195. boost_asio_handler_invoke_helpers::invoke(
  196. function, this_handler->handler_);
  197. #if defined(BOOST_ASIO_NO_DEPRECATED)
  198. return asio_handler_invoke_is_no_longer_used();
  199. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  200. }
  201. template <typename Function, typename Handler, typename Arg1>
  202. inline asio_handler_invoke_is_deprecated
  203. asio_handler_invoke(const Function& function,
  204. binder1<Handler, Arg1>* this_handler)
  205. {
  206. boost_asio_handler_invoke_helpers::invoke(
  207. function, this_handler->handler_);
  208. #if defined(BOOST_ASIO_NO_DEPRECATED)
  209. return asio_handler_invoke_is_no_longer_used();
  210. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  211. }
  212. template <typename Handler, typename Arg1>
  213. inline binder1<typename decay<Handler>::type, Arg1> bind_handler(
  214. BOOST_ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1)
  215. {
  216. return binder1<typename decay<Handler>::type, Arg1>(0,
  217. BOOST_ASIO_MOVE_CAST(Handler)(handler), arg1);
  218. }
  219. template <typename Handler, typename Arg1, typename Arg2>
  220. class binder2
  221. {
  222. public:
  223. template <typename T>
  224. binder2(int, BOOST_ASIO_MOVE_ARG(T) handler,
  225. const Arg1& arg1, const Arg2& arg2)
  226. : handler_(BOOST_ASIO_MOVE_CAST(T)(handler)),
  227. arg1_(arg1),
  228. arg2_(arg2)
  229. {
  230. }
  231. binder2(Handler& handler, const Arg1& arg1, const Arg2& arg2)
  232. : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
  233. arg1_(arg1),
  234. arg2_(arg2)
  235. {
  236. }
  237. #if defined(BOOST_ASIO_HAS_MOVE)
  238. binder2(const binder2& other)
  239. : handler_(other.handler_),
  240. arg1_(other.arg1_),
  241. arg2_(other.arg2_)
  242. {
  243. }
  244. binder2(binder2&& other)
  245. : handler_(BOOST_ASIO_MOVE_CAST(Handler)(other.handler_)),
  246. arg1_(BOOST_ASIO_MOVE_CAST(Arg1)(other.arg1_)),
  247. arg2_(BOOST_ASIO_MOVE_CAST(Arg2)(other.arg2_))
  248. {
  249. }
  250. #endif // defined(BOOST_ASIO_HAS_MOVE)
  251. void operator()()
  252. {
  253. BOOST_ASIO_MOVE_OR_LVALUE(Handler)(handler_)(
  254. static_cast<const Arg1&>(arg1_),
  255. static_cast<const Arg2&>(arg2_));
  256. }
  257. void operator()() const
  258. {
  259. handler_(arg1_, arg2_);
  260. }
  261. //private:
  262. Handler handler_;
  263. Arg1 arg1_;
  264. Arg2 arg2_;
  265. };
  266. template <typename Handler, typename Arg1, typename Arg2>
  267. inline asio_handler_allocate_is_deprecated
  268. asio_handler_allocate(std::size_t size,
  269. binder2<Handler, Arg1, Arg2>* this_handler)
  270. {
  271. #if defined(BOOST_ASIO_NO_DEPRECATED)
  272. boost_asio_handler_alloc_helpers::allocate(size, this_handler->handler_);
  273. return asio_handler_allocate_is_no_longer_used();
  274. #else // defined(BOOST_ASIO_NO_DEPRECATED)
  275. return boost_asio_handler_alloc_helpers::allocate(
  276. size, this_handler->handler_);
  277. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  278. }
  279. template <typename Handler, typename Arg1, typename Arg2>
  280. inline asio_handler_deallocate_is_deprecated
  281. asio_handler_deallocate(void* pointer, std::size_t size,
  282. binder2<Handler, Arg1, Arg2>* this_handler)
  283. {
  284. boost_asio_handler_alloc_helpers::deallocate(
  285. pointer, size, this_handler->handler_);
  286. #if defined(BOOST_ASIO_NO_DEPRECATED)
  287. return asio_handler_deallocate_is_no_longer_used();
  288. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  289. }
  290. template <typename Handler, typename Arg1, typename Arg2>
  291. inline bool asio_handler_is_continuation(
  292. binder2<Handler, Arg1, Arg2>* this_handler)
  293. {
  294. return boost_asio_handler_cont_helpers::is_continuation(
  295. this_handler->handler_);
  296. }
  297. template <typename Function, typename Handler, typename Arg1, typename Arg2>
  298. inline asio_handler_invoke_is_deprecated
  299. asio_handler_invoke(Function& function,
  300. binder2<Handler, Arg1, Arg2>* this_handler)
  301. {
  302. boost_asio_handler_invoke_helpers::invoke(
  303. function, this_handler->handler_);
  304. #if defined(BOOST_ASIO_NO_DEPRECATED)
  305. return asio_handler_invoke_is_no_longer_used();
  306. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  307. }
  308. template <typename Function, typename Handler, typename Arg1, typename Arg2>
  309. inline asio_handler_invoke_is_deprecated
  310. asio_handler_invoke(const Function& function,
  311. binder2<Handler, Arg1, Arg2>* this_handler)
  312. {
  313. boost_asio_handler_invoke_helpers::invoke(
  314. function, this_handler->handler_);
  315. #if defined(BOOST_ASIO_NO_DEPRECATED)
  316. return asio_handler_invoke_is_no_longer_used();
  317. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  318. }
  319. template <typename Handler, typename Arg1, typename Arg2>
  320. inline binder2<typename decay<Handler>::type, Arg1, Arg2> bind_handler(
  321. BOOST_ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1, const Arg2& arg2)
  322. {
  323. return binder2<typename decay<Handler>::type, Arg1, Arg2>(0,
  324. BOOST_ASIO_MOVE_CAST(Handler)(handler), arg1, arg2);
  325. }
  326. template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
  327. class binder3
  328. {
  329. public:
  330. template <typename T>
  331. binder3(int, BOOST_ASIO_MOVE_ARG(T) handler, const Arg1& arg1,
  332. const Arg2& arg2, const Arg3& arg3)
  333. : handler_(BOOST_ASIO_MOVE_CAST(T)(handler)),
  334. arg1_(arg1),
  335. arg2_(arg2),
  336. arg3_(arg3)
  337. {
  338. }
  339. binder3(Handler& handler, const Arg1& arg1,
  340. const Arg2& arg2, const Arg3& arg3)
  341. : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
  342. arg1_(arg1),
  343. arg2_(arg2),
  344. arg3_(arg3)
  345. {
  346. }
  347. #if defined(BOOST_ASIO_HAS_MOVE)
  348. binder3(const binder3& other)
  349. : handler_(other.handler_),
  350. arg1_(other.arg1_),
  351. arg2_(other.arg2_),
  352. arg3_(other.arg3_)
  353. {
  354. }
  355. binder3(binder3&& other)
  356. : handler_(BOOST_ASIO_MOVE_CAST(Handler)(other.handler_)),
  357. arg1_(BOOST_ASIO_MOVE_CAST(Arg1)(other.arg1_)),
  358. arg2_(BOOST_ASIO_MOVE_CAST(Arg2)(other.arg2_)),
  359. arg3_(BOOST_ASIO_MOVE_CAST(Arg3)(other.arg3_))
  360. {
  361. }
  362. #endif // defined(BOOST_ASIO_HAS_MOVE)
  363. void operator()()
  364. {
  365. BOOST_ASIO_MOVE_OR_LVALUE(Handler)(handler_)(
  366. static_cast<const Arg1&>(arg1_),
  367. static_cast<const Arg2&>(arg2_),
  368. static_cast<const Arg3&>(arg3_));
  369. }
  370. void operator()() const
  371. {
  372. handler_(arg1_, arg2_, arg3_);
  373. }
  374. //private:
  375. Handler handler_;
  376. Arg1 arg1_;
  377. Arg2 arg2_;
  378. Arg3 arg3_;
  379. };
  380. template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
  381. inline asio_handler_allocate_is_deprecated
  382. asio_handler_allocate(std::size_t size,
  383. binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
  384. {
  385. #if defined(BOOST_ASIO_NO_DEPRECATED)
  386. boost_asio_handler_alloc_helpers::allocate(size, this_handler->handler_);
  387. return asio_handler_allocate_is_no_longer_used();
  388. #else // defined(BOOST_ASIO_NO_DEPRECATED)
  389. return boost_asio_handler_alloc_helpers::allocate(
  390. size, this_handler->handler_);
  391. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  392. }
  393. template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
  394. inline asio_handler_deallocate_is_deprecated
  395. asio_handler_deallocate(void* pointer, std::size_t size,
  396. binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
  397. {
  398. boost_asio_handler_alloc_helpers::deallocate(
  399. pointer, size, this_handler->handler_);
  400. #if defined(BOOST_ASIO_NO_DEPRECATED)
  401. return asio_handler_deallocate_is_no_longer_used();
  402. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  403. }
  404. template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
  405. inline bool asio_handler_is_continuation(
  406. binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
  407. {
  408. return boost_asio_handler_cont_helpers::is_continuation(
  409. this_handler->handler_);
  410. }
  411. template <typename Function, typename Handler,
  412. typename Arg1, typename Arg2, typename Arg3>
  413. inline asio_handler_invoke_is_deprecated
  414. asio_handler_invoke(Function& function,
  415. binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
  416. {
  417. boost_asio_handler_invoke_helpers::invoke(
  418. function, this_handler->handler_);
  419. #if defined(BOOST_ASIO_NO_DEPRECATED)
  420. return asio_handler_invoke_is_no_longer_used();
  421. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  422. }
  423. template <typename Function, typename Handler,
  424. typename Arg1, typename Arg2, typename Arg3>
  425. inline asio_handler_invoke_is_deprecated
  426. asio_handler_invoke(const Function& function,
  427. binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
  428. {
  429. boost_asio_handler_invoke_helpers::invoke(
  430. function, this_handler->handler_);
  431. #if defined(BOOST_ASIO_NO_DEPRECATED)
  432. return asio_handler_invoke_is_no_longer_used();
  433. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  434. }
  435. template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
  436. inline binder3<typename decay<Handler>::type, Arg1, Arg2, Arg3> bind_handler(
  437. BOOST_ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1, const Arg2& arg2,
  438. const Arg3& arg3)
  439. {
  440. return binder3<typename decay<Handler>::type, Arg1, Arg2, Arg3>(0,
  441. BOOST_ASIO_MOVE_CAST(Handler)(handler), arg1, arg2, arg3);
  442. }
  443. template <typename Handler, typename Arg1,
  444. typename Arg2, typename Arg3, typename Arg4>
  445. class binder4
  446. {
  447. public:
  448. template <typename T>
  449. binder4(int, BOOST_ASIO_MOVE_ARG(T) handler, const Arg1& arg1,
  450. const Arg2& arg2, const Arg3& arg3, const Arg4& arg4)
  451. : handler_(BOOST_ASIO_MOVE_CAST(T)(handler)),
  452. arg1_(arg1),
  453. arg2_(arg2),
  454. arg3_(arg3),
  455. arg4_(arg4)
  456. {
  457. }
  458. binder4(Handler& handler, const Arg1& arg1,
  459. const Arg2& arg2, const Arg3& arg3, const Arg4& arg4)
  460. : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
  461. arg1_(arg1),
  462. arg2_(arg2),
  463. arg3_(arg3),
  464. arg4_(arg4)
  465. {
  466. }
  467. #if defined(BOOST_ASIO_HAS_MOVE)
  468. binder4(const binder4& other)
  469. : handler_(other.handler_),
  470. arg1_(other.arg1_),
  471. arg2_(other.arg2_),
  472. arg3_(other.arg3_),
  473. arg4_(other.arg4_)
  474. {
  475. }
  476. binder4(binder4&& other)
  477. : handler_(BOOST_ASIO_MOVE_CAST(Handler)(other.handler_)),
  478. arg1_(BOOST_ASIO_MOVE_CAST(Arg1)(other.arg1_)),
  479. arg2_(BOOST_ASIO_MOVE_CAST(Arg2)(other.arg2_)),
  480. arg3_(BOOST_ASIO_MOVE_CAST(Arg3)(other.arg3_)),
  481. arg4_(BOOST_ASIO_MOVE_CAST(Arg4)(other.arg4_))
  482. {
  483. }
  484. #endif // defined(BOOST_ASIO_HAS_MOVE)
  485. void operator()()
  486. {
  487. BOOST_ASIO_MOVE_OR_LVALUE(Handler)(handler_)(
  488. static_cast<const Arg1&>(arg1_),
  489. static_cast<const Arg2&>(arg2_),
  490. static_cast<const Arg3&>(arg3_),
  491. static_cast<const Arg4&>(arg4_));
  492. }
  493. void operator()() const
  494. {
  495. handler_(arg1_, arg2_, arg3_, arg4_);
  496. }
  497. //private:
  498. Handler handler_;
  499. Arg1 arg1_;
  500. Arg2 arg2_;
  501. Arg3 arg3_;
  502. Arg4 arg4_;
  503. };
  504. template <typename Handler, typename Arg1,
  505. typename Arg2, typename Arg3, typename Arg4>
  506. inline asio_handler_allocate_is_deprecated
  507. asio_handler_allocate(std::size_t size,
  508. binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
  509. {
  510. #if defined(BOOST_ASIO_NO_DEPRECATED)
  511. boost_asio_handler_alloc_helpers::allocate(size, this_handler->handler_);
  512. return asio_handler_allocate_is_no_longer_used();
  513. #else // defined(BOOST_ASIO_NO_DEPRECATED)
  514. return boost_asio_handler_alloc_helpers::allocate(
  515. size, this_handler->handler_);
  516. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  517. }
  518. template <typename Handler, typename Arg1,
  519. typename Arg2, typename Arg3, typename Arg4>
  520. inline asio_handler_deallocate_is_deprecated
  521. asio_handler_deallocate(void* pointer, std::size_t size,
  522. binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
  523. {
  524. boost_asio_handler_alloc_helpers::deallocate(
  525. pointer, size, this_handler->handler_);
  526. #if defined(BOOST_ASIO_NO_DEPRECATED)
  527. return asio_handler_deallocate_is_no_longer_used();
  528. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  529. }
  530. template <typename Handler, typename Arg1,
  531. typename Arg2, typename Arg3, typename Arg4>
  532. inline bool asio_handler_is_continuation(
  533. binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
  534. {
  535. return boost_asio_handler_cont_helpers::is_continuation(
  536. this_handler->handler_);
  537. }
  538. template <typename Function, typename Handler, typename Arg1,
  539. typename Arg2, typename Arg3, typename Arg4>
  540. inline asio_handler_invoke_is_deprecated
  541. asio_handler_invoke(Function& function,
  542. binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
  543. {
  544. boost_asio_handler_invoke_helpers::invoke(
  545. function, this_handler->handler_);
  546. #if defined(BOOST_ASIO_NO_DEPRECATED)
  547. return asio_handler_invoke_is_no_longer_used();
  548. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  549. }
  550. template <typename Function, typename Handler, typename Arg1,
  551. typename Arg2, typename Arg3, typename Arg4>
  552. inline asio_handler_invoke_is_deprecated
  553. asio_handler_invoke(const Function& function,
  554. binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
  555. {
  556. boost_asio_handler_invoke_helpers::invoke(
  557. function, this_handler->handler_);
  558. #if defined(BOOST_ASIO_NO_DEPRECATED)
  559. return asio_handler_invoke_is_no_longer_used();
  560. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  561. }
  562. template <typename Handler, typename Arg1,
  563. typename Arg2, typename Arg3, typename Arg4>
  564. inline binder4<typename decay<Handler>::type, Arg1, Arg2, Arg3, Arg4>
  565. bind_handler(BOOST_ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1,
  566. const Arg2& arg2, const Arg3& arg3, const Arg4& arg4)
  567. {
  568. return binder4<typename decay<Handler>::type, Arg1, Arg2, Arg3, Arg4>(0,
  569. BOOST_ASIO_MOVE_CAST(Handler)(handler), arg1, arg2, arg3, arg4);
  570. }
  571. template <typename Handler, typename Arg1, typename Arg2,
  572. typename Arg3, typename Arg4, typename Arg5>
  573. class binder5
  574. {
  575. public:
  576. template <typename T>
  577. binder5(int, BOOST_ASIO_MOVE_ARG(T) handler, const Arg1& arg1,
  578. const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5)
  579. : handler_(BOOST_ASIO_MOVE_CAST(T)(handler)),
  580. arg1_(arg1),
  581. arg2_(arg2),
  582. arg3_(arg3),
  583. arg4_(arg4),
  584. arg5_(arg5)
  585. {
  586. }
  587. binder5(Handler& handler, const Arg1& arg1, const Arg2& arg2,
  588. const Arg3& arg3, const Arg4& arg4, const Arg5& arg5)
  589. : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
  590. arg1_(arg1),
  591. arg2_(arg2),
  592. arg3_(arg3),
  593. arg4_(arg4),
  594. arg5_(arg5)
  595. {
  596. }
  597. #if defined(BOOST_ASIO_HAS_MOVE)
  598. binder5(const binder5& other)
  599. : handler_(other.handler_),
  600. arg1_(other.arg1_),
  601. arg2_(other.arg2_),
  602. arg3_(other.arg3_),
  603. arg4_(other.arg4_),
  604. arg5_(other.arg5_)
  605. {
  606. }
  607. binder5(binder5&& other)
  608. : handler_(BOOST_ASIO_MOVE_CAST(Handler)(other.handler_)),
  609. arg1_(BOOST_ASIO_MOVE_CAST(Arg1)(other.arg1_)),
  610. arg2_(BOOST_ASIO_MOVE_CAST(Arg2)(other.arg2_)),
  611. arg3_(BOOST_ASIO_MOVE_CAST(Arg3)(other.arg3_)),
  612. arg4_(BOOST_ASIO_MOVE_CAST(Arg4)(other.arg4_)),
  613. arg5_(BOOST_ASIO_MOVE_CAST(Arg5)(other.arg5_))
  614. {
  615. }
  616. #endif // defined(BOOST_ASIO_HAS_MOVE)
  617. void operator()()
  618. {
  619. BOOST_ASIO_MOVE_OR_LVALUE(Handler)(handler_)(
  620. static_cast<const Arg1&>(arg1_),
  621. static_cast<const Arg2&>(arg2_),
  622. static_cast<const Arg3&>(arg3_),
  623. static_cast<const Arg4&>(arg4_),
  624. static_cast<const Arg5&>(arg5_));
  625. }
  626. void operator()() const
  627. {
  628. handler_(arg1_, arg2_, arg3_, arg4_, arg5_);
  629. }
  630. //private:
  631. Handler handler_;
  632. Arg1 arg1_;
  633. Arg2 arg2_;
  634. Arg3 arg3_;
  635. Arg4 arg4_;
  636. Arg5 arg5_;
  637. };
  638. template <typename Handler, typename Arg1, typename Arg2,
  639. typename Arg3, typename Arg4, typename Arg5>
  640. inline asio_handler_allocate_is_deprecated
  641. asio_handler_allocate(std::size_t size,
  642. binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
  643. {
  644. #if defined(BOOST_ASIO_NO_DEPRECATED)
  645. boost_asio_handler_alloc_helpers::allocate(size, this_handler->handler_);
  646. return asio_handler_allocate_is_no_longer_used();
  647. #else // defined(BOOST_ASIO_NO_DEPRECATED)
  648. return boost_asio_handler_alloc_helpers::allocate(
  649. size, this_handler->handler_);
  650. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  651. }
  652. template <typename Handler, typename Arg1, typename Arg2,
  653. typename Arg3, typename Arg4, typename Arg5>
  654. inline asio_handler_deallocate_is_deprecated
  655. asio_handler_deallocate(void* pointer, std::size_t size,
  656. binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
  657. {
  658. boost_asio_handler_alloc_helpers::deallocate(
  659. pointer, size, this_handler->handler_);
  660. #if defined(BOOST_ASIO_NO_DEPRECATED)
  661. return asio_handler_deallocate_is_no_longer_used();
  662. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  663. }
  664. template <typename Handler, typename Arg1, typename Arg2,
  665. typename Arg3, typename Arg4, typename Arg5>
  666. inline bool asio_handler_is_continuation(
  667. binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
  668. {
  669. return boost_asio_handler_cont_helpers::is_continuation(
  670. this_handler->handler_);
  671. }
  672. template <typename Function, typename Handler, typename Arg1,
  673. typename Arg2, typename Arg3, typename Arg4, typename Arg5>
  674. inline asio_handler_invoke_is_deprecated
  675. asio_handler_invoke(Function& function,
  676. binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
  677. {
  678. boost_asio_handler_invoke_helpers::invoke(
  679. function, this_handler->handler_);
  680. #if defined(BOOST_ASIO_NO_DEPRECATED)
  681. return asio_handler_invoke_is_no_longer_used();
  682. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  683. }
  684. template <typename Function, typename Handler, typename Arg1,
  685. typename Arg2, typename Arg3, typename Arg4, typename Arg5>
  686. inline asio_handler_invoke_is_deprecated
  687. asio_handler_invoke(const Function& function,
  688. binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
  689. {
  690. boost_asio_handler_invoke_helpers::invoke(
  691. function, this_handler->handler_);
  692. #if defined(BOOST_ASIO_NO_DEPRECATED)
  693. return asio_handler_invoke_is_no_longer_used();
  694. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  695. }
  696. template <typename Handler, typename Arg1, typename Arg2,
  697. typename Arg3, typename Arg4, typename Arg5>
  698. inline binder5<typename decay<Handler>::type, Arg1, Arg2, Arg3, Arg4, Arg5>
  699. bind_handler(BOOST_ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1,
  700. const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5)
  701. {
  702. return binder5<typename decay<Handler>::type, Arg1, Arg2, Arg3, Arg4, Arg5>(0,
  703. BOOST_ASIO_MOVE_CAST(Handler)(handler), arg1, arg2, arg3, arg4, arg5);
  704. }
  705. #if defined(BOOST_ASIO_HAS_MOVE)
  706. template <typename Handler, typename Arg1>
  707. class move_binder1
  708. {
  709. public:
  710. move_binder1(int, BOOST_ASIO_MOVE_ARG(Handler) handler,
  711. BOOST_ASIO_MOVE_ARG(Arg1) arg1)
  712. : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
  713. arg1_(BOOST_ASIO_MOVE_CAST(Arg1)(arg1))
  714. {
  715. }
  716. move_binder1(move_binder1&& other)
  717. : handler_(BOOST_ASIO_MOVE_CAST(Handler)(other.handler_)),
  718. arg1_(BOOST_ASIO_MOVE_CAST(Arg1)(other.arg1_))
  719. {
  720. }
  721. void operator()()
  722. {
  723. BOOST_ASIO_MOVE_OR_LVALUE(Handler)(handler_)(
  724. BOOST_ASIO_MOVE_CAST(Arg1)(arg1_));
  725. }
  726. //private:
  727. Handler handler_;
  728. Arg1 arg1_;
  729. };
  730. template <typename Handler, typename Arg1>
  731. inline asio_handler_allocate_is_deprecated
  732. asio_handler_allocate(std::size_t size,
  733. move_binder1<Handler, Arg1>* this_handler)
  734. {
  735. #if defined(BOOST_ASIO_NO_DEPRECATED)
  736. boost_asio_handler_alloc_helpers::allocate(size, this_handler->handler_);
  737. return asio_handler_allocate_is_no_longer_used();
  738. #else // defined(BOOST_ASIO_NO_DEPRECATED)
  739. return boost_asio_handler_alloc_helpers::allocate(
  740. size, this_handler->handler_);
  741. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  742. }
  743. template <typename Handler, typename Arg1>
  744. inline asio_handler_deallocate_is_deprecated
  745. asio_handler_deallocate(void* pointer, std::size_t size,
  746. move_binder1<Handler, Arg1>* this_handler)
  747. {
  748. boost_asio_handler_alloc_helpers::deallocate(
  749. pointer, size, this_handler->handler_);
  750. #if defined(BOOST_ASIO_NO_DEPRECATED)
  751. return asio_handler_deallocate_is_no_longer_used();
  752. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  753. }
  754. template <typename Handler, typename Arg1>
  755. inline bool asio_handler_is_continuation(
  756. move_binder1<Handler, Arg1>* this_handler)
  757. {
  758. return boost_asio_handler_cont_helpers::is_continuation(
  759. this_handler->handler_);
  760. }
  761. template <typename Function, typename Handler, typename Arg1>
  762. inline asio_handler_invoke_is_deprecated
  763. asio_handler_invoke(BOOST_ASIO_MOVE_ARG(Function) function,
  764. move_binder1<Handler, Arg1>* this_handler)
  765. {
  766. boost_asio_handler_invoke_helpers::invoke(
  767. BOOST_ASIO_MOVE_CAST(Function)(function), this_handler->handler_);
  768. #if defined(BOOST_ASIO_NO_DEPRECATED)
  769. return asio_handler_invoke_is_no_longer_used();
  770. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  771. }
  772. template <typename Handler, typename Arg1, typename Arg2>
  773. class move_binder2
  774. {
  775. public:
  776. move_binder2(int, BOOST_ASIO_MOVE_ARG(Handler) handler,
  777. const Arg1& arg1, BOOST_ASIO_MOVE_ARG(Arg2) arg2)
  778. : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
  779. arg1_(arg1),
  780. arg2_(BOOST_ASIO_MOVE_CAST(Arg2)(arg2))
  781. {
  782. }
  783. move_binder2(move_binder2&& other)
  784. : handler_(BOOST_ASIO_MOVE_CAST(Handler)(other.handler_)),
  785. arg1_(BOOST_ASIO_MOVE_CAST(Arg1)(other.arg1_)),
  786. arg2_(BOOST_ASIO_MOVE_CAST(Arg2)(other.arg2_))
  787. {
  788. }
  789. void operator()()
  790. {
  791. BOOST_ASIO_MOVE_OR_LVALUE(Handler)(handler_)(
  792. static_cast<const Arg1&>(arg1_),
  793. BOOST_ASIO_MOVE_CAST(Arg2)(arg2_));
  794. }
  795. //private:
  796. Handler handler_;
  797. Arg1 arg1_;
  798. Arg2 arg2_;
  799. };
  800. template <typename Handler, typename Arg1, typename Arg2>
  801. inline asio_handler_allocate_is_deprecated
  802. asio_handler_allocate(std::size_t size,
  803. move_binder2<Handler, Arg1, Arg2>* this_handler)
  804. {
  805. #if defined(BOOST_ASIO_NO_DEPRECATED)
  806. boost_asio_handler_alloc_helpers::allocate(size, this_handler->handler_);
  807. return asio_handler_allocate_is_no_longer_used();
  808. #else // defined(BOOST_ASIO_NO_DEPRECATED)
  809. return boost_asio_handler_alloc_helpers::allocate(
  810. size, this_handler->handler_);
  811. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  812. }
  813. template <typename Handler, typename Arg1, typename Arg2>
  814. inline asio_handler_deallocate_is_deprecated
  815. asio_handler_deallocate(void* pointer, std::size_t size,
  816. move_binder2<Handler, Arg1, Arg2>* this_handler)
  817. {
  818. boost_asio_handler_alloc_helpers::deallocate(
  819. pointer, size, this_handler->handler_);
  820. #if defined(BOOST_ASIO_NO_DEPRECATED)
  821. return asio_handler_deallocate_is_no_longer_used();
  822. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  823. }
  824. template <typename Handler, typename Arg1, typename Arg2>
  825. inline bool asio_handler_is_continuation(
  826. move_binder2<Handler, Arg1, Arg2>* this_handler)
  827. {
  828. return boost_asio_handler_cont_helpers::is_continuation(
  829. this_handler->handler_);
  830. }
  831. template <typename Function, typename Handler, typename Arg1, typename Arg2>
  832. inline asio_handler_invoke_is_deprecated
  833. asio_handler_invoke(BOOST_ASIO_MOVE_ARG(Function) function,
  834. move_binder2<Handler, Arg1, Arg2>* this_handler)
  835. {
  836. boost_asio_handler_invoke_helpers::invoke(
  837. BOOST_ASIO_MOVE_CAST(Function)(function), this_handler->handler_);
  838. #if defined(BOOST_ASIO_NO_DEPRECATED)
  839. return asio_handler_invoke_is_no_longer_used();
  840. #endif // defined(BOOST_ASIO_NO_DEPRECATED)
  841. }
  842. #endif // defined(BOOST_ASIO_HAS_MOVE)
  843. } // namespace detail
  844. template <template <typename, typename> class Associator,
  845. typename Handler, typename DefaultCandidate>
  846. struct associator<Associator,
  847. detail::binder0<Handler>, DefaultCandidate>
  848. : Associator<Handler, DefaultCandidate>
  849. {
  850. static typename Associator<Handler, DefaultCandidate>::type
  851. get(const detail::binder0<Handler>& h) BOOST_ASIO_NOEXCEPT
  852. {
  853. return Associator<Handler, DefaultCandidate>::get(h.handler_);
  854. }
  855. static BOOST_ASIO_AUTO_RETURN_TYPE_PREFIX2(
  856. typename Associator<Handler, DefaultCandidate>::type)
  857. get(const detail::binder0<Handler>& h,
  858. const DefaultCandidate& c) BOOST_ASIO_NOEXCEPT
  859. BOOST_ASIO_AUTO_RETURN_TYPE_SUFFIX((
  860. Associator<Handler, DefaultCandidate>::get(h.handler_, c)))
  861. {
  862. return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
  863. }
  864. };
  865. template <template <typename, typename> class Associator,
  866. typename Handler, typename Arg1, typename DefaultCandidate>
  867. struct associator<Associator,
  868. detail::binder1<Handler, Arg1>, DefaultCandidate>
  869. : Associator<Handler, DefaultCandidate>
  870. {
  871. static typename Associator<Handler, DefaultCandidate>::type
  872. get(const detail::binder1<Handler, Arg1>& h) BOOST_ASIO_NOEXCEPT
  873. {
  874. return Associator<Handler, DefaultCandidate>::get(h.handler_);
  875. }
  876. static BOOST_ASIO_AUTO_RETURN_TYPE_PREFIX2(
  877. typename Associator<Handler, DefaultCandidate>::type)
  878. get(const detail::binder1<Handler, Arg1>& h,
  879. const DefaultCandidate& c) BOOST_ASIO_NOEXCEPT
  880. BOOST_ASIO_AUTO_RETURN_TYPE_SUFFIX((
  881. Associator<Handler, DefaultCandidate>::get(h.handler_, c)))
  882. {
  883. return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
  884. }
  885. };
  886. template <template <typename, typename> class Associator,
  887. typename Handler, typename Arg1, typename Arg2,
  888. typename DefaultCandidate>
  889. struct associator<Associator,
  890. detail::binder2<Handler, Arg1, Arg2>, DefaultCandidate>
  891. : Associator<Handler, DefaultCandidate>
  892. {
  893. static typename Associator<Handler, DefaultCandidate>::type
  894. get(const detail::binder2<Handler, Arg1, Arg2>& h) BOOST_ASIO_NOEXCEPT
  895. {
  896. return Associator<Handler, DefaultCandidate>::get(h.handler_);
  897. }
  898. static BOOST_ASIO_AUTO_RETURN_TYPE_PREFIX2(
  899. typename Associator<Handler, DefaultCandidate>::type)
  900. get(const detail::binder2<Handler, Arg1, Arg2>& h,
  901. const DefaultCandidate& c) BOOST_ASIO_NOEXCEPT
  902. BOOST_ASIO_AUTO_RETURN_TYPE_SUFFIX((
  903. Associator<Handler, DefaultCandidate>::get(h.handler_, c)))
  904. {
  905. return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
  906. }
  907. };
  908. template <template <typename, typename> class Associator,
  909. typename Handler, typename Arg1, typename Arg2, typename Arg3,
  910. typename DefaultCandidate>
  911. struct associator<Associator,
  912. detail::binder3<Handler, Arg1, Arg2, Arg3>, DefaultCandidate>
  913. : Associator<Handler, DefaultCandidate>
  914. {
  915. static typename Associator<Handler, DefaultCandidate>::type
  916. get(const detail::binder3<Handler, Arg1, Arg2, Arg3>& h) BOOST_ASIO_NOEXCEPT
  917. {
  918. return Associator<Handler, DefaultCandidate>::get(h.handler_);
  919. }
  920. static BOOST_ASIO_AUTO_RETURN_TYPE_PREFIX2(
  921. typename Associator<Handler, DefaultCandidate>::type)
  922. get(const detail::binder3<Handler, Arg1, Arg2, Arg3>& h,
  923. const DefaultCandidate& c) BOOST_ASIO_NOEXCEPT
  924. BOOST_ASIO_AUTO_RETURN_TYPE_SUFFIX((
  925. Associator<Handler, DefaultCandidate>::get(h.handler_, c)))
  926. {
  927. return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
  928. }
  929. };
  930. template <template <typename, typename> class Associator,
  931. typename Handler, typename Arg1, typename Arg2, typename Arg3,
  932. typename Arg4, typename DefaultCandidate>
  933. struct associator<Associator,
  934. detail::binder4<Handler, Arg1, Arg2, Arg3, Arg4>, DefaultCandidate>
  935. : Associator<Handler, DefaultCandidate>
  936. {
  937. static typename Associator<Handler, DefaultCandidate>::type
  938. get(const detail::binder4<Handler, Arg1, Arg2, Arg3, Arg4>& h)
  939. BOOST_ASIO_NOEXCEPT
  940. {
  941. return Associator<Handler, DefaultCandidate>::get(h.handler_);
  942. }
  943. static BOOST_ASIO_AUTO_RETURN_TYPE_PREFIX2(
  944. typename Associator<Handler, DefaultCandidate>::type)
  945. get(const detail::binder4<Handler, Arg1, Arg2, Arg3, Arg4>& h,
  946. const DefaultCandidate& c) BOOST_ASIO_NOEXCEPT
  947. BOOST_ASIO_AUTO_RETURN_TYPE_SUFFIX((
  948. Associator<Handler, DefaultCandidate>::get(h.handler_, c)))
  949. {
  950. return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
  951. }
  952. };
  953. template <template <typename, typename> class Associator,
  954. typename Handler, typename Arg1, typename Arg2, typename Arg3,
  955. typename Arg4, typename Arg5, typename DefaultCandidate>
  956. struct associator<Associator,
  957. detail::binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>, DefaultCandidate>
  958. : Associator<Handler, DefaultCandidate>
  959. {
  960. static typename Associator<Handler, DefaultCandidate>::type
  961. get(const detail::binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>& h)
  962. BOOST_ASIO_NOEXCEPT
  963. {
  964. return Associator<Handler, DefaultCandidate>::get(h.handler_);
  965. }
  966. static BOOST_ASIO_AUTO_RETURN_TYPE_PREFIX2(
  967. typename Associator<Handler, DefaultCandidate>::type)
  968. get(const detail::binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>& h,
  969. const DefaultCandidate& c) BOOST_ASIO_NOEXCEPT
  970. BOOST_ASIO_AUTO_RETURN_TYPE_SUFFIX((
  971. Associator<Handler, DefaultCandidate>::get(h.handler_, c)))
  972. {
  973. return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
  974. }
  975. };
  976. #if defined(BOOST_ASIO_HAS_MOVE)
  977. template <template <typename, typename> class Associator,
  978. typename Handler, typename Arg1, typename DefaultCandidate>
  979. struct associator<Associator,
  980. detail::move_binder1<Handler, Arg1>, DefaultCandidate>
  981. : Associator<Handler, DefaultCandidate>
  982. {
  983. static typename Associator<Handler, DefaultCandidate>::type
  984. get(const detail::move_binder1<Handler, Arg1>& h) BOOST_ASIO_NOEXCEPT
  985. {
  986. return Associator<Handler, DefaultCandidate>::get(h.handler_);
  987. }
  988. static BOOST_ASIO_AUTO_RETURN_TYPE_PREFIX2(
  989. typename Associator<Handler, DefaultCandidate>::type)
  990. get(const detail::move_binder1<Handler, Arg1>& h,
  991. const DefaultCandidate& c) BOOST_ASIO_NOEXCEPT
  992. BOOST_ASIO_AUTO_RETURN_TYPE_SUFFIX((
  993. Associator<Handler, DefaultCandidate>::get(h.handler_, c)))
  994. {
  995. return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
  996. }
  997. };
  998. template <template <typename, typename> class Associator,
  999. typename Handler, typename Arg1, typename Arg2,
  1000. typename DefaultCandidate>
  1001. struct associator<Associator,
  1002. detail::move_binder2<Handler, Arg1, Arg2>, DefaultCandidate>
  1003. : Associator<Handler, DefaultCandidate>
  1004. {
  1005. static typename Associator<Handler, DefaultCandidate>::type
  1006. get(const detail::move_binder2<Handler, Arg1, Arg2>& h) BOOST_ASIO_NOEXCEPT
  1007. {
  1008. return Associator<Handler, DefaultCandidate>::get(h.handler_);
  1009. }
  1010. static BOOST_ASIO_AUTO_RETURN_TYPE_PREFIX2(
  1011. typename Associator<Handler, DefaultCandidate>::type)
  1012. get(const detail::move_binder2<Handler, Arg1, Arg2>& h,
  1013. const DefaultCandidate& c) BOOST_ASIO_NOEXCEPT
  1014. BOOST_ASIO_AUTO_RETURN_TYPE_SUFFIX((
  1015. Associator<Handler, DefaultCandidate>::get(h.handler_, c)))
  1016. {
  1017. return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
  1018. }
  1019. };
  1020. #endif // defined(BOOST_ASIO_HAS_MOVE)
  1021. } // namespace asio
  1022. } // namespace boost
  1023. #include <boost/asio/detail/pop_options.hpp>
  1024. #endif // BOOST_ASIO_DETAIL_BIND_HANDLER_HPP