|
@@ -78,6 +78,18 @@ class LIBPROTOBUF_EXPORT Closure {
|
|
|
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Closure);
|
|
|
};
|
|
|
|
|
|
+template<typename R>
|
|
|
+class LIBPROTOBUF_EXPORT ResultCallback {
|
|
|
+ public:
|
|
|
+ ResultCallback() {}
|
|
|
+ virtual ~ResultCallback() {}
|
|
|
+
|
|
|
+ virtual R Run() = 0;
|
|
|
+
|
|
|
+ private:
|
|
|
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ResultCallback);
|
|
|
+};
|
|
|
+
|
|
|
template<typename R, typename A1>
|
|
|
class LIBPROTOBUF_EXPORT ResultCallback1 {
|
|
|
public:
|
|
@@ -240,6 +252,50 @@ class MethodClosure2 : public Closure {
|
|
|
Arg2 arg2_;
|
|
|
};
|
|
|
|
|
|
+template<typename R>
|
|
|
+class FunctionResultCallback_0_0 : public ResultCallback<R> {
|
|
|
+ public:
|
|
|
+ typedef R (*FunctionType)();
|
|
|
+
|
|
|
+ FunctionResultCallback_0_0(FunctionType function, bool self_deleting)
|
|
|
+ : function_(function), self_deleting_(self_deleting) {}
|
|
|
+ ~FunctionResultCallback_0_0() {}
|
|
|
+
|
|
|
+ R Run() {
|
|
|
+ bool needs_delete = self_deleting_; // read in case callback deletes
|
|
|
+ R result = function_();
|
|
|
+ if (needs_delete) delete this;
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private:
|
|
|
+ FunctionType function_;
|
|
|
+ bool self_deleting_;
|
|
|
+};
|
|
|
+
|
|
|
+template<typename R, typename P1>
|
|
|
+class FunctionResultCallback_1_0 : public ResultCallback<R> {
|
|
|
+ public:
|
|
|
+ typedef R (*FunctionType)(P1);
|
|
|
+
|
|
|
+ FunctionResultCallback_1_0(FunctionType function, bool self_deleting,
|
|
|
+ P1 p1)
|
|
|
+ : function_(function), self_deleting_(self_deleting), p1_(p1) {}
|
|
|
+ ~FunctionResultCallback_1_0() {}
|
|
|
+
|
|
|
+ R Run() {
|
|
|
+ bool needs_delete = self_deleting_; // read in case callback deletes
|
|
|
+ R result = function_(p1_);
|
|
|
+ if (needs_delete) delete this;
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private:
|
|
|
+ FunctionType function_;
|
|
|
+ bool self_deleting_;
|
|
|
+ P1 p1_;
|
|
|
+};
|
|
|
+
|
|
|
template<typename R, typename Arg1>
|
|
|
class FunctionResultCallback_0_1 : public ResultCallback1<R, Arg1> {
|
|
|
public:
|
|
@@ -408,6 +464,33 @@ inline Closure* NewPermanentCallback(
|
|
|
object, method, false, arg1, arg2);
|
|
|
}
|
|
|
|
|
|
+// See ResultCallback
|
|
|
+template<typename R>
|
|
|
+inline ResultCallback<R>* NewCallback(R (*function)()) {
|
|
|
+ return new internal::FunctionResultCallback_0_0<R>(function, true);
|
|
|
+}
|
|
|
+
|
|
|
+// See ResultCallback
|
|
|
+template<typename R>
|
|
|
+inline ResultCallback<R>* NewPermanentCallback(R (*function)()) {
|
|
|
+ return new internal::FunctionResultCallback_0_0<R>(function, false);
|
|
|
+}
|
|
|
+
|
|
|
+// See ResultCallback
|
|
|
+template<typename R, typename P1>
|
|
|
+inline ResultCallback<R>* NewCallback(R (*function)(P1), P1 p1) {
|
|
|
+ return new internal::FunctionResultCallback_1_0<R, P1>(
|
|
|
+ function, true, p1);
|
|
|
+}
|
|
|
+
|
|
|
+// See ResultCallback
|
|
|
+template<typename R, typename P1>
|
|
|
+inline ResultCallback<R>* NewPermanentCallback(
|
|
|
+ R (*function)(P1), P1 p1) {
|
|
|
+ return new internal::FunctionResultCallback_1_0<R, P1>(
|
|
|
+ function, false, p1);
|
|
|
+}
|
|
|
+
|
|
|
// See ResultCallback1
|
|
|
template<typename R, typename A1>
|
|
|
inline ResultCallback1<R, A1>* NewCallback(R (*function)(A1)) {
|