1// Protocol Buffers - Google's data interchange format
2// Copyright 2008 Google Inc. All rights reserved.
3// http://code.google.com/p/protobuf/
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
8//
9// * Redistributions of source code must retain the above copyright
10// notice, this list of conditions and the following disclaimer.
11// * Redistributions in binary form must reproduce the above
12// copyright notice, this list of conditions and the following disclaimer
13// in the documentation and/or other materials provided with the
14// distribution.
15// * Neither the name of Google Inc. nor the names of its
16// contributors may be used to endorse or promote products derived from
17// this software without specific prior written permission.
18//
19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31// Author: [email protected] (Kenton Varda) and others
32//
33// Contains basic types and utilities used by the rest of the library.
34
35// The code in this file is modified from google/protobuf/stubs/common.h
36// in protobuf-2.4, mainly for creating closures. We need to separate
37// the code because protobuf 3.0 moves NewCallback into internal namespace.
38// Another reason is that we add more overloads to the function which is
39// probably widely used throughout baidu. When user's callback creation
40// code breaks in protobuf 3.0, they can simply replace
41// google::protobuf::NewCallback with brpc::NewCallback.
42
43#ifndef BRPC_CALLBACK_H
44#define BRPC_CALLBACK_H
45
46#include <google/protobuf/stubs/common.h> // Closure
47#if GOOGLE_PROTOBUF_VERSION >= 3007000
48// After protobuf 3.7.0, callback.h is removed from common.h, we need to explicitly
49// include this file.
50#include <google/protobuf/stubs/callback.h>
51#endif
52
53namespace brpc {
54
55// Abstract interface for a callback. When calling an RPC, you must provide
56// a Closure to call when the procedure completes. See the Service interface
57// in service.h.
58//
59// To automatically construct a Closure which calls a particular function or
60// method with a particular set of parameters, use the NewCallback() function.
61// Example:
62// void FooDone(const FooResponse* response) {
63// ...
64// }
65//
66// void CallFoo() {
67// ...
68// // When done, call FooDone() and pass it a pointer to the response.
69// Closure* callback = NewCallback(&FooDone, response);
70// // Make the call.
71// service->Foo(controller, request, response, callback);
72// }
73//
74// Example that calls a method:
75// class Handler {
76// public:
77// ...
78//
79// void FooDone(const FooResponse* response) {
80// ...
81// }
82//
83// void CallFoo() {
84// ...
85// // When done, call FooDone() and pass it a pointer to the response.
86// Closure* callback = NewCallback(this, &Handler::FooDone, response);
87// // Make the call.
88// service->Foo(controller, request, response, callback);
89// }
90// };
91//
92// Currently NewCallback() supports binding zero, one, or two arguments.
93//
94// Callbacks created with NewCallback() automatically delete themselves when
95// executed. They should be used when a callback is to be called exactly
96// once (usually the case with RPC callbacks). If a callback may be called
97// a different number of times (including zero), create it with
98// NewPermanentCallback() instead. You are then responsible for deleting the
99// callback (using the "delete" keyword as normal).
100//
101// Note that NewCallback() is a bit touchy regarding argument types. Generally,
102// the values you provide for the parameter bindings must exactly match the
103// types accepted by the callback function. For example:
104// void Foo(string s);
105// NewCallback(&Foo, "foo"); // WON'T WORK: const char* != string
106// NewCallback(&Foo, string("foo")); // WORKS
107// Also note that the arguments cannot be references:
108// void Foo(const string& s);
109// string my_str;
110// NewCallback(&Foo, my_str); // WON'T WORK: Can't use referecnes.
111// However, correctly-typed pointers will work just fine.
112
113namespace internal {
114
115template <typename T>
116inline T* get_pointer(T* p) {
117 return p;
118}
119
120class FunctionClosure0 : public ::google::protobuf::Closure {
121 public:
122 typedef void (*FunctionType)();
123
124 FunctionClosure0(FunctionType function, bool self_deleting)
125 : function_(function), self_deleting_(self_deleting) {}
126 ~FunctionClosure0() {}
127
128 void Run() override {
129 bool needs_delete = self_deleting_; // read in case callback deletes
130 function_();
131 if (needs_delete) delete this;
132 }
133
134 private:
135 FunctionType function_;
136 bool self_deleting_;
137};
138
139template <typename Class, typename Pointer>
140class MethodClosure0 : public ::google::protobuf::Closure {
141 public:
142 typedef void (Class::*MethodType)();
143
144 MethodClosure0(const Pointer& object, MethodType method, bool self_deleting)
145 : object_(object), method_(method), self_deleting_(self_deleting) {}
146 ~MethodClosure0() {}
147
148 void Run() {
149 bool needs_delete = self_deleting_; // read in case callback deletes
150 (get_pointer(object_)->*method_)();
151 if (needs_delete) delete this;
152 }
153
154 private:
155 Pointer object_;
156 MethodType method_;
157 bool self_deleting_;
158};
159
160template <typename Arg1>
161class FunctionClosure1 : public ::google::protobuf::Closure {
162 public:
163 typedef void (*FunctionType)(Arg1 arg1);
164
165 FunctionClosure1(FunctionType function, bool self_deleting,
166 Arg1 arg1)
167 : function_(function), self_deleting_(self_deleting),
168 arg1_(arg1) {}
169 ~FunctionClosure1() {}
170
171 void Run() {
172 bool needs_delete = self_deleting_; // read in case callback deletes
173 function_(arg1_);
174 if (needs_delete) delete this;
175 }
176
177 private:
178 FunctionType function_;
179 bool self_deleting_;
180 Arg1 arg1_;
181};
182
183template <typename Class, typename Pointer, typename Arg1>
184class MethodClosure1 : public ::google::protobuf::Closure {
185 public:
186 typedef void (Class::*MethodType)(Arg1 arg1);
187
188 MethodClosure1(const Pointer& object, MethodType method, bool self_deleting,
189 Arg1 arg1)
190 : object_(object), method_(method), self_deleting_(self_deleting),
191 arg1_(arg1) {}
192 ~MethodClosure1() {}
193
194 void Run() {
195 bool needs_delete = self_deleting_; // read in case callback deletes
196 (get_pointer(object_)->*method_)(arg1_);
197 if (needs_delete) delete this;
198 }
199
200 private:
201 Pointer object_;
202 MethodType method_;
203 bool self_deleting_;
204 Arg1 arg1_;
205};
206
207template <typename Arg1, typename Arg2>
208class FunctionClosure2 : public ::google::protobuf::Closure {
209 public:
210 typedef void (*FunctionType)(Arg1 arg1, Arg2 arg2);
211
212 FunctionClosure2(FunctionType function, bool self_deleting,
213 Arg1 arg1, Arg2 arg2)
214 : function_(function), self_deleting_(self_deleting),
215 arg1_(arg1), arg2_(arg2) {}
216 ~FunctionClosure2() {}
217
218 void Run() {
219 bool needs_delete = self_deleting_; // read in case callback deletes
220 function_(arg1_, arg2_);
221 if (needs_delete) delete this;
222 }
223
224 private:
225 FunctionType function_;
226 bool self_deleting_;
227 Arg1 arg1_;
228 Arg2 arg2_;
229};
230
231template <typename Class, typename Pointer, typename Arg1, typename Arg2>
232class MethodClosure2 : public ::google::protobuf::Closure {
233 public:
234 typedef void (Class::*MethodType)(Arg1 arg1, Arg2 arg2);
235
236 MethodClosure2(const Pointer& object, MethodType method, bool self_deleting,
237 Arg1 arg1, Arg2 arg2)
238 : object_(object), method_(method), self_deleting_(self_deleting),
239 arg1_(arg1), arg2_(arg2) {}
240 ~MethodClosure2() {}
241
242 void Run() {
243 bool needs_delete = self_deleting_; // read in case callback deletes
244 (get_pointer(object_)->*method_)(arg1_, arg2_);
245 if (needs_delete) delete this;
246 }
247
248 private:
249 Pointer object_;
250 MethodType method_;
251 bool self_deleting_;
252 Arg1 arg1_;
253 Arg2 arg2_;
254};
255
256template <typename Arg1, typename Arg2, typename Arg3>
257class FunctionClosure3 : public ::google::protobuf::Closure {
258 public:
259 typedef void (*FunctionType)(Arg1 arg1, Arg2 arg2, Arg3 arg3);
260
261 FunctionClosure3(FunctionType function, bool self_deleting,
262 Arg1 arg1, Arg2 arg2, Arg3 arg3)
263 : function_(function), self_deleting_(self_deleting),
264 arg1_(arg1), arg2_(arg2), arg3_(arg3) {}
265 ~FunctionClosure3() {}
266
267 void Run() {
268 bool needs_delete = self_deleting_; // read in case callback deletes
269 function_(arg1_, arg2_, arg3_);
270 if (needs_delete) delete this;
271 }
272
273 private:
274 FunctionType function_;
275 bool self_deleting_;
276 Arg1 arg1_;
277 Arg2 arg2_;
278 Arg3 arg3_;
279};
280
281template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3>
282class MethodClosure3 : public ::google::protobuf::Closure {
283 public:
284 typedef void (Class::*MethodType)(Arg1 arg1, Arg2 arg2, Arg3 arg3);
285
286 MethodClosure3(const Pointer& object, MethodType method, bool self_deleting,
287 Arg1 arg1, Arg2 arg2, Arg3 arg3)
288 : object_(object), method_(method), self_deleting_(self_deleting),
289 arg1_(arg1), arg2_(arg2),arg3_(arg3) {}
290 ~MethodClosure3() {}
291
292 void Run() {
293 bool needs_delete = self_deleting_; // read in case callback deletes
294 (get_pointer(object_)->*method_)(arg1_, arg2_,arg3_);
295 if (needs_delete) delete this;
296 }
297
298 private:
299 Pointer object_;
300 MethodType method_;
301 bool self_deleting_;
302 Arg1 arg1_;
303 Arg2 arg2_;
304 Arg3 arg3_;
305};
306
307template <typename Arg1, typename Arg2, typename Arg3, typename Arg4>
308class FunctionClosure4 : public ::google::protobuf::Closure {
309 public:
310 typedef void (*FunctionType)(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4);
311
312 FunctionClosure4(FunctionType function, bool self_deleting,
313 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4)
314 : function_(function), self_deleting_(self_deleting),
315 arg1_(arg1), arg2_(arg2), arg3_(arg3), arg4_(arg4) {}
316 ~FunctionClosure4() {}
317
318 void Run() {
319 bool needs_delete = self_deleting_; // read in case callback deletes
320 function_(arg1_, arg2_, arg3_, arg4_);
321 if (needs_delete) delete this;
322 }
323
324 private:
325 FunctionType function_;
326 bool self_deleting_;
327 Arg1 arg1_;
328 Arg2 arg2_;
329 Arg3 arg3_;
330 Arg4 arg4_;
331};
332
333template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
334class MethodClosure4 : public ::google::protobuf::Closure {
335 public:
336 typedef void (Class::*MethodType)(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4);
337
338 MethodClosure4(const Pointer& object, MethodType method, bool self_deleting,
339 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4)
340 : object_(object), method_(method), self_deleting_(self_deleting),
341 arg1_(arg1), arg2_(arg2),arg3_(arg3),arg4_(arg4) {}
342 ~MethodClosure4() {}
343
344 void Run() {
345 bool needs_delete = self_deleting_; // read in case callback deletes
346 (get_pointer(object_)->*method_)(arg1_, arg2_,arg3_,arg4_);
347 if (needs_delete) delete this;
348 }
349
350 private:
351 Pointer object_;
352 MethodType method_;
353 bool self_deleting_;
354 Arg1 arg1_;
355 Arg2 arg2_;
356 Arg3 arg3_;
357 Arg4 arg4_;
358};
359
360template <typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
361class FunctionClosure5 : public ::google::protobuf::Closure {
362 public:
363 typedef void (*FunctionType)(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5);
364
365 FunctionClosure5(FunctionType function, bool self_deleting,
366 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5)
367 : function_(function), self_deleting_(self_deleting),
368 arg1_(arg1), arg2_(arg2), arg3_(arg3), arg4_(arg4), arg5_(arg5) {}
369 ~FunctionClosure5() {}
370
371 void Run() {
372 bool needs_delete = self_deleting_; // read in case callback deletes
373 function_(arg1_, arg2_, arg3_, arg4_, arg5_);
374 if (needs_delete) delete this;
375 }
376
377 private:
378 FunctionType function_;
379 bool self_deleting_;
380 Arg1 arg1_;
381 Arg2 arg2_;
382 Arg3 arg3_;
383 Arg4 arg4_;
384 Arg5 arg5_;
385};
386
387template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
388class MethodClosure5 : public ::google::protobuf::Closure {
389 public:
390 typedef void (Class::*MethodType)(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5);
391
392 MethodClosure5(const Pointer& object, MethodType method, bool self_deleting,
393 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5)
394 : object_(object), method_(method), self_deleting_(self_deleting),
395 arg1_(arg1), arg2_(arg2),arg3_(arg3),arg4_(arg4),arg5_(arg5) {}
396 ~MethodClosure5() {}
397
398 void Run() {
399 bool needs_delete = self_deleting_; // read in case callback deletes
400 (get_pointer(object_)->*method_)(arg1_, arg2_,arg3_,arg4_,arg5_);
401 if (needs_delete) delete this;
402 }
403
404 private:
405 Pointer object_;
406 MethodType method_;
407 bool self_deleting_;
408 Arg1 arg1_;
409 Arg2 arg2_;
410 Arg3 arg3_;
411 Arg4 arg4_;
412 Arg5 arg5_;
413};
414
415template <typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6>
416class FunctionClosure6 : public ::google::protobuf::Closure {
417 public:
418 typedef void (*FunctionType)(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6);
419
420 FunctionClosure6(FunctionType function, bool self_deleting,
421 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6)
422 : function_(function), self_deleting_(self_deleting),
423 arg1_(arg1), arg2_(arg2), arg3_(arg3), arg4_(arg4), arg5_(arg5), arg6_(arg6) {}
424 ~FunctionClosure6() {}
425
426 void Run() {
427 bool needs_delete = self_deleting_; // read in case callback deletes
428 function_(arg1_, arg2_, arg3_, arg4_, arg5_, arg6_);
429 if (needs_delete) delete this;
430 }
431
432 private:
433 FunctionType function_;
434 bool self_deleting_;
435 Arg1 arg1_;
436 Arg2 arg2_;
437 Arg3 arg3_;
438 Arg4 arg4_;
439 Arg5 arg5_;
440 Arg6 arg6_;
441};
442
443template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6>
444class MethodClosure6 : public ::google::protobuf::Closure {
445 public:
446 typedef void (Class::*MethodType)(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6);
447
448 MethodClosure6(const Pointer& object, MethodType method, bool self_deleting,
449 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6)
450 : object_(object), method_(method), self_deleting_(self_deleting),
451 arg1_(arg1), arg2_(arg2),arg3_(arg3),arg4_(arg4),arg5_(arg5),arg6_(arg6) {}
452 ~MethodClosure6() {}
453
454 void Run() {
455 bool needs_delete = self_deleting_; // read in case callback deletes
456 (get_pointer(object_)->*method_)(arg1_, arg2_,arg3_,arg4_,arg5_,arg6_);
457 if (needs_delete) delete this;
458 }
459
460 private:
461 Pointer object_;
462 MethodType method_;
463 bool self_deleting_;
464 Arg1 arg1_;
465 Arg2 arg2_;
466 Arg3 arg3_;
467 Arg4 arg4_;
468 Arg5 arg5_;
469 Arg6 arg6_;
470};
471
472template <typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7>
473class FunctionClosure7 : public ::google::protobuf::Closure {
474 public:
475 typedef void (*FunctionType)(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7);
476
477 FunctionClosure7(FunctionType function, bool self_deleting,
478 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7)
479 : function_(function), self_deleting_(self_deleting),
480 arg1_(arg1), arg2_(arg2), arg3_(arg3), arg4_(arg4), arg5_(arg5), arg6_(arg6), arg7_(arg7) {}
481 ~FunctionClosure7() {}
482
483 void Run() {
484 bool needs_delete = self_deleting_; // read in case callback deletes
485 function_(arg1_, arg2_, arg3_, arg4_, arg5_, arg6_, arg7_);
486 if (needs_delete) delete this;
487 }
488
489 private:
490 FunctionType function_;
491 bool self_deleting_;
492 Arg1 arg1_;
493 Arg2 arg2_;
494 Arg3 arg3_;
495 Arg4 arg4_;
496 Arg5 arg5_;
497 Arg6 arg6_;
498 Arg7 arg7_;
499};
500
501template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7>
502class MethodClosure7 : public ::google::protobuf::Closure {
503 public:
504 typedef void (Class::*MethodType)(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7);
505
506 MethodClosure7(const Pointer& object, MethodType method, bool self_deleting,
507 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7)
508 : object_(object), method_(method), self_deleting_(self_deleting),
509 arg1_(arg1), arg2_(arg2),arg3_(arg3),arg4_(arg4),arg5_(arg5),arg6_(arg6),arg7_(arg7) {}
510 ~MethodClosure7() {}
511
512 void Run() {
513 bool needs_delete = self_deleting_; // read in case callback deletes
514 (get_pointer(object_)->*method_)(arg1_, arg2_,arg3_,arg4_,arg5_,arg6_,arg7_);
515 if (needs_delete) delete this;
516 }
517
518 private:
519 Pointer object_;
520 MethodType method_;
521 bool self_deleting_;
522 Arg1 arg1_;
523 Arg2 arg2_;
524 Arg3 arg3_;
525 Arg4 arg4_;
526 Arg5 arg5_;
527 Arg6 arg6_;
528 Arg7 arg7_;
529};
530
531
532template <typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7, typename Arg8>
533class FunctionClosure8 : public ::google::protobuf::Closure {
534 public:
535 typedef void (*FunctionType)(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8);
536
537 FunctionClosure8(FunctionType function, bool self_deleting,
538 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8)
539 : function_(function), self_deleting_(self_deleting),
540 arg1_(arg1), arg2_(arg2), arg3_(arg3), arg4_(arg4), arg5_(arg5), arg6_(arg6), arg7_(arg7), arg8_(arg8) {}
541 ~FunctionClosure8() {}
542
543 void Run() {
544 bool needs_delete = self_deleting_; // read in case callback deletes
545 function_(arg1_, arg2_, arg3_, arg4_, arg5_, arg6_, arg7_,arg8_);
546 if (needs_delete) delete this;
547 }
548
549 private:
550 FunctionType function_;
551 bool self_deleting_;
552 Arg1 arg1_;
553 Arg2 arg2_;
554 Arg3 arg3_;
555 Arg4 arg4_;
556 Arg5 arg5_;
557 Arg6 arg6_;
558 Arg7 arg7_;
559 Arg8 arg8_;
560};
561
562template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7, typename Arg8>
563class MethodClosure8 : public ::google::protobuf::Closure {
564 public:
565 typedef void (Class::*MethodType)(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8);
566
567 MethodClosure8(const Pointer& object, MethodType method, bool self_deleting,
568 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8)
569 : object_(object), method_(method), self_deleting_(self_deleting),
570 arg1_(arg1), arg2_(arg2),arg3_(arg3),arg4_(arg4),arg5_(arg5),arg6_(arg6),arg7_(arg7),arg8_(arg8) {}
571 ~MethodClosure8() {}
572
573 void Run() {
574 bool needs_delete = self_deleting_; // read in case callback deletes
575 (get_pointer(object_)->*method_)(arg1_, arg2_,arg3_,arg4_,arg5_,arg6_,arg7_,arg8_);
576 if (needs_delete) delete this;
577 }
578
579 private:
580 Pointer object_;
581 MethodType method_;
582 bool self_deleting_;
583 Arg1 arg1_;
584 Arg2 arg2_;
585 Arg3 arg3_;
586 Arg4 arg4_;
587 Arg5 arg5_;
588 Arg6 arg6_;
589 Arg7 arg7_;
590 Arg8 arg8_;
591};
592
593
594template <typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7, typename Arg8, typename Arg9>
595class FunctionClosure9 : public ::google::protobuf::Closure {
596 public:
597 typedef void (*FunctionType)(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9);
598
599 FunctionClosure9(FunctionType function, bool self_deleting,
600 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9)
601 : function_(function), self_deleting_(self_deleting),
602 arg1_(arg1), arg2_(arg2), arg3_(arg3), arg4_(arg4), arg5_(arg5), arg6_(arg6), arg7_(arg7), arg8_(arg8), arg9_(arg9) {}
603 ~FunctionClosure9() {}
604
605 void Run() {
606 bool needs_delete = self_deleting_; // read in case callback deletes
607 function_(arg1_, arg2_, arg3_, arg4_, arg5_, arg6_, arg7_,arg8_,arg9_);
608 if (needs_delete) delete this;
609 }
610
611 private:
612 FunctionType function_;
613 bool self_deleting_;
614 Arg1 arg1_;
615 Arg2 arg2_;
616 Arg3 arg3_;
617 Arg4 arg4_;
618 Arg5 arg5_;
619 Arg6 arg6_;
620 Arg7 arg7_;
621 Arg8 arg8_;
622 Arg9 arg9_;
623};
624
625template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7, typename Arg8, typename Arg9>
626class MethodClosure9 : public ::google::protobuf::Closure {
627 public:
628 typedef void (Class::*MethodType)(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9);
629
630 MethodClosure9(const Pointer& object, MethodType method, bool self_deleting,
631 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9)
632 : object_(object), method_(method), self_deleting_(self_deleting),
633 arg1_(arg1), arg2_(arg2),arg3_(arg3),arg4_(arg4),arg5_(arg5),arg6_(arg6),arg7_(arg7),arg8_(arg8),arg9_(arg9) {}
634 ~MethodClosure9() {}
635
636 void Run() {
637 bool needs_delete = self_deleting_; // read in case callback deletes
638 (get_pointer(object_)->*method_)(arg1_, arg2_,arg3_,arg4_,arg5_,arg6_,arg7_,arg8_,arg9_);
639 if (needs_delete) delete this;
640 }
641
642 private:
643 Pointer object_;
644 MethodType method_;
645 bool self_deleting_;
646 Arg1 arg1_;
647 Arg2 arg2_;
648 Arg3 arg3_;
649 Arg4 arg4_;
650 Arg5 arg5_;
651 Arg6 arg6_;
652 Arg7 arg7_;
653 Arg8 arg8_;
654 Arg9 arg9_;
655};
656
657template <typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7, typename Arg8, typename Arg9, typename Arg10>
658class FunctionClosure10 : public ::google::protobuf::Closure {
659 public:
660 typedef void (*FunctionType)(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9, Arg10 arg10);
661
662 FunctionClosure10(FunctionType function, bool self_deleting,
663 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9, Arg10 arg10)
664 : function_(function), self_deleting_(self_deleting),
665 arg1_(arg1), arg2_(arg2), arg3_(arg3), arg4_(arg4), arg5_(arg5), arg6_(arg6), arg7_(arg7), arg8_(arg8), arg9_(arg9), arg10_(arg10) {}
666 ~FunctionClosure10() {}
667
668 void Run() {
669 bool needs_delete = self_deleting_; // read in case callback deletes
670 function_(arg1_, arg2_, arg3_, arg4_, arg5_, arg6_, arg7_,arg8_,arg9_,arg10_);
671 if (needs_delete) delete this;
672 }
673
674 private:
675 FunctionType function_;
676 bool self_deleting_;
677 Arg1 arg1_;
678 Arg2 arg2_;
679 Arg3 arg3_;
680 Arg4 arg4_;
681 Arg5 arg5_;
682 Arg6 arg6_;
683 Arg7 arg7_;
684 Arg8 arg8_;
685 Arg9 arg9_;
686 Arg10 arg10_;
687};
688
689template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7, typename Arg8, typename Arg9, typename Arg10>
690class MethodClosure10 : public ::google::protobuf::Closure {
691 public:
692 typedef void (Class::*MethodType)(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9, Arg10 arg10);
693
694 MethodClosure10(const Pointer& object, MethodType method, bool self_deleting,
695 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9, Arg10 arg10)
696 : object_(object), method_(method), self_deleting_(self_deleting),
697 arg1_(arg1), arg2_(arg2),arg3_(arg3),arg4_(arg4),arg5_(arg5),arg6_(arg6),arg7_(arg7),arg8_(arg8),arg9_(arg9),arg10_(arg10) {}
698 ~MethodClosure10() {}
699
700 void Run() {
701 bool needs_delete = self_deleting_; // read in case callback deletes
702 (get_pointer(object_)->*method_)(arg1_, arg2_,arg3_,arg4_,arg5_,arg6_,arg7_,arg8_,arg9_,arg10_);
703 if (needs_delete) delete this;
704 }
705
706 private:
707 Pointer object_;
708 MethodType method_;
709 bool self_deleting_;
710 Arg1 arg1_;
711 Arg2 arg2_;
712 Arg3 arg3_;
713 Arg4 arg4_;
714 Arg5 arg5_;
715 Arg6 arg6_;
716 Arg7 arg7_;
717 Arg8 arg8_;
718 Arg9 arg9_;
719 Arg10 arg10_;
720};
721
722} // namespace internal
723
724// See Closure.
725inline ::google::protobuf::Closure* NewCallback(void (*function)()) {
726 return new internal::FunctionClosure0(function, true);
727}
728
729// See Closure.
730inline ::google::protobuf::Closure* NewPermanentCallback(void (*function)()) {
731 return new internal::FunctionClosure0(function, false);
732}
733
734// See Closure.
735template <typename Class, typename Pointer>
736inline ::google::protobuf::Closure* NewCallback(const Pointer& object, void (Class::*method)()) {
737 return new internal::MethodClosure0<Class, Pointer>(object, method, true);
738}
739
740// See Closure.
741template <typename Class, typename Pointer>
742inline ::google::protobuf::Closure* NewPermanentCallback(const Pointer& object, void (Class::*method)()) {
743 return new internal::MethodClosure0<Class, Pointer>(object, method, false);
744}
745
746// See Closure.
747template <typename Arg1>
748inline ::google::protobuf::Closure* NewCallback(void (*function)(Arg1),
749 Arg1 arg1) {
750 return new internal::FunctionClosure1<Arg1>(function, true, arg1);
751}
752
753// See Closure.
754template <typename Arg1>
755inline ::google::protobuf::Closure* NewPermanentCallback(void (*function)(Arg1),
756 Arg1 arg1) {
757 return new internal::FunctionClosure1<Arg1>(function, false, arg1);
758}
759
760// See Closure.
761template <typename Class, typename Pointer, typename Arg1>
762inline ::google::protobuf::Closure* NewCallback(const Pointer& object, void (Class::*method)(Arg1),
763 Arg1 arg1) {
764 return new internal::MethodClosure1<Class, Pointer, Arg1>(object, method, true, arg1);
765}
766
767// See Closure.
768template <typename Class, typename Pointer, typename Arg1>
769inline ::google::protobuf::Closure* NewPermanentCallback(const Pointer& object, void (Class::*method)(Arg1),
770 Arg1 arg1) {
771 return new internal::MethodClosure1<Class, Pointer, Arg1>(object, method, false, arg1);
772}
773
774// See Closure.
775template <typename Arg1, typename Arg2>
776inline ::google::protobuf::Closure* NewCallback(void (*function)(Arg1, Arg2),
777 Arg1 arg1, Arg2 arg2) {
778 return new internal::FunctionClosure2<Arg1, Arg2>(
779 function, true, arg1, arg2);
780}
781
782// See Closure.
783template <typename Arg1, typename Arg2>
784inline ::google::protobuf::Closure* NewPermanentCallback(void (*function)(Arg1, Arg2),
785 Arg1 arg1, Arg2 arg2) {
786 return new internal::FunctionClosure2<Arg1, Arg2>(
787 function, false, arg1, arg2);
788}
789
790// See Closure.
791template <typename Class, typename Pointer, typename Arg1, typename Arg2>
792inline ::google::protobuf::Closure* NewCallback(const Pointer& object, void (Class::*method)(Arg1, Arg2),
793 Arg1 arg1, Arg2 arg2) {
794 return new internal::MethodClosure2<Class, Pointer, Arg1, Arg2>(
795 object, method, true, arg1, arg2);
796}
797
798// See Closure.
799template <typename Class, typename Pointer, typename Arg1, typename Arg2>
800inline ::google::protobuf::Closure* NewPermanentCallback(
801 const Pointer& object, void (Class::*method)(Arg1, Arg2),
802 Arg1 arg1, Arg2 arg2) {
803 return new internal::MethodClosure2<Class, Pointer, Arg1, Arg2>(
804 object, method, false, arg1, arg2);
805}
806
807// See Closure.
808template <typename Arg1, typename Arg2, typename Arg3>
809inline ::google::protobuf::Closure* NewCallback(void (*function)(Arg1, Arg2, Arg3),
810 Arg1 arg1, Arg2 arg2, Arg3 arg3) {
811 return new internal::FunctionClosure3<Arg1, Arg2, Arg3>(
812 function, true, arg1, arg2, arg3);
813}
814
815// See Closure.
816template <typename Arg1, typename Arg2, typename Arg3>
817 inline ::google::protobuf::Closure* NewPermanentCallback(void (*function)(Arg1, Arg2, Arg3),
818 Arg1 arg1, Arg2 arg2, Arg3 arg3) {
819 return new internal::FunctionClosure3<Arg1, Arg2, Arg3>(
820 function, false, arg1, arg2, arg3);
821}
822
823// See Closure
824template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3>
825inline ::google::protobuf::Closure* NewCallback(
826 const Pointer& object, void (Class::*method)(Arg1, Arg2, Arg3),
827 Arg1 arg1, Arg2 arg2, Arg3 arg3) {
828 return new internal::MethodClosure3<Class, Pointer, Arg1, Arg2, Arg3>(
829 object, method, true, arg1, arg2, arg3);
830}
831
832// See Closure
833template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3>
834 inline ::google::protobuf::Closure* NewPermanentCallback(
835 const Pointer& object, void (Class::*method)(Arg1, Arg2, Arg3),
836 Arg1 arg1, Arg2 arg2, Arg3 arg3) {
837 return new internal::MethodClosure3<Class, Pointer, Arg1, Arg2, Arg3>(
838 object, method, false, arg1, arg2, arg3);
839}
840
841// See Closure.
842template <typename Arg1, typename Arg2, typename Arg3, typename Arg4>
843inline ::google::protobuf::Closure* NewCallback(void (*function)(Arg1, Arg2, Arg3, Arg4),
844 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4) {
845 return new internal::FunctionClosure4<Arg1, Arg2, Arg3, Arg4>(
846 function, true, arg1, arg2, arg3, arg4);
847}
848
849// See Closure.
850template <typename Arg1, typename Arg2, typename Arg3, typename Arg4>
851inline ::google::protobuf::Closure* NewPermanentCallback(void (*function)(Arg1, Arg2, Arg3, Arg4),
852 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4) {
853 return new internal::FunctionClosure4<Arg1, Arg2, Arg3, Arg4>(
854 function, false, arg1, arg2, arg3, arg4);
855}
856
857// See Closure.
858template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
859inline ::google::protobuf::Closure* NewCallback(
860 const Pointer& object, void (Class::*method)(Arg1, Arg2, Arg3, Arg4),
861 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4) {
862 return new internal::MethodClosure4<Class, Pointer, Arg1, Arg2, Arg3, Arg4>(
863 object, method, true, arg1, arg2, arg3, arg4);
864}
865
866// See Closure.
867template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
868inline ::google::protobuf::Closure* NewPermanentCallback(
869 const Pointer& object, void (Class::*method)(Arg1, Arg2, Arg3, Arg4),
870 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4) {
871 return new internal::MethodClosure4<Class, Pointer, Arg1, Arg2, Arg3, Arg4>(
872 object, method, false, arg1, arg2, arg3, arg4);
873}
874
875// See Closure.
876template <typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
877inline ::google::protobuf::Closure* NewCallback(void (*function)(Arg1, Arg2, Arg3, Arg4, Arg5),
878 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5) {
879 return new internal::FunctionClosure5<Arg1, Arg2, Arg3, Arg4, Arg5>(
880 function, true, arg1, arg2, arg3, arg4, arg5);
881}
882
883// See Closure.
884template <typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
885inline ::google::protobuf::Closure* NewPermanentCallback(void (*function)(Arg1, Arg2, Arg3, Arg4, Arg5),
886 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5) {
887 return new internal::FunctionClosure5<Arg1, Arg2, Arg3, Arg4, Arg5>(
888 function, false, arg1, arg2, arg3, arg4, arg5);
889}
890
891// See Closure
892template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
893inline ::google::protobuf::Closure* NewCallback(
894 const Pointer& object, void (Class::*method)(Arg1, Arg2, Arg3, Arg4, Arg5),
895 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5) {
896 return new internal::MethodClosure5<Class, Pointer, Arg1, Arg2, Arg3, Arg4, Arg5>(
897 object, method, true, arg1, arg2, arg3, arg4, arg5);
898}
899
900// See Closure
901template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
902inline ::google::protobuf::Closure* NewPermanentCallback(
903 const Pointer& object, void (Class::*method)(Arg1, Arg2, Arg3, Arg4, Arg5),
904 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5) {
905 return new internal::MethodClosure5<Class, Pointer, Arg1, Arg2, Arg3, Arg4, Arg5>(
906 object, method, false, arg1, arg2, arg3, arg4, arg5);
907}
908
909// See Closure.
910template <typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6>
911inline ::google::protobuf::Closure* NewCallback(void (*function)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6),
912 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6) {
913 return new internal::FunctionClosure6<Arg1, Arg2, Arg3, Arg4, Arg5, Arg6>(
914 function, true, arg1, arg2, arg3, arg4, arg5, arg6);
915}
916
917// See Closure.
918template <typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6>
919inline ::google::protobuf::Closure* NewPermanentCallback(void (*function)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6),
920 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6) {
921 return new internal::FunctionClosure6<Arg1, Arg2, Arg3, Arg4, Arg5, Arg6>(
922 function, false, arg1, arg2, arg3, arg4, arg5, arg6);
923}
924
925// See Closure
926template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6>
927inline ::google::protobuf::Closure* NewCallback(
928 const Pointer& object, void (Class::*method)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6),
929 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6) {
930 return new internal::MethodClosure6<Class, Pointer, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6>(
931 object, method, true, arg1, arg2, arg3, arg4, arg5, arg6);
932}
933
934// See Closure
935template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6>
936inline ::google::protobuf::Closure* NewPermanentCallback(
937 const Pointer& object, void (Class::*method)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6),
938 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6) {
939 return new internal::MethodClosure6<Class, Pointer, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6>(
940 object, method, false, arg1, arg2, arg3, arg4, arg5, arg6);
941}
942
943// See Closure
944template <typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7>
945inline ::google::protobuf::Closure* NewCallback(void (*function)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7),
946 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7) {
947 return new internal::FunctionClosure7<Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7>(
948 function, true, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
949}
950
951// See Closure.
952template <typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7>
953inline ::google::protobuf::Closure* NewPermanentCallback(void (*function)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7),
954 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7) {
955 return new internal::FunctionClosure7<Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7>(
956 function, false, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
957}
958
959
960// See Closure
961template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7>
962inline ::google::protobuf::Closure* NewCallback(
963 const Pointer& object, void (Class::*method)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7),
964 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7) {
965 return new internal::MethodClosure7<Class, Pointer, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7>(
966 object, method, true, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
967}
968
969
970// See Closure
971template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7>
972inline ::google::protobuf::Closure* NewPermanentCallback(
973 const Pointer& object, void (Class::*method)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7),
974 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7) {
975 return new internal::MethodClosure7<Class, Pointer, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7>(
976 object, method, false, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
977}
978
979
980
981// See Closure.
982template <typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7, typename Arg8>
983inline ::google::protobuf::Closure* NewCallback(void (*function)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8),
984 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8) {
985 return new internal::FunctionClosure8<Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8>(
986 function, true, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
987}
988
989
990// See Closure.
991template <typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7, typename Arg8>
992inline ::google::protobuf::Closure* NewPermanentCallback(void (*function)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8),
993 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8) {
994 return new internal::FunctionClosure8<Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8>(
995 function, false, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
996}
997
998
999
1000// See Closure
1001template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7, typename Arg8>
1002inline ::google::protobuf::Closure* NewCallback(
1003 const Pointer& object, void (Class::*method)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8),
1004 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8) {
1005 return new internal::MethodClosure8<Class, Pointer, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8>(
1006 object, method, true, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
1007}
1008
1009
1010// See Closure
1011template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7, typename Arg8>
1012inline ::google::protobuf::Closure* NewPermanentCallback(
1013 const Pointer& object, void (Class::*method)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8),
1014 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8) {
1015 return new internal::MethodClosure8<Class, Pointer, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8>(
1016 object, method, false, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
1017}
1018
1019
1020// See Closure.
1021template <typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7, typename Arg8, typename Arg9>
1022inline ::google::protobuf::Closure* NewCallback(void (*function)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9),
1023 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9) {
1024 return new internal::FunctionClosure9<Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9>(
1025 function, true, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
1026}
1027
1028
1029// See Closure.
1030template <typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7, typename Arg8, typename Arg9>
1031inline ::google::protobuf::Closure* NewPermanentCallback(void (*function)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9),
1032 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9) {
1033 return new internal::FunctionClosure9<Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9>(
1034 function, false, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
1035}
1036
1037
1038// See Closure
1039template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7, typename Arg8, typename Arg9>
1040inline ::google::protobuf::Closure* NewCallback(
1041 const Pointer& object, void (Class::*method)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9),
1042 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9) {
1043 return new internal::MethodClosure9<Class, Pointer, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9>(
1044 object, method, true, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
1045}
1046
1047
1048// See Closure
1049template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7, typename Arg8, typename Arg9>
1050inline ::google::protobuf::Closure* NewPermanentCallback(
1051 const Pointer& object, void (Class::*method)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9),
1052 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9) {
1053 return new internal::MethodClosure9<Class, Pointer, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9>(
1054 object, method, false, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
1055}
1056
1057// See Closure.
1058template <typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7, typename Arg8, typename Arg9, typename Arg10>
1059inline ::google::protobuf::Closure* NewCallback(void (*function)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10),
1060 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9, Arg10 arg10) {
1061 return new internal::FunctionClosure10<Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10>(
1062 function, true, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
1063}
1064
1065
1066// See Closure.
1067template <typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7, typename Arg8, typename Arg9, typename Arg10>
1068inline ::google::protobuf::Closure* NewPermanentCallback(void (*function)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10),
1069 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9, Arg10 arg10) {
1070 return new internal::FunctionClosure10<Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10>(
1071 function, false, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
1072}
1073
1074
1075// See Closure
1076template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7, typename Arg8, typename Arg9, typename Arg10>
1077inline ::google::protobuf::Closure* NewCallback(
1078 const Pointer& object, void (Class::*method)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10),
1079 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9, Arg10 arg10) {
1080 return new internal::MethodClosure10<Class, Pointer, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10>(
1081 object, method, true, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
1082}
1083
1084
1085// See Closure
1086template <typename Class, typename Pointer, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6, typename Arg7, typename Arg8, typename Arg9, typename Arg10>
1087inline ::google::protobuf::Closure* NewPermanentCallback(
1088 const Pointer& object, void (Class::*method)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10),
1089 Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6, Arg7 arg7, Arg8 arg8, Arg9 arg9, Arg10 arg10) {
1090 return new internal::MethodClosure10<Class, Pointer, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10>(
1091 object, method, false, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
1092}
1093
1094} // namespace brpc
1095
1096
1097#endif // BRPC_CALLBACK_H
1098