bind_handler.hpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  1. //
  2. // detail/bind_handler.hpp
  3. // ~~~~~~~~~~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2015 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 ASIO_DETAIL_BIND_HANDLER_HPP
  11. #define 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 "asio/detail/config.hpp"
  16. #include "asio/detail/handler_alloc_helpers.hpp"
  17. #include "asio/detail/handler_cont_helpers.hpp"
  18. #include "asio/detail/handler_invoke_helpers.hpp"
  19. #include "asio/detail/push_options.hpp"
  20. namespace asio {
  21. namespace detail {
  22. template <typename Handler, typename Arg1>
  23. class binder1
  24. {
  25. public:
  26. binder1(const Handler& handler, const Arg1& arg1)
  27. : handler_(handler),
  28. arg1_(arg1)
  29. {
  30. }
  31. binder1(Handler& handler, const Arg1& arg1)
  32. : handler_(ASIO_MOVE_CAST(Handler)(handler)),
  33. arg1_(arg1)
  34. {
  35. }
  36. void operator()()
  37. {
  38. handler_(static_cast<const Arg1&>(arg1_));
  39. }
  40. void operator()() const
  41. {
  42. handler_(arg1_);
  43. }
  44. //private:
  45. Handler handler_;
  46. Arg1 arg1_;
  47. };
  48. template <typename Handler, typename Arg1>
  49. inline void* asio_handler_allocate(std::size_t size,
  50. binder1<Handler, Arg1>* this_handler)
  51. {
  52. return asio_handler_alloc_helpers::allocate(
  53. size, this_handler->handler_);
  54. }
  55. template <typename Handler, typename Arg1>
  56. inline void asio_handler_deallocate(void* pointer, std::size_t size,
  57. binder1<Handler, Arg1>* this_handler)
  58. {
  59. asio_handler_alloc_helpers::deallocate(
  60. pointer, size, this_handler->handler_);
  61. }
  62. template <typename Handler, typename Arg1>
  63. inline bool asio_handler_is_continuation(
  64. binder1<Handler, Arg1>* this_handler)
  65. {
  66. return asio_handler_cont_helpers::is_continuation(
  67. this_handler->handler_);
  68. }
  69. template <typename Function, typename Handler, typename Arg1>
  70. inline void asio_handler_invoke(Function& function,
  71. binder1<Handler, Arg1>* this_handler)
  72. {
  73. asio_handler_invoke_helpers::invoke(
  74. function, this_handler->handler_);
  75. }
  76. template <typename Function, typename Handler, typename Arg1>
  77. inline void asio_handler_invoke(const Function& function,
  78. binder1<Handler, Arg1>* this_handler)
  79. {
  80. asio_handler_invoke_helpers::invoke(
  81. function, this_handler->handler_);
  82. }
  83. template <typename Handler, typename Arg1>
  84. inline binder1<Handler, Arg1> bind_handler(Handler handler,
  85. const Arg1& arg1)
  86. {
  87. return binder1<Handler, Arg1>(handler, arg1);
  88. }
  89. template <typename Handler, typename Arg1, typename Arg2>
  90. class binder2
  91. {
  92. public:
  93. binder2(const Handler& handler, const Arg1& arg1, const Arg2& arg2)
  94. : handler_(handler),
  95. arg1_(arg1),
  96. arg2_(arg2)
  97. {
  98. }
  99. binder2(Handler& handler, const Arg1& arg1, const Arg2& arg2)
  100. : handler_(ASIO_MOVE_CAST(Handler)(handler)),
  101. arg1_(arg1),
  102. arg2_(arg2)
  103. {
  104. }
  105. void operator()()
  106. {
  107. handler_(static_cast<const Arg1&>(arg1_),
  108. static_cast<const Arg2&>(arg2_));
  109. }
  110. void operator()() const
  111. {
  112. handler_(arg1_, arg2_);
  113. }
  114. //private:
  115. Handler handler_;
  116. Arg1 arg1_;
  117. Arg2 arg2_;
  118. };
  119. template <typename Handler, typename Arg1, typename Arg2>
  120. inline void* asio_handler_allocate(std::size_t size,
  121. binder2<Handler, Arg1, Arg2>* this_handler)
  122. {
  123. return asio_handler_alloc_helpers::allocate(
  124. size, this_handler->handler_);
  125. }
  126. template <typename Handler, typename Arg1, typename Arg2>
  127. inline void asio_handler_deallocate(void* pointer, std::size_t size,
  128. binder2<Handler, Arg1, Arg2>* this_handler)
  129. {
  130. asio_handler_alloc_helpers::deallocate(
  131. pointer, size, this_handler->handler_);
  132. }
  133. template <typename Handler, typename Arg1, typename Arg2>
  134. inline bool asio_handler_is_continuation(
  135. binder2<Handler, Arg1, Arg2>* this_handler)
  136. {
  137. return asio_handler_cont_helpers::is_continuation(
  138. this_handler->handler_);
  139. }
  140. template <typename Function, typename Handler, typename Arg1, typename Arg2>
  141. inline void asio_handler_invoke(Function& function,
  142. binder2<Handler, Arg1, Arg2>* this_handler)
  143. {
  144. asio_handler_invoke_helpers::invoke(
  145. function, this_handler->handler_);
  146. }
  147. template <typename Function, typename Handler, typename Arg1, typename Arg2>
  148. inline void asio_handler_invoke(const Function& function,
  149. binder2<Handler, Arg1, Arg2>* this_handler)
  150. {
  151. asio_handler_invoke_helpers::invoke(
  152. function, this_handler->handler_);
  153. }
  154. template <typename Handler, typename Arg1, typename Arg2>
  155. inline binder2<Handler, Arg1, Arg2> bind_handler(Handler handler,
  156. const Arg1& arg1, const Arg2& arg2)
  157. {
  158. return binder2<Handler, Arg1, Arg2>(handler, arg1, arg2);
  159. }
  160. template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
  161. class binder3
  162. {
  163. public:
  164. binder3(const Handler& handler, const Arg1& arg1, const Arg2& arg2,
  165. const Arg3& arg3)
  166. : handler_(handler),
  167. arg1_(arg1),
  168. arg2_(arg2),
  169. arg3_(arg3)
  170. {
  171. }
  172. binder3(Handler& handler, const Arg1& arg1, const Arg2& arg2,
  173. const Arg3& arg3)
  174. : handler_(ASIO_MOVE_CAST(Handler)(handler)),
  175. arg1_(arg1),
  176. arg2_(arg2),
  177. arg3_(arg3)
  178. {
  179. }
  180. void operator()()
  181. {
  182. handler_(static_cast<const Arg1&>(arg1_),
  183. static_cast<const Arg2&>(arg2_),
  184. static_cast<const Arg3&>(arg3_));
  185. }
  186. void operator()() const
  187. {
  188. handler_(arg1_, arg2_, arg3_);
  189. }
  190. //private:
  191. Handler handler_;
  192. Arg1 arg1_;
  193. Arg2 arg2_;
  194. Arg3 arg3_;
  195. };
  196. template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
  197. inline void* asio_handler_allocate(std::size_t size,
  198. binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
  199. {
  200. return asio_handler_alloc_helpers::allocate(
  201. size, this_handler->handler_);
  202. }
  203. template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
  204. inline void asio_handler_deallocate(void* pointer, std::size_t size,
  205. binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
  206. {
  207. asio_handler_alloc_helpers::deallocate(
  208. pointer, size, this_handler->handler_);
  209. }
  210. template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
  211. inline bool asio_handler_is_continuation(
  212. binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
  213. {
  214. return asio_handler_cont_helpers::is_continuation(
  215. this_handler->handler_);
  216. }
  217. template <typename Function, typename Handler, typename Arg1, typename Arg2,
  218. typename Arg3>
  219. inline void asio_handler_invoke(Function& function,
  220. binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
  221. {
  222. asio_handler_invoke_helpers::invoke(
  223. function, this_handler->handler_);
  224. }
  225. template <typename Function, typename Handler, typename Arg1, typename Arg2,
  226. typename Arg3>
  227. inline void asio_handler_invoke(const Function& function,
  228. binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
  229. {
  230. asio_handler_invoke_helpers::invoke(
  231. function, this_handler->handler_);
  232. }
  233. template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
  234. inline binder3<Handler, Arg1, Arg2, Arg3> bind_handler(Handler handler,
  235. const Arg1& arg1, const Arg2& arg2, const Arg3& arg3)
  236. {
  237. return binder3<Handler, Arg1, Arg2, Arg3>(handler, arg1, arg2, arg3);
  238. }
  239. template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
  240. typename Arg4>
  241. class binder4
  242. {
  243. public:
  244. binder4(const Handler& handler, const Arg1& arg1, const Arg2& arg2,
  245. const Arg3& arg3, const Arg4& arg4)
  246. : handler_(handler),
  247. arg1_(arg1),
  248. arg2_(arg2),
  249. arg3_(arg3),
  250. arg4_(arg4)
  251. {
  252. }
  253. binder4(Handler& handler, const Arg1& arg1, const Arg2& arg2,
  254. const Arg3& arg3, const Arg4& arg4)
  255. : handler_(ASIO_MOVE_CAST(Handler)(handler)),
  256. arg1_(arg1),
  257. arg2_(arg2),
  258. arg3_(arg3),
  259. arg4_(arg4)
  260. {
  261. }
  262. void operator()()
  263. {
  264. handler_(static_cast<const Arg1&>(arg1_),
  265. static_cast<const Arg2&>(arg2_),
  266. static_cast<const Arg3&>(arg3_),
  267. static_cast<const Arg4&>(arg4_));
  268. }
  269. void operator()() const
  270. {
  271. handler_(arg1_, arg2_, arg3_, arg4_);
  272. }
  273. //private:
  274. Handler handler_;
  275. Arg1 arg1_;
  276. Arg2 arg2_;
  277. Arg3 arg3_;
  278. Arg4 arg4_;
  279. };
  280. template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
  281. typename Arg4>
  282. inline void* asio_handler_allocate(std::size_t size,
  283. binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
  284. {
  285. return asio_handler_alloc_helpers::allocate(
  286. size, this_handler->handler_);
  287. }
  288. template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
  289. typename Arg4>
  290. inline void asio_handler_deallocate(void* pointer, std::size_t size,
  291. binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
  292. {
  293. asio_handler_alloc_helpers::deallocate(
  294. pointer, size, this_handler->handler_);
  295. }
  296. template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
  297. typename Arg4>
  298. inline bool asio_handler_is_continuation(
  299. binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
  300. {
  301. return asio_handler_cont_helpers::is_continuation(
  302. this_handler->handler_);
  303. }
  304. template <typename Function, typename Handler, typename Arg1, typename Arg2,
  305. typename Arg3, typename Arg4>
  306. inline void asio_handler_invoke(Function& function,
  307. binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
  308. {
  309. asio_handler_invoke_helpers::invoke(
  310. function, this_handler->handler_);
  311. }
  312. template <typename Function, typename Handler, typename Arg1, typename Arg2,
  313. typename Arg3, typename Arg4>
  314. inline void asio_handler_invoke(const Function& function,
  315. binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
  316. {
  317. asio_handler_invoke_helpers::invoke(
  318. function, this_handler->handler_);
  319. }
  320. template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
  321. typename Arg4>
  322. inline binder4<Handler, Arg1, Arg2, Arg3, Arg4> bind_handler(
  323. Handler handler, const Arg1& arg1, const Arg2& arg2,
  324. const Arg3& arg3, const Arg4& arg4)
  325. {
  326. return binder4<Handler, Arg1, Arg2, Arg3, Arg4>(handler, arg1, arg2, arg3,
  327. arg4);
  328. }
  329. template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
  330. typename Arg4, typename Arg5>
  331. class binder5
  332. {
  333. public:
  334. binder5(const Handler& handler, const Arg1& arg1, const Arg2& arg2,
  335. const Arg3& arg3, const Arg4& arg4, const Arg5& arg5)
  336. : handler_(handler),
  337. arg1_(arg1),
  338. arg2_(arg2),
  339. arg3_(arg3),
  340. arg4_(arg4),
  341. arg5_(arg5)
  342. {
  343. }
  344. binder5(Handler& handler, const Arg1& arg1, const Arg2& arg2,
  345. const Arg3& arg3, const Arg4& arg4, const Arg5& arg5)
  346. : handler_(ASIO_MOVE_CAST(Handler)(handler)),
  347. arg1_(arg1),
  348. arg2_(arg2),
  349. arg3_(arg3),
  350. arg4_(arg4),
  351. arg5_(arg5)
  352. {
  353. }
  354. void operator()()
  355. {
  356. handler_(static_cast<const Arg1&>(arg1_),
  357. static_cast<const Arg2&>(arg2_),
  358. static_cast<const Arg3&>(arg3_),
  359. static_cast<const Arg4&>(arg4_),
  360. static_cast<const Arg5&>(arg5_));
  361. }
  362. void operator()() const
  363. {
  364. handler_(arg1_, arg2_, arg3_, arg4_, arg5_);
  365. }
  366. //private:
  367. Handler handler_;
  368. Arg1 arg1_;
  369. Arg2 arg2_;
  370. Arg3 arg3_;
  371. Arg4 arg4_;
  372. Arg5 arg5_;
  373. };
  374. template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
  375. typename Arg4, typename Arg5>
  376. inline void* asio_handler_allocate(std::size_t size,
  377. binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
  378. {
  379. return asio_handler_alloc_helpers::allocate(
  380. size, this_handler->handler_);
  381. }
  382. template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
  383. typename Arg4, typename Arg5>
  384. inline void asio_handler_deallocate(void* pointer, std::size_t size,
  385. binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
  386. {
  387. asio_handler_alloc_helpers::deallocate(
  388. pointer, size, this_handler->handler_);
  389. }
  390. template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
  391. typename Arg4, typename Arg5>
  392. inline bool asio_handler_is_continuation(
  393. binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
  394. {
  395. return asio_handler_cont_helpers::is_continuation(
  396. this_handler->handler_);
  397. }
  398. template <typename Function, typename Handler, typename Arg1, typename Arg2,
  399. typename Arg3, typename Arg4, typename Arg5>
  400. inline void asio_handler_invoke(Function& function,
  401. binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
  402. {
  403. asio_handler_invoke_helpers::invoke(
  404. function, this_handler->handler_);
  405. }
  406. template <typename Function, typename Handler, typename Arg1, typename Arg2,
  407. typename Arg3, typename Arg4, typename Arg5>
  408. inline void asio_handler_invoke(const Function& function,
  409. binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
  410. {
  411. asio_handler_invoke_helpers::invoke(
  412. function, this_handler->handler_);
  413. }
  414. template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
  415. typename Arg4, typename Arg5>
  416. inline binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5> bind_handler(
  417. Handler handler, const Arg1& arg1, const Arg2& arg2,
  418. const Arg3& arg3, const Arg4& arg4, const Arg5& arg5)
  419. {
  420. return binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>(handler, arg1, arg2,
  421. arg3, arg4, arg5);
  422. }
  423. } // namespace detail
  424. } // namespace asio
  425. #include "asio/detail/pop_options.hpp"
  426. #endif // ASIO_DETAIL_BIND_HANDLER_HPP