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 |