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 
11 #ifndef BOOST_ASIO_DETAIL_BIND_HANDLER_HPP
12 #define BOOST_ASIO_DETAIL_BIND_HANDLER_HPP
13 
14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
15 # pragma once
16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
17 
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>
22 
23 #include <boost/asio/detail/push_options.hpp>
24 
25 namespace boost {
26 namespace asio {
27 namespace detail {
28 
29 template <typename Handler, typename Arg1>
30 class binder1
31 {
32 public:
binder1(const Handler & handler,const Arg1 & arg1)33   binder1(const Handler& handler, const Arg1& arg1)
34     : handler_(handler),
35       arg1_(arg1)
36   {
37   }
38 
binder1(Handler & handler,const Arg1 & arg1)39   binder1(Handler& handler, const Arg1& arg1)
40     : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
41       arg1_(arg1)
42   {
43   }
44 
operator ()()45   void operator()()
46   {
47     handler_(static_cast<const Arg1&>(arg1_));
48   }
49 
operator ()() const50   void operator()() const
51   {
52     handler_(arg1_);
53   }
54 
55 //private:
56   Handler handler_;
57   Arg1 arg1_;
58 };
59 
60 template <typename Handler, typename Arg1>
asio_handler_allocate(std::size_t size,binder1<Handler,Arg1> * this_handler)61 inline void* asio_handler_allocate(std::size_t size,
62     binder1<Handler, Arg1>* this_handler)
63 {
64   return boost_asio_handler_alloc_helpers::allocate(
65       size, this_handler->handler_);
66 }
67 
68 template <typename Handler, typename Arg1>
asio_handler_deallocate(void * pointer,std::size_t size,binder1<Handler,Arg1> * this_handler)69 inline void asio_handler_deallocate(void* pointer, std::size_t size,
70     binder1<Handler, Arg1>* this_handler)
71 {
72   boost_asio_handler_alloc_helpers::deallocate(
73       pointer, size, this_handler->handler_);
74 }
75 
76 template <typename Handler, typename Arg1>
asio_handler_is_continuation(binder1<Handler,Arg1> * this_handler)77 inline bool asio_handler_is_continuation(
78     binder1<Handler, Arg1>* this_handler)
79 {
80   return boost_asio_handler_cont_helpers::is_continuation(
81       this_handler->handler_);
82 }
83 
84 template <typename Function, typename Handler, typename Arg1>
asio_handler_invoke(Function & function,binder1<Handler,Arg1> * this_handler)85 inline void asio_handler_invoke(Function& function,
86     binder1<Handler, Arg1>* this_handler)
87 {
88   boost_asio_handler_invoke_helpers::invoke(
89       function, this_handler->handler_);
90 }
91 
92 template <typename Function, typename Handler, typename Arg1>
asio_handler_invoke(const Function & function,binder1<Handler,Arg1> * this_handler)93 inline void asio_handler_invoke(const Function& function,
94     binder1<Handler, Arg1>* this_handler)
95 {
96   boost_asio_handler_invoke_helpers::invoke(
97       function, this_handler->handler_);
98 }
99 
100 template <typename Handler, typename Arg1>
bind_handler(Handler handler,const Arg1 & arg1)101 inline binder1<Handler, Arg1> bind_handler(Handler handler,
102     const Arg1& arg1)
103 {
104   return binder1<Handler, Arg1>(handler, arg1);
105 }
106 
107 template <typename Handler, typename Arg1, typename Arg2>
108 class binder2
109 {
110 public:
binder2(const Handler & handler,const Arg1 & arg1,const Arg2 & arg2)111   binder2(const Handler& handler, const Arg1& arg1, const Arg2& arg2)
112     : handler_(handler),
113       arg1_(arg1),
114       arg2_(arg2)
115   {
116   }
117 
binder2(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)),
120       arg1_(arg1),
121       arg2_(arg2)
122   {
123   }
124 
operator ()()125   void operator()()
126   {
127     handler_(static_cast<const Arg1&>(arg1_),
128         static_cast<const Arg2&>(arg2_));
129   }
130 
operator ()() const131   void operator()() const
132   {
133     handler_(arg1_, arg2_);
134   }
135 
136 //private:
137   Handler handler_;
138   Arg1 arg1_;
139   Arg2 arg2_;
140 };
141 
142 template <typename Handler, typename Arg1, typename Arg2>
asio_handler_allocate(std::size_t size,binder2<Handler,Arg1,Arg2> * this_handler)143 inline void* asio_handler_allocate(std::size_t size,
144     binder2<Handler, Arg1, Arg2>* this_handler)
145 {
146   return boost_asio_handler_alloc_helpers::allocate(
147       size, this_handler->handler_);
148 }
149 
150 template <typename Handler, typename Arg1, typename Arg2>
asio_handler_deallocate(void * pointer,std::size_t size,binder2<Handler,Arg1,Arg2> * this_handler)151 inline void asio_handler_deallocate(void* pointer, std::size_t size,
152     binder2<Handler, Arg1, Arg2>* this_handler)
153 {
154   boost_asio_handler_alloc_helpers::deallocate(
155       pointer, size, this_handler->handler_);
156 }
157 
158 template <typename Handler, typename Arg1, typename Arg2>
asio_handler_is_continuation(binder2<Handler,Arg1,Arg2> * this_handler)159 inline bool asio_handler_is_continuation(
160     binder2<Handler, Arg1, Arg2>* this_handler)
161 {
162   return boost_asio_handler_cont_helpers::is_continuation(
163       this_handler->handler_);
164 }
165 
166 template <typename Function, typename Handler, typename Arg1, typename Arg2>
asio_handler_invoke(Function & function,binder2<Handler,Arg1,Arg2> * this_handler)167 inline void asio_handler_invoke(Function& function,
168     binder2<Handler, Arg1, Arg2>* this_handler)
169 {
170   boost_asio_handler_invoke_helpers::invoke(
171       function, this_handler->handler_);
172 }
173 
174 template <typename Function, typename Handler, typename Arg1, typename Arg2>
asio_handler_invoke(const Function & function,binder2<Handler,Arg1,Arg2> * this_handler)175 inline void asio_handler_invoke(const Function& function,
176     binder2<Handler, Arg1, Arg2>* this_handler)
177 {
178   boost_asio_handler_invoke_helpers::invoke(
179       function, this_handler->handler_);
180 }
181 
182 template <typename Handler, typename Arg1, typename Arg2>
bind_handler(Handler handler,const Arg1 & arg1,const Arg2 & arg2)183 inline binder2<Handler, Arg1, Arg2> bind_handler(Handler handler,
184     const Arg1& arg1, const Arg2& arg2)
185 {
186   return binder2<Handler, Arg1, Arg2>(handler, arg1, arg2);
187 }
188 
189 template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
190 class binder3
191 {
192 public:
binder3(const Handler & handler,const Arg1 & arg1,const Arg2 & arg2,const Arg3 & arg3)193   binder3(const Handler& handler, const Arg1& arg1, const Arg2& arg2,
194       const Arg3& arg3)
195     : handler_(handler),
196       arg1_(arg1),
197       arg2_(arg2),
198       arg3_(arg3)
199   {
200   }
201 
binder3(Handler & handler,const Arg1 & arg1,const Arg2 & arg2,const Arg3 & arg3)202   binder3(Handler& handler, const Arg1& arg1, const Arg2& arg2,
203       const Arg3& arg3)
204     : handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
205       arg1_(arg1),
206       arg2_(arg2),
207       arg3_(arg3)
208   {
209   }
210 
operator ()()211   void operator()()
212   {
213     handler_(static_cast<const Arg1&>(arg1_),
214         static_cast<const Arg2&>(arg2_),
215         static_cast<const Arg3&>(arg3_));
216   }
217 
operator ()() const218   void operator()() const
219   {
220     handler_(arg1_, arg2_, arg3_);
221   }
222 
223 //private:
224   Handler handler_;
225   Arg1 arg1_;
226   Arg2 arg2_;
227   Arg3 arg3_;
228 };
229 
230 template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
asio_handler_allocate(std::size_t size,binder3<Handler,Arg1,Arg2,Arg3> * this_handler)231 inline void* asio_handler_allocate(std::size_t size,
232     binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
233 {
234   return boost_asio_handler_alloc_helpers::allocate(
235       size, this_handler->handler_);
236 }
237 
238 template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
asio_handler_deallocate(void * pointer,std::size_t size,binder3<Handler,Arg1,Arg2,Arg3> * this_handler)239 inline void asio_handler_deallocate(void* pointer, std::size_t size,
240     binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
241 {
242   boost_asio_handler_alloc_helpers::deallocate(
243       pointer, size, this_handler->handler_);
244 }
245 
246 template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
asio_handler_is_continuation(binder3<Handler,Arg1,Arg2,Arg3> * this_handler)247 inline bool asio_handler_is_continuation(
248     binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
249 {
250   return boost_asio_handler_cont_helpers::is_continuation(
251       this_handler->handler_);
252 }
253 
254 template <typename Function, typename Handler, typename Arg1, typename Arg2,
255     typename Arg3>
asio_handler_invoke(Function & function,binder3<Handler,Arg1,Arg2,Arg3> * this_handler)256 inline void asio_handler_invoke(Function& function,
257     binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
258 {
259   boost_asio_handler_invoke_helpers::invoke(
260       function, this_handler->handler_);
261 }
262 
263 template <typename Function, typename Handler, typename Arg1, typename Arg2,
264     typename Arg3>
asio_handler_invoke(const Function & function,binder3<Handler,Arg1,Arg2,Arg3> * this_handler)265 inline void asio_handler_invoke(const Function& function,
266     binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
267 {
268   boost_asio_handler_invoke_helpers::invoke(
269       function, this_handler->handler_);
270 }
271 
272 template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
bind_handler(Handler handler,const Arg1 & arg1,const Arg2 & arg2,const Arg3 & arg3)273 inline binder3<Handler, Arg1, Arg2, Arg3> bind_handler(Handler handler,
274     const Arg1& arg1, const Arg2& arg2, const Arg3& arg3)
275 {
276   return binder3<Handler, Arg1, Arg2, Arg3>(handler, arg1, arg2, arg3);
277 }
278 
279 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
280     typename Arg4>
281 class binder4
282 {
283 public:
binder4(const Handler & handler,const Arg1 & arg1,const Arg2 & arg2,const Arg3 & arg3,const Arg4 & arg4)284   binder4(const Handler& handler, const Arg1& arg1, const Arg2& arg2,
285       const Arg3& arg3, const Arg4& arg4)
286     : handler_(handler),
287       arg1_(arg1),
288       arg2_(arg2),
289       arg3_(arg3),
290       arg4_(arg4)
291   {
292   }
293 
binder4(Handler & handler,const Arg1 & arg1,const Arg2 & arg2,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)),
297       arg1_(arg1),
298       arg2_(arg2),
299       arg3_(arg3),
300       arg4_(arg4)
301   {
302   }
303 
operator ()()304   void operator()()
305   {
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_));
310   }
311 
operator ()() const312   void operator()() const
313   {
314     handler_(arg1_, arg2_, arg3_, arg4_);
315   }
316 
317 //private:
318   Handler handler_;
319   Arg1 arg1_;
320   Arg2 arg2_;
321   Arg3 arg3_;
322   Arg4 arg4_;
323 };
324 
325 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
326     typename Arg4>
asio_handler_allocate(std::size_t size,binder4<Handler,Arg1,Arg2,Arg3,Arg4> * this_handler)327 inline void* asio_handler_allocate(std::size_t size,
328     binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
329 {
330   return boost_asio_handler_alloc_helpers::allocate(
331       size, this_handler->handler_);
332 }
333 
334 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
335     typename Arg4>
asio_handler_deallocate(void * pointer,std::size_t size,binder4<Handler,Arg1,Arg2,Arg3,Arg4> * this_handler)336 inline void asio_handler_deallocate(void* pointer, std::size_t size,
337     binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
338 {
339   boost_asio_handler_alloc_helpers::deallocate(
340       pointer, size, this_handler->handler_);
341 }
342 
343 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
344     typename Arg4>
asio_handler_is_continuation(binder4<Handler,Arg1,Arg2,Arg3,Arg4> * this_handler)345 inline bool asio_handler_is_continuation(
346     binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
347 {
348   return boost_asio_handler_cont_helpers::is_continuation(
349       this_handler->handler_);
350 }
351 
352 template <typename Function, typename Handler, typename Arg1, typename Arg2,
353     typename Arg3, typename Arg4>
asio_handler_invoke(Function & function,binder4<Handler,Arg1,Arg2,Arg3,Arg4> * this_handler)354 inline void asio_handler_invoke(Function& function,
355     binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
356 {
357   boost_asio_handler_invoke_helpers::invoke(
358       function, this_handler->handler_);
359 }
360 
361 template <typename Function, typename Handler, typename Arg1, typename Arg2,
362     typename Arg3, typename Arg4>
asio_handler_invoke(const Function & function,binder4<Handler,Arg1,Arg2,Arg3,Arg4> * this_handler)363 inline void asio_handler_invoke(const Function& function,
364     binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
365 {
366   boost_asio_handler_invoke_helpers::invoke(
367       function, this_handler->handler_);
368 }
369 
370 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
371     typename Arg4>
bind_handler(Handler handler,const Arg1 & arg1,const Arg2 & arg2,const Arg3 & arg3,const Arg4 & arg4)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)
375 {
376   return binder4<Handler, Arg1, Arg2, Arg3, Arg4>(handler, arg1, arg2, arg3,
377       arg4);
378 }
379 
380 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
381     typename Arg4, typename Arg5>
382 class binder5
383 {
384 public:
binder5(const Handler & handler,const Arg1 & arg1,const Arg2 & arg2,const Arg3 & arg3,const Arg4 & arg4,const Arg5 & arg5)385   binder5(const Handler& handler, const Arg1& arg1, const Arg2& arg2,
386       const Arg3& arg3, const Arg4& arg4, const Arg5& arg5)
387     : handler_(handler),
388       arg1_(arg1),
389       arg2_(arg2),
390       arg3_(arg3),
391       arg4_(arg4),
392       arg5_(arg5)
393   {
394   }
395 
binder5(Handler & handler,const Arg1 & arg1,const Arg2 & arg2,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)),
399       arg1_(arg1),
400       arg2_(arg2),
401       arg3_(arg3),
402       arg4_(arg4),
403       arg5_(arg5)
404   {
405   }
406 
operator ()()407   void operator()()
408   {
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_));
414   }
415 
operator ()() const416   void operator()() const
417   {
418     handler_(arg1_, arg2_, arg3_, arg4_, arg5_);
419   }
420 
421 //private:
422   Handler handler_;
423   Arg1 arg1_;
424   Arg2 arg2_;
425   Arg3 arg3_;
426   Arg4 arg4_;
427   Arg5 arg5_;
428 };
429 
430 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
431     typename Arg4, typename Arg5>
asio_handler_allocate(std::size_t size,binder5<Handler,Arg1,Arg2,Arg3,Arg4,Arg5> * this_handler)432 inline void* asio_handler_allocate(std::size_t size,
433     binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
434 {
435   return boost_asio_handler_alloc_helpers::allocate(
436       size, this_handler->handler_);
437 }
438 
439 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
440     typename Arg4, typename Arg5>
asio_handler_deallocate(void * pointer,std::size_t size,binder5<Handler,Arg1,Arg2,Arg3,Arg4,Arg5> * this_handler)441 inline void asio_handler_deallocate(void* pointer, std::size_t size,
442     binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
443 {
444   boost_asio_handler_alloc_helpers::deallocate(
445       pointer, size, this_handler->handler_);
446 }
447 
448 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
449     typename Arg4, typename Arg5>
asio_handler_is_continuation(binder5<Handler,Arg1,Arg2,Arg3,Arg4,Arg5> * this_handler)450 inline bool asio_handler_is_continuation(
451     binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
452 {
453   return boost_asio_handler_cont_helpers::is_continuation(
454       this_handler->handler_);
455 }
456 
457 template <typename Function, typename Handler, typename Arg1, typename Arg2,
458     typename Arg3, typename Arg4, typename Arg5>
asio_handler_invoke(Function & function,binder5<Handler,Arg1,Arg2,Arg3,Arg4,Arg5> * this_handler)459 inline void asio_handler_invoke(Function& function,
460     binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
461 {
462   boost_asio_handler_invoke_helpers::invoke(
463       function, this_handler->handler_);
464 }
465 
466 template <typename Function, typename Handler, typename Arg1, typename Arg2,
467     typename Arg3, typename Arg4, typename Arg5>
asio_handler_invoke(const Function & function,binder5<Handler,Arg1,Arg2,Arg3,Arg4,Arg5> * this_handler)468 inline void asio_handler_invoke(const Function& function,
469     binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
470 {
471   boost_asio_handler_invoke_helpers::invoke(
472       function, this_handler->handler_);
473 }
474 
475 template <typename Handler, typename Arg1, typename Arg2, typename Arg3,
476     typename Arg4, typename Arg5>
bind_handler(Handler handler,const Arg1 & arg1,const Arg2 & arg2,const Arg3 & arg3,const Arg4 & arg4,const Arg5 & 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)
480 {
481   return binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>(handler, arg1, arg2,
482       arg3, arg4, arg5);
483 }
484 
485 } // namespace detail
486 } // namespace asio
487 } // namespace boost
488 
489 #include <boost/asio/detail/pop_options.hpp>
490 
491 #endif // BOOST_ASIO_DETAIL_BIND_HANDLER_HPP
492