Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2598)

Unified Diff: base/callback.h

Issue 9717021: Make Callback::Reset() return a copy to support use-cases where Run() ends up modifying |*this|. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | base/callback.h.pump » ('j') | base/callback_unittest.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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*,
« no previous file with comments | « no previous file | base/callback.h.pump » ('j') | base/callback_unittest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698