Index: base/callback.h |
diff --git a/base/callback.h b/base/callback.h |
index ab8f7bb8a711d39f85069b3fdcbf65a09948ba44..d8da740d21184d9133b6997d850f25490fdb6d00 100644 |
--- a/base/callback.h |
+++ b/base/callback.h |
@@ -39,6 +39,10 @@ |
// The reason to pass via a const-reference is to avoid unnecessary |
// AddRef/Release pairs to the internal state. |
// |
+// If a Callback variable must be empty during the Run() of a previous value of |
+// that variable, use ResetAndRun(). E.g. if MyClass has a member variable |
+// Callback which gets set as a side-effect of Run()'ing the Callback (to |
+// something else), ResetAndRun() can be handy. |
// |
// EXAMPLE USAGE: |
// |
@@ -272,6 +276,13 @@ class Callback<R(void)> : public internal::CallbackBase { |
return f(bind_state_.get()); |
} |
+ |
+ R ResetAndRun() { |
+ Callback<RunType> tmp(*this); |
+ Reset(); |
+ tmp.Run(); |
+ } |
+ |
private: |
typedef R(*PolymorphicInvoke)( |
internal::BindStateBase*); |
@@ -311,6 +322,13 @@ class Callback<R(A1)> : public internal::CallbackBase { |
return f(bind_state_.get(), internal::CallbackForward(a1)); |
} |
+ |
+ R ResetAndRun(typename internal::CallbackParamTraits<A1>::ForwardType a1) { |
+ Callback<RunType> tmp(*this); |
+ Reset(); |
+ tmp.Run(internal::CallbackForward(a1)); |
+ } |
+ |
private: |
typedef R(*PolymorphicInvoke)( |
internal::BindStateBase*, |
@@ -353,6 +371,15 @@ class Callback<R(A1, A2)> : public internal::CallbackBase { |
internal::CallbackForward(a2)); |
} |
+ |
+ R ResetAndRun(typename internal::CallbackParamTraits<A1>::ForwardType a1, |
+ typename internal::CallbackParamTraits<A2>::ForwardType a2) { |
+ Callback<RunType> tmp(*this); |
+ Reset(); |
+ tmp.Run(internal::CallbackForward(a1), |
+ internal::CallbackForward(a2)); |
+ } |
+ |
private: |
typedef R(*PolymorphicInvoke)( |
internal::BindStateBase*, |
@@ -398,6 +425,17 @@ class Callback<R(A1, A2, A3)> : public internal::CallbackBase { |
internal::CallbackForward(a3)); |
} |
+ |
+ R ResetAndRun(typename internal::CallbackParamTraits<A1>::ForwardType a1, |
+ typename internal::CallbackParamTraits<A2>::ForwardType a2, |
+ typename internal::CallbackParamTraits<A3>::ForwardType a3) { |
+ Callback<RunType> tmp(*this); |
+ Reset(); |
+ tmp.Run(internal::CallbackForward(a1), |
+ internal::CallbackForward(a2), |
+ internal::CallbackForward(a3)); |
+ } |
+ |
private: |
typedef R(*PolymorphicInvoke)( |
internal::BindStateBase*, |
@@ -446,6 +484,19 @@ class Callback<R(A1, A2, A3, A4)> : public internal::CallbackBase { |
internal::CallbackForward(a4)); |
} |
+ |
+ R ResetAndRun(typename internal::CallbackParamTraits<A1>::ForwardType a1, |
+ typename internal::CallbackParamTraits<A2>::ForwardType a2, |
+ typename internal::CallbackParamTraits<A3>::ForwardType a3, |
+ typename internal::CallbackParamTraits<A4>::ForwardType a4) { |
+ Callback<RunType> tmp(*this); |
+ Reset(); |
+ tmp.Run(internal::CallbackForward(a1), |
+ internal::CallbackForward(a2), |
+ internal::CallbackForward(a3), |
+ internal::CallbackForward(a4)); |
+ } |
+ |
private: |
typedef R(*PolymorphicInvoke)( |
internal::BindStateBase*, |
@@ -498,6 +549,21 @@ class Callback<R(A1, A2, A3, A4, A5)> : public internal::CallbackBase { |
internal::CallbackForward(a5)); |
} |
+ |
+ R ResetAndRun(typename internal::CallbackParamTraits<A1>::ForwardType a1, |
+ typename internal::CallbackParamTraits<A2>::ForwardType a2, |
+ typename internal::CallbackParamTraits<A3>::ForwardType a3, |
+ typename internal::CallbackParamTraits<A4>::ForwardType a4, |
+ typename internal::CallbackParamTraits<A5>::ForwardType a5) { |
+ Callback<RunType> tmp(*this); |
+ Reset(); |
+ tmp.Run(internal::CallbackForward(a1), |
+ internal::CallbackForward(a2), |
+ internal::CallbackForward(a3), |
+ internal::CallbackForward(a4), |
+ internal::CallbackForward(a5)); |
+ } |
+ |
private: |
typedef R(*PolymorphicInvoke)( |
internal::BindStateBase*, |
@@ -553,6 +619,23 @@ class Callback<R(A1, A2, A3, A4, A5, A6)> : public internal::CallbackBase { |
internal::CallbackForward(a6)); |
} |
+ |
+ R ResetAndRun(typename internal::CallbackParamTraits<A1>::ForwardType a1, |
+ typename internal::CallbackParamTraits<A2>::ForwardType a2, |
+ typename internal::CallbackParamTraits<A3>::ForwardType a3, |
+ typename internal::CallbackParamTraits<A4>::ForwardType a4, |
+ typename internal::CallbackParamTraits<A5>::ForwardType a5, |
+ typename internal::CallbackParamTraits<A6>::ForwardType a6) { |
+ Callback<RunType> tmp(*this); |
+ Reset(); |
+ tmp.Run(internal::CallbackForward(a1), |
+ internal::CallbackForward(a2), |
+ internal::CallbackForward(a3), |
+ internal::CallbackForward(a4), |
+ internal::CallbackForward(a5), |
+ internal::CallbackForward(a6)); |
+ } |
+ |
private: |
typedef R(*PolymorphicInvoke)( |
internal::BindStateBase*, |
@@ -611,6 +694,25 @@ class Callback<R(A1, A2, A3, A4, A5, A6, A7)> : public internal::CallbackBase { |
internal::CallbackForward(a7)); |
} |
+ |
+ R ResetAndRun(typename internal::CallbackParamTraits<A1>::ForwardType a1, |
+ typename internal::CallbackParamTraits<A2>::ForwardType a2, |
+ typename internal::CallbackParamTraits<A3>::ForwardType a3, |
+ typename internal::CallbackParamTraits<A4>::ForwardType a4, |
+ typename internal::CallbackParamTraits<A5>::ForwardType a5, |
+ typename internal::CallbackParamTraits<A6>::ForwardType a6, |
+ typename internal::CallbackParamTraits<A7>::ForwardType a7) { |
+ Callback<RunType> tmp(*this); |
+ Reset(); |
+ tmp.Run(internal::CallbackForward(a1), |
+ internal::CallbackForward(a2), |
+ internal::CallbackForward(a3), |
+ internal::CallbackForward(a4), |
+ internal::CallbackForward(a5), |
+ internal::CallbackForward(a6), |
+ internal::CallbackForward(a7)); |
+ } |
+ |
private: |
typedef R(*PolymorphicInvoke)( |
internal::BindStateBase*, |