root/trunk/whisperlib/common/base/callback/result_closure.h

Revision 7, 18.8 kB (checked in by whispercastorg, 2 years ago)

version 0.2.0

Line 
1 // Copyright (c) 2009, Whispersoft s.r.l.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
13 // distribution.
14 // * Neither the name of Whispersoft s.r.l. nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 //
30
31 #ifndef __COMMON_CALLBACK_BASE_RESULT_CLOSURE_H__
32 #define __COMMON_CALLBACK_BASE_RESULT_CLOSURE_H__
33
34
35 template<typename R>
36 class ResultClosure {
37 public:
38   ResultClosure(bool is_permanent)
39     : is_permanent_(is_permanent) {
40   }
41   virtual ~ResultClosure() {
42   }
43   R Run() {
44     R ret = RunInternal();
45     if ( !is_permanent_ )
46       delete this;
47     return ret;
48   }
49   bool is_permanent() const { return is_permanent_; }
50 protected:
51   virtual R RunInternal() = 0;
52 private:
53   bool is_permanent_;
54 };
55
56
57 /////////////////////////////////////////////////////////////////////
58
59 template<typename R>
60 class ResultClosure_0 : public ResultClosure<R> {
61 public:
62   typedef R (*Fun)();
63   ResultClosure_0(bool is_permanent, Fun fun)
64     : ResultClosure<R>(is_permanent),
65       fun_(fun) {
66   }
67 protected:
68   virtual R RunInternal() {
69     return (*fun_)();
70   }
71 private:
72   Fun fun_;
73 };
74 template<typename R>
75 ResultClosure_0<R>* NewCallback(R (*fun)()) {
76   return new ResultClosure_0<R>(false, fun);
77 }
78 template<typename R>
79 ResultClosure_0<R>* NewPermanentCallback(R (*fun)()) {
80   return new ResultClosure_0<R>(true, fun);
81 }
82
83
84 template<typename C, typename R>
85 class ResultMemberClosure_0 : public ResultClosure<R> {
86 public:
87   typedef R (C::*Fun)();
88   ResultMemberClosure_0 (bool is_permanent, C* c, Fun fun)
89     : ResultClosure<R>(is_permanent),
90       c_(c),
91       fun_(fun) {
92   }
93 protected:
94   virtual R RunInternal() {
95     return (c_->*fun_)();
96   }
97 private:
98   C* c_;
99   Fun fun_;
100 };
101
102 template<typename C, typename R>
103 ResultMemberClosure_0<C, R>* NewCallback(C* c, R (C::*fun)()) {
104   return new ResultMemberClosure_0<C, R>(false, c, fun);
105 }
106 template<typename C, typename R>
107 ResultMemberClosure_0<C, R>* NewPermanentCallback(C* c, R (C::*fun)()) {
108   return new ResultMemberClosure_0<C, R>(true, c, fun);
109 }
110
111 template<typename C, typename R>
112 class ResultConstMemberClosure_0 : public ResultClosure<R> {
113 public:
114   typedef R (C::*Fun)() const;
115   ResultConstMemberClosure_0 (bool is_permanent, const C* c, Fun fun)
116     : ResultClosure<R>(is_permanent),
117       c_(c),
118       fun_(fun) {
119   }
120 protected:
121   virtual R RunInternal() {
122     return (c_->*fun_)();
123   }
124 private:
125   const C* c_;
126   Fun fun_;
127 };
128
129 template<typename C, typename R>
130 ResultConstMemberClosure_0<C, R>* NewCallback(const C* c, R (C::*fun)() const) {
131   return new ResultConstMemberClosure_0<C, R>(false, c, fun);
132 }
133 template<typename C, typename R>
134 ResultConstMemberClosure_0<C, R>* NewPermanentCallback(const C* c, R (C::*fun)() const) {
135   return new ResultConstMemberClosure_0<C, R>(true, c, fun);
136 }
137
138 ////////////////////////////////////////////////////////////////////////////////
139
140 template<typename R, typename T0>
141 class ResultClosure_1 : public ResultClosure<R> {
142 public:
143   typedef R (*Fun)(T0);
144   ResultClosure_1(bool is_permanent, Fun fun, T0 p0)
145     : ResultClosure<R>(is_permanent),
146     p0_(p0),
147       fun_(fun) {
148   }
149 protected:
150   virtual R RunInternal() {
151     return (*fun_)(p0_);
152   }
153 private:
154   T0 p0_;
155   Fun fun_;
156 };
157 template<typename R, typename T0>
158 ResultClosure_1<R, T0>* NewCallback(R (*fun)(T0), T0 p0) {
159   return new ResultClosure_1<R, T0>(false, fun, p0);
160 }
161 template<typename R, typename T0>
162 ResultClosure_1<R, T0>* NewPermanentCallback(R (*fun)(T0), T0 p0) {
163   return new ResultClosure_1<R, T0>(true, fun, p0);
164 }
165
166
167 template<typename C, typename R, typename T0>
168 class ResultConstMemberClosure_1 : public ResultClosure<R> {
169 public:
170   typedef R (C::*Fun)(T0) const;
171   ResultConstMemberClosure_1 (bool is_permanent, const C* c, Fun fun, T0 p0)
172     : ResultClosure<R>(is_permanent),
173     c_(c),
174     p0_(p0),
175     fun_(fun) {
176   }
177 protected:
178   virtual R RunInternal() {
179     return (c_->*fun_)(p0_);
180   }
181 private:
182   const C* c_;
183   T0 p0_;
184   Fun fun_;
185 };
186
187 template<typename C, typename R, typename T0>
188 ResultConstMemberClosure_1<C, R, T0>* NewCallback(const C* c, R (C::*fun)(T0) const, T0 p0) {
189   return new ResultConstMemberClosure_1<C, R, T0>(false, c, fun, p0);
190 }
191 template<typename C, typename R, typename T0>
192 ResultConstMemberClosure_1<C, R, T0>* NewPermanentCallback(const C* c, R (C::*fun)(T0) const, T0 p0) {
193   return new ResultConstMemberClosure_1<C, R, T0>(true, c, fun, p0);
194 }
195
196
197
198 template<typename C, typename R, typename T0>
199 class ResultMemberClosure_1 : public ResultClosure<R> {
200 public:
201   typedef R (C::*Fun)(T0);
202   ResultMemberClosure_1 (bool is_permanent, C* c, Fun fun, T0 p0)
203     : ResultClosure<R>(is_permanent),
204     c_(c),
205     p0_(p0),
206     fun_(fun) {
207   }
208 protected:
209   virtual R RunInternal() {
210     return (c_->*fun_)(p0_);
211   }
212 private:
213   C* c_;
214   T0 p0_;
215   Fun fun_;
216 };
217
218 template<typename C, typename R, typename T0>
219 ResultMemberClosure_1<C, R, T0>* NewCallback(C* c, R (C::*fun)(T0), T0 p0) {
220   return new ResultMemberClosure_1<C, R, T0>(false, c, fun, p0);
221 }
222 template<typename C, typename R, typename T0>
223 ResultMemberClosure_1<C, R, T0>* NewPermanentCallback(C* c, R (C::*fun)(T0), T0 p0) {
224   return new ResultMemberClosure_1<C, R, T0>(true, c, fun, p0);
225 }
226
227
228
229 template<typename R, typename T0, typename T1>
230 class ResultClosure_2 : public ResultClosure<R> {
231 public:
232   typedef R (*Fun)(T0, T1);
233   ResultClosure_2(bool is_permanent, Fun fun, T0 p0, T1 p1)
234     : ResultClosure<R>(is_permanent),
235     p0_(p0),
236 p1_(p1),
237       fun_(fun) {
238   }
239 protected:
240   virtual R RunInternal() {
241     return (*fun_)(p0_, p1_);
242   }
243 private:
244   T0 p0_;
245 T1 p1_;
246   Fun fun_;
247 };
248 template<typename R, typename T0, typename T1>
249 ResultClosure_2<R, T0, T1>* NewCallback(R (*fun)(T0, T1), T0 p0, T1 p1) {
250   return new ResultClosure_2<R, T0, T1>(false, fun, p0, p1);
251 }
252 template<typename R, typename T0, typename T1>
253 ResultClosure_2<R, T0, T1>* NewPermanentCallback(R (*fun)(T0, T1), T0 p0, T1 p1) {
254   return new ResultClosure_2<R, T0, T1>(true, fun, p0, p1);
255 }
256
257
258 template<typename C, typename R, typename T0, typename T1>
259 class ResultConstMemberClosure_2 : public ResultClosure<R> {
260 public:
261   typedef R (C::*Fun)(T0, T1) const;
262   ResultConstMemberClosure_2 (bool is_permanent, const C* c, Fun fun, T0 p0, T1 p1)
263     : ResultClosure<R>(is_permanent),
264     c_(c),
265     p0_(p0),
266 p1_(p1),
267     fun_(fun) {
268   }
269 protected:
270   virtual R RunInternal() {
271     return (c_->*fun_)(p0_, p1_);
272   }
273 private:
274   const C* c_;
275   T0 p0_;
276 T1 p1_;
277   Fun fun_;
278 };
279
280 template<typename C, typename R, typename T0, typename T1>
281 ResultConstMemberClosure_2<C, R, T0, T1>* NewCallback(const C* c, R (C::*fun)(T0, T1) const, T0 p0, T1 p1) {
282   return new ResultConstMemberClosure_2<C, R, T0, T1>(false, c, fun, p0, p1);
283 }
284 template<typename C, typename R, typename T0, typename T1>
285 ResultConstMemberClosure_2<C, R, T0, T1>* NewPermanentCallback(const C* c, R (C::*fun)(T0, T1) const, T0 p0, T1 p1) {
286   return new ResultConstMemberClosure_2<C, R, T0, T1>(true, c, fun, p0, p1);
287 }
288
289
290
291 template<typename C, typename R, typename T0, typename T1>
292 class ResultMemberClosure_2 : public ResultClosure<R> {
293 public:
294   typedef R (C::*Fun)(T0, T1);
295   ResultMemberClosure_2 (bool is_permanent, C* c, Fun fun, T0 p0, T1 p1)
296     : ResultClosure<R>(is_permanent),
297     c_(c),
298     p0_(p0),
299 p1_(p1),
300     fun_(fun) {
301   }
302 protected:
303   virtual R RunInternal() {
304     return (c_->*fun_)(p0_, p1_);
305   }
306 private:
307   C* c_;
308   T0 p0_;
309 T1 p1_;
310   Fun fun_;
311 };
312
313 template<typename C, typename R, typename T0, typename T1>
314 ResultMemberClosure_2<C, R, T0, T1>* NewCallback(C* c, R (C::*fun)(T0, T1), T0 p0, T1 p1) {
315   return new ResultMemberClosure_2<C, R, T0, T1>(false, c, fun, p0, p1);
316 }
317 template<typename C, typename R, typename T0, typename T1>
318 ResultMemberClosure_2<C, R, T0, T1>* NewPermanentCallback(C* c, R (C::*fun)(T0, T1), T0 p0, T1 p1) {
319   return new ResultMemberClosure_2<C, R, T0, T1>(true, c, fun, p0, p1);
320 }
321
322
323
324 template<typename R, typename T0, typename T1, typename T2>
325 class ResultClosure_3 : public ResultClosure<R> {
326 public:
327   typedef R (*Fun)(T0, T1, T2);
328   ResultClosure_3(bool is_permanent, Fun fun, T0 p0, T1 p1, T2 p2)
329     : ResultClosure<R>(is_permanent),
330     p0_(p0),
331 p1_(p1),
332 p2_(p2),
333       fun_(fun) {
334   }
335 protected:
336   virtual R RunInternal() {
337     return (*fun_)(p0_, p1_, p2_);
338   }
339 private:
340   T0 p0_;
341 T1 p1_;
342 T2 p2_;
343   Fun fun_;
344 };
345 template<typename R, typename T0, typename T1, typename T2>
346 ResultClosure_3<R, T0, T1, T2>* NewCallback(R (*fun)(T0, T1, T2), T0 p0, T1 p1, T2 p2) {
347   return new ResultClosure_3<R, T0, T1, T2>(false, fun, p0, p1, p2);
348 }
349 template<typename R, typename T0, typename T1, typename T2>
350 ResultClosure_3<R, T0, T1, T2>* NewPermanentCallback(R (*fun)(T0, T1, T2), T0 p0, T1 p1, T2 p2) {
351   return new ResultClosure_3<R, T0, T1, T2>(true, fun, p0, p1, p2);
352 }
353
354
355 template<typename C, typename R, typename T0, typename T1, typename T2>
356 class ResultConstMemberClosure_3 : public ResultClosure<R> {
357 public:
358   typedef R (C::*Fun)(T0, T1, T2) const;
359   ResultConstMemberClosure_3 (bool is_permanent, const C* c, Fun fun, T0 p0, T1 p1, T2 p2)
360     : ResultClosure<R>(is_permanent),
361     c_(c),
362     p0_(p0),
363 p1_(p1),
364 p2_(p2),
365     fun_(fun) {
366   }
367 protected:
368   virtual R RunInternal() {
369     return (c_->*fun_)(p0_, p1_, p2_);
370   }
371 private:
372   const C* c_;
373   T0 p0_;
374 T1 p1_;
375 T2 p2_;
376   Fun fun_;
377 };
378
379 template<typename C, typename R, typename T0, typename T1, typename T2>
380 ResultConstMemberClosure_3<C, R, T0, T1, T2>* NewCallback(const C* c, R (C::*fun)(T0, T1, T2) const, T0 p0, T1 p1, T2 p2) {
381   return new ResultConstMemberClosure_3<C, R, T0, T1, T2>(false, c, fun, p0, p1, p2);
382 }
383 template<typename C, typename R, typename T0, typename T1, typename T2>
384 ResultConstMemberClosure_3<C, R, T0, T1, T2>* NewPermanentCallback(const C* c, R (C::*fun)(T0, T1, T2) const, T0 p0, T1 p1, T2 p2) {
385   return new ResultConstMemberClosure_3<C, R, T0, T1, T2>(true, c, fun, p0, p1, p2);
386 }
387
388
389
390 template<typename C, typename R, typename T0, typename T1, typename T2>
391 class ResultMemberClosure_3 : public ResultClosure<R> {
392 public:
393   typedef R (C::*Fun)(T0, T1, T2);
394   ResultMemberClosure_3 (bool is_permanent, C* c, Fun fun, T0 p0, T1 p1, T2 p2)
395     : ResultClosure<R>(is_permanent),
396     c_(c),
397     p0_(p0),
398 p1_(p1),
399 p2_(p2),
400     fun_(fun) {
401   }
402 protected:
403   virtual R RunInternal() {
404     return (c_->*fun_)(p0_, p1_, p2_);
405   }
406 private:
407   C* c_;
408   T0 p0_;
409 T1 p1_;
410 T2 p2_;
411   Fun fun_;
412 };
413
414 template<typename C, typename R, typename T0, typename T1, typename T2>
415 ResultMemberClosure_3<C, R, T0, T1, T2>* NewCallback(C* c, R (C::*fun)(T0, T1, T2), T0 p0, T1 p1, T2 p2) {
416   return new ResultMemberClosure_3<C, R, T0, T1, T2>(false, c, fun, p0, p1, p2);
417 }
418 template<typename C, typename R, typename T0, typename T1, typename T2>
419 ResultMemberClosure_3<C, R, T0, T1, T2>* NewPermanentCallback(C* c, R (C::*fun)(T0, T1, T2), T0 p0, T1 p1, T2 p2) {
420   return new ResultMemberClosure_3<C, R, T0, T1, T2>(true, c, fun, p0, p1, p2);
421 }
422
423
424
425 template<typename R, typename T0, typename T1, typename T2, typename T3>
426 class ResultClosure_4 : public ResultClosure<R> {
427 public:
428   typedef R (*Fun)(T0, T1, T2, T3);
429   ResultClosure_4(bool is_permanent, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3)
430     : ResultClosure<R>(is_permanent),
431     p0_(p0),
432 p1_(p1),
433 p2_(p2),
434 p3_(p3),
435       fun_(fun) {
436   }
437 protected:
438   virtual R RunInternal() {
439     return (*fun_)(p0_, p1_, p2_, p3_);
440   }
441 private:
442   T0 p0_;
443 T1 p1_;
444 T2 p2_;
445 T3 p3_;
446   Fun fun_;
447 };
448 template<typename R, typename T0, typename T1, typename T2, typename T3>
449 ResultClosure_4<R, T0, T1, T2, T3>* NewCallback(R (*fun)(T0, T1, T2, T3), T0 p0, T1 p1, T2 p2, T3 p3) {
450   return new ResultClosure_4<R, T0, T1, T2, T3>(false, fun, p0, p1, p2, p3);
451 }
452 template<typename R, typename T0, typename T1, typename T2, typename T3>
453 ResultClosure_4<R, T0, T1, T2, T3>* NewPermanentCallback(R (*fun)(T0, T1, T2, T3), T0 p0, T1 p1, T2 p2, T3 p3) {
454   return new ResultClosure_4<R, T0, T1, T2, T3>(true, fun, p0, p1, p2, p3);
455 }
456
457
458 template<typename C, typename R, typename T0, typename T1, typename T2, typename T3>
459 class ResultConstMemberClosure_4 : public ResultClosure<R> {
460 public:
461   typedef R (C::*Fun)(T0, T1, T2, T3) const;
462   ResultConstMemberClosure_4 (bool is_permanent, const C* c, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3)
463     : ResultClosure<R>(is_permanent),
464     c_(c),
465     p0_(p0),
466 p1_(p1),
467 p2_(p2),
468 p3_(p3),
469     fun_(fun) {
470   }
471 protected:
472   virtual R RunInternal() {
473     return (c_->*fun_)(p0_, p1_, p2_, p3_);
474   }
475 private:
476   const C* c_;
477   T0 p0_;
478 T1 p1_;
479 T2 p2_;
480 T3 p3_;
481   Fun fun_;
482 };
483
484 template<typename C, typename R, typename T0, typename T1, typename T2, typename T3>
485 ResultConstMemberClosure_4<C, R, T0, T1, T2, T3>* NewCallback(const C* c, R (C::*fun)(T0, T1, T2, T3) const, T0 p0, T1 p1, T2 p2, T3 p3) {
486   return new ResultConstMemberClosure_4<C, R, T0, T1, T2, T3>(false, c, fun, p0, p1, p2, p3);
487 }
488 template<typename C, typename R, typename T0, typename T1, typename T2, typename T3>
489 ResultConstMemberClosure_4<C, R, T0, T1, T2, T3>* NewPermanentCallback(const C* c, R (C::*fun)(T0, T1, T2, T3) const, T0 p0, T1 p1, T2 p2, T3 p3) {
490   return new ResultConstMemberClosure_4<C, R, T0, T1, T2, T3>(true, c, fun, p0, p1, p2, p3);
491 }
492
493
494
495 template<typename C, typename R, typename T0, typename T1, typename T2, typename T3>
496 class ResultMemberClosure_4 : public ResultClosure<R> {
497 public:
498   typedef R (C::*Fun)(T0, T1, T2, T3);
499   ResultMemberClosure_4 (bool is_permanent, C* c, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3)
500     : ResultClosure<R>(is_permanent),
501     c_(c),
502     p0_(p0),
503 p1_(p1),
504 p2_(p2),
505 p3_(p3),
506     fun_(fun) {
507   }
508 protected:
509   virtual R RunInternal() {
510     return (c_->*fun_)(p0_, p1_, p2_, p3_);
511   }
512 private:
513   C* c_;
514   T0 p0_;
515 T1 p1_;
516 T2 p2_;
517 T3 p3_;
518   Fun fun_;
519 };
520
521 template<typename C, typename R, typename T0, typename T1, typename T2, typename T3>
522 ResultMemberClosure_4<C, R, T0, T1, T2, T3>* NewCallback(C* c, R (C::*fun)(T0, T1, T2, T3), T0 p0, T1 p1, T2 p2, T3 p3) {
523   return new ResultMemberClosure_4<C, R, T0, T1, T2, T3>(false, c, fun, p0, p1, p2, p3);
524 }
525 template<typename C, typename R, typename T0, typename T1, typename T2, typename T3>
526 ResultMemberClosure_4<C, R, T0, T1, T2, T3>* NewPermanentCallback(C* c, R (C::*fun)(T0, T1, T2, T3), T0 p0, T1 p1, T2 p2, T3 p3) {
527   return new ResultMemberClosure_4<C, R, T0, T1, T2, T3>(true, c, fun, p0, p1, p2, p3);
528 }
529
530
531
532 template<typename R, typename T0, typename T1, typename T2, typename T3, typename T4>
533 class ResultClosure_5 : public ResultClosure<R> {
534 public:
535   typedef R (*Fun)(T0, T1, T2, T3, T4);
536   ResultClosure_5(bool is_permanent, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4)
537     : ResultClosure<R>(is_permanent),
538     p0_(p0),
539 p1_(p1),
540 p2_(p2),
541 p3_(p3),
542 p4_(p4),
543       fun_(fun) {
544   }
545 protected:
546   virtual R RunInternal() {
547     return (*fun_)(p0_, p1_, p2_, p3_, p4_);
548   }
549 private:
550   T0 p0_;
551 T1 p1_;
552 T2 p2_;
553 T3 p3_;
554 T4 p4_;
555   Fun fun_;
556 };
557 template<typename R, typename T0, typename T1, typename T2, typename T3, typename T4>
558 ResultClosure_5<R, T0, T1, T2, T3, T4>* NewCallback(R (*fun)(T0, T1, T2, T3, T4), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4) {
559   return new ResultClosure_5<R, T0, T1, T2, T3, T4>(false, fun, p0, p1, p2, p3, p4);
560 }
561 template<typename R, typename T0, typename T1, typename T2, typename T3, typename T4>
562 ResultClosure_5<R, T0, T1, T2, T3, T4>* NewPermanentCallback(R (*fun)(T0, T1, T2, T3, T4), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4) {
563   return new ResultClosure_5<R, T0, T1, T2, T3, T4>(true, fun, p0, p1, p2, p3, p4);
564 }
565
566
567 template<typename C, typename R, typename T0, typename T1, typename T2, typename T3, typename T4>
568 class ResultConstMemberClosure_5 : public ResultClosure<R> {
569 public:
570   typedef R (C::*Fun)(T0, T1, T2, T3, T4) const;
571   ResultConstMemberClosure_5 (bool is_permanent, const C* c, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4)
572     : ResultClosure<R>(is_permanent),
573     c_(c),
574     p0_(p0),
575 p1_(p1),
576 p2_(p2),
577 p3_(p3),
578 p4_(p4),
579     fun_(fun) {
580   }
581 protected:
582   virtual R RunInternal() {
583     return (c_->*fun_)(p0_, p1_, p2_, p3_, p4_);
584   }
585 private:
586   const C* c_;
587   T0 p0_;
588 T1 p1_;
589 T2 p2_;
590 T3 p3_;
591 T4 p4_;
592   Fun fun_;
593 };
594
595 template<typename C, typename R, typename T0, typename T1, typename T2, typename T3, typename T4>
596 ResultConstMemberClosure_5<C, R, T0, T1, T2, T3, T4>* NewCallback(const C* c, R (C::*fun)(T0, T1, T2, T3, T4) const, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4) {
597   return new ResultConstMemberClosure_5<C, R, T0, T1, T2, T3, T4>(false, c, fun, p0, p1, p2, p3, p4);
598 }
599 template<typename C, typename R, typename T0, typename T1, typename T2, typename T3, typename T4>
600 ResultConstMemberClosure_5<C, R, T0, T1, T2, T3, T4>* NewPermanentCallback(const C* c, R (C::*fun)(T0, T1, T2, T3, T4) const, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4) {
601   return new ResultConstMemberClosure_5<C, R, T0, T1, T2, T3, T4>(true, c, fun, p0, p1, p2, p3, p4);
602 }
603
604
605
606 template<typename C, typename R, typename T0, typename T1, typename T2, typename T3, typename T4>
607 class ResultMemberClosure_5 : public ResultClosure<R> {
608 public:
609   typedef R (C::*Fun)(T0, T1, T2, T3, T4);
610   ResultMemberClosure_5 (bool is_permanent, C* c, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4)
611     : ResultClosure<R>(is_permanent),
612     c_(c),
613     p0_(p0),
614 p1_(p1),
615 p2_(p2),
616 p3_(p3),
617 p4_(p4),
618     fun_(fun) {
619   }
620 protected:
621   virtual R RunInternal() {
622     return (c_->*fun_)(p0_, p1_, p2_, p3_, p4_);
623   }
624 private:
625   C* c_;
626   T0 p0_;
627 T1 p1_;
628 T2 p2_;
629 T3 p3_;
630 T4 p4_;
631   Fun fun_;
632 };
633
634 template<typename C, typename R, typename T0, typename T1, typename T2, typename T3, typename T4>
635 ResultMemberClosure_5<C, R, T0, T1, T2, T3, T4>* NewCallback(C* c, R (C::*fun)(T0, T1, T2, T3, T4), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4) {
636   return new ResultMemberClosure_5<C, R, T0, T1, T2, T3, T4>(false, c, fun, p0, p1, p2, p3, p4);
637 }
638 template<typename C, typename R, typename T0, typename T1, typename T2, typename T3, typename T4>
639 ResultMemberClosure_5<C, R, T0, T1, T2, T3, T4>* NewPermanentCallback(C* c, R (C::*fun)(T0, T1, T2, T3, T4), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4) {
640   return new ResultMemberClosure_5<C, R, T0, T1, T2, T3, T4>(true, c, fun, p0, p1, p2, p3, p4);
641 }
642
643 #endif  // __COMMON_CALLBACK_BASE_RESULT_CLOSURE_H__
Note: See TracBrowser for help on using the browser.