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

Revision 7, 34.3 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_BASE_CALLBACK_CLOSURE_H__
32 #define __COMMON_BASE_CALLBACK_CLOSURE_H__
33
34 #include <whisperlib/common/base/log.h>
35
36 class Closure {
37 public:
38   Closure(bool is_permanent) : is_permanent_(is_permanent) {
39     #ifdef _DEBUG
40     selector_registered_ = false;
41     #endif
42   }
43   virtual ~Closure() {
44     #ifdef _DEBUG
45     CHECK(!selector_registered_) << "Attempting to delete a closure"
46                                     " registered in selector";
47     #endif
48   }
49   void Run() {
50     const bool permanent = is_permanent();
51     RunInternal();
52     if ( !permanent ) {
53       delete this;
54     }
55   }
56   bool is_permanent() const {
57     return is_permanent_;
58   }
59 #ifdef _DEBUG
60   void set_selector_registered(bool selector_registered) {
61     selector_registered_ = selector_registered;
62   }
63 #endif
64 protected:
65   virtual void RunInternal() = 0;
66 private:
67   const bool is_permanent_;
68 #ifdef _DEBUG
69   bool selector_registered_;
70 #endif
71 };
72
73
74 //////////////////////////////////////////////////////////////////////
75 //
76 // 0 params
77 //
78
79 class Closure0 : public Closure {
80 public:
81   typedef void (*Fun)(void);
82   Closure0(bool is_permanent, Fun fun)
83     : Closure(is_permanent),
84       fun_(fun) {
85   }
86 protected:
87   virtual void RunInternal() {
88     (*fun_)();
89   }
90 private:
91   Fun fun_;
92 };
93
94 inline Closure0* NewCallback(Closure0::Fun fun) {
95   return new Closure0(false, fun);
96 }
97 inline Closure0* NewPermanentCallback(Closure0::Fun fun) {
98   return new Closure0(true, fun);
99 }
100
101 template<typename C>
102 class MemberClosure0 : public Closure {
103 public:
104   typedef void (C::*Fun)();
105   MemberClosure0(bool is_permanent, C* c, Fun fun)
106     : Closure(is_permanent),
107     c_(c),
108
109       fun_(fun) {
110   }
111 protected:
112   virtual void RunInternal() {
113       (c_->*fun_)();
114   }
115 private:
116   C* c_;
117
118   Fun fun_;
119 };
120 template<typename C>
121 MemberClosure0<C>* NewCallback(C* c, void (C::*fun)()) {
122   return new MemberClosure0<C>(false, c, fun);
123 }
124 template<typename C>
125 MemberClosure0<C>* NewPermanentCallback(C* c, void (C::*fun)()) {
126   return new MemberClosure0<C>(true, c, fun);
127 }
128
129 template<typename C>
130 class ConstMemberClosure0 : public Closure {
131 public:
132   typedef void (C::*Fun)() const;
133   ConstMemberClosure0(bool is_permanent, const C* c, Fun fun)
134     : Closure(is_permanent),
135     c_(c),
136
137       fun_(fun) {
138   }
139 protected:
140   virtual void RunInternal() {
141       (c_->*fun_)();
142   }
143 private:
144   const C* c_;
145
146   Fun fun_;
147 };
148 template<typename C>
149 ConstMemberClosure0<C>* NewCallback(const C* c, void (C::*fun)() const) {
150   return new ConstMemberClosure0<C>(false, c, fun);
151 }
152 template<typename C>
153 ConstMemberClosure0<C>* NewPermanentCallback(C* c, void (C::*fun)() const) {
154   return new ConstMemberClosure0<C>(true, c, fun);
155 }
156
157
158 //////////////////////////////////////////////////////////////////////
159 //
160 // 1,2,3,4,5,6 - autogenerated with python print_callback.py
161 //
162
163 template<typename T0>
164 class Closure1 : public Closure {
165 public:
166   typedef void (*Fun)(T0);
167   Closure1(bool is_permanent, Fun fun, T0 p0)
168     : Closure(is_permanent),
169     p0_(p0),
170       fun_(fun) {
171   }
172 protected:
173   virtual void RunInternal() {
174     (*fun_)(p0_);
175   }
176 private:
177   T0 p0_;
178   Fun fun_;
179 };
180 template<typename T0>
181 Closure1<T0>* NewCallback(void (*fun)(T0), T0 p0) {
182   return new Closure1<T0>(false, fun, p0);
183 }
184 template<typename T0>
185 Closure1<T0>* NewPermanentCallback(void (*fun)(T0), T0 p0) {
186   return new Closure1<T0>(true, fun, p0);
187 }
188
189
190 template<typename C, typename T0>
191 class MemberClosure1 : public Closure {
192 public:
193   typedef void (C::*Fun)(T0);
194   MemberClosure1(bool is_permanent, C* c, Fun fun, T0 p0)
195     : Closure(is_permanent),
196     c_(c),
197     p0_(p0),
198       fun_(fun) {
199   }
200 protected:
201   virtual void RunInternal() {
202       (c_->*fun_)(p0_);
203   }
204 private:
205   C* c_;
206   T0 p0_;
207   Fun fun_;
208 };
209 template<typename C, typename T0>
210 MemberClosure1<C, T0>* NewCallback(C* c, void (C::*fun)(T0), T0 p0) {
211   return new MemberClosure1<C, T0>(false, c, fun, p0);
212 }
213 template<typename C, typename T0>
214 MemberClosure1<C, T0>* NewPermanentCallback(C* c, void (C::*fun)(T0), T0 p0) {
215   return new MemberClosure1<C, T0>(true, c, fun, p0);
216 }
217
218
219 template<typename C, typename T0>
220 class ConstMemberClosure1 : public Closure {
221 public:
222   typedef void (C::*Fun)(T0) const;
223   ConstMemberClosure1(bool is_permanent, const C* c, Fun fun, T0 p0)
224     : Closure(is_permanent),
225     c_(c),
226     p0_(p0),
227       fun_(fun) {
228   }
229 protected:
230   virtual void RunInternal() {
231       (c_->*fun_)(p0_);
232   }
233 private:
234   const C* c_;
235   T0 p0_;
236   Fun fun_;
237 };
238 template<typename C, typename T0>
239 ConstMemberClosure1<C, T0>* NewCallback(const C* c, void (C::*fun)(T0) const, T0 p0) {
240   return new ConstMemberClosure1<C, T0>(false, c, fun, p0);
241 }
242 template<typename C, typename T0>
243 ConstMemberClosure1<C, T0>* NewPermanentCallback(C* c, void (C::*fun)(T0) const, T0 p0) {
244   return new ConstMemberClosure1<C, T0>(true, c, fun, p0);
245 }
246
247
248 template<typename T0, typename T1>
249 class Closure2 : public Closure {
250 public:
251   typedef void (*Fun)(T0, T1);
252   Closure2(bool is_permanent, Fun fun, T0 p0, T1 p1)
253     : Closure(is_permanent),
254     p0_(p0),
255 p1_(p1),
256       fun_(fun) {
257   }
258 protected:
259   virtual void RunInternal() {
260     (*fun_)(p0_, p1_);
261   }
262 private:
263   T0 p0_;
264 T1 p1_;
265   Fun fun_;
266 };
267 template<typename T0, typename T1>
268 Closure2<T0, T1>* NewCallback(void (*fun)(T0, T1), T0 p0, T1 p1) {
269   return new Closure2<T0, T1>(false, fun, p0, p1);
270 }
271 template<typename T0, typename T1>
272 Closure2<T0, T1>* NewPermanentCallback(void (*fun)(T0, T1), T0 p0, T1 p1) {
273   return new Closure2<T0, T1>(true, fun, p0, p1);
274 }
275
276
277 template<typename C, typename T0, typename T1>
278 class MemberClosure2 : public Closure {
279 public:
280   typedef void (C::*Fun)(T0, T1);
281   MemberClosure2(bool is_permanent, C* c, Fun fun, T0 p0, T1 p1)
282     : Closure(is_permanent),
283     c_(c),
284     p0_(p0),
285 p1_(p1),
286       fun_(fun) {
287   }
288 protected:
289   virtual void RunInternal() {
290       (c_->*fun_)(p0_, p1_);
291   }
292 private:
293   C* c_;
294   T0 p0_;
295 T1 p1_;
296   Fun fun_;
297 };
298 template<typename C, typename T0, typename T1>
299 MemberClosure2<C, T0, T1>* NewCallback(C* c, void (C::*fun)(T0, T1), T0 p0, T1 p1) {
300   return new MemberClosure2<C, T0, T1>(false, c, fun, p0, p1);
301 }
302 template<typename C, typename T0, typename T1>
303 MemberClosure2<C, T0, T1>* NewPermanentCallback(C* c, void (C::*fun)(T0, T1), T0 p0, T1 p1) {
304   return new MemberClosure2<C, T0, T1>(true, c, fun, p0, p1);
305 }
306
307
308 template<typename C, typename T0, typename T1>
309 class ConstMemberClosure2 : public Closure {
310 public:
311   typedef void (C::*Fun)(T0, T1) const;
312   ConstMemberClosure2(bool is_permanent, const C* c, Fun fun, T0 p0, T1 p1)
313     : Closure(is_permanent),
314     c_(c),
315     p0_(p0),
316 p1_(p1),
317       fun_(fun) {
318   }
319 protected:
320   virtual void RunInternal() {
321       (c_->*fun_)(p0_, p1_);
322   }
323 private:
324   const C* c_;
325   T0 p0_;
326 T1 p1_;
327   Fun fun_;
328 };
329 template<typename C, typename T0, typename T1>
330 ConstMemberClosure2<C, T0, T1>* NewCallback(const C* c, void (C::*fun)(T0, T1) const, T0 p0, T1 p1) {
331   return new ConstMemberClosure2<C, T0, T1>(false, c, fun, p0, p1);
332 }
333 template<typename C, typename T0, typename T1>
334 ConstMemberClosure2<C, T0, T1>* NewPermanentCallback(C* c, void (C::*fun)(T0, T1) const, T0 p0, T1 p1) {
335   return new ConstMemberClosure2<C, T0, T1>(true, c, fun, p0, p1);
336 }
337
338
339 template<typename T0, typename T1, typename T2>
340 class Closure3 : public Closure {
341 public:
342   typedef void (*Fun)(T0, T1, T2);
343   Closure3(bool is_permanent, Fun fun, T0 p0, T1 p1, T2 p2)
344     : Closure(is_permanent),
345     p0_(p0),
346 p1_(p1),
347 p2_(p2),
348       fun_(fun) {
349   }
350 protected:
351   virtual void RunInternal() {
352     (*fun_)(p0_, p1_, p2_);
353   }
354 private:
355   T0 p0_;
356 T1 p1_;
357 T2 p2_;
358   Fun fun_;
359 };
360 template<typename T0, typename T1, typename T2>
361 Closure3<T0, T1, T2>* NewCallback(void (*fun)(T0, T1, T2), T0 p0, T1 p1, T2 p2) {
362   return new Closure3<T0, T1, T2>(false, fun, p0, p1, p2);
363 }
364 template<typename T0, typename T1, typename T2>
365 Closure3<T0, T1, T2>* NewPermanentCallback(void (*fun)(T0, T1, T2), T0 p0, T1 p1, T2 p2) {
366   return new Closure3<T0, T1, T2>(true, fun, p0, p1, p2);
367 }
368
369
370 template<typename C, typename T0, typename T1, typename T2>
371 class MemberClosure3 : public Closure {
372 public:
373   typedef void (C::*Fun)(T0, T1, T2);
374   MemberClosure3(bool is_permanent, C* c, Fun fun, T0 p0, T1 p1, T2 p2)
375     : Closure(is_permanent),
376     c_(c),
377     p0_(p0),
378 p1_(p1),
379 p2_(p2),
380       fun_(fun) {
381   }
382 protected:
383   virtual void RunInternal() {
384       (c_->*fun_)(p0_, p1_, p2_);
385   }
386 private:
387   C* c_;
388   T0 p0_;
389 T1 p1_;
390 T2 p2_;
391   Fun fun_;
392 };
393 template<typename C, typename T0, typename T1, typename T2>
394 MemberClosure3<C, T0, T1, T2>* NewCallback(C* c, void (C::*fun)(T0, T1, T2), T0 p0, T1 p1, T2 p2) {
395   return new MemberClosure3<C, T0, T1, T2>(false, c, fun, p0, p1, p2);
396 }
397 template<typename C, typename T0, typename T1, typename T2>
398 MemberClosure3<C, T0, T1, T2>* NewPermanentCallback(C* c, void (C::*fun)(T0, T1, T2), T0 p0, T1 p1, T2 p2) {
399   return new MemberClosure3<C, T0, T1, T2>(true, c, fun, p0, p1, p2);
400 }
401
402
403 template<typename C, typename T0, typename T1, typename T2>
404 class ConstMemberClosure3 : public Closure {
405 public:
406   typedef void (C::*Fun)(T0, T1, T2) const;
407   ConstMemberClosure3(bool is_permanent, const C* c, Fun fun, T0 p0, T1 p1, T2 p2)
408     : Closure(is_permanent),
409     c_(c),
410     p0_(p0),
411 p1_(p1),
412 p2_(p2),
413       fun_(fun) {
414   }
415 protected:
416   virtual void RunInternal() {
417       (c_->*fun_)(p0_, p1_, p2_);
418   }
419 private:
420   const C* c_;
421   T0 p0_;
422 T1 p1_;
423 T2 p2_;
424   Fun fun_;
425 };
426 template<typename C, typename T0, typename T1, typename T2>
427 ConstMemberClosure3<C, T0, T1, T2>* NewCallback(const C* c, void (C::*fun)(T0, T1, T2) const, T0 p0, T1 p1, T2 p2) {
428   return new ConstMemberClosure3<C, T0, T1, T2>(false, c, fun, p0, p1, p2);
429 }
430 template<typename C, typename T0, typename T1, typename T2>
431 ConstMemberClosure3<C, T0, T1, T2>* NewPermanentCallback(C* c, void (C::*fun)(T0, T1, T2) const, T0 p0, T1 p1, T2 p2) {
432   return new ConstMemberClosure3<C, T0, T1, T2>(true, c, fun, p0, p1, p2);
433 }
434
435
436 template<typename T0, typename T1, typename T2, typename T3>
437 class Closure4 : public Closure {
438 public:
439   typedef void (*Fun)(T0, T1, T2, T3);
440   Closure4(bool is_permanent, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3)
441     : Closure(is_permanent),
442     p0_(p0),
443 p1_(p1),
444 p2_(p2),
445 p3_(p3),
446       fun_(fun) {
447   }
448 protected:
449   virtual void RunInternal() {
450     (*fun_)(p0_, p1_, p2_, p3_);
451   }
452 private:
453   T0 p0_;
454 T1 p1_;
455 T2 p2_;
456 T3 p3_;
457   Fun fun_;
458 };
459 template<typename T0, typename T1, typename T2, typename T3>
460 Closure4<T0, T1, T2, T3>* NewCallback(void (*fun)(T0, T1, T2, T3), T0 p0, T1 p1, T2 p2, T3 p3) {
461   return new Closure4<T0, T1, T2, T3>(false, fun, p0, p1, p2, p3);
462 }
463 template<typename T0, typename T1, typename T2, typename T3>
464 Closure4<T0, T1, T2, T3>* NewPermanentCallback(void (*fun)(T0, T1, T2, T3), T0 p0, T1 p1, T2 p2, T3 p3) {
465   return new Closure4<T0, T1, T2, T3>(true, fun, p0, p1, p2, p3);
466 }
467
468
469 template<typename C, typename T0, typename T1, typename T2, typename T3>
470 class MemberClosure4 : public Closure {
471 public:
472   typedef void (C::*Fun)(T0, T1, T2, T3);
473   MemberClosure4(bool is_permanent, C* c, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3)
474     : Closure(is_permanent),
475     c_(c),
476     p0_(p0),
477 p1_(p1),
478 p2_(p2),
479 p3_(p3),
480       fun_(fun) {
481   }
482 protected:
483   virtual void RunInternal() {
484       (c_->*fun_)(p0_, p1_, p2_, p3_);
485   }
486 private:
487   C* c_;
488   T0 p0_;
489 T1 p1_;
490 T2 p2_;
491 T3 p3_;
492   Fun fun_;
493 };
494 template<typename C, typename T0, typename T1, typename T2, typename T3>
495 MemberClosure4<C, T0, T1, T2, T3>* NewCallback(C* c, void (C::*fun)(T0, T1, T2, T3), T0 p0, T1 p1, T2 p2, T3 p3) {
496   return new MemberClosure4<C, T0, T1, T2, T3>(false, c, fun, p0, p1, p2, p3);
497 }
498 template<typename C, typename T0, typename T1, typename T2, typename T3>
499 MemberClosure4<C, T0, T1, T2, T3>* NewPermanentCallback(C* c, void (C::*fun)(T0, T1, T2, T3), T0 p0, T1 p1, T2 p2, T3 p3) {
500   return new MemberClosure4<C, T0, T1, T2, T3>(true, c, fun, p0, p1, p2, p3);
501 }
502
503
504 template<typename C, typename T0, typename T1, typename T2, typename T3>
505 class ConstMemberClosure4 : public Closure {
506 public:
507   typedef void (C::*Fun)(T0, T1, T2, T3) const;
508   ConstMemberClosure4(bool is_permanent, const C* c, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3)
509     : Closure(is_permanent),
510     c_(c),
511     p0_(p0),
512 p1_(p1),
513 p2_(p2),
514 p3_(p3),
515       fun_(fun) {
516   }
517 protected:
518   virtual void RunInternal() {
519       (c_->*fun_)(p0_, p1_, p2_, p3_);
520   }
521 private:
522   const C* c_;
523   T0 p0_;
524 T1 p1_;
525 T2 p2_;
526 T3 p3_;
527   Fun fun_;
528 };
529 template<typename C, typename T0, typename T1, typename T2, typename T3>
530 ConstMemberClosure4<C, T0, T1, T2, T3>* NewCallback(const C* c, void (C::*fun)(T0, T1, T2, T3) const, T0 p0, T1 p1, T2 p2, T3 p3) {
531   return new ConstMemberClosure4<C, T0, T1, T2, T3>(false, c, fun, p0, p1, p2, p3);
532 }
533 template<typename C, typename T0, typename T1, typename T2, typename T3>
534 ConstMemberClosure4<C, T0, T1, T2, T3>* NewPermanentCallback(C* c, void (C::*fun)(T0, T1, T2, T3) const, T0 p0, T1 p1, T2 p2, T3 p3) {
535   return new ConstMemberClosure4<C, T0, T1, T2, T3>(true, c, fun, p0, p1, p2, p3);
536 }
537
538
539 template<typename T0, typename T1, typename T2, typename T3, typename T4>
540 class Closure5 : public Closure {
541 public:
542   typedef void (*Fun)(T0, T1, T2, T3, T4);
543   Closure5(bool is_permanent, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4)
544     : Closure(is_permanent),
545     p0_(p0),
546 p1_(p1),
547 p2_(p2),
548 p3_(p3),
549 p4_(p4),
550       fun_(fun) {
551   }
552 protected:
553   virtual void RunInternal() {
554     (*fun_)(p0_, p1_, p2_, p3_, p4_);
555   }
556 private:
557   T0 p0_;
558 T1 p1_;
559 T2 p2_;
560 T3 p3_;
561 T4 p4_;
562   Fun fun_;
563 };
564 template<typename T0, typename T1, typename T2, typename T3, typename T4>
565 Closure5<T0, T1, T2, T3, T4>* NewCallback(void (*fun)(T0, T1, T2, T3, T4), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4) {
566   return new Closure5<T0, T1, T2, T3, T4>(false, fun, p0, p1, p2, p3, p4);
567 }
568 template<typename T0, typename T1, typename T2, typename T3, typename T4>
569 Closure5<T0, T1, T2, T3, T4>* NewPermanentCallback(void (*fun)(T0, T1, T2, T3, T4), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4) {
570   return new Closure5<T0, T1, T2, T3, T4>(true, fun, p0, p1, p2, p3, p4);
571 }
572
573
574 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4>
575 class MemberClosure5 : public Closure {
576 public:
577   typedef void (C::*Fun)(T0, T1, T2, T3, T4);
578   MemberClosure5(bool is_permanent, C* c, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4)
579     : Closure(is_permanent),
580     c_(c),
581     p0_(p0),
582 p1_(p1),
583 p2_(p2),
584 p3_(p3),
585 p4_(p4),
586       fun_(fun) {
587   }
588 protected:
589   virtual void RunInternal() {
590       (c_->*fun_)(p0_, p1_, p2_, p3_, p4_);
591   }
592 private:
593   C* c_;
594   T0 p0_;
595 T1 p1_;
596 T2 p2_;
597 T3 p3_;
598 T4 p4_;
599   Fun fun_;
600 };
601 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4>
602 MemberClosure5<C, T0, T1, T2, T3, T4>* NewCallback(C* c, void (C::*fun)(T0, T1, T2, T3, T4), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4) {
603   return new MemberClosure5<C, T0, T1, T2, T3, T4>(false, c, fun, p0, p1, p2, p3, p4);
604 }
605 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4>
606 MemberClosure5<C, T0, T1, T2, T3, T4>* NewPermanentCallback(C* c, void (C::*fun)(T0, T1, T2, T3, T4), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4) {
607   return new MemberClosure5<C, T0, T1, T2, T3, T4>(true, c, fun, p0, p1, p2, p3, p4);
608 }
609
610
611 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4>
612 class ConstMemberClosure5 : public Closure {
613 public:
614   typedef void (C::*Fun)(T0, T1, T2, T3, T4) const;
615   ConstMemberClosure5(bool is_permanent, const C* c, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4)
616     : Closure(is_permanent),
617     c_(c),
618     p0_(p0),
619 p1_(p1),
620 p2_(p2),
621 p3_(p3),
622 p4_(p4),
623       fun_(fun) {
624   }
625 protected:
626   virtual void RunInternal() {
627       (c_->*fun_)(p0_, p1_, p2_, p3_, p4_);
628   }
629 private:
630   const C* c_;
631   T0 p0_;
632 T1 p1_;
633 T2 p2_;
634 T3 p3_;
635 T4 p4_;
636   Fun fun_;
637 };
638 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4>
639 ConstMemberClosure5<C, T0, T1, T2, T3, T4>* NewCallback(const C* c, void (C::*fun)(T0, T1, T2, T3, T4) const, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4) {
640   return new ConstMemberClosure5<C, T0, T1, T2, T3, T4>(false, c, fun, p0, p1, p2, p3, p4);
641 }
642 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4>
643 ConstMemberClosure5<C, T0, T1, T2, T3, T4>* NewPermanentCallback(C* c, void (C::*fun)(T0, T1, T2, T3, T4) const, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4) {
644   return new ConstMemberClosure5<C, T0, T1, T2, T3, T4>(true, c, fun, p0, p1, p2, p3, p4);
645 }
646
647
648 template<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
649 class Closure6 : public Closure {
650 public:
651   typedef void (*Fun)(T0, T1, T2, T3, T4, T5);
652   Closure6(bool is_permanent, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5)
653     : Closure(is_permanent),
654     p0_(p0),
655 p1_(p1),
656 p2_(p2),
657 p3_(p3),
658 p4_(p4),
659 p5_(p5),
660       fun_(fun) {
661   }
662 protected:
663   virtual void RunInternal() {
664     (*fun_)(p0_, p1_, p2_, p3_, p4_, p5_);
665   }
666 private:
667   T0 p0_;
668 T1 p1_;
669 T2 p2_;
670 T3 p3_;
671 T4 p4_;
672 T5 p5_;
673   Fun fun_;
674 };
675 template<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
676 Closure6<T0, T1, T2, T3, T4, T5>* NewCallback(void (*fun)(T0, T1, T2, T3, T4, T5), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5) {
677   return new Closure6<T0, T1, T2, T3, T4, T5>(false, fun, p0, p1, p2, p3, p4, p5);
678 }
679 template<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
680 Closure6<T0, T1, T2, T3, T4, T5>* NewPermanentCallback(void (*fun)(T0, T1, T2, T3, T4, T5), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5) {
681   return new Closure6<T0, T1, T2, T3, T4, T5>(true, fun, p0, p1, p2, p3, p4, p5);
682 }
683
684
685 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
686 class MemberClosure6 : public Closure {
687 public:
688   typedef void (C::*Fun)(T0, T1, T2, T3, T4, T5);
689   MemberClosure6(bool is_permanent, C* c, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5)
690     : Closure(is_permanent),
691     c_(c),
692     p0_(p0),
693 p1_(p1),
694 p2_(p2),
695 p3_(p3),
696 p4_(p4),
697 p5_(p5),
698       fun_(fun) {
699   }
700 protected:
701   virtual void RunInternal() {
702       (c_->*fun_)(p0_, p1_, p2_, p3_, p4_, p5_);
703   }
704 private:
705   C* c_;
706   T0 p0_;
707 T1 p1_;
708 T2 p2_;
709 T3 p3_;
710 T4 p4_;
711 T5 p5_;
712   Fun fun_;
713 };
714 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
715 MemberClosure6<C, T0, T1, T2, T3, T4, T5>* NewCallback(C* c, void (C::*fun)(T0, T1, T2, T3, T4, T5), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5) {
716   return new MemberClosure6<C, T0, T1, T2, T3, T4, T5>(false, c, fun, p0, p1, p2, p3, p4, p5);
717 }
718 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
719 MemberClosure6<C, T0, T1, T2, T3, T4, T5>* NewPermanentCallback(C* c, void (C::*fun)(T0, T1, T2, T3, T4, T5), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5) {
720   return new MemberClosure6<C, T0, T1, T2, T3, T4, T5>(true, c, fun, p0, p1, p2, p3, p4, p5);
721 }
722
723
724 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
725 class ConstMemberClosure6 : public Closure {
726 public:
727   typedef void (C::*Fun)(T0, T1, T2, T3, T4, T5) const;
728   ConstMemberClosure6(bool is_permanent, const C* c, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5)
729     : Closure(is_permanent),
730     c_(c),
731     p0_(p0),
732 p1_(p1),
733 p2_(p2),
734 p3_(p3),
735 p4_(p4),
736 p5_(p5),
737       fun_(fun) {
738   }
739 protected:
740   virtual void RunInternal() {
741       (c_->*fun_)(p0_, p1_, p2_, p3_, p4_, p5_);
742   }
743 private:
744   const C* c_;
745   T0 p0_;
746 T1 p1_;
747 T2 p2_;
748 T3 p3_;
749 T4 p4_;
750 T5 p5_;
751   Fun fun_;
752 };
753 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
754 ConstMemberClosure6<C, T0, T1, T2, T3, T4, T5>* NewCallback(const C* c, void (C::*fun)(T0, T1, T2, T3, T4, T5) const, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5) {
755   return new ConstMemberClosure6<C, T0, T1, T2, T3, T4, T5>(false, c, fun, p0, p1, p2, p3, p4, p5);
756 }
757 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
758 ConstMemberClosure6<C, T0, T1, T2, T3, T4, T5>* NewPermanentCallback(C* c, void (C::*fun)(T0, T1, T2, T3, T4, T5) const, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5) {
759   return new ConstMemberClosure6<C, T0, T1, T2, T3, T4, T5>(true, c, fun, p0, p1, p2, p3, p4, p5);
760 }
761
762
763 template<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
764 class Closure7 : public Closure {
765 public:
766   typedef void (*Fun)(T0, T1, T2, T3, T4, T5, T6);
767   Closure7(bool is_permanent, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6)
768     : Closure(is_permanent),
769     p0_(p0),
770 p1_(p1),
771 p2_(p2),
772 p3_(p3),
773 p4_(p4),
774 p5_(p5),
775 p6_(p6),
776       fun_(fun) {
777   }
778 protected:
779   virtual void RunInternal() {
780     (*fun_)(p0_, p1_, p2_, p3_, p4_, p5_, p6_);
781   }
782 private:
783   T0 p0_;
784 T1 p1_;
785 T2 p2_;
786 T3 p3_;
787 T4 p4_;
788 T5 p5_;
789 T6 p6_;
790   Fun fun_;
791 };
792 template<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
793 Closure7<T0, T1, T2, T3, T4, T5, T6>* NewCallback(void (*fun)(T0, T1, T2, T3, T4, T5, T6), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6) {
794   return new Closure7<T0, T1, T2, T3, T4, T5, T6>(false, fun, p0, p1, p2, p3, p4, p5, p6);
795 }
796 template<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
797 Closure7<T0, T1, T2, T3, T4, T5, T6>* NewPermanentCallback(void (*fun)(T0, T1, T2, T3, T4, T5, T6), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6) {
798   return new Closure7<T0, T1, T2, T3, T4, T5, T6>(true, fun, p0, p1, p2, p3, p4, p5, p6);
799 }
800
801
802 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
803 class MemberClosure7 : public Closure {
804 public:
805   typedef void (C::*Fun)(T0, T1, T2, T3, T4, T5, T6);
806   MemberClosure7(bool is_permanent, C* c, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6)
807     : Closure(is_permanent),
808     c_(c),
809     p0_(p0),
810 p1_(p1),
811 p2_(p2),
812 p3_(p3),
813 p4_(p4),
814 p5_(p5),
815 p6_(p6),
816       fun_(fun) {
817   }
818 protected:
819   virtual void RunInternal() {
820       (c_->*fun_)(p0_, p1_, p2_, p3_, p4_, p5_, p6_);
821   }
822 private:
823   C* c_;
824   T0 p0_;
825 T1 p1_;
826 T2 p2_;
827 T3 p3_;
828 T4 p4_;
829 T5 p5_;
830 T6 p6_;
831   Fun fun_;
832 };
833 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
834 MemberClosure7<C, T0, T1, T2, T3, T4, T5, T6>* NewCallback(C* c, void (C::*fun)(T0, T1, T2, T3, T4, T5, T6), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6) {
835   return new MemberClosure7<C, T0, T1, T2, T3, T4, T5, T6>(false, c, fun, p0, p1, p2, p3, p4, p5, p6);
836 }
837 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
838 MemberClosure7<C, T0, T1, T2, T3, T4, T5, T6>* NewPermanentCallback(C* c, void (C::*fun)(T0, T1, T2, T3, T4, T5, T6), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6) {
839   return new MemberClosure7<C, T0, T1, T2, T3, T4, T5, T6>(true, c, fun, p0, p1, p2, p3, p4, p5, p6);
840 }
841
842
843 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
844 class ConstMemberClosure7 : public Closure {
845 public:
846   typedef void (C::*Fun)(T0, T1, T2, T3, T4, T5, T6) const;
847   ConstMemberClosure7(bool is_permanent, const C* c, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6)
848     : Closure(is_permanent),
849     c_(c),
850     p0_(p0),
851 p1_(p1),
852 p2_(p2),
853 p3_(p3),
854 p4_(p4),
855 p5_(p5),
856 p6_(p6),
857       fun_(fun) {
858   }
859 protected:
860   virtual void RunInternal() {
861       (c_->*fun_)(p0_, p1_, p2_, p3_, p4_, p5_, p6_);
862   }
863 private:
864   const C* c_;
865   T0 p0_;
866 T1 p1_;
867 T2 p2_;
868 T3 p3_;
869 T4 p4_;
870 T5 p5_;
871 T6 p6_;
872   Fun fun_;
873 };
874 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
875 ConstMemberClosure7<C, T0, T1, T2, T3, T4, T5, T6>* NewCallback(const C* c, void (C::*fun)(T0, T1, T2, T3, T4, T5, T6) const, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6) {
876   return new ConstMemberClosure7<C, T0, T1, T2, T3, T4, T5, T6>(false, c, fun, p0, p1, p2, p3, p4, p5, p6);
877 }
878 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
879 ConstMemberClosure7<C, T0, T1, T2, T3, T4, T5, T6>* NewPermanentCallback(C* c, void (C::*fun)(T0, T1, T2, T3, T4, T5, T6) const, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6) {
880   return new ConstMemberClosure7<C, T0, T1, T2, T3, T4, T5, T6>(true, c, fun, p0, p1, p2, p3, p4, p5, p6);
881 }
882
883
884 template<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
885 class Closure8 : public Closure {
886 public:
887   typedef void (*Fun)(T0, T1, T2, T3, T4, T5, T6, T7);
888   Closure8(bool is_permanent, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7)
889     : Closure(is_permanent),
890     p0_(p0),
891 p1_(p1),
892 p2_(p2),
893 p3_(p3),
894 p4_(p4),
895 p5_(p5),
896 p6_(p6),
897 p7_(p7),
898       fun_(fun) {
899   }
900 protected:
901   virtual void RunInternal() {
902     (*fun_)(p0_, p1_, p2_, p3_, p4_, p5_, p6_, p7_);
903   }
904 private:
905   T0 p0_;
906 T1 p1_;
907 T2 p2_;
908 T3 p3_;
909 T4 p4_;
910 T5 p5_;
911 T6 p6_;
912 T7 p7_;
913   Fun fun_;
914 };
915 template<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
916 Closure8<T0, T1, T2, T3, T4, T5, T6, T7>* NewCallback(void (*fun)(T0, T1, T2, T3, T4, T5, T6, T7), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7) {
917   return new Closure8<T0, T1, T2, T3, T4, T5, T6, T7>(false, fun, p0, p1, p2, p3, p4, p5, p6, p7);
918 }
919 template<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
920 Closure8<T0, T1, T2, T3, T4, T5, T6, T7>* NewPermanentCallback(void (*fun)(T0, T1, T2, T3, T4, T5, T6, T7), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7) {
921   return new Closure8<T0, T1, T2, T3, T4, T5, T6, T7>(true, fun, p0, p1, p2, p3, p4, p5, p6, p7);
922 }
923
924
925 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
926 class MemberClosure8 : public Closure {
927 public:
928   typedef void (C::*Fun)(T0, T1, T2, T3, T4, T5, T6, T7);
929   MemberClosure8(bool is_permanent, C* c, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7)
930     : Closure(is_permanent),
931     c_(c),
932     p0_(p0),
933 p1_(p1),
934 p2_(p2),
935 p3_(p3),
936 p4_(p4),
937 p5_(p5),
938 p6_(p6),
939 p7_(p7),
940       fun_(fun) {
941   }
942 protected:
943   virtual void RunInternal() {
944       (c_->*fun_)(p0_, p1_, p2_, p3_, p4_, p5_, p6_, p7_);
945   }
946 private:
947   C* c_;
948   T0 p0_;
949 T1 p1_;
950 T2 p2_;
951 T3 p3_;
952 T4 p4_;
953 T5 p5_;
954 T6 p6_;
955 T7 p7_;
956   Fun fun_;
957 };
958 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
959 MemberClosure8<C, T0, T1, T2, T3, T4, T5, T6, T7>* NewCallback(C* c, void (C::*fun)(T0, T1, T2, T3, T4, T5, T6, T7), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7) {
960   return new MemberClosure8<C, T0, T1, T2, T3, T4, T5, T6, T7>(false, c, fun, p0, p1, p2, p3, p4, p5, p6, p7);
961 }
962 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
963 MemberClosure8<C, T0, T1, T2, T3, T4, T5, T6, T7>* NewPermanentCallback(C* c, void (C::*fun)(T0, T1, T2, T3, T4, T5, T6, T7), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7) {
964   return new MemberClosure8<C, T0, T1, T2, T3, T4, T5, T6, T7>(true, c, fun, p0, p1, p2, p3, p4, p5, p6, p7);
965 }
966
967
968 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
969 class ConstMemberClosure8 : public Closure {
970 public:
971   typedef void (C::*Fun)(T0, T1, T2, T3, T4, T5, T6, T7) const;
972   ConstMemberClosure8(bool is_permanent, const C* c, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7)
973     : Closure(is_permanent),
974     c_(c),
975     p0_(p0),
976 p1_(p1),
977 p2_(p2),
978 p3_(p3),
979 p4_(p4),
980 p5_(p5),
981 p6_(p6),
982 p7_(p7),
983       fun_(fun) {
984   }
985 protected:
986   virtual void RunInternal() {
987       (c_->*fun_)(p0_, p1_, p2_, p3_, p4_, p5_, p6_, p7_);
988   }
989 private:
990   const C* c_;
991   T0 p0_;
992 T1 p1_;
993 T2 p2_;
994 T3 p3_;
995 T4 p4_;
996 T5 p5_;
997 T6 p6_;
998 T7 p7_;
999   Fun fun_;
1000 };
1001 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
1002 ConstMemberClosure8<C, T0, T1, T2, T3, T4, T5, T6, T7>* NewCallback(const C* c, void (C::*fun)(T0, T1, T2, T3, T4, T5, T6, T7) const, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7) {
1003   return new ConstMemberClosure8<C, T0, T1, T2, T3, T4, T5, T6, T7>(false, c, fun, p0, p1, p2, p3, p4, p5, p6, p7);
1004 }
1005 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
1006 ConstMemberClosure8<C, T0, T1, T2, T3, T4, T5, T6, T7>* NewPermanentCallback(C* c, void (C::*fun)(T0, T1, T2, T3, T4, T5, T6, T7) const, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7) {
1007   return new ConstMemberClosure8<C, T0, T1, T2, T3, T4, T5, T6, T7>(true, c, fun, p0, p1, p2, p3, p4, p5, p6, p7);
1008 }
1009
1010
1011 template<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
1012 class Closure9 : public Closure {
1013 public:
1014   typedef void (*Fun)(T0, T1, T2, T3, T4, T5, T6, T7, T8);
1015   Closure9(bool is_permanent, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8)
1016     : Closure(is_permanent),
1017     p0_(p0),
1018 p1_(p1),
1019 p2_(p2),
1020 p3_(p3),
1021 p4_(p4),
1022 p5_(p5),
1023 p6_(p6),
1024 p7_(p7),
1025 p8_(p8),
1026       fun_(fun) {
1027   }
1028 protected:
1029   virtual void RunInternal() {
1030     (*fun_)(p0_, p1_, p2_, p3_, p4_, p5_, p6_, p7_, p8_);
1031   }
1032 private:
1033   T0 p0_;
1034 T1 p1_;
1035 T2 p2_;
1036 T3 p3_;
1037 T4 p4_;
1038 T5 p5_;
1039 T6 p6_;
1040 T7 p7_;
1041 T8 p8_;
1042   Fun fun_;
1043 };
1044 template<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
1045 Closure9<T0, T1, T2, T3, T4, T5, T6, T7, T8>* NewCallback(void (*fun)(T0, T1, T2, T3, T4, T5, T6, T7, T8), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8) {
1046   return new Closure9<T0, T1, T2, T3, T4, T5, T6, T7, T8>(false, fun, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1047 }
1048 template<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
1049 Closure9<T0, T1, T2, T3, T4, T5, T6, T7, T8>* NewPermanentCallback(void (*fun)(T0, T1, T2, T3, T4, T5, T6, T7, T8), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8) {
1050   return new Closure9<T0, T1, T2, T3, T4, T5, T6, T7, T8>(true, fun, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1051 }
1052
1053
1054 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
1055 class MemberClosure9 : public Closure {
1056 public:
1057   typedef void (C::*Fun)(T0, T1, T2, T3, T4, T5, T6, T7, T8);
1058   MemberClosure9(bool is_permanent, C* c, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8)
1059     : Closure(is_permanent),
1060     c_(c),
1061     p0_(p0),
1062 p1_(p1),
1063 p2_(p2),
1064 p3_(p3),
1065 p4_(p4),
1066 p5_(p5),
1067 p6_(p6),
1068 p7_(p7),
1069 p8_(p8),
1070       fun_(fun) {
1071   }
1072 protected:
1073   virtual void RunInternal() {
1074       (c_->*fun_)(p0_, p1_, p2_, p3_, p4_, p5_, p6_, p7_, p8_);
1075   }
1076 private:
1077   C* c_;
1078   T0 p0_;
1079 T1 p1_;
1080 T2 p2_;
1081 T3 p3_;
1082 T4 p4_;
1083 T5 p5_;
1084 T6 p6_;
1085 T7 p7_;
1086 T8 p8_;
1087   Fun fun_;
1088 };
1089 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
1090 MemberClosure9<C, T0, T1, T2, T3, T4, T5, T6, T7, T8>* NewCallback(C* c, void (C::*fun)(T0, T1, T2, T3, T4, T5, T6, T7, T8), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8) {
1091   return new MemberClosure9<C, T0, T1, T2, T3, T4, T5, T6, T7, T8>(false, c, fun, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1092 }
1093 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
1094 MemberClosure9<C, T0, T1, T2, T3, T4, T5, T6, T7, T8>* NewPermanentCallback(C* c, void (C::*fun)(T0, T1, T2, T3, T4, T5, T6, T7, T8), T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8) {
1095   return new MemberClosure9<C, T0, T1, T2, T3, T4, T5, T6, T7, T8>(true, c, fun, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1096 }
1097
1098
1099 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
1100 class ConstMemberClosure9 : public Closure {
1101 public:
1102   typedef void (C::*Fun)(T0, T1, T2, T3, T4, T5, T6, T7, T8) const;
1103   ConstMemberClosure9(bool is_permanent, const C* c, Fun fun, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8)
1104     : Closure(is_permanent),
1105     c_(c),
1106     p0_(p0),
1107 p1_(p1),
1108 p2_(p2),
1109 p3_(p3),
1110 p4_(p4),
1111 p5_(p5),
1112 p6_(p6),
1113 p7_(p7),
1114 p8_(p8),
1115       fun_(fun) {
1116   }
1117 protected:
1118   virtual void RunInternal() {
1119       (c_->*fun_)(p0_, p1_, p2_, p3_, p4_, p5_, p6_, p7_, p8_);
1120   }
1121 private:
1122   const C* c_;
1123   T0 p0_;
1124 T1 p1_;
1125 T2 p2_;
1126 T3 p3_;
1127 T4 p4_;
1128 T5 p5_;
1129 T6 p6_;
1130 T7 p7_;
1131 T8 p8_;
1132   Fun fun_;
1133 };
1134 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
1135 ConstMemberClosure9<C, T0, T1, T2, T3, T4, T5, T6, T7, T8>* NewCallback(const C* c, void (C::*fun)(T0, T1, T2, T3, T4, T5, T6, T7, T8) const, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8) {
1136   return new ConstMemberClosure9<C, T0, T1, T2, T3, T4, T5, T6, T7, T8>(false, c, fun, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1137 }
1138 template<typename C, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
1139 ConstMemberClosure9<C, T0, T1, T2, T3, T4, T5, T6, T7, T8>* NewPermanentCallback(C* c, void (C::*fun)(T0, T1, T2, T3, T4, T5, T6, T7, T8) const, T0 p0, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8) {
1140   return new ConstMemberClosure9<C, T0, T1, T2, T3, T4, T5, T6, T7, T8>(true, c, fun, p0, p1, p2, p3, p4, p5, p6, p7, p8);
1141 }
1142
1143 #endif  // __COMMON_BASE_CALLBACK_CLOSURE_H__
Note: See TracBrowser for help on using the browser.