2 // detail/bind_handler.hpp
3 // ~~~~~~~~~~~~~~~~~~~~~~~
5 // Copyright (c) 2003-2016 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/detail/handler_alloc_helpers.hpp>
20 #include <boost/asio/detail/handler_cont_helpers.hpp>
21 #include <boost/asio/detail/handler_invoke_helpers.hpp>
23 #include <boost/asio/detail/push_options.hpp>
29 template <typename Handler, typename Arg1>
33 binder1(const Handler& handler, const Arg1& arg1)
39 binder1(Handler& handler, const Arg1& arg1)
40 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
47 handler_(static_cast<const Arg1&>(arg1_));
50 void operator()() const
60 template <typename Handler, typename Arg1>
61 inline void* asio_handler_allocate(std::size_t size,
62 binder1<Handler, Arg1>* this_handler)
64 return boost_asio_handler_alloc_helpers::allocate(
65 size, this_handler->handler_);
68 template <typename Handler, typename Arg1>
69 inline void asio_handler_deallocate(void* pointer, std::size_t size,
70 binder1<Handler, Arg1>* this_handler)
72 boost_asio_handler_alloc_helpers::deallocate(
73 pointer, size, this_handler->handler_);
76 template <typename Handler, typename Arg1>
77 inline bool asio_handler_is_continuation(
78 binder1<Handler, Arg1>* this_handler)
80 return boost_asio_handler_cont_helpers::is_continuation(
81 this_handler->handler_);
84 template <typename Function, typename Handler, typename Arg1>
85 inline void asio_handler_invoke(Function& function,
86 binder1<Handler, Arg1>* this_handler)
88 boost_asio_handler_invoke_helpers::invoke(
89 function, this_handler->handler_);
92 template <typename Function, typename Handler, typename Arg1>
93 inline void asio_handler_invoke(const Function& function,
94 binder1<Handler, Arg1>* this_handler)
96 boost_asio_handler_invoke_helpers::invoke(
97 function, this_handler->handler_);
100 template <typename Handler, typename Arg1>
101 inline binder1<Handler, Arg1> bind_handler(Handler handler,
104 return binder1<Handler, Arg1>(handler, arg1);
107 template <typename Handler, typename Arg1, typename Arg2>
111 binder2(const Handler& handler, const Arg1& arg1, const Arg2& arg2)
118 binder2(Handler& handler, const Arg1& arg1, const Arg2& arg2)
119 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
127 handler_(static_cast<const Arg1&>(arg1_),
128 static_cast<const Arg2&>(arg2_));
131 void operator()() const
133 handler_(arg1_, arg2_);
142 template <typename Handler, typename Arg1, typename Arg2>
143 inline void* asio_handler_allocate(std::size_t size,
144 binder2<Handler, Arg1, Arg2>* this_handler)
146 return boost_asio_handler_alloc_helpers::allocate(
147 size, this_handler->handler_);
150 template <typename Handler, typename Arg1, typename Arg2>
151 inline void asio_handler_deallocate(void* pointer, std::size_t size,
152 binder2<Handler, Arg1, Arg2>* this_handler)
154 boost_asio_handler_alloc_helpers::deallocate(
155 pointer, size, this_handler->handler_);
158 template <typename Handler, typename Arg1, typename Arg2>
159 inline bool asio_handler_is_continuation(
160 binder2<Handler, Arg1, Arg2>* this_handler)
162 return boost_asio_handler_cont_helpers::is_continuation(
163 this_handler->handler_);
166 template <typename Function, typename Handler, typename Arg1, typename Arg2>
167 inline void asio_handler_invoke(Function& function,
168 binder2<Handler, Arg1, Arg2>* this_handler)
170 boost_asio_handler_invoke_helpers::invoke(
171 function, this_handler->handler_);
174 template <typename Function, typename Handler, typename Arg1, typename Arg2>
175 inline void asio_handler_invoke(const Function& function,
176 binder2<Handler, Arg1, Arg2>* this_handler)
178 boost_asio_handler_invoke_helpers::invoke(
179 function, this_handler->handler_);
182 template <typename Handler, typename Arg1, typename Arg2>
183 inline binder2<Handler, Arg1, Arg2> bind_handler(Handler handler,
184 const Arg1& arg1, const Arg2& arg2)
186 return binder2<Handler, Arg1, Arg2>(handler, arg1, arg2);
189 template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
193 binder3(const Handler& handler, const Arg1& arg1, const Arg2& arg2,
202 binder3(Handler& handler, const Arg1& arg1, const Arg2& arg2,
204 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
213 handler_(static_cast<const Arg1&>(arg1_),
214 static_cast<const Arg2&>(arg2_),
215 static_cast<const Arg3&>(arg3_));
218 void operator()() const
220 handler_(arg1_, arg2_, arg3_);
230 template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
231 inline void* asio_handler_allocate(std::size_t size,
232 binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
234 return boost_asio_handler_alloc_helpers::allocate(
235 size, this_handler->handler_);
238 template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
239 inline void asio_handler_deallocate(void* pointer, std::size_t size,
240 binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
242 boost_asio_handler_alloc_helpers::deallocate(
243 pointer, size, this_handler->handler_);
246 template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
247 inline bool asio_handler_is_continuation(
248 binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
250 return boost_asio_handler_cont_helpers::is_continuation(
251 this_handler->handler_);
254 template <typename Function, typename Handler, typename Arg1, typename Arg2,
256 inline void asio_handler_invoke(Function& function,
257 binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
259 boost_asio_handler_invoke_helpers::invoke(
260 function, this_handler->handler_);
263 template <typename Function, typename Handler, typename Arg1, typename Arg2,
265 inline void asio_handler_invoke(const Function& function,
266 binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
268 boost_asio_handler_invoke_helpers::invoke(
269 function, this_handler->handler_);
272 template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
273 inline binder3<Handler, Arg1, Arg2, Arg3> bind_handler(Handler handler,
274 const Arg1& arg1, const Arg2& arg2, const Arg3& arg3)
276 return binder3<Handler, Arg1, Arg2, Arg3>(handler, arg1, arg2, arg3);
279 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
284 binder4(const Handler& handler, const Arg1& arg1, const Arg2& arg2,
285 const Arg3& arg3, const Arg4& arg4)
294 binder4(Handler& handler, const Arg1& arg1, const Arg2& arg2,
295 const Arg3& arg3, const Arg4& arg4)
296 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
306 handler_(static_cast<const Arg1&>(arg1_),
307 static_cast<const Arg2&>(arg2_),
308 static_cast<const Arg3&>(arg3_),
309 static_cast<const Arg4&>(arg4_));
312 void operator()() const
314 handler_(arg1_, arg2_, arg3_, arg4_);
325 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
327 inline void* asio_handler_allocate(std::size_t size,
328 binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
330 return boost_asio_handler_alloc_helpers::allocate(
331 size, this_handler->handler_);
334 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
336 inline void asio_handler_deallocate(void* pointer, std::size_t size,
337 binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
339 boost_asio_handler_alloc_helpers::deallocate(
340 pointer, size, this_handler->handler_);
343 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
345 inline bool asio_handler_is_continuation(
346 binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
348 return boost_asio_handler_cont_helpers::is_continuation(
349 this_handler->handler_);
352 template <typename Function, typename Handler, typename Arg1, typename Arg2,
353 typename Arg3, typename Arg4>
354 inline void asio_handler_invoke(Function& function,
355 binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
357 boost_asio_handler_invoke_helpers::invoke(
358 function, this_handler->handler_);
361 template <typename Function, typename Handler, typename Arg1, typename Arg2,
362 typename Arg3, typename Arg4>
363 inline void asio_handler_invoke(const Function& function,
364 binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
366 boost_asio_handler_invoke_helpers::invoke(
367 function, this_handler->handler_);
370 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
372 inline binder4<Handler, Arg1, Arg2, Arg3, Arg4> bind_handler(
373 Handler handler, const Arg1& arg1, const Arg2& arg2,
374 const Arg3& arg3, const Arg4& arg4)
376 return binder4<Handler, Arg1, Arg2, Arg3, Arg4>(handler, arg1, arg2, arg3,
380 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
381 typename Arg4, typename Arg5>
385 binder5(const Handler& handler, const Arg1& arg1, const Arg2& arg2,
386 const Arg3& arg3, const Arg4& arg4, const Arg5& arg5)
396 binder5(Handler& handler, const Arg1& arg1, const Arg2& arg2,
397 const Arg3& arg3, const Arg4& arg4, const Arg5& arg5)
398 : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
409 handler_(static_cast<const Arg1&>(arg1_),
410 static_cast<const Arg2&>(arg2_),
411 static_cast<const Arg3&>(arg3_),
412 static_cast<const Arg4&>(arg4_),
413 static_cast<const Arg5&>(arg5_));
416 void operator()() const
418 handler_(arg1_, arg2_, arg3_, arg4_, arg5_);
430 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
431 typename Arg4, typename Arg5>
432 inline void* asio_handler_allocate(std::size_t size,
433 binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
435 return boost_asio_handler_alloc_helpers::allocate(
436 size, this_handler->handler_);
439 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
440 typename Arg4, typename Arg5>
441 inline void asio_handler_deallocate(void* pointer, std::size_t size,
442 binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
444 boost_asio_handler_alloc_helpers::deallocate(
445 pointer, size, this_handler->handler_);
448 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
449 typename Arg4, typename Arg5>
450 inline bool asio_handler_is_continuation(
451 binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
453 return boost_asio_handler_cont_helpers::is_continuation(
454 this_handler->handler_);
457 template <typename Function, typename Handler, typename Arg1, typename Arg2,
458 typename Arg3, typename Arg4, typename Arg5>
459 inline void asio_handler_invoke(Function& function,
460 binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
462 boost_asio_handler_invoke_helpers::invoke(
463 function, this_handler->handler_);
466 template <typename Function, typename Handler, typename Arg1, typename Arg2,
467 typename Arg3, typename Arg4, typename Arg5>
468 inline void asio_handler_invoke(const Function& function,
469 binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
471 boost_asio_handler_invoke_helpers::invoke(
472 function, this_handler->handler_);
475 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
476 typename Arg4, typename Arg5>
477 inline binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5> bind_handler(
478 Handler handler, const Arg1& arg1, const Arg2& arg2,
479 const Arg3& arg3, const Arg4& arg4, const Arg5& arg5)
481 return binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>(handler, arg1, arg2,
485 } // namespace detail
489 #include <boost/asio/detail/pop_options.hpp>
491 #endif // BOOST_ASIO_DETAIL_BIND_HANDLER_HPP