Index: base/bind_internal.h |
diff --git a/base/bind_internal.h b/base/bind_internal.h |
index 7beba516f6f2407d42517dbecb06fbabf6afdff9..3e0c48b98f9fa77273848b7164bb3cdac792dac1 100644 |
--- a/base/bind_internal.h |
+++ b/base/bind_internal.h |
@@ -36,15 +36,15 @@ namespace internal { |
// The templates below handle the determination of each of these dimensions. |
// In brief: |
// |
-// FunctionTraits<> -- Provides a normalied signature, and other traits. |
+// FunctionTraits<> -- Provides a normalized signature, and other traits. |
// InvokerN<> -- Provides a DoInvoke() function that actually executes |
-// a calback. |
+// a callback. |
// 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. |
+// to their definition. |
// IsWeakMethod determines if we are binding a method to a WeakPtr<> for an |
@@ -61,7 +61,7 @@ struct IsWeakMethod<true, WeakPtr<T> > : public true_type {}; |
// The FunctionTraits<> template determines the type of function, and also |
// creates a NormalizedType used to select the InvokerN classes. It turns out |
// that syntactically, you only really have 2 variations when invoking a |
-// funciton pointer: normal, and method. One is invoked func_ptr(arg1). The |
+// function pointer: normal, and method. One is invoked func_ptr(arg1). The |
// other is invoked (*obj_->method_ptr(arg1)). |
// |
// However, in the type system, there are many more distinctions. In standard |
@@ -71,7 +71,7 @@ struct IsWeakMethod<true, WeakPtr<T> > : public true_type {}; |
// a normalized signature. |
// |
// Having a NormalizedSignature signature, reduces the combinatoric |
-// complexity of defintions for the InvokerN<> later. Even though there are |
+// complexity of definitions for the InvokerN<> later. Even though there are |
// only 2 syntactic variations on invoking a function, without normalizing the |
// signature, there would need to be one specialization of InvokerN for each |
// unique (function_type, bound_arg, unbound_args) tuple in order to match all |
@@ -417,6 +417,68 @@ struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5, X6) const> { |
}; |
+// Function: Arity 7. |
+template <typename R, typename X1, typename X2, typename X3, typename X4, |
+ typename X5, typename X6, typename X7> |
+struct FunctionTraits<R(*)(X1, X2, X3, X4, X5, X6, X7)> { |
+ typedef R (*NormalizedSig)(X1, X2, X3, X4, X5, X6, X7); |
+ typedef false_type IsMethod; |
+ |
+ typedef R Return; |
+ |
+ // Target type for each bound parameter. |
+ typedef X1 B1; |
+ typedef X2 B2; |
+ typedef X3 B3; |
+ typedef X4 B4; |
+ typedef X5 B5; |
+ typedef X6 B6; |
+ typedef X7 B7; |
+ |
+}; |
+ |
+// Method: Arity 7. |
+template <typename R, typename T, typename X1, typename X2, typename X3, |
+ typename X4, typename X5, typename X6, typename X7> |
+struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5, X6, X7)> { |
+ typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5, X6, X7); |
+ typedef true_type IsMethod; |
+ |
+ typedef R Return; |
+ |
+ // Target type for each bound parameter. |
+ typedef T B1; |
+ typedef X1 B2; |
+ typedef X2 B3; |
+ typedef X3 B4; |
+ typedef X4 B5; |
+ typedef X5 B6; |
+ typedef X6 B7; |
+ typedef X7 B8; |
+ |
+}; |
+ |
+// Const Method: Arity 7. |
+template <typename R, typename T, typename X1, typename X2, typename X3, |
+ typename X4, typename X5, typename X6, typename X7> |
+struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5, X6, X7) const> { |
+ typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5, X6, X7); |
+ typedef true_type IsMethod; |
+ |
+ typedef R Return; |
+ |
+ // Target type for each bound parameter. |
+ typedef T B1; |
+ typedef X1 B2; |
+ typedef X2 B3; |
+ typedef X3 B4; |
+ typedef X4 B5; |
+ typedef X5 B6; |
+ typedef X6 B7; |
+ typedef X7 B8; |
+ |
+}; |
+ |
// InvokerN<> |
// |
// The InvokerN templates contain a static DoInvoke() function that is the key |
@@ -424,12 +486,12 @@ struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5, X6) const> { |
// |
// DoInvoke() is a static function with a fixed signature that is independent |
// of StorageType; its first argument is a pointer to the non-templated common |
-// baseclass of StorageType. This lets us store pointer to DoInvoke() in a |
+// base class of StorageType. This lets us store pointer to DoInvoke() in a |
// function pointer that has knowledge of the specific StorageType, and thus |
// no knowledge of the bound function and bound parameter types. |
// |
// As long as we ensure that DoInvoke() is only used with pointers there were |
-// upcasted from the correct StorageType, we can be sure that execution is |
+// up-casted from the correct StorageType, we can be sure that execution is |
// safe. |
// |
// The InvokerN templates are the only point that knows the number of bound |
@@ -570,6 +632,33 @@ struct Invoker0<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { |
} |
}; |
+// Function: Arity 7 -> 7. |
+template <typename StorageType, typename R,typename X1, typename X2, |
+ typename X3, typename X4, typename X5, typename X6, typename X7> |
+struct Invoker0<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6, X7)> { |
+ typedef R(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X1>::ForwardType, |
+ typename internal::ParamTraits<X2>::ForwardType, |
+ typename internal::ParamTraits<X3>::ForwardType, |
+ typename internal::ParamTraits<X4>::ForwardType, |
+ typename internal::ParamTraits<X5>::ForwardType, |
+ typename internal::ParamTraits<X6>::ForwardType, |
+ typename internal::ParamTraits<X7>::ForwardType); |
+ |
+ static R 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, |
+ typename internal::ParamTraits<X6>::ForwardType x6, |
+ typename internal::ParamTraits<X7>::ForwardType x7) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ return invoker->f_(x1, x2, x3, x4, x5, x6, x7); |
+ } |
+}; |
+ |
template <bool IsWeak, typename StorageType, typename NormalizedSig> |
struct Invoker1; |
@@ -914,6 +1003,85 @@ struct Invoker1<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> { |
} |
}; |
+// Function: Arity 7 -> 6. |
+template <typename StorageType, typename R,typename X1, typename X2, |
+ typename X3, typename X4, typename X5, typename X6, typename X7> |
+struct Invoker1<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6, X7)> { |
+ typedef R(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X2>::ForwardType, |
+ typename internal::ParamTraits<X3>::ForwardType, |
+ typename internal::ParamTraits<X4>::ForwardType, |
+ typename internal::ParamTraits<X5>::ForwardType, |
+ typename internal::ParamTraits<X6>::ForwardType, |
+ typename internal::ParamTraits<X7>::ForwardType); |
+ |
+ static R 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, |
+ typename internal::ParamTraits<X6>::ForwardType x6, |
+ typename internal::ParamTraits<X7>::ForwardType x7) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5, x6, x7); |
+ } |
+}; |
+ |
+// Method: Arity 6 -> 6. |
+template <typename StorageType, typename R, typename T, typename X1, |
+ typename X2, typename X3, typename X4, typename X5, typename X6> |
+struct Invoker1<false, StorageType, R(T::*)(X1, X2, X3, X4, X5, X6)> { |
+ typedef R(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X1>::ForwardType, |
+ typename internal::ParamTraits<X2>::ForwardType, |
+ typename internal::ParamTraits<X3>::ForwardType, |
+ typename internal::ParamTraits<X4>::ForwardType, |
+ typename internal::ParamTraits<X5>::ForwardType, |
+ typename internal::ParamTraits<X6>::ForwardType); |
+ |
+ static R 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, |
+ typename internal::ParamTraits<X6>::ForwardType x6) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4, x5, x6); |
+ } |
+}; |
+ |
+// WeakPtr Method: Arity 6 -> 6. |
+template <typename StorageType, typename T, typename X1, typename X2, |
+ typename X3, typename X4, typename X5, typename X6> |
+struct Invoker1<true, StorageType, void(T::*)(X1, X2, X3, X4, X5, X6)> { |
+ typedef void(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X1>::ForwardType, |
+ typename internal::ParamTraits<X2>::ForwardType, |
+ typename internal::ParamTraits<X3>::ForwardType, |
+ typename internal::ParamTraits<X4>::ForwardType, |
+ typename internal::ParamTraits<X5>::ForwardType, |
+ typename internal::ParamTraits<X6>::ForwardType); |
+ |
+ 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, |
+ typename internal::ParamTraits<X6>::ForwardType x6) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
+ if (!weak_ptr.get()) { |
+ return; |
+ } |
+ (weak_ptr->*invoker->f_)(x1, x2, x3, x4, x5, x6); |
+ } |
+}; |
+ |
template <bool IsWeak, typename StorageType, typename NormalizedSig> |
struct Invoker2; |
@@ -1191,6 +1359,81 @@ struct Invoker2<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> { |
} |
}; |
+// Function: Arity 7 -> 5. |
+template <typename StorageType, typename R,typename X1, typename X2, |
+ typename X3, typename X4, typename X5, typename X6, typename X7> |
+struct Invoker2<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6, X7)> { |
+ typedef R(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X3>::ForwardType, |
+ typename internal::ParamTraits<X4>::ForwardType, |
+ typename internal::ParamTraits<X5>::ForwardType, |
+ typename internal::ParamTraits<X6>::ForwardType, |
+ typename internal::ParamTraits<X7>::ForwardType); |
+ |
+ static R DoInvoke(InvokerStorageBase* base, |
+ typename internal::ParamTraits<X3>::ForwardType x3, |
+ typename internal::ParamTraits<X4>::ForwardType x4, |
+ typename internal::ParamTraits<X5>::ForwardType x5, |
+ typename internal::ParamTraits<X6>::ForwardType x6, |
+ typename internal::ParamTraits<X7>::ForwardType x7) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5, |
+ x6, x7); |
+ } |
+}; |
+ |
+// Method: Arity 6 -> 5. |
+template <typename StorageType, typename R, typename T, typename X1, |
+ typename X2, typename X3, typename X4, typename X5, typename X6> |
+struct Invoker2<false, StorageType, R(T::*)(X1, X2, X3, X4, X5, X6)> { |
+ typedef R(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X2>::ForwardType, |
+ typename internal::ParamTraits<X3>::ForwardType, |
+ typename internal::ParamTraits<X4>::ForwardType, |
+ typename internal::ParamTraits<X5>::ForwardType, |
+ typename internal::ParamTraits<X6>::ForwardType); |
+ |
+ static R 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, |
+ typename internal::ParamTraits<X6>::ForwardType x6) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, |
+ x4, x5, x6); |
+ } |
+}; |
+ |
+// WeakPtr Method: Arity 6 -> 5. |
+template <typename StorageType, typename T, typename X1, typename X2, |
+ typename X3, typename X4, typename X5, typename X6> |
+struct Invoker2<true, StorageType, void(T::*)(X1, X2, X3, X4, X5, X6)> { |
+ typedef void(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X2>::ForwardType, |
+ typename internal::ParamTraits<X3>::ForwardType, |
+ typename internal::ParamTraits<X4>::ForwardType, |
+ typename internal::ParamTraits<X5>::ForwardType, |
+ typename internal::ParamTraits<X6>::ForwardType); |
+ |
+ 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, |
+ typename internal::ParamTraits<X6>::ForwardType x6) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
+ if (!weak_ptr.get()) { |
+ return; |
+ } |
+ (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, x4, x5, x6); |
+ } |
+}; |
+ |
template <bool IsWeak, typename StorageType, typename NormalizedSig> |
struct Invoker3; |
@@ -1411,6 +1654,76 @@ struct Invoker3<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> { |
} |
}; |
+// Function: Arity 7 -> 4. |
+template <typename StorageType, typename R,typename X1, typename X2, |
+ typename X3, typename X4, typename X5, typename X6, typename X7> |
+struct Invoker3<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6, X7)> { |
+ typedef R(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X4>::ForwardType, |
+ typename internal::ParamTraits<X5>::ForwardType, |
+ typename internal::ParamTraits<X6>::ForwardType, |
+ typename internal::ParamTraits<X7>::ForwardType); |
+ |
+ static R DoInvoke(InvokerStorageBase* base, |
+ typename internal::ParamTraits<X4>::ForwardType x4, |
+ typename internal::ParamTraits<X5>::ForwardType x5, |
+ typename internal::ParamTraits<X6>::ForwardType x6, |
+ typename internal::ParamTraits<X7>::ForwardType x7) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
+ Unwrap(invoker->p3_), x4, x5, x6, x7); |
+ } |
+}; |
+ |
+// Method: Arity 6 -> 4. |
+template <typename StorageType, typename R, typename T, typename X1, |
+ typename X2, typename X3, typename X4, typename X5, typename X6> |
+struct Invoker3<false, StorageType, R(T::*)(X1, X2, X3, X4, X5, X6)> { |
+ typedef R(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X3>::ForwardType, |
+ typename internal::ParamTraits<X4>::ForwardType, |
+ typename internal::ParamTraits<X5>::ForwardType, |
+ typename internal::ParamTraits<X6>::ForwardType); |
+ |
+ static R DoInvoke(InvokerStorageBase* base, |
+ typename internal::ParamTraits<X3>::ForwardType x3, |
+ typename internal::ParamTraits<X4>::ForwardType x4, |
+ typename internal::ParamTraits<X5>::ForwardType x5, |
+ typename internal::ParamTraits<X6>::ForwardType x6) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
+ Unwrap(invoker->p3_), x3, x4, x5, x6); |
+ } |
+}; |
+ |
+// WeakPtr Method: Arity 6 -> 4. |
+template <typename StorageType, typename T, typename X1, typename X2, |
+ typename X3, typename X4, typename X5, typename X6> |
+struct Invoker3<true, StorageType, void(T::*)(X1, X2, X3, X4, X5, X6)> { |
+ typedef void(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X3>::ForwardType, |
+ typename internal::ParamTraits<X4>::ForwardType, |
+ typename internal::ParamTraits<X5>::ForwardType, |
+ typename internal::ParamTraits<X6>::ForwardType); |
+ |
+ static void DoInvoke(InvokerStorageBase* base, |
+ typename internal::ParamTraits<X3>::ForwardType x3, |
+ typename internal::ParamTraits<X4>::ForwardType x4, |
+ typename internal::ParamTraits<X5>::ForwardType x5, |
+ typename internal::ParamTraits<X6>::ForwardType x6) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
+ if (!weak_ptr.get()) { |
+ return; |
+ } |
+ (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_), x3, |
+ x4, x5, x6); |
+ } |
+}; |
+ |
template <bool IsWeak, typename StorageType, typename NormalizedSig> |
struct Invoker4; |
@@ -1570,6 +1883,70 @@ struct Invoker4<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> { |
} |
}; |
+// Function: Arity 7 -> 3. |
+template <typename StorageType, typename R,typename X1, typename X2, |
+ typename X3, typename X4, typename X5, typename X6, typename X7> |
+struct Invoker4<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6, X7)> { |
+ typedef R(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X5>::ForwardType, |
+ typename internal::ParamTraits<X6>::ForwardType, |
+ typename internal::ParamTraits<X7>::ForwardType); |
+ |
+ static R DoInvoke(InvokerStorageBase* base, |
+ typename internal::ParamTraits<X5>::ForwardType x5, |
+ typename internal::ParamTraits<X6>::ForwardType x6, |
+ typename internal::ParamTraits<X7>::ForwardType x7) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
+ Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5, x6, x7); |
+ } |
+}; |
+ |
+// Method: Arity 6 -> 3. |
+template <typename StorageType, typename R, typename T, typename X1, |
+ typename X2, typename X3, typename X4, typename X5, typename X6> |
+struct Invoker4<false, StorageType, R(T::*)(X1, X2, X3, X4, X5, X6)> { |
+ typedef R(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X4>::ForwardType, |
+ typename internal::ParamTraits<X5>::ForwardType, |
+ typename internal::ParamTraits<X6>::ForwardType); |
+ |
+ static R DoInvoke(InvokerStorageBase* base, |
+ typename internal::ParamTraits<X4>::ForwardType x4, |
+ typename internal::ParamTraits<X5>::ForwardType x5, |
+ typename internal::ParamTraits<X6>::ForwardType x6) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
+ Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4, x5, x6); |
+ } |
+}; |
+ |
+// WeakPtr Method: Arity 6 -> 3. |
+template <typename StorageType, typename T, typename X1, typename X2, |
+ typename X3, typename X4, typename X5, typename X6> |
+struct Invoker4<true, StorageType, void(T::*)(X1, X2, X3, X4, X5, X6)> { |
+ typedef void(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X4>::ForwardType, |
+ typename internal::ParamTraits<X5>::ForwardType, |
+ typename internal::ParamTraits<X6>::ForwardType); |
+ |
+ static void DoInvoke(InvokerStorageBase* base, |
+ typename internal::ParamTraits<X4>::ForwardType x4, |
+ typename internal::ParamTraits<X5>::ForwardType x5, |
+ typename internal::ParamTraits<X6>::ForwardType x6) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
+ if (!weak_ptr.get()) { |
+ return; |
+ } |
+ (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_), |
+ Unwrap(invoker->p4_), x4, x5, x6); |
+ } |
+}; |
+ |
template <bool IsWeak, typename StorageType, typename NormalizedSig> |
struct Invoker5; |
@@ -1671,6 +2048,66 @@ struct Invoker5<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> { |
} |
}; |
+// Function: Arity 7 -> 2. |
+template <typename StorageType, typename R,typename X1, typename X2, |
+ typename X3, typename X4, typename X5, typename X6, typename X7> |
+struct Invoker5<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6, X7)> { |
+ typedef R(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X6>::ForwardType, |
+ typename internal::ParamTraits<X7>::ForwardType); |
+ |
+ static R DoInvoke(InvokerStorageBase* base, |
+ typename internal::ParamTraits<X6>::ForwardType x6, |
+ typename internal::ParamTraits<X7>::ForwardType x7) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
+ Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x6, |
+ x7); |
+ } |
+}; |
+ |
+// Method: Arity 6 -> 2. |
+template <typename StorageType, typename R, typename T, typename X1, |
+ typename X2, typename X3, typename X4, typename X5, typename X6> |
+struct Invoker5<false, StorageType, R(T::*)(X1, X2, X3, X4, X5, X6)> { |
+ typedef R(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X5>::ForwardType, |
+ typename internal::ParamTraits<X6>::ForwardType); |
+ |
+ static R DoInvoke(InvokerStorageBase* base, |
+ typename internal::ParamTraits<X5>::ForwardType x5, |
+ typename internal::ParamTraits<X6>::ForwardType x6) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
+ Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5, |
+ x6); |
+ } |
+}; |
+ |
+// WeakPtr Method: Arity 6 -> 2. |
+template <typename StorageType, typename T, typename X1, typename X2, |
+ typename X3, typename X4, typename X5, typename X6> |
+struct Invoker5<true, StorageType, void(T::*)(X1, X2, X3, X4, X5, X6)> { |
+ typedef void(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X5>::ForwardType, |
+ typename internal::ParamTraits<X6>::ForwardType); |
+ |
+ static void DoInvoke(InvokerStorageBase* base, |
+ typename internal::ParamTraits<X5>::ForwardType x5, |
+ typename internal::ParamTraits<X6>::ForwardType x6) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
+ if (!weak_ptr.get()) { |
+ return; |
+ } |
+ (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_), |
+ Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5, x6); |
+ } |
+}; |
+ |
template <bool IsWeak, typename StorageType, typename NormalizedSig> |
struct Invoker6; |
@@ -1722,6 +2159,112 @@ struct Invoker6<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> { |
} |
}; |
+// Function: Arity 7 -> 1. |
+template <typename StorageType, typename R,typename X1, typename X2, |
+ typename X3, typename X4, typename X5, typename X6, typename X7> |
+struct Invoker6<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6, X7)> { |
+ typedef R(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X7>::ForwardType); |
+ |
+ static R DoInvoke(InvokerStorageBase* base, |
+ typename internal::ParamTraits<X7>::ForwardType x7) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
+ Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), |
+ Unwrap(invoker->p6_), x7); |
+ } |
+}; |
+ |
+// Method: Arity 6 -> 1. |
+template <typename StorageType, typename R, typename T, typename X1, |
+ typename X2, typename X3, typename X4, typename X5, typename X6> |
+struct Invoker6<false, StorageType, R(T::*)(X1, X2, X3, X4, X5, X6)> { |
+ typedef R(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X6>::ForwardType); |
+ |
+ static R DoInvoke(InvokerStorageBase* base, |
+ typename internal::ParamTraits<X6>::ForwardType x6) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
+ Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), |
+ Unwrap(invoker->p6_), x6); |
+ } |
+}; |
+ |
+// WeakPtr Method: Arity 6 -> 1. |
+template <typename StorageType, typename T, typename X1, typename X2, |
+ typename X3, typename X4, typename X5, typename X6> |
+struct Invoker6<true, StorageType, void(T::*)(X1, X2, X3, X4, X5, X6)> { |
+ typedef void(*DoInvokeType)( |
+ internal::InvokerStorageBase*, |
+ typename internal::ParamTraits<X6>::ForwardType); |
+ |
+ static void DoInvoke(InvokerStorageBase* base, |
+ typename internal::ParamTraits<X6>::ForwardType x6) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
+ if (!weak_ptr.get()) { |
+ return; |
+ } |
+ (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_), |
+ Unwrap(invoker->p4_), Unwrap(invoker->p5_), Unwrap(invoker->p6_), x6); |
+ } |
+}; |
+ |
+template <bool IsWeak, typename StorageType, typename NormalizedSig> |
+struct Invoker7; |
+ |
+// Function: Arity 7 -> 0. |
+template <typename StorageType, typename R,typename X1, typename X2, |
+ typename X3, typename X4, typename X5, typename X6, typename X7> |
+struct Invoker7<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6, X7)> { |
+ typedef R(*DoInvokeType)( |
+ internal::InvokerStorageBase*); |
+ |
+ static R DoInvoke(InvokerStorageBase* base) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), |
+ Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), |
+ Unwrap(invoker->p6_), Unwrap(invoker->p7_)); |
+ } |
+}; |
+ |
+// Method: Arity 6 -> 0. |
+template <typename StorageType, typename R, typename T, typename X1, |
+ typename X2, typename X3, typename X4, typename X5, typename X6> |
+struct Invoker7<false, StorageType, R(T::*)(X1, X2, X3, X4, X5, X6)> { |
+ typedef R(*DoInvokeType)( |
+ internal::InvokerStorageBase*); |
+ |
+ static R DoInvoke(InvokerStorageBase* base) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), |
+ Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), |
+ Unwrap(invoker->p6_), Unwrap(invoker->p7_)); |
+ } |
+}; |
+ |
+// WeakPtr Method: Arity 6 -> 0. |
+template <typename StorageType, typename T, typename X1, typename X2, |
+ typename X3, typename X4, typename X5, typename X6> |
+struct Invoker7<true, StorageType, void(T::*)(X1, X2, X3, X4, X5, X6)> { |
+ typedef void(*DoInvokeType)( |
+ internal::InvokerStorageBase*); |
+ |
+ static void DoInvoke(InvokerStorageBase* base) { |
+ StorageType* invoker = static_cast<StorageType*>(base); |
+ typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; |
+ if (!weak_ptr.get()) { |
+ return; |
+ } |
+ (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_), |
+ Unwrap(invoker->p4_), Unwrap(invoker->p5_), Unwrap(invoker->p6_), |
+ Unwrap(invoker->p7_)); |
+ } |
+}; |
+ |
// BindMoreFuncN<> |
// |
// This set of functions help in fully binding the free parameters in a |
@@ -1763,6 +2306,14 @@ void BindMoreFunc6(const base::Callback<Sig>& callback, const P1& p1, |
callback.Run(p1, p2, p3, p4, p5, p6); |
} |
+template <typename Sig, typename P1, typename P2, typename P3, typename P4, |
+ typename P5, typename P6, typename P7> |
+void BindMoreFunc7(const base::Callback<Sig>& callback, const P1& p1, |
+ const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, |
+ const P7& p7) { |
+ callback.Run(p1, p2, p3, p4, p5, p6, p7); |
+} |
+ |
// InvokerStorageN<> |
// |
// These are the actual storage classes for the Invokers. |
@@ -2189,6 +2740,97 @@ class InvokerStorage6 : public InvokerStorageBase { |
typename ParamTraits<P6>::StorageType p6_; |
}; |
+template <typename Sig, typename P1, typename P2, typename P3, typename P4, |
+ typename P5, typename P6, typename P7> |
+class InvokerStorage7 : public InvokerStorageBase { |
+ public: |
+ typedef InvokerStorage7 StorageType; |
+ typedef FunctionTraits<Sig> TargetTraits; |
+ typedef typename TargetTraits::IsMethod IsMethod; |
+ typedef Sig Signature; |
+ typedef ParamTraits<P1> P1Traits; |
+ typedef ParamTraits<P2> P2Traits; |
+ typedef ParamTraits<P3> P3Traits; |
+ typedef ParamTraits<P4> P4Traits; |
+ typedef ParamTraits<P5> P5Traits; |
+ typedef ParamTraits<P6> P6Traits; |
+ typedef ParamTraits<P7> P7Traits; |
+ typedef Invoker7<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 |
+ // disallow binding of an array as the method's target object. |
+ COMPILE_ASSERT(IsMethod::value || |
+ internal::NeedsScopedRefptrButGetsRawPtr< |
+ typename ParamTraits<P1>::StorageType>::value == 0, |
+ p1_is_refcounted_type_and_needs_scoped_refptr); |
+ COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, |
+ first_bound_argument_to_method_cannot_be_array); |
+ COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr< |
+ typename ParamTraits<P2>::StorageType>::value == 0, |
+ p2_is_refcounted_type_and_needs_scoped_refptr); |
+ COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr< |
+ typename ParamTraits<P3>::StorageType>::value == 0, |
+ p3_is_refcounted_type_and_needs_scoped_refptr); |
+ COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr< |
+ typename ParamTraits<P4>::StorageType>::value == 0, |
+ p4_is_refcounted_type_and_needs_scoped_refptr); |
+ COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr< |
+ typename ParamTraits<P5>::StorageType>::value == 0, |
+ p5_is_refcounted_type_and_needs_scoped_refptr); |
+ COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr< |
+ typename ParamTraits<P6>::StorageType>::value == 0, |
+ p6_is_refcounted_type_and_needs_scoped_refptr); |
+ COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr< |
+ typename ParamTraits<P7>::StorageType>::value == 0, |
+ p7_is_refcounted_type_and_needs_scoped_refptr); |
+ |
+ // Do not allow binding a non-const reference parameter. Non-const reference |
+ // parameters are disallowed by the Google style guide. Also, binding a |
+ // non-const reference parameter can make for subtle bugs because the |
+ // invoked function will receive a reference to the stored copy of the |
+ // argument and not the original. |
+ COMPILE_ASSERT( |
+ !( is_non_const_reference<typename TargetTraits::B1>::value || |
+ is_non_const_reference<typename TargetTraits::B2>::value || |
+ is_non_const_reference<typename TargetTraits::B3>::value || |
+ is_non_const_reference<typename TargetTraits::B4>::value || |
+ is_non_const_reference<typename TargetTraits::B5>::value || |
+ is_non_const_reference<typename TargetTraits::B6>::value || |
+ is_non_const_reference<typename TargetTraits::B7>::value ), |
+ do_not_bind_functions_with_nonconst_ref); |
+ |
+ |
+ InvokerStorage7(Sig f, const P1& p1, const P2& p2, const P3& p3, |
+ const P4& p4, const P5& p5, const P6& p6, const P7& p7) |
+ : f_(f), p1_(static_cast<typename ParamTraits<P1>::StorageType>(p1)), |
+ p2_(static_cast<typename ParamTraits<P2>::StorageType>(p2)), |
+ p3_(static_cast<typename ParamTraits<P3>::StorageType>(p3)), |
+ p4_(static_cast<typename ParamTraits<P4>::StorageType>(p4)), |
+ p5_(static_cast<typename ParamTraits<P5>::StorageType>(p5)), |
+ p6_(static_cast<typename ParamTraits<P6>::StorageType>(p6)), |
+ p7_(static_cast<typename ParamTraits<P7>::StorageType>(p7)) { |
+ MaybeRefcount<IsMethod, P1>::AddRef(p1_); |
+ } |
+ |
+ virtual ~InvokerStorage7() { |
+ MaybeRefcount<IsMethod, P1>::Release(p1_); |
+ } |
+ |
+ Sig f_; |
+ typename ParamTraits<P1>::StorageType p1_; |
+ typename ParamTraits<P2>::StorageType p2_; |
+ typename ParamTraits<P3>::StorageType p3_; |
+ typename ParamTraits<P4>::StorageType p4_; |
+ typename ParamTraits<P5>::StorageType p5_; |
+ typename ParamTraits<P6>::StorageType p6_; |
+ typename ParamTraits<P7>::StorageType p7_; |
+}; |
+ |
} // namespace internal |
} // namespace base |