bind_handler.hpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. //
  2. // bind_handler.hpp
  3. // ~~~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2010 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/push_options.hpp"
  16. #include "asio/detail/handler_alloc_helpers.hpp"
  17. #include "asio/detail/handler_invoke_helpers.hpp"
  18. namespace asio {
  19. namespace detail {
  20. template <typename Handler, typename Arg1>
  21. class binder1
  22. {
  23. public:
  24. binder1(const Handler& handler, const Arg1& arg1)
  25. : handler_(handler),
  26. arg1_(arg1)
  27. {
  28. }
  29. void operator()()
  30. {
  31. handler_(arg1_);
  32. }
  33. void operator()() const
  34. {
  35. handler_(arg1_);
  36. }
  37. //private:
  38. Handler handler_;
  39. Arg1 arg1_;
  40. };
  41. template <typename Handler, typename Arg1>
  42. inline void* asio_handler_allocate(std::size_t size,
  43. binder1<Handler, Arg1>* this_handler)
  44. {
  45. return asio_handler_alloc_helpers::allocate(
  46. size, this_handler->handler_);
  47. }
  48. template <typename Handler, typename Arg1>
  49. inline void asio_handler_deallocate(void* pointer, std::size_t size,
  50. binder1<Handler, Arg1>* this_handler)
  51. {
  52. asio_handler_alloc_helpers::deallocate(
  53. pointer, size, this_handler->handler_);
  54. }
  55. template <typename Function, typename Handler, typename Arg1>
  56. inline void asio_handler_invoke(const Function& function,
  57. binder1<Handler, Arg1>* this_handler)
  58. {
  59. asio_handler_invoke_helpers::invoke(
  60. function, this_handler->handler_);
  61. }
  62. template <typename Handler, typename Arg1>
  63. inline binder1<Handler, Arg1> bind_handler(const Handler& handler,
  64. const Arg1& arg1)
  65. {
  66. return binder1<Handler, Arg1>(handler, arg1);
  67. }
  68. template <typename Handler, typename Arg1, typename Arg2>
  69. class binder2
  70. {
  71. public:
  72. binder2(const Handler& handler, const Arg1& arg1, const Arg2& arg2)
  73. : handler_(handler),
  74. arg1_(arg1),
  75. arg2_(arg2)
  76. {
  77. }
  78. void operator()()
  79. {
  80. handler_(arg1_, arg2_);
  81. }
  82. void operator()() const
  83. {
  84. handler_(arg1_, arg2_);
  85. }
  86. //private:
  87. Handler handler_;
  88. Arg1 arg1_;
  89. Arg2 arg2_;
  90. };
  91. template <typename Handler, typename Arg1, typename Arg2>
  92. inline void* asio_handler_allocate(std::size_t size,
  93. binder2<Handler, Arg1, Arg2>* this_handler)
  94. {
  95. return asio_handler_alloc_helpers::allocate(
  96. size, this_handler->handler_);
  97. }
  98. template <typename Handler, typename Arg1, typename Arg2>
  99. inline void asio_handler_deallocate(void* pointer, std::size_t size,
  100. binder2<Handler, Arg1, Arg2>* this_handler)
  101. {
  102. asio_handler_alloc_helpers::deallocate(
  103. pointer, size, this_handler->handler_);
  104. }
  105. template <typename Function, typename Handler, typename Arg1, typename Arg2>
  106. inline void asio_handler_invoke(const Function& function,
  107. binder2<Handler, Arg1, Arg2>* this_handler)
  108. {
  109. asio_handler_invoke_helpers::invoke(
  110. function, this_handler->handler_);
  111. }
  112. template <typename Handler, typename Arg1, typename Arg2>
  113. inline binder2<Handler, Arg1, Arg2> bind_handler(const Handler& handler,
  114. const Arg1& arg1, const Arg2& arg2)
  115. {
  116. return binder2<Handler, Arg1, Arg2>(handler, arg1, arg2);
  117. }
  118. template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
  119. class binder3
  120. {
  121. public:
  122. binder3(const Handler& handler, const Arg1& arg1, const Arg2& arg2,
  123. const Arg3& arg3)
  124. : handler_(handler),
  125. arg1_(arg1),
  126. arg2_(arg2),
  127. arg3_(arg3)
  128. {
  129. }
  130. void operator()()
  131. {
  132. handler_(arg1_, arg2_, arg3_);
  133. }
  134. void operator()() const
  135. {
  136. handler_(arg1_, arg2_, arg3_);
  137. }
  138. //private:
  139. Handler handler_;
  140. Arg1 arg1_;
  141. Arg2 arg2_;
  142. Arg3 arg3_;
  143. };
  144. template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
  145. inline void* asio_handler_allocate(std::size_t size,
  146. binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
  147. {
  148. return asio_handler_alloc_helpers::allocate(
  149. size, this_handler->handler_);
  150. }
  151. template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
  152. inline void asio_handler_deallocate(void* pointer, std::size_t size,
  153. binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
  154. {
  155. asio_handler_alloc_helpers::deallocate(
  156. pointer, size, this_handler->handler_);
  157. }
  158. template <typename Function, typename Handler, typename Arg1, typename Arg2,
  159. typename Arg3>
  160. inline void asio_handler_invoke(const Function& function,
  161. binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
  162. {
  163. asio_handler_invoke_helpers::invoke(
  164. function, this_handler->handler_);
  165. }
  166. template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
  167. inline binder3<Handler, Arg1, Arg2, Arg3> bind_handler(const Handler& handler,
  168. const Arg1& arg1, const Arg2& arg2, const Arg3& arg3)
  169. {
  170. return binder3<Handler, Arg1, Arg2, Arg3>(handler, arg1, arg2, arg3);
  171. }
  172. template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
  173. typename Arg4>
  174. class binder4
  175. {
  176. public:
  177. binder4(const Handler& handler, const Arg1& arg1, const Arg2& arg2,
  178. const Arg3& arg3, const Arg4& arg4)
  179. : handler_(handler),
  180. arg1_(arg1),
  181. arg2_(arg2),
  182. arg3_(arg3),
  183. arg4_(arg4)
  184. {
  185. }
  186. void operator()()
  187. {
  188. handler_(arg1_, arg2_, arg3_, arg4_);
  189. }
  190. void operator()() const
  191. {
  192. handler_(arg1_, arg2_, arg3_, arg4_);
  193. }
  194. //private:
  195. Handler handler_;
  196. Arg1 arg1_;
  197. Arg2 arg2_;
  198. Arg3 arg3_;
  199. Arg4 arg4_;
  200. };
  201. template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
  202. typename Arg4>
  203. inline void* asio_handler_allocate(std::size_t size,
  204. binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
  205. {
  206. return asio_handler_alloc_helpers::allocate(
  207. size, this_handler->handler_);
  208. }
  209. template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
  210. typename Arg4>
  211. inline void asio_handler_deallocate(void* pointer, std::size_t size,
  212. binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
  213. {
  214. asio_handler_alloc_helpers::deallocate(
  215. pointer, size, this_handler->handler_);
  216. }
  217. template <typename Function, typename Handler, typename Arg1, typename Arg2,
  218. typename Arg3, typename Arg4>
  219. inline void asio_handler_invoke(const Function& function,
  220. binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
  221. {
  222. asio_handler_invoke_helpers::invoke(
  223. function, this_handler->handler_);
  224. }
  225. template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
  226. typename Arg4>
  227. inline binder4<Handler, Arg1, Arg2, Arg3, Arg4> bind_handler(
  228. const Handler& handler, const Arg1& arg1, const Arg2& arg2,
  229. const Arg3& arg3, const Arg4& arg4)
  230. {
  231. return binder4<Handler, Arg1, Arg2, Arg3, Arg4>(handler, arg1, arg2, arg3,
  232. arg4);
  233. }
  234. template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
  235. typename Arg4, typename Arg5>
  236. class binder5
  237. {
  238. public:
  239. binder5(const Handler& handler, const Arg1& arg1, const Arg2& arg2,
  240. const Arg3& arg3, const Arg4& arg4, const Arg5& arg5)
  241. : handler_(handler),
  242. arg1_(arg1),
  243. arg2_(arg2),
  244. arg3_(arg3),
  245. arg4_(arg4),
  246. arg5_(arg5)
  247. {
  248. }
  249. void operator()()
  250. {
  251. handler_(arg1_, arg2_, arg3_, arg4_, arg5_);
  252. }
  253. void operator()() const
  254. {
  255. handler_(arg1_, arg2_, arg3_, arg4_, arg5_);
  256. }
  257. //private:
  258. Handler handler_;
  259. Arg1 arg1_;
  260. Arg2 arg2_;
  261. Arg3 arg3_;
  262. Arg4 arg4_;
  263. Arg5 arg5_;
  264. };
  265. template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
  266. typename Arg4, typename Arg5>
  267. inline void* asio_handler_allocate(std::size_t size,
  268. binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
  269. {
  270. return asio_handler_alloc_helpers::allocate(
  271. size, this_handler->handler_);
  272. }
  273. template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
  274. typename Arg4, typename Arg5>
  275. inline void asio_handler_deallocate(void* pointer, std::size_t size,
  276. binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
  277. {
  278. asio_handler_alloc_helpers::deallocate(
  279. pointer, size, this_handler->handler_);
  280. }
  281. template <typename Function, typename Handler, typename Arg1, typename Arg2,
  282. typename Arg3, typename Arg4, typename Arg5>
  283. inline void asio_handler_invoke(const Function& function,
  284. binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
  285. {
  286. asio_handler_invoke_helpers::invoke(
  287. function, this_handler->handler_);
  288. }
  289. template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
  290. typename Arg4, typename Arg5>
  291. inline binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5> bind_handler(
  292. const Handler& handler, const Arg1& arg1, const Arg2& arg2,
  293. const Arg3& arg3, const Arg4& arg4, const Arg5& arg5)
  294. {
  295. return binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>(handler, arg1, arg2,
  296. arg3, arg4, arg5);
  297. }
  298. } // namespace detail
  299. } // namespace asio
  300. #include "asio/detail/pop_options.hpp"
  301. #endif // ASIO_DETAIL_BIND_HANDLER_HPP