Index: base/callback.h |
diff --git a/base/callback.h b/base/callback.h |
index c613890ef592bdbc5b6de4ca5c0706aaa0f0e3b6..430565a53a31b3fd9fa99433a7732c5443f04ebf 100644 |
--- a/base/callback.h |
+++ b/base/callback.h |
@@ -748,6 +748,69 @@ class Callback<R(A1, A2, A3, A4, A5, A6, A7)> : public internal::CallbackBase { |
}; |
+template <typename R, typename A1, typename A2, typename A3, typename A4, |
+ typename A5, typename A6, typename A7, typename A8> |
+class Callback<R(A1, A2, A3, A4, A5, A6, A7, A8)> |
+ : public internal::CallbackBase { |
+ public: |
+ typedef R(RunType)(A1, A2, A3, A4, A5, A6, A7, A8); |
+ |
+ Callback() : CallbackBase(NULL) { } |
+ |
+ // Note that this constructor CANNOT be explicit, and that Bind() CANNOT |
+ // return the exact Callback<> type. See base/bind.h for details. |
+ template <typename Runnable, typename BindRunType, typename BoundArgsType> |
+ Callback(internal::BindState<Runnable, BindRunType, |
+ BoundArgsType>* bind_state) |
+ : CallbackBase(bind_state) { |
+ |
+ // Force the assignment to a local variable of PolymorphicInvoke |
+ // so the compiler will typecheck that the passed in Run() method has |
+ // the correct type. |
+ PolymorphicInvoke invoke_func = |
+ &internal::BindState<Runnable, BindRunType, BoundArgsType> |
+ ::InvokerType::Run; |
+ polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); |
+ } |
+ |
+ bool Equals(const Callback& other) const { |
+ return CallbackBase::Equals(other); |
+ } |
+ |
+ R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, |
+ typename internal::CallbackParamTraits<A2>::ForwardType a2, |
+ typename internal::CallbackParamTraits<A3>::ForwardType a3, |
+ typename internal::CallbackParamTraits<A4>::ForwardType a4, |
+ typename internal::CallbackParamTraits<A5>::ForwardType a5, |
+ typename internal::CallbackParamTraits<A6>::ForwardType a6, |
+ typename internal::CallbackParamTraits<A7>::ForwardType a7, |
+ typename internal::CallbackParamTraits<A8>::ForwardType a8) const { |
+ PolymorphicInvoke f = |
+ reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); |
+ |
+ return f(bind_state_.get(), internal::CallbackForward(a1), |
+ internal::CallbackForward(a2), |
+ internal::CallbackForward(a3), |
+ internal::CallbackForward(a4), |
+ internal::CallbackForward(a5), |
+ internal::CallbackForward(a6), |
+ internal::CallbackForward(a7), |
+ internal::CallbackForward(a8)); |
+ } |
+ |
+ private: |
+ typedef R(*PolymorphicInvoke)( |
+ internal::BindStateBase*, |
+ typename internal::CallbackParamTraits<A1>::ForwardType, |
+ typename internal::CallbackParamTraits<A2>::ForwardType, |
+ typename internal::CallbackParamTraits<A3>::ForwardType, |
+ typename internal::CallbackParamTraits<A4>::ForwardType, |
+ typename internal::CallbackParamTraits<A5>::ForwardType, |
+ typename internal::CallbackParamTraits<A6>::ForwardType, |
+ typename internal::CallbackParamTraits<A7>::ForwardType, |
+ typename internal::CallbackParamTraits<A8>::ForwardType); |
+ |
+}; |
// Syntactic sugar to make Callbacks<void(void)> easier to declare since it |
// will be used in a lot of APIs with delayed execution. |