1 #ifndef GOOGLE_PROTOBUF_STUBS_CALLBACK_H_
2 #define GOOGLE_PROTOBUF_STUBS_CALLBACK_H_
6 #include <google/protobuf/stubs/macros.h>
8 #include <google/protobuf/port_def.inc>
73 class PROTOBUF_EXPORT Closure {
78 virtual void Run() = 0;
85 class ResultCallback {
96 template <
typename R,
typename A1>
97 class PROTOBUF_EXPORT ResultCallback1 {
102 virtual R
Run(A1) = 0;
108 template <
typename R,
typename A1,
typename A2>
109 class PROTOBUF_EXPORT ResultCallback2 {
114 virtual R
Run(A1,A2) = 0;
122 class PROTOBUF_EXPORT FunctionClosure0 :
public Closure {
124 typedef void (*FunctionType)();
127 : function_(
function), self_deleting_(self_deleting) {}
131 bool needs_delete = self_deleting_;
133 if (needs_delete)
delete this;
137 FunctionType function_;
141 template <
typename Class>
142 class MethodClosure0 :
public Closure {
153 if (needs_delete)
delete this;
162 template <
typename Arg1>
163 class FunctionClosure1 :
public Closure {
176 if (needs_delete)
delete this;
185 template <
typename Class,
typename Arg1>
186 class MethodClosure1 :
public Closure {
199 if (needs_delete)
delete this;
209 template <
typename Arg1,
typename Arg2>
210 class FunctionClosure2 :
public Closure {
215 Arg1 arg1, Arg2 arg2)
223 if (needs_delete)
delete this;
233 template <
typename Class,
typename Arg1,
typename Arg2>
234 class MethodClosure2 :
public Closure {
239 Arg1 arg1, Arg2 arg2)
247 if (needs_delete)
delete this;
270 if (needs_delete)
delete this;
279 template<
typename R,
typename P1>
292 if (needs_delete)
delete this;
302 template<
typename R,
typename Arg1>
314 if (needs_delete)
delete this;
323 template<
typename R,
typename P1,
typename A1>
336 if (needs_delete)
delete this;
346 template <
typename T>
347 struct InternalConstRef {
352 template<
typename R,
typename T>
365 if (needs_delete)
delete this;
375 template <
typename R,
typename T,
typename P1,
typename P2,
typename P3,
376 typename P4,
typename P5,
typename P6,
typename A1,
typename A2>
381 P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
396 if (needs_delete)
delete this;
416 return new internal::FunctionClosure0(
function,
true);
421 return new internal::FunctionClosure0(
function,
false);
425 template <
typename Class>
427 return new internal::MethodClosure0<Class>(
object,
method,
true);
431 template <
typename Class>
433 return new internal::MethodClosure0<Class>(
object,
method,
false);
437 template <
typename Arg1>
438 inline Closure*
NewCallback(
void (*
function)(Arg1),
440 return new internal::FunctionClosure1<Arg1>(
function,
true, arg1);
444 template <
typename Arg1>
447 return new internal::FunctionClosure1<Arg1>(
function,
false, arg1);
451 template <
typename Class,
typename Arg1>
454 return new internal::MethodClosure1<Class, Arg1>(
object,
method,
true, arg1);
458 template <
typename Class,
typename Arg1>
461 return new internal::MethodClosure1<Class, Arg1>(
object,
method,
false, arg1);
465 template <
typename Arg1,
typename Arg2>
466 inline Closure*
NewCallback(
void (*
function)(Arg1, Arg2),
467 Arg1 arg1, Arg2 arg2) {
468 return new internal::FunctionClosure2<Arg1, Arg2>(
469 function,
true, arg1, arg2);
473 template <
typename Arg1,
typename Arg2>
475 Arg1 arg1, Arg2 arg2) {
476 return new internal::FunctionClosure2<Arg1, Arg2>(
477 function,
false, arg1, arg2);
481 template <
typename Class,
typename Arg1,
typename Arg2>
483 Arg1 arg1, Arg2 arg2) {
484 return new internal::MethodClosure2<Class, Arg1, Arg2>(
485 object,
method,
true, arg1, arg2);
489 template <
typename Class,
typename Arg1,
typename Arg2>
491 Class*
object,
void (Class::*
method)(Arg1, Arg2),
492 Arg1 arg1, Arg2 arg2) {
493 return new internal::MethodClosure2<Class, Arg1, Arg2>(
494 object,
method,
false, arg1, arg2);
499 inline ResultCallback<R>*
NewCallback(R (*
function)()) {
500 return new internal::FunctionResultCallback_0_0<R>(
function,
true);
506 return new internal::FunctionResultCallback_0_0<R>(
function,
false);
510 template<
typename R,
typename P1>
511 inline ResultCallback<R>*
NewCallback(R (*
function)(P1), P1 p1) {
512 return new internal::FunctionResultCallback_1_0<R, P1>(
517 template<
typename R,
typename P1>
519 R (*
function)(P1), P1 p1) {
520 return new internal::FunctionResultCallback_1_0<R, P1>(
521 function,
false, p1);
525 template<
typename R,
typename A1>
526 inline ResultCallback1<R, A1>*
NewCallback(R (*
function)(A1)) {
527 return new internal::FunctionResultCallback_0_1<R, A1>(
function,
true);
531 template<
typename R,
typename A1>
533 return new internal::FunctionResultCallback_0_1<R, A1>(
function,
false);
537 template<
typename R,
typename P1,
typename A1>
538 inline ResultCallback1<R, A1>*
NewCallback(R (*
function)(P1, A1), P1 p1) {
539 return new internal::FunctionResultCallback_1_1<R, P1, A1>(
544 template<
typename R,
typename P1,
typename A1>
546 R (*
function)(P1, A1), P1 p1) {
547 return new internal::FunctionResultCallback_1_1<R, P1, A1>(
548 function,
false, p1);
552 template <
typename R,
typename T1,
typename T2>
554 T1*
object, R (
T2::*
function)()) {
555 return new internal::MethodResultCallback_0_0<R, T1>(
object,
function,
false);
559 template <
typename R,
typename T,
typename P1,
typename P2,
typename P3,
560 typename P4,
typename P5,
typename P6,
typename A1,
typename A2>
562 T*
object, R (
T::*
function)(P1, P2, P3, P4, P5, P6, A1, A2),
569 return new internal::MethodResultCallback_6_2<R,
T, P1, P2, P3, P4, P5, P6,
570 A1, A2>(object,
function,
false,
571 p1, p2, p3, p4, p5, p6);
581 #include <google/protobuf/port_undef.inc>
583 #endif // GOOGLE_PROTOBUF_STUBS_CALLBACK_H_