Index: third_party/protobuf/src/google/protobuf/stubs/callback.h |
diff --git a/third_party/protobuf/src/google/protobuf/stubs/callback.h b/third_party/protobuf/src/google/protobuf/stubs/callback.h |
index 6da530d3e6f14aedefba6e39c566e979038a8171..87271c5eb8f58692cc967c9dbdc3c9814810c6c6 100644 |
--- a/third_party/protobuf/src/google/protobuf/stubs/callback.h |
+++ b/third_party/protobuf/src/google/protobuf/stubs/callback.h |
@@ -78,6 +78,18 @@ class LIBPROTOBUF_EXPORT Closure { |
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Closure); |
}; |
+template<typename R> |
+class 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)) { |