diff options
Diffstat (limited to 'src/google/protobuf/stubs/callback.h')
-rw-r--r-- | src/google/protobuf/stubs/callback.h | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/src/google/protobuf/stubs/callback.h b/src/google/protobuf/stubs/callback.h index bbd507a8..6888f136 100644 --- a/src/google/protobuf/stubs/callback.h +++ b/src/google/protobuf/stubs/callback.h @@ -1,8 +1,9 @@ #ifndef GOOGLE_PROTOBUF_STUBS_CALLBACK_H_ #define GOOGLE_PROTOBUF_STUBS_CALLBACK_H_ +#include <type_traits> + #include <google/protobuf/stubs/macros.h> -#include <google/protobuf/stubs/type_traits.h> // =================================================================== // emulates google3/base/callback.h @@ -342,10 +343,33 @@ class FunctionResultCallback_1_1 : public ResultCallback1<R, A1> { template <typename T> struct InternalConstRef { - typedef typename remove_reference<T>::type base_type; + typedef typename std::remove_reference<T>::type base_type; typedef const base_type& type; }; +template<typename R, typename T> +class MethodResultCallback_0_0 : public ResultCallback<R> { + public: + typedef R (T::*MethodType)(); + MethodResultCallback_0_0(T* object, MethodType method, bool self_deleting) + : object_(object), + method_(method), + self_deleting_(self_deleting) {} + ~MethodResultCallback_0_0() {} + + R Run() { + bool needs_delete = self_deleting_; + R result = (object_->*method_)(); + if (needs_delete) delete this; + return result; + } + + private: + T* object_; + MethodType method_; + bool self_deleting_; +}; + template <typename R, typename T, typename P1, typename P2, typename P3, typename P4, typename P5, typename A1, typename A2> class MethodResultCallback_5_2 : public ResultCallback2<R, A1, A2> { @@ -374,11 +398,11 @@ class MethodResultCallback_5_2 : public ResultCallback2<R, A1, A2> { T* object_; MethodType method_; bool self_deleting_; - typename remove_reference<P1>::type p1_; - typename remove_reference<P2>::type p2_; - typename remove_reference<P3>::type p3_; - typename remove_reference<P4>::type p4_; - typename remove_reference<P5>::type p5_; + typename std::remove_reference<P1>::type p1_; + typename std::remove_reference<P2>::type p2_; + typename std::remove_reference<P3>::type p3_; + typename std::remove_reference<P4>::type p4_; + typename std::remove_reference<P5>::type p5_; }; } // namespace internal @@ -520,6 +544,13 @@ inline ResultCallback1<R, A1>* NewPermanentCallback( function, false, p1); } +// See MethodResultCallback_0_0 +template <typename R, typename T1, typename T2> +inline ResultCallback<R>* NewPermanentCallback( + T1* object, R (T2::*function)()) { + return new internal::MethodResultCallback_0_0<R, T1>(object, function, false); +} + // See MethodResultCallback_5_2 template <typename R, typename T, typename P1, typename P2, typename P3, typename P4, typename P5, typename A1, typename A2> |