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

Unified Diff: base/bind_internal.h

Issue 7015064: Support binding WeakPtr<> to methods with void return types. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix copyright Created 9 years, 7 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
Index: base/bind_internal.h
diff --git a/base/bind_internal.h b/base/bind_internal.h
index 606e2b098c5928d2bb28e32d81eb914a1b73c56d..fa58e10debaf0e08b0e7ea30cade43e32311e4eb 100644
--- a/base/bind_internal.h
+++ b/base/bind_internal.h
@@ -16,6 +16,7 @@
#include "base/callback_internal.h"
#include "base/template_util.h"
#include "build/build_config.h"
+#include "base/memory/weak_ptr.h"
willchan no longer on Chromium 2011/05/14 01:25:10 Again, sort alphabetically :)
awong 2011/05/16 20:01:27 Done.
#if defined(OS_WIN)
#include "base/bind_internal_win.h"
@@ -39,10 +40,21 @@ namespace internal {
// a calback.
// InvokerStorageN<> -- Provides storage for the bound parameters, and
// typedefs to the above.
+// IsWeakMethod<> -- Determines if we are binding a method to a WeakPtr<>.
//
// More details about the design of each class is included in a comment closer
// to their defition.
+
+// IsWeakMethod determines if we are binding a method to a WeakPtr<> for an
+// object. It is used to select an InvokerN that will no-op itself in the
+// event the WeakPtr<> for the target object is invalidated.
+template <bool IsMethod, typename T>
+struct IsWeakMethod : public false_type {};
+
+template <typename T>
+struct IsWeakMethod<true, WeakPtr<T> > : public true_type {};
+
// FunctionTraits<>
//
// The FunctionTraits<> template determines the type of function, and also
@@ -75,6 +87,8 @@ struct FunctionTraits<R(*)()> {
typedef R (*NormalizedSig)();
typedef false_type IsMethod;
+ typedef R Return;
+
};
// Method: Arity 0.
@@ -83,6 +97,8 @@ struct FunctionTraits<R(T::*)()> {
typedef R (T::*NormalizedSig)();
typedef true_type IsMethod;
+ typedef R Return;
+
// Target type for each bound parameter.
typedef T B1;
@@ -94,6 +110,8 @@ struct FunctionTraits<R(T::*)() const> {
typedef R (T::*NormalizedSig)();
typedef true_type IsMethod;
+ typedef R Return;
+
// Target type for each bound parameter.
typedef T B1;
@@ -104,6 +122,9 @@ template <typename R, typename X1>
struct FunctionTraits<R(*)(X1)> {
typedef R (*NormalizedSig)(X1);
typedef false_type IsMethod;
+
+ typedef R Return;
+
// Target type for each bound parameter.
typedef X1 B1;
@@ -115,6 +136,8 @@ struct FunctionTraits<R(T::*)(X1)> {
typedef R (T::*NormalizedSig)(X1);
typedef true_type IsMethod;
+ typedef R Return;
+
// Target type for each bound parameter.
typedef T B1;
typedef X1 B2;
@@ -127,6 +150,8 @@ struct FunctionTraits<R(T::*)(X1) const> {
typedef R (T::*NormalizedSig)(X1);
typedef true_type IsMethod;
+ typedef R Return;
+
// Target type for each bound parameter.
typedef T B1;
typedef X1 B2;
@@ -138,6 +163,9 @@ template <typename R, typename X1, typename X2>
struct FunctionTraits<R(*)(X1, X2)> {
typedef R (*NormalizedSig)(X1, X2);
typedef false_type IsMethod;
+
+ typedef R Return;
+
// Target type for each bound parameter.
typedef X1 B1;
typedef X2 B2;
@@ -150,6 +178,8 @@ struct FunctionTraits<R(T::*)(X1, X2)> {
typedef R (T::*NormalizedSig)(X1, X2);
typedef true_type IsMethod;
+ typedef R Return;
+
// Target type for each bound parameter.
typedef T B1;
typedef X1 B2;
@@ -163,6 +193,8 @@ struct FunctionTraits<R(T::*)(X1, X2) const> {
typedef R (T::*NormalizedSig)(X1, X2);
typedef true_type IsMethod;
+ typedef R Return;
+
// Target type for each bound parameter.
typedef T B1;
typedef X1 B2;
@@ -175,6 +207,9 @@ template <typename R, typename X1, typename X2, typename X3>
struct FunctionTraits<R(*)(X1, X2, X3)> {
typedef R (*NormalizedSig)(X1, X2, X3);
typedef false_type IsMethod;
+
+ typedef R Return;
+
// Target type for each bound parameter.
typedef X1 B1;
typedef X2 B2;
@@ -188,6 +223,8 @@ struct FunctionTraits<R(T::*)(X1, X2, X3)> {
typedef R (T::*NormalizedSig)(X1, X2, X3);
typedef true_type IsMethod;
+ typedef R Return;
+
// Target type for each bound parameter.
typedef T B1;
typedef X1 B2;
@@ -202,6 +239,8 @@ struct FunctionTraits<R(T::*)(X1, X2, X3) const> {
typedef R (T::*NormalizedSig)(X1, X2, X3);
typedef true_type IsMethod;
+ typedef R Return;
+
// Target type for each bound parameter.
typedef T B1;
typedef X1 B2;
@@ -215,6 +254,9 @@ template <typename R, typename X1, typename X2, typename X3, typename X4>
struct FunctionTraits<R(*)(X1, X2, X3, X4)> {
typedef R (*NormalizedSig)(X1, X2, X3, X4);
typedef false_type IsMethod;
+
+ typedef R Return;
+
// Target type for each bound parameter.
typedef X1 B1;
typedef X2 B2;
@@ -230,6 +272,8 @@ struct FunctionTraits<R(T::*)(X1, X2, X3, X4)> {
typedef R (T::*NormalizedSig)(X1, X2, X3, X4);
typedef true_type IsMethod;
+ typedef R Return;
+
// Target type for each bound parameter.
typedef T B1;
typedef X1 B2;
@@ -246,6 +290,8 @@ struct FunctionTraits<R(T::*)(X1, X2, X3, X4) const> {
typedef R (T::*NormalizedSig)(X1, X2, X3, X4);
typedef true_type IsMethod;
+ typedef R Return;
+
// Target type for each bound parameter.
typedef T B1;
typedef X1 B2;
@@ -261,6 +307,9 @@ template <typename R, typename X1, typename X2, typename X3, typename X4,
struct FunctionTraits<R(*)(X1, X2, X3, X4, X5)> {
typedef R (*NormalizedSig)(X1, X2, X3, X4, X5);
typedef false_type IsMethod;
+
+ typedef R Return;
+
// Target type for each bound parameter.
typedef X1 B1;
typedef X2 B2;
@@ -277,6 +326,8 @@ struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5)> {
typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5);
typedef true_type IsMethod;
+ typedef R Return;
+
// Target type for each bound parameter.
typedef T B1;
typedef X1 B2;
@@ -294,6 +345,8 @@ struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5) const> {
typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5);
typedef true_type IsMethod;
+ typedef R Return;
+
// Target type for each bound parameter.
typedef T B1;
typedef X1 B2;
@@ -310,6 +363,9 @@ template <typename R, typename X1, typename X2, typename X3, typename X4,
struct FunctionTraits<R(*)(X1, X2, X3, X4, X5, X6)> {
typedef R (*NormalizedSig)(X1, X2, X3, X4, X5, X6);
typedef false_type IsMethod;
+
+ typedef R Return;
+
// Target type for each bound parameter.
typedef X1 B1;
typedef X2 B2;
@@ -327,6 +383,8 @@ struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5, X6)> {
typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5, X6);
typedef true_type IsMethod;
+ typedef R Return;
+
// Target type for each bound parameter.
typedef T B1;
typedef X1 B2;
@@ -345,6 +403,8 @@ struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5, X6) const> {
typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5, X6);
typedef true_type IsMethod;
+ typedef R Return;
+
// Target type for each bound parameter.
typedef T B1;
typedef X1 B2;
@@ -376,12 +436,12 @@ struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5, X6) const> {
// templates classes in the system to only have as many specializations as
// the max arity of function we wish to support.
-template <typename StorageType, typename NormalizedSig>
+template <bool IsWeak, typename StorageType, typename NormalizedSig>
struct Invoker0;
// Function: Arity 0 -> 0.
template <typename StorageType, typename R>
-struct Invoker0<StorageType, R(*)()> {
+struct Invoker0<false, StorageType, R(*)()> {
static R DoInvoke(InvokerStorageBase* base) {
StorageType* invoker = static_cast<StorageType*>(base);
return invoker->f_();
@@ -390,7 +450,7 @@ struct Invoker0<StorageType, R(*)()> {
// Function: Arity 1 -> 1.
template <typename StorageType, typename R,typename X1>
-struct Invoker0<StorageType, R(*)(X1)> {
+struct Invoker0<false, StorageType, R(*)(X1)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X1>::ForwardType x1) {
StorageType* invoker = static_cast<StorageType*>(base);
@@ -400,7 +460,7 @@ struct Invoker0<StorageType, R(*)(X1)> {
// Function: Arity 2 -> 2.
template <typename StorageType, typename R,typename X1, typename X2>
-struct Invoker0<StorageType, R(*)(X1, X2)> {
+struct Invoker0<false, StorageType, R(*)(X1, X2)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X1>::ForwardType x1,
typename internal::ParamTraits<X2>::ForwardType x2) {
@@ -412,7 +472,7 @@ struct Invoker0<StorageType, R(*)(X1, X2)> {
// Function: Arity 3 -> 3.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3>
-struct Invoker0<StorageType, R(*)(X1, X2, X3)> {
+struct Invoker0<false, StorageType, R(*)(X1, X2, X3)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X1>::ForwardType x1,
typename internal::ParamTraits<X2>::ForwardType x2,
@@ -425,7 +485,7 @@ struct Invoker0<StorageType, R(*)(X1, X2, X3)> {
// Function: Arity 4 -> 4.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3, typename X4>
-struct Invoker0<StorageType, R(*)(X1, X2, X3, X4)> {
+struct Invoker0<false, StorageType, R(*)(X1, X2, X3, X4)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X1>::ForwardType x1,
typename internal::ParamTraits<X2>::ForwardType x2,
@@ -439,7 +499,7 @@ struct Invoker0<StorageType, R(*)(X1, X2, X3, X4)> {
// Function: Arity 5 -> 5.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3, typename X4, typename X5>
-struct Invoker0<StorageType, R(*)(X1, X2, X3, X4, X5)> {
+struct Invoker0<false, StorageType, R(*)(X1, X2, X3, X4, X5)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X1>::ForwardType x1,
typename internal::ParamTraits<X2>::ForwardType x2,
@@ -454,7 +514,7 @@ struct Invoker0<StorageType, R(*)(X1, X2, X3, X4, X5)> {
// Function: Arity 6 -> 6.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3, typename X4, typename X5, typename X6>
-struct Invoker0<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
+struct Invoker0<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X1>::ForwardType x1,
typename internal::ParamTraits<X2>::ForwardType x2,
@@ -467,12 +527,12 @@ struct Invoker0<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
}
};
-template <typename StorageType, typename NormalizedSig>
+template <bool IsWeak, typename StorageType, typename NormalizedSig>
struct Invoker1;
// Function: Arity 1 -> 0.
template <typename StorageType, typename R,typename X1>
-struct Invoker1<StorageType, R(*)(X1)> {
+struct Invoker1<false, StorageType, R(*)(X1)> {
static R DoInvoke(InvokerStorageBase* base) {
StorageType* invoker = static_cast<StorageType*>(base);
return invoker->f_(Unwrap(invoker->p1_));
@@ -481,16 +541,28 @@ struct Invoker1<StorageType, R(*)(X1)> {
// Method: Arity 0 -> 0.
template <typename StorageType, typename R, typename T>
-struct Invoker1<StorageType, R(T::*)()> {
+struct Invoker1<false, StorageType, R(T::*)()> {
static R DoInvoke(InvokerStorageBase* base) {
StorageType* invoker = static_cast<StorageType*>(base);
return (Unwrap(invoker->p1_)->*invoker->f_)();
}
};
+// WeakPtr Method: Arity 0 -> 0.
+template <typename StorageType, typename T>
+struct Invoker1<true, StorageType, void(T::*)()> {
+ static void DoInvoke(InvokerStorageBase* base) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
willchan no longer on Chromium 2011/05/14 01:25:10 It's non-obvious from reading the code that this i
awong 2011/05/16 20:01:27 Made a stab at it. I need to take another pass th
willchan no longer on Chromium 2011/05/16 22:01:26 OK.
+ return;
+ }
+ (invoker->p1_->*invoker->f_)();
+ }
+};
+
// Function: Arity 2 -> 1.
template <typename StorageType, typename R,typename X1, typename X2>
-struct Invoker1<StorageType, R(*)(X1, X2)> {
+struct Invoker1<false, StorageType, R(*)(X1, X2)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X2>::ForwardType x2) {
StorageType* invoker = static_cast<StorageType*>(base);
@@ -500,7 +572,7 @@ struct Invoker1<StorageType, R(*)(X1, X2)> {
// Method: Arity 1 -> 1.
template <typename StorageType, typename R, typename T, typename X1>
-struct Invoker1<StorageType, R(T::*)(X1)> {
+struct Invoker1<false, StorageType, R(T::*)(X1)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X1>::ForwardType x1) {
StorageType* invoker = static_cast<StorageType*>(base);
@@ -508,10 +580,23 @@ struct Invoker1<StorageType, R(T::*)(X1)> {
}
};
+// WeakPtr Method: Arity 1 -> 1.
+template <typename StorageType, typename T, typename X1>
+struct Invoker1<true, StorageType, void(T::*)(X1)> {
+ static void DoInvoke(InvokerStorageBase* base,
+ typename internal::ParamTraits<X1>::ForwardType x1) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(x1);
+ }
+};
+
// Function: Arity 3 -> 2.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3>
-struct Invoker1<StorageType, R(*)(X1, X2, X3)> {
+struct Invoker1<false, StorageType, R(*)(X1, X2, X3)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X2>::ForwardType x2,
typename internal::ParamTraits<X3>::ForwardType x3) {
@@ -523,7 +608,7 @@ struct Invoker1<StorageType, R(*)(X1, X2, X3)> {
// Method: Arity 2 -> 2.
template <typename StorageType, typename R, typename T, typename X1,
typename X2>
-struct Invoker1<StorageType, R(T::*)(X1, X2)> {
+struct Invoker1<false, StorageType, R(T::*)(X1, X2)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X1>::ForwardType x1,
typename internal::ParamTraits<X2>::ForwardType x2) {
@@ -532,10 +617,24 @@ struct Invoker1<StorageType, R(T::*)(X1, X2)> {
}
};
+// WeakPtr Method: Arity 2 -> 2.
+template <typename StorageType, typename T, typename X1, typename X2>
+struct Invoker1<true, StorageType, void(T::*)(X1, X2)> {
+ static void DoInvoke(InvokerStorageBase* base,
+ typename internal::ParamTraits<X1>::ForwardType x1,
+ typename internal::ParamTraits<X2>::ForwardType x2) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(x1, x2);
+ }
+};
+
// Function: Arity 4 -> 3.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3, typename X4>
-struct Invoker1<StorageType, R(*)(X1, X2, X3, X4)> {
+struct Invoker1<false, StorageType, R(*)(X1, X2, X3, X4)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X2>::ForwardType x2,
typename internal::ParamTraits<X3>::ForwardType x3,
@@ -548,7 +647,7 @@ struct Invoker1<StorageType, R(*)(X1, X2, X3, X4)> {
// Method: Arity 3 -> 3.
template <typename StorageType, typename R, typename T, typename X1,
typename X2, typename X3>
-struct Invoker1<StorageType, R(T::*)(X1, X2, X3)> {
+struct Invoker1<false, StorageType, R(T::*)(X1, X2, X3)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X1>::ForwardType x1,
typename internal::ParamTraits<X2>::ForwardType x2,
@@ -558,10 +657,26 @@ struct Invoker1<StorageType, R(T::*)(X1, X2, X3)> {
}
};
+// WeakPtr Method: Arity 3 -> 3.
+template <typename StorageType, typename T, typename X1, typename X2,
+ typename X3>
+struct Invoker1<true, StorageType, void(T::*)(X1, X2, X3)> {
+ static void DoInvoke(InvokerStorageBase* base,
+ typename internal::ParamTraits<X1>::ForwardType x1,
+ typename internal::ParamTraits<X2>::ForwardType x2,
+ typename internal::ParamTraits<X3>::ForwardType x3) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(x1, x2, x3);
+ }
+};
+
// Function: Arity 5 -> 4.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3, typename X4, typename X5>
-struct Invoker1<StorageType, R(*)(X1, X2, X3, X4, X5)> {
+struct Invoker1<false, StorageType, R(*)(X1, X2, X3, X4, X5)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X2>::ForwardType x2,
typename internal::ParamTraits<X3>::ForwardType x3,
@@ -575,7 +690,7 @@ struct Invoker1<StorageType, R(*)(X1, X2, X3, X4, X5)> {
// Method: Arity 4 -> 4.
template <typename StorageType, typename R, typename T, typename X1,
typename X2, typename X3, typename X4>
-struct Invoker1<StorageType, R(T::*)(X1, X2, X3, X4)> {
+struct Invoker1<false, StorageType, R(T::*)(X1, X2, X3, X4)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X1>::ForwardType x1,
typename internal::ParamTraits<X2>::ForwardType x2,
@@ -586,10 +701,27 @@ struct Invoker1<StorageType, R(T::*)(X1, X2, X3, X4)> {
}
};
+// WeakPtr Method: Arity 4 -> 4.
+template <typename StorageType, typename T, typename X1, typename X2,
+ typename X3, typename X4>
+struct Invoker1<true, StorageType, void(T::*)(X1, X2, X3, X4)> {
+ static void DoInvoke(InvokerStorageBase* base,
+ typename internal::ParamTraits<X1>::ForwardType x1,
+ typename internal::ParamTraits<X2>::ForwardType x2,
+ typename internal::ParamTraits<X3>::ForwardType x3,
+ typename internal::ParamTraits<X4>::ForwardType x4) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(x1, x2, x3, x4);
+ }
+};
+
// Function: Arity 6 -> 5.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3, typename X4, typename X5, typename X6>
-struct Invoker1<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
+struct Invoker1<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X2>::ForwardType x2,
typename internal::ParamTraits<X3>::ForwardType x3,
@@ -604,7 +736,7 @@ struct Invoker1<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
// Method: Arity 5 -> 5.
template <typename StorageType, typename R, typename T, typename X1,
typename X2, typename X3, typename X4, typename X5>
-struct Invoker1<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
+struct Invoker1<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X1>::ForwardType x1,
typename internal::ParamTraits<X2>::ForwardType x2,
@@ -616,12 +748,30 @@ struct Invoker1<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
}
};
-template <typename StorageType, typename NormalizedSig>
+// WeakPtr Method: Arity 5 -> 5.
+template <typename StorageType, typename T, typename X1, typename X2,
+ typename X3, typename X4, typename X5>
+struct Invoker1<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> {
+ static void DoInvoke(InvokerStorageBase* base,
+ typename internal::ParamTraits<X1>::ForwardType x1,
+ typename internal::ParamTraits<X2>::ForwardType x2,
+ typename internal::ParamTraits<X3>::ForwardType x3,
+ typename internal::ParamTraits<X4>::ForwardType x4,
+ typename internal::ParamTraits<X5>::ForwardType x5) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(x1, x2, x3, x4, x5);
+ }
+};
+
+template <bool IsWeak, typename StorageType, typename NormalizedSig>
struct Invoker2;
// Function: Arity 2 -> 0.
template <typename StorageType, typename R,typename X1, typename X2>
-struct Invoker2<StorageType, R(*)(X1, X2)> {
+struct Invoker2<false, StorageType, R(*)(X1, X2)> {
static R DoInvoke(InvokerStorageBase* base) {
StorageType* invoker = static_cast<StorageType*>(base);
return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_));
@@ -630,17 +780,29 @@ struct Invoker2<StorageType, R(*)(X1, X2)> {
// Method: Arity 1 -> 0.
template <typename StorageType, typename R, typename T, typename X1>
-struct Invoker2<StorageType, R(T::*)(X1)> {
+struct Invoker2<false, StorageType, R(T::*)(X1)> {
static R DoInvoke(InvokerStorageBase* base) {
StorageType* invoker = static_cast<StorageType*>(base);
return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_));
}
};
+// WeakPtr Method: Arity 1 -> 0.
+template <typename StorageType, typename T, typename X1>
+struct Invoker2<true, StorageType, void(T::*)(X1)> {
+ static void DoInvoke(InvokerStorageBase* base) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_));
+ }
+};
+
// Function: Arity 3 -> 1.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3>
-struct Invoker2<StorageType, R(*)(X1, X2, X3)> {
+struct Invoker2<false, StorageType, R(*)(X1, X2, X3)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X3>::ForwardType x3) {
StorageType* invoker = static_cast<StorageType*>(base);
@@ -651,7 +813,7 @@ struct Invoker2<StorageType, R(*)(X1, X2, X3)> {
// Method: Arity 2 -> 1.
template <typename StorageType, typename R, typename T, typename X1,
typename X2>
-struct Invoker2<StorageType, R(T::*)(X1, X2)> {
+struct Invoker2<false, StorageType, R(T::*)(X1, X2)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X2>::ForwardType x2) {
StorageType* invoker = static_cast<StorageType*>(base);
@@ -659,10 +821,23 @@ struct Invoker2<StorageType, R(T::*)(X1, X2)> {
}
};
+// WeakPtr Method: Arity 2 -> 1.
+template <typename StorageType, typename T, typename X1, typename X2>
+struct Invoker2<true, StorageType, void(T::*)(X1, X2)> {
+ static void DoInvoke(InvokerStorageBase* base,
+ typename internal::ParamTraits<X2>::ForwardType x2) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), x2);
+ }
+};
+
// Function: Arity 4 -> 2.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3, typename X4>
-struct Invoker2<StorageType, R(*)(X1, X2, X3, X4)> {
+struct Invoker2<false, StorageType, R(*)(X1, X2, X3, X4)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X3>::ForwardType x3,
typename internal::ParamTraits<X4>::ForwardType x4) {
@@ -674,7 +849,7 @@ struct Invoker2<StorageType, R(*)(X1, X2, X3, X4)> {
// Method: Arity 3 -> 2.
template <typename StorageType, typename R, typename T, typename X1,
typename X2, typename X3>
-struct Invoker2<StorageType, R(T::*)(X1, X2, X3)> {
+struct Invoker2<false, StorageType, R(T::*)(X1, X2, X3)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X2>::ForwardType x2,
typename internal::ParamTraits<X3>::ForwardType x3) {
@@ -683,10 +858,25 @@ struct Invoker2<StorageType, R(T::*)(X1, X2, X3)> {
}
};
+// WeakPtr Method: Arity 3 -> 2.
+template <typename StorageType, typename T, typename X1, typename X2,
+ typename X3>
+struct Invoker2<true, StorageType, void(T::*)(X1, X2, X3)> {
+ static void DoInvoke(InvokerStorageBase* base,
+ typename internal::ParamTraits<X2>::ForwardType x2,
+ typename internal::ParamTraits<X3>::ForwardType x3) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), x2, x3);
+ }
+};
+
// Function: Arity 5 -> 3.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3, typename X4, typename X5>
-struct Invoker2<StorageType, R(*)(X1, X2, X3, X4, X5)> {
+struct Invoker2<false, StorageType, R(*)(X1, X2, X3, X4, X5)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X3>::ForwardType x3,
typename internal::ParamTraits<X4>::ForwardType x4,
@@ -699,7 +889,7 @@ struct Invoker2<StorageType, R(*)(X1, X2, X3, X4, X5)> {
// Method: Arity 4 -> 3.
template <typename StorageType, typename R, typename T, typename X1,
typename X2, typename X3, typename X4>
-struct Invoker2<StorageType, R(T::*)(X1, X2, X3, X4)> {
+struct Invoker2<false, StorageType, R(T::*)(X1, X2, X3, X4)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X2>::ForwardType x2,
typename internal::ParamTraits<X3>::ForwardType x3,
@@ -710,10 +900,26 @@ struct Invoker2<StorageType, R(T::*)(X1, X2, X3, X4)> {
}
};
+// WeakPtr Method: Arity 4 -> 3.
+template <typename StorageType, typename T, typename X1, typename X2,
+ typename X3, typename X4>
+struct Invoker2<true, StorageType, void(T::*)(X1, X2, X3, X4)> {
+ static void DoInvoke(InvokerStorageBase* base,
+ typename internal::ParamTraits<X2>::ForwardType x2,
+ typename internal::ParamTraits<X3>::ForwardType x3,
+ typename internal::ParamTraits<X4>::ForwardType x4) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, x4);
+ }
+};
+
// Function: Arity 6 -> 4.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3, typename X4, typename X5, typename X6>
-struct Invoker2<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
+struct Invoker2<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X3>::ForwardType x3,
typename internal::ParamTraits<X4>::ForwardType x4,
@@ -728,7 +934,7 @@ struct Invoker2<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
// Method: Arity 5 -> 4.
template <typename StorageType, typename R, typename T, typename X1,
typename X2, typename X3, typename X4, typename X5>
-struct Invoker2<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
+struct Invoker2<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X2>::ForwardType x2,
typename internal::ParamTraits<X3>::ForwardType x3,
@@ -740,13 +946,30 @@ struct Invoker2<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
}
};
-template <typename StorageType, typename NormalizedSig>
+// WeakPtr Method: Arity 5 -> 4.
+template <typename StorageType, typename T, typename X1, typename X2,
+ typename X3, typename X4, typename X5>
+struct Invoker2<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> {
+ static void DoInvoke(InvokerStorageBase* base,
+ typename internal::ParamTraits<X2>::ForwardType x2,
+ typename internal::ParamTraits<X3>::ForwardType x3,
+ typename internal::ParamTraits<X4>::ForwardType x4,
+ typename internal::ParamTraits<X5>::ForwardType x5) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, x4, x5);
+ }
+};
+
+template <bool IsWeak, typename StorageType, typename NormalizedSig>
struct Invoker3;
// Function: Arity 3 -> 0.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3>
-struct Invoker3<StorageType, R(*)(X1, X2, X3)> {
+struct Invoker3<false, StorageType, R(*)(X1, X2, X3)> {
static R DoInvoke(InvokerStorageBase* base) {
StorageType* invoker = static_cast<StorageType*>(base);
return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
@@ -757,7 +980,7 @@ struct Invoker3<StorageType, R(*)(X1, X2, X3)> {
// Method: Arity 2 -> 0.
template <typename StorageType, typename R, typename T, typename X1,
typename X2>
-struct Invoker3<StorageType, R(T::*)(X1, X2)> {
+struct Invoker3<false, StorageType, R(T::*)(X1, X2)> {
static R DoInvoke(InvokerStorageBase* base) {
StorageType* invoker = static_cast<StorageType*>(base);
return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
@@ -765,10 +988,22 @@ struct Invoker3<StorageType, R(T::*)(X1, X2)> {
}
};
+// WeakPtr Method: Arity 2 -> 0.
+template <typename StorageType, typename T, typename X1, typename X2>
+struct Invoker3<true, StorageType, void(T::*)(X1, X2)> {
+ static void DoInvoke(InvokerStorageBase* base) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_));
+ }
+};
+
// Function: Arity 4 -> 1.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3, typename X4>
-struct Invoker3<StorageType, R(*)(X1, X2, X3, X4)> {
+struct Invoker3<false, StorageType, R(*)(X1, X2, X3, X4)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X4>::ForwardType x4) {
StorageType* invoker = static_cast<StorageType*>(base);
@@ -780,7 +1015,7 @@ struct Invoker3<StorageType, R(*)(X1, X2, X3, X4)> {
// Method: Arity 3 -> 1.
template <typename StorageType, typename R, typename T, typename X1,
typename X2, typename X3>
-struct Invoker3<StorageType, R(T::*)(X1, X2, X3)> {
+struct Invoker3<false, StorageType, R(T::*)(X1, X2, X3)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X3>::ForwardType x3) {
StorageType* invoker = static_cast<StorageType*>(base);
@@ -789,10 +1024,25 @@ struct Invoker3<StorageType, R(T::*)(X1, X2, X3)> {
}
};
+// WeakPtr Method: Arity 3 -> 1.
+template <typename StorageType, typename T, typename X1, typename X2,
+ typename X3>
+struct Invoker3<true, StorageType, void(T::*)(X1, X2, X3)> {
+ static void DoInvoke(InvokerStorageBase* base,
+ typename internal::ParamTraits<X3>::ForwardType x3) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
+ x3);
+ }
+};
+
// Function: Arity 5 -> 2.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3, typename X4, typename X5>
-struct Invoker3<StorageType, R(*)(X1, X2, X3, X4, X5)> {
+struct Invoker3<false, StorageType, R(*)(X1, X2, X3, X4, X5)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X4>::ForwardType x4,
typename internal::ParamTraits<X5>::ForwardType x5) {
@@ -805,7 +1055,7 @@ struct Invoker3<StorageType, R(*)(X1, X2, X3, X4, X5)> {
// Method: Arity 4 -> 2.
template <typename StorageType, typename R, typename T, typename X1,
typename X2, typename X3, typename X4>
-struct Invoker3<StorageType, R(T::*)(X1, X2, X3, X4)> {
+struct Invoker3<false, StorageType, R(T::*)(X1, X2, X3, X4)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X3>::ForwardType x3,
typename internal::ParamTraits<X4>::ForwardType x4) {
@@ -815,10 +1065,26 @@ struct Invoker3<StorageType, R(T::*)(X1, X2, X3, X4)> {
}
};
+// WeakPtr Method: Arity 4 -> 2.
+template <typename StorageType, typename T, typename X1, typename X2,
+ typename X3, typename X4>
+struct Invoker3<true, StorageType, void(T::*)(X1, X2, X3, X4)> {
+ static void DoInvoke(InvokerStorageBase* base,
+ typename internal::ParamTraits<X3>::ForwardType x3,
+ typename internal::ParamTraits<X4>::ForwardType x4) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
+ x3, x4);
+ }
+};
+
// Function: Arity 6 -> 3.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3, typename X4, typename X5, typename X6>
-struct Invoker3<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
+struct Invoker3<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X4>::ForwardType x4,
typename internal::ParamTraits<X5>::ForwardType x5,
@@ -832,7 +1098,7 @@ struct Invoker3<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
// Method: Arity 5 -> 3.
template <typename StorageType, typename R, typename T, typename X1,
typename X2, typename X3, typename X4, typename X5>
-struct Invoker3<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
+struct Invoker3<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X3>::ForwardType x3,
typename internal::ParamTraits<X4>::ForwardType x4,
@@ -843,13 +1109,30 @@ struct Invoker3<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
}
};
-template <typename StorageType, typename NormalizedSig>
+// WeakPtr Method: Arity 5 -> 3.
+template <typename StorageType, typename T, typename X1, typename X2,
+ typename X3, typename X4, typename X5>
+struct Invoker3<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> {
+ static void DoInvoke(InvokerStorageBase* base,
+ typename internal::ParamTraits<X3>::ForwardType x3,
+ typename internal::ParamTraits<X4>::ForwardType x4,
+ typename internal::ParamTraits<X5>::ForwardType x5) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
+ x3, x4, x5);
+ }
+};
+
+template <bool IsWeak, typename StorageType, typename NormalizedSig>
struct Invoker4;
// Function: Arity 4 -> 0.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3, typename X4>
-struct Invoker4<StorageType, R(*)(X1, X2, X3, X4)> {
+struct Invoker4<false, StorageType, R(*)(X1, X2, X3, X4)> {
static R DoInvoke(InvokerStorageBase* base) {
StorageType* invoker = static_cast<StorageType*>(base);
return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
@@ -860,7 +1143,7 @@ struct Invoker4<StorageType, R(*)(X1, X2, X3, X4)> {
// Method: Arity 3 -> 0.
template <typename StorageType, typename R, typename T, typename X1,
typename X2, typename X3>
-struct Invoker4<StorageType, R(T::*)(X1, X2, X3)> {
+struct Invoker4<false, StorageType, R(T::*)(X1, X2, X3)> {
static R DoInvoke(InvokerStorageBase* base) {
StorageType* invoker = static_cast<StorageType*>(base);
return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
@@ -868,10 +1151,24 @@ struct Invoker4<StorageType, R(T::*)(X1, X2, X3)> {
}
};
+// WeakPtr Method: Arity 3 -> 0.
+template <typename StorageType, typename T, typename X1, typename X2,
+ typename X3>
+struct Invoker4<true, StorageType, void(T::*)(X1, X2, X3)> {
+ static void DoInvoke(InvokerStorageBase* base) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
+ Unwrap(invoker->p4_));
+ }
+};
+
// Function: Arity 5 -> 1.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3, typename X4, typename X5>
-struct Invoker4<StorageType, R(*)(X1, X2, X3, X4, X5)> {
+struct Invoker4<false, StorageType, R(*)(X1, X2, X3, X4, X5)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X5>::ForwardType x5) {
StorageType* invoker = static_cast<StorageType*>(base);
@@ -883,7 +1180,7 @@ struct Invoker4<StorageType, R(*)(X1, X2, X3, X4, X5)> {
// Method: Arity 4 -> 1.
template <typename StorageType, typename R, typename T, typename X1,
typename X2, typename X3, typename X4>
-struct Invoker4<StorageType, R(T::*)(X1, X2, X3, X4)> {
+struct Invoker4<false, StorageType, R(T::*)(X1, X2, X3, X4)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X4>::ForwardType x4) {
StorageType* invoker = static_cast<StorageType*>(base);
@@ -892,10 +1189,25 @@ struct Invoker4<StorageType, R(T::*)(X1, X2, X3, X4)> {
}
};
+// WeakPtr Method: Arity 4 -> 1.
+template <typename StorageType, typename T, typename X1, typename X2,
+ typename X3, typename X4>
+struct Invoker4<true, StorageType, void(T::*)(X1, X2, X3, X4)> {
+ static void DoInvoke(InvokerStorageBase* base,
+ typename internal::ParamTraits<X4>::ForwardType x4) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
+ Unwrap(invoker->p4_), x4);
+ }
+};
+
// Function: Arity 6 -> 2.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3, typename X4, typename X5, typename X6>
-struct Invoker4<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
+struct Invoker4<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X5>::ForwardType x5,
typename internal::ParamTraits<X6>::ForwardType x6) {
@@ -908,7 +1220,7 @@ struct Invoker4<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
// Method: Arity 5 -> 2.
template <typename StorageType, typename R, typename T, typename X1,
typename X2, typename X3, typename X4, typename X5>
-struct Invoker4<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
+struct Invoker4<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X4>::ForwardType x4,
typename internal::ParamTraits<X5>::ForwardType x5) {
@@ -918,13 +1230,29 @@ struct Invoker4<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
}
};
-template <typename StorageType, typename NormalizedSig>
+// WeakPtr Method: Arity 5 -> 2.
+template <typename StorageType, typename T, typename X1, typename X2,
+ typename X3, typename X4, typename X5>
+struct Invoker4<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> {
+ static void DoInvoke(InvokerStorageBase* base,
+ typename internal::ParamTraits<X4>::ForwardType x4,
+ typename internal::ParamTraits<X5>::ForwardType x5) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
+ Unwrap(invoker->p4_), x4, x5);
+ }
+};
+
+template <bool IsWeak, typename StorageType, typename NormalizedSig>
struct Invoker5;
// Function: Arity 5 -> 0.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3, typename X4, typename X5>
-struct Invoker5<StorageType, R(*)(X1, X2, X3, X4, X5)> {
+struct Invoker5<false, StorageType, R(*)(X1, X2, X3, X4, X5)> {
static R DoInvoke(InvokerStorageBase* base) {
StorageType* invoker = static_cast<StorageType*>(base);
return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
@@ -935,7 +1263,7 @@ struct Invoker5<StorageType, R(*)(X1, X2, X3, X4, X5)> {
// Method: Arity 4 -> 0.
template <typename StorageType, typename R, typename T, typename X1,
typename X2, typename X3, typename X4>
-struct Invoker5<StorageType, R(T::*)(X1, X2, X3, X4)> {
+struct Invoker5<false, StorageType, R(T::*)(X1, X2, X3, X4)> {
static R DoInvoke(InvokerStorageBase* base) {
StorageType* invoker = static_cast<StorageType*>(base);
return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
@@ -943,10 +1271,24 @@ struct Invoker5<StorageType, R(T::*)(X1, X2, X3, X4)> {
}
};
+// WeakPtr Method: Arity 4 -> 0.
+template <typename StorageType, typename T, typename X1, typename X2,
+ typename X3, typename X4>
+struct Invoker5<true, StorageType, void(T::*)(X1, X2, X3, X4)> {
+ static void DoInvoke(InvokerStorageBase* base) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
+ Unwrap(invoker->p4_), Unwrap(invoker->p5_));
+ }
+};
+
// Function: Arity 6 -> 1.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3, typename X4, typename X5, typename X6>
-struct Invoker5<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
+struct Invoker5<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X6>::ForwardType x6) {
StorageType* invoker = static_cast<StorageType*>(base);
@@ -958,7 +1300,7 @@ struct Invoker5<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
// Method: Arity 5 -> 1.
template <typename StorageType, typename R, typename T, typename X1,
typename X2, typename X3, typename X4, typename X5>
-struct Invoker5<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
+struct Invoker5<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
static R DoInvoke(InvokerStorageBase* base,
typename internal::ParamTraits<X5>::ForwardType x5) {
StorageType* invoker = static_cast<StorageType*>(base);
@@ -967,13 +1309,28 @@ struct Invoker5<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
}
};
-template <typename StorageType, typename NormalizedSig>
+// WeakPtr Method: Arity 5 -> 1.
+template <typename StorageType, typename T, typename X1, typename X2,
+ typename X3, typename X4, typename X5>
+struct Invoker5<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> {
+ static void DoInvoke(InvokerStorageBase* base,
+ typename internal::ParamTraits<X5>::ForwardType x5) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
+ Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5);
+ }
+};
+
+template <bool IsWeak, typename StorageType, typename NormalizedSig>
struct Invoker6;
// Function: Arity 6 -> 0.
template <typename StorageType, typename R,typename X1, typename X2,
typename X3, typename X4, typename X5, typename X6>
-struct Invoker6<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
+struct Invoker6<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
static R DoInvoke(InvokerStorageBase* base) {
StorageType* invoker = static_cast<StorageType*>(base);
return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
@@ -985,7 +1342,7 @@ struct Invoker6<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
// Method: Arity 5 -> 0.
template <typename StorageType, typename R, typename T, typename X1,
typename X2, typename X3, typename X4, typename X5>
-struct Invoker6<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
+struct Invoker6<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
static R DoInvoke(InvokerStorageBase* base) {
StorageType* invoker = static_cast<StorageType*>(base);
return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
@@ -994,6 +1351,19 @@ struct Invoker6<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
}
};
+// WeakPtr Method: Arity 5 -> 0.
+template <typename StorageType, typename T, typename X1, typename X2,
+ typename X3, typename X4, typename X5>
+struct Invoker6<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> {
+ static void DoInvoke(InvokerStorageBase* base) {
+ StorageType* invoker = static_cast<StorageType*>(base);
+ if (!invoker->p1_.get()) {
+ return;
+ }
+ (invoker->p1_->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
+ Unwrap(invoker->p4_), Unwrap(invoker->p5_), Unwrap(invoker->p6_));
+ }
+};
// InvokerStorageN<>
//
@@ -1014,8 +1384,9 @@ class InvokerStorage0 : public InvokerStorageBase {
public:
typedef InvokerStorage0 StorageType;
typedef FunctionTraits<Sig> TargetTraits;
- typedef Invoker0<StorageType, typename TargetTraits::NormalizedSig> Invoker;
typedef typename TargetTraits::IsMethod IsMethod;
+ typedef Invoker0<false, StorageType,
+ typename TargetTraits::NormalizedSig> Invoker;
@@ -1033,8 +1404,12 @@ class InvokerStorage1 : public InvokerStorageBase {
public:
typedef InvokerStorage1 StorageType;
typedef FunctionTraits<Sig> TargetTraits;
- typedef Invoker1<StorageType, typename TargetTraits::NormalizedSig> Invoker;
typedef typename TargetTraits::IsMethod IsMethod;
+ typedef Invoker1<IsWeakMethod<IsMethod::value, P1>::value, StorageType,
+ typename TargetTraits::NormalizedSig> Invoker;
+ COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) ||
+ is_void<typename TargetTraits::Return>::value,
+ weak_ptrs_can_only_bind_to_methods_without_return_values);
// For methods, we need to be careful for parameter 1. We skip the
// scoped_refptr check because the binder itself takes care of this. We also
@@ -1073,8 +1448,12 @@ class InvokerStorage2 : public InvokerStorageBase {
public:
typedef InvokerStorage2 StorageType;
typedef FunctionTraits<Sig> TargetTraits;
- typedef Invoker2<StorageType, typename TargetTraits::NormalizedSig> Invoker;
typedef typename TargetTraits::IsMethod IsMethod;
+ typedef Invoker2<IsWeakMethod<IsMethod::value, P1>::value, StorageType,
+ typename TargetTraits::NormalizedSig> Invoker;
+ COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) ||
+ is_void<typename TargetTraits::Return>::value,
+ weak_ptrs_can_only_bind_to_methods_without_return_values);
// For methods, we need to be careful for parameter 1. We skip the
// scoped_refptr check because the binder itself takes care of this. We also
@@ -1118,8 +1497,12 @@ class InvokerStorage3 : public InvokerStorageBase {
public:
typedef InvokerStorage3 StorageType;
typedef FunctionTraits<Sig> TargetTraits;
- typedef Invoker3<StorageType, typename TargetTraits::NormalizedSig> Invoker;
typedef typename TargetTraits::IsMethod IsMethod;
+ typedef Invoker3<IsWeakMethod<IsMethod::value, P1>::value, StorageType,
+ typename TargetTraits::NormalizedSig> Invoker;
+ COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) ||
+ is_void<typename TargetTraits::Return>::value,
+ weak_ptrs_can_only_bind_to_methods_without_return_values);
// For methods, we need to be careful for parameter 1. We skip the
// scoped_refptr check because the binder itself takes care of this. We also
@@ -1168,8 +1551,12 @@ class InvokerStorage4 : public InvokerStorageBase {
public:
typedef InvokerStorage4 StorageType;
typedef FunctionTraits<Sig> TargetTraits;
- typedef Invoker4<StorageType, typename TargetTraits::NormalizedSig> Invoker;
typedef typename TargetTraits::IsMethod IsMethod;
+ typedef Invoker4<IsWeakMethod<IsMethod::value, P1>::value, StorageType,
+ typename TargetTraits::NormalizedSig> Invoker;
+ COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) ||
+ is_void<typename TargetTraits::Return>::value,
+ weak_ptrs_can_only_bind_to_methods_without_return_values);
// For methods, we need to be careful for parameter 1. We skip the
// scoped_refptr check because the binder itself takes care of this. We also
@@ -1224,8 +1611,12 @@ class InvokerStorage5 : public InvokerStorageBase {
public:
typedef InvokerStorage5 StorageType;
typedef FunctionTraits<Sig> TargetTraits;
- typedef Invoker5<StorageType, typename TargetTraits::NormalizedSig> Invoker;
typedef typename TargetTraits::IsMethod IsMethod;
+ typedef Invoker5<IsWeakMethod<IsMethod::value, P1>::value, StorageType,
+ typename TargetTraits::NormalizedSig> Invoker;
+ COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) ||
+ is_void<typename TargetTraits::Return>::value,
+ weak_ptrs_can_only_bind_to_methods_without_return_values);
// For methods, we need to be careful for parameter 1. We skip the
// scoped_refptr check because the binder itself takes care of this. We also
@@ -1286,8 +1677,12 @@ class InvokerStorage6 : public InvokerStorageBase {
public:
typedef InvokerStorage6 StorageType;
typedef FunctionTraits<Sig> TargetTraits;
- typedef Invoker6<StorageType, typename TargetTraits::NormalizedSig> Invoker;
typedef typename TargetTraits::IsMethod IsMethod;
+ typedef Invoker6<IsWeakMethod<IsMethod::value, P1>::value, StorageType,
+ typename TargetTraits::NormalizedSig> Invoker;
+ COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) ||
+ is_void<typename TargetTraits::Return>::value,
+ weak_ptrs_can_only_bind_to_methods_without_return_values);
// For methods, we need to be careful for parameter 1. We skip the
// scoped_refptr check because the binder itself takes care of this. We also
« base/bind_helpers.h ('K') | « base/bind_helpers.h ('k') | base/bind_internal.h.pump » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698