| Index: base/callback.h
|
| diff --git a/base/callback.h b/base/callback.h
|
| index 7579cef6716ca97da26dc3c74ab7e796e9321fc8..6844cc54dcb34317e9e0645753a304f52cc8bfc5 100644
|
| --- a/base/callback.h
|
| +++ b/base/callback.h
|
| @@ -126,26 +126,26 @@
|
| // The Callback classes represent a generic function pointer. Internally,
|
| // it stores a refcounted piece of state that represents the target function
|
| // and all its bound parameters. Each Callback specialization has a templated
|
| -// constructor that takes an InvokerStorageHolder<> object. In the context of
|
| -// the constructor, the static type of this InvokerStorageHolder<> object
|
| +// constructor that takes an BindStateHolder<> object. In the context of
|
| +// the constructor, the static type of this BindStateHolder<> object
|
| // uniquely identifies the function it is representing, all its bound
|
| // parameters, and a DoInvoke() that is capable of invoking the target.
|
| //
|
| -// Callback's constructor is takes the InvokerStorageHolder<> that has the
|
| +// Callback's constructor is takes the BindStateHolder<> that has the
|
| // full static type and erases the target function type, and the bound
|
| // parameters. It does this by storing a pointer to the specific DoInvoke()
|
| -// function, and upcasting the state of InvokerStorageHolder<> to a
|
| -// InvokerStorageBase. This is safe as long as this InvokerStorageBase pointer
|
| +// function, and upcasting the state of BindStateHolder<> to a
|
| +// BindStateBase. This is safe as long as this BindStateBase pointer
|
| // is only used with the stored DoInvoke() pointer.
|
| //
|
| -// To create InvokerStorageHolder<> objects, we use the Bind() functions.
|
| +// To create BindStateHolder<> objects, we use the Bind() functions.
|
| // These functions, along with a set of internal templates, are reponsible for
|
| //
|
| // - Unwrapping the function signature into return type, and parameters
|
| // - Determining the number of parameters that are bound
|
| // - Creating the storage for the bound parameters
|
| // - Performing compile-time asserts to avoid error-prone behavior
|
| -// - Returning an InvokerStorageHolder<> with an DoInvoke() that has an arity
|
| +// - Returning an BindStateHolder<> with an DoInvoke() that has an arity
|
| // matching the number of unbound parameters, and knows the correct
|
| // refcounting semantics for the target object if we are binding a class
|
| // method.
|
| @@ -236,12 +236,11 @@ class Callback;
|
| template <typename R>
|
| class Callback<R(void)> : public internal::CallbackBase {
|
| public:
|
| - typedef R(*PolymorphicInvoke)(
|
| - internal::InvokerStorageBase*);
|
| + typedef R(RunType)();
|
|
|
| Callback() : CallbackBase(NULL, NULL) { }
|
|
|
| - // We pass InvokerStorageHolder by const ref to avoid incurring an
|
| + // We pass BindStateHolder by const ref to avoid incurring an
|
| // unnecessary AddRef/Unref pair even though we will modify the object.
|
| // We cannot use a normal reference because the compiler will warn
|
| // since this is often used on a return value, which is a temporary.
|
| @@ -249,13 +248,13 @@ class Callback<R(void)> : public internal::CallbackBase {
|
| // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
|
| // return the exact Callback<> type. See base/bind.h for details.
|
| template <typename T>
|
| - Callback(const internal::InvokerStorageHolder<T>& invoker_holder)
|
| - : CallbackBase(
|
| - reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke),
|
| - &invoker_holder.invoker_storage_) {
|
| - COMPILE_ASSERT((is_same<PolymorphicInvoke,
|
| - typename T::Invoker::DoInvokeType>::value),
|
| - callback_type_does_not_match_bind_result);
|
| + Callback(const internal::BindStateHolder<T>& bind_state_holder)
|
| + : CallbackBase(NULL, &bind_state_holder.bind_state_) {
|
| + // Force the assignment to a location variable of PolymorphicInvoke
|
| + // so the compiler will typecheck that the passed in Run() method has
|
| + // the correct type.
|
| + PolymorphicInvoke invoke_func = &T::InvokerType::Run;
|
| + polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
|
| }
|
|
|
| bool Equals(const Callback& other) const {
|
| @@ -266,20 +265,23 @@ class Callback<R(void)> : public internal::CallbackBase {
|
| PolymorphicInvoke f =
|
| reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
|
|
|
| - return f(invoker_storage_.get());
|
| + return f(bind_state_.get());
|
| }
|
| +
|
| + private:
|
| + typedef R(*PolymorphicInvoke)(
|
| + internal::BindStateBase*);
|
| +
|
| };
|
|
|
| template <typename R, typename A1>
|
| class Callback<R(A1)> : public internal::CallbackBase {
|
| public:
|
| - typedef R(*PolymorphicInvoke)(
|
| - internal::InvokerStorageBase*,
|
| - typename internal::ParamTraits<A1>::ForwardType);
|
| + typedef R(RunType)(A1);
|
|
|
| Callback() : CallbackBase(NULL, NULL) { }
|
|
|
| - // We pass InvokerStorageHolder by const ref to avoid incurring an
|
| + // We pass BindStateHolder by const ref to avoid incurring an
|
| // unnecessary AddRef/Unref pair even though we will modify the object.
|
| // We cannot use a normal reference because the compiler will warn
|
| // since this is often used on a return value, which is a temporary.
|
| @@ -287,38 +289,41 @@ class Callback<R(A1)> : public internal::CallbackBase {
|
| // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
|
| // return the exact Callback<> type. See base/bind.h for details.
|
| template <typename T>
|
| - Callback(const internal::InvokerStorageHolder<T>& invoker_holder)
|
| - : CallbackBase(
|
| - reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke),
|
| - &invoker_holder.invoker_storage_) {
|
| - COMPILE_ASSERT((is_same<PolymorphicInvoke,
|
| - typename T::Invoker::DoInvokeType>::value),
|
| - callback_type_does_not_match_bind_result);
|
| + Callback(const internal::BindStateHolder<T>& bind_state_holder)
|
| + : CallbackBase(NULL, &bind_state_holder.bind_state_) {
|
| + // Force the assignment to a location variable of PolymorphicInvoke
|
| + // so the compiler will typecheck that the passed in Run() method has
|
| + // the correct type.
|
| + PolymorphicInvoke invoke_func = &T::InvokerType::Run;
|
| + polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
|
| }
|
|
|
| bool Equals(const Callback& other) const {
|
| return CallbackBase::Equals(other);
|
| }
|
|
|
| - R Run(typename internal::ParamTraits<A1>::ForwardType a1) const {
|
| + R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1) const {
|
| PolymorphicInvoke f =
|
| reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
|
|
|
| - return f(invoker_storage_.get(), a1);
|
| + return f(bind_state_.get(), a1);
|
| }
|
| +
|
| + private:
|
| + typedef R(*PolymorphicInvoke)(
|
| + internal::BindStateBase*,
|
| + typename internal::CallbackParamTraits<A1>::ForwardType);
|
| +
|
| };
|
|
|
| template <typename R, typename A1, typename A2>
|
| class Callback<R(A1, A2)> : public internal::CallbackBase {
|
| public:
|
| - typedef R(*PolymorphicInvoke)(
|
| - internal::InvokerStorageBase*,
|
| - typename internal::ParamTraits<A1>::ForwardType,
|
| - typename internal::ParamTraits<A2>::ForwardType);
|
| + typedef R(RunType)(A1, A2);
|
|
|
| Callback() : CallbackBase(NULL, NULL) { }
|
|
|
| - // We pass InvokerStorageHolder by const ref to avoid incurring an
|
| + // We pass BindStateHolder by const ref to avoid incurring an
|
| // unnecessary AddRef/Unref pair even though we will modify the object.
|
| // We cannot use a normal reference because the compiler will warn
|
| // since this is often used on a return value, which is a temporary.
|
| @@ -326,41 +331,44 @@ class Callback<R(A1, A2)> : public internal::CallbackBase {
|
| // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
|
| // return the exact Callback<> type. See base/bind.h for details.
|
| template <typename T>
|
| - Callback(const internal::InvokerStorageHolder<T>& invoker_holder)
|
| - : CallbackBase(
|
| - reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke),
|
| - &invoker_holder.invoker_storage_) {
|
| - COMPILE_ASSERT((is_same<PolymorphicInvoke,
|
| - typename T::Invoker::DoInvokeType>::value),
|
| - callback_type_does_not_match_bind_result);
|
| + Callback(const internal::BindStateHolder<T>& bind_state_holder)
|
| + : CallbackBase(NULL, &bind_state_holder.bind_state_) {
|
| + // Force the assignment to a location variable of PolymorphicInvoke
|
| + // so the compiler will typecheck that the passed in Run() method has
|
| + // the correct type.
|
| + PolymorphicInvoke invoke_func = &T::InvokerType::Run;
|
| + polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
|
| }
|
|
|
| bool Equals(const Callback& other) const {
|
| return CallbackBase::Equals(other);
|
| }
|
|
|
| - R Run(typename internal::ParamTraits<A1>::ForwardType a1,
|
| - typename internal::ParamTraits<A2>::ForwardType a2) const {
|
| + R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1,
|
| + typename internal::CallbackParamTraits<A2>::ForwardType a2) const {
|
| PolymorphicInvoke f =
|
| reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
|
|
|
| - return f(invoker_storage_.get(), a1,
|
| + return f(bind_state_.get(), a1,
|
| a2);
|
| }
|
| +
|
| + private:
|
| + typedef R(*PolymorphicInvoke)(
|
| + internal::BindStateBase*,
|
| + typename internal::CallbackParamTraits<A1>::ForwardType,
|
| + typename internal::CallbackParamTraits<A2>::ForwardType);
|
| +
|
| };
|
|
|
| template <typename R, typename A1, typename A2, typename A3>
|
| class Callback<R(A1, A2, A3)> : public internal::CallbackBase {
|
| public:
|
| - typedef R(*PolymorphicInvoke)(
|
| - internal::InvokerStorageBase*,
|
| - typename internal::ParamTraits<A1>::ForwardType,
|
| - typename internal::ParamTraits<A2>::ForwardType,
|
| - typename internal::ParamTraits<A3>::ForwardType);
|
| + typedef R(RunType)(A1, A2, A3);
|
|
|
| Callback() : CallbackBase(NULL, NULL) { }
|
|
|
| - // We pass InvokerStorageHolder by const ref to avoid incurring an
|
| + // We pass BindStateHolder by const ref to avoid incurring an
|
| // unnecessary AddRef/Unref pair even though we will modify the object.
|
| // We cannot use a normal reference because the compiler will warn
|
| // since this is often used on a return value, which is a temporary.
|
| @@ -368,44 +376,47 @@ class Callback<R(A1, A2, A3)> : public internal::CallbackBase {
|
| // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
|
| // return the exact Callback<> type. See base/bind.h for details.
|
| template <typename T>
|
| - Callback(const internal::InvokerStorageHolder<T>& invoker_holder)
|
| - : CallbackBase(
|
| - reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke),
|
| - &invoker_holder.invoker_storage_) {
|
| - COMPILE_ASSERT((is_same<PolymorphicInvoke,
|
| - typename T::Invoker::DoInvokeType>::value),
|
| - callback_type_does_not_match_bind_result);
|
| + Callback(const internal::BindStateHolder<T>& bind_state_holder)
|
| + : CallbackBase(NULL, &bind_state_holder.bind_state_) {
|
| + // Force the assignment to a location variable of PolymorphicInvoke
|
| + // so the compiler will typecheck that the passed in Run() method has
|
| + // the correct type.
|
| + PolymorphicInvoke invoke_func = &T::InvokerType::Run;
|
| + polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
|
| }
|
|
|
| bool Equals(const Callback& other) const {
|
| return CallbackBase::Equals(other);
|
| }
|
|
|
| - R Run(typename internal::ParamTraits<A1>::ForwardType a1,
|
| - typename internal::ParamTraits<A2>::ForwardType a2,
|
| - typename internal::ParamTraits<A3>::ForwardType a3) const {
|
| + R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1,
|
| + typename internal::CallbackParamTraits<A2>::ForwardType a2,
|
| + typename internal::CallbackParamTraits<A3>::ForwardType a3) const {
|
| PolymorphicInvoke f =
|
| reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
|
|
|
| - return f(invoker_storage_.get(), a1,
|
| + return f(bind_state_.get(), a1,
|
| a2,
|
| a3);
|
| }
|
| +
|
| + private:
|
| + typedef R(*PolymorphicInvoke)(
|
| + internal::BindStateBase*,
|
| + typename internal::CallbackParamTraits<A1>::ForwardType,
|
| + typename internal::CallbackParamTraits<A2>::ForwardType,
|
| + typename internal::CallbackParamTraits<A3>::ForwardType);
|
| +
|
| };
|
|
|
| template <typename R, typename A1, typename A2, typename A3, typename A4>
|
| class Callback<R(A1, A2, A3, A4)> : public internal::CallbackBase {
|
| public:
|
| - typedef R(*PolymorphicInvoke)(
|
| - internal::InvokerStorageBase*,
|
| - typename internal::ParamTraits<A1>::ForwardType,
|
| - typename internal::ParamTraits<A2>::ForwardType,
|
| - typename internal::ParamTraits<A3>::ForwardType,
|
| - typename internal::ParamTraits<A4>::ForwardType);
|
| + typedef R(RunType)(A1, A2, A3, A4);
|
|
|
| Callback() : CallbackBase(NULL, NULL) { }
|
|
|
| - // We pass InvokerStorageHolder by const ref to avoid incurring an
|
| + // We pass BindStateHolder by const ref to avoid incurring an
|
| // unnecessary AddRef/Unref pair even though we will modify the object.
|
| // We cannot use a normal reference because the compiler will warn
|
| // since this is often used on a return value, which is a temporary.
|
| @@ -413,48 +424,51 @@ class Callback<R(A1, A2, A3, A4)> : public internal::CallbackBase {
|
| // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
|
| // return the exact Callback<> type. See base/bind.h for details.
|
| template <typename T>
|
| - Callback(const internal::InvokerStorageHolder<T>& invoker_holder)
|
| - : CallbackBase(
|
| - reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke),
|
| - &invoker_holder.invoker_storage_) {
|
| - COMPILE_ASSERT((is_same<PolymorphicInvoke,
|
| - typename T::Invoker::DoInvokeType>::value),
|
| - callback_type_does_not_match_bind_result);
|
| + Callback(const internal::BindStateHolder<T>& bind_state_holder)
|
| + : CallbackBase(NULL, &bind_state_holder.bind_state_) {
|
| + // Force the assignment to a location variable of PolymorphicInvoke
|
| + // so the compiler will typecheck that the passed in Run() method has
|
| + // the correct type.
|
| + PolymorphicInvoke invoke_func = &T::InvokerType::Run;
|
| + polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
|
| }
|
|
|
| bool Equals(const Callback& other) const {
|
| return CallbackBase::Equals(other);
|
| }
|
|
|
| - R Run(typename internal::ParamTraits<A1>::ForwardType a1,
|
| - typename internal::ParamTraits<A2>::ForwardType a2,
|
| - typename internal::ParamTraits<A3>::ForwardType a3,
|
| - typename internal::ParamTraits<A4>::ForwardType a4) const {
|
| + 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) const {
|
| PolymorphicInvoke f =
|
| reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
|
|
|
| - return f(invoker_storage_.get(), a1,
|
| + return f(bind_state_.get(), a1,
|
| a2,
|
| a3,
|
| a4);
|
| }
|
| +
|
| + 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);
|
| +
|
| };
|
|
|
| template <typename R, typename A1, typename A2, typename A3, typename A4,
|
| typename A5>
|
| class Callback<R(A1, A2, A3, A4, A5)> : public internal::CallbackBase {
|
| public:
|
| - typedef R(*PolymorphicInvoke)(
|
| - internal::InvokerStorageBase*,
|
| - typename internal::ParamTraits<A1>::ForwardType,
|
| - typename internal::ParamTraits<A2>::ForwardType,
|
| - typename internal::ParamTraits<A3>::ForwardType,
|
| - typename internal::ParamTraits<A4>::ForwardType,
|
| - typename internal::ParamTraits<A5>::ForwardType);
|
| + typedef R(RunType)(A1, A2, A3, A4, A5);
|
|
|
| Callback() : CallbackBase(NULL, NULL) { }
|
|
|
| - // We pass InvokerStorageHolder by const ref to avoid incurring an
|
| + // We pass BindStateHolder by const ref to avoid incurring an
|
| // unnecessary AddRef/Unref pair even though we will modify the object.
|
| // We cannot use a normal reference because the compiler will warn
|
| // since this is often used on a return value, which is a temporary.
|
| @@ -462,51 +476,54 @@ class Callback<R(A1, A2, A3, A4, A5)> : public internal::CallbackBase {
|
| // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
|
| // return the exact Callback<> type. See base/bind.h for details.
|
| template <typename T>
|
| - Callback(const internal::InvokerStorageHolder<T>& invoker_holder)
|
| - : CallbackBase(
|
| - reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke),
|
| - &invoker_holder.invoker_storage_) {
|
| - COMPILE_ASSERT((is_same<PolymorphicInvoke,
|
| - typename T::Invoker::DoInvokeType>::value),
|
| - callback_type_does_not_match_bind_result);
|
| + Callback(const internal::BindStateHolder<T>& bind_state_holder)
|
| + : CallbackBase(NULL, &bind_state_holder.bind_state_) {
|
| + // Force the assignment to a location variable of PolymorphicInvoke
|
| + // so the compiler will typecheck that the passed in Run() method has
|
| + // the correct type.
|
| + PolymorphicInvoke invoke_func = &T::InvokerType::Run;
|
| + polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
|
| }
|
|
|
| bool Equals(const Callback& other) const {
|
| return CallbackBase::Equals(other);
|
| }
|
|
|
| - R Run(typename internal::ParamTraits<A1>::ForwardType a1,
|
| - typename internal::ParamTraits<A2>::ForwardType a2,
|
| - typename internal::ParamTraits<A3>::ForwardType a3,
|
| - typename internal::ParamTraits<A4>::ForwardType a4,
|
| - typename internal::ParamTraits<A5>::ForwardType a5) const {
|
| + 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) const {
|
| PolymorphicInvoke f =
|
| reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
|
|
|
| - return f(invoker_storage_.get(), a1,
|
| + return f(bind_state_.get(), a1,
|
| a2,
|
| a3,
|
| a4,
|
| a5);
|
| }
|
| +
|
| + 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);
|
| +
|
| };
|
|
|
| template <typename R, typename A1, typename A2, typename A3, typename A4,
|
| typename A5, typename A6>
|
| class Callback<R(A1, A2, A3, A4, A5, A6)> : public internal::CallbackBase {
|
| public:
|
| - typedef R(*PolymorphicInvoke)(
|
| - internal::InvokerStorageBase*,
|
| - typename internal::ParamTraits<A1>::ForwardType,
|
| - typename internal::ParamTraits<A2>::ForwardType,
|
| - typename internal::ParamTraits<A3>::ForwardType,
|
| - typename internal::ParamTraits<A4>::ForwardType,
|
| - typename internal::ParamTraits<A5>::ForwardType,
|
| - typename internal::ParamTraits<A6>::ForwardType);
|
| + typedef R(RunType)(A1, A2, A3, A4, A5, A6);
|
|
|
| Callback() : CallbackBase(NULL, NULL) { }
|
|
|
| - // We pass InvokerStorageHolder by const ref to avoid incurring an
|
| + // We pass BindStateHolder by const ref to avoid incurring an
|
| // unnecessary AddRef/Unref pair even though we will modify the object.
|
| // We cannot use a normal reference because the compiler will warn
|
| // since this is often used on a return value, which is a temporary.
|
| @@ -514,35 +531,46 @@ class Callback<R(A1, A2, A3, A4, A5, A6)> : public internal::CallbackBase {
|
| // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
|
| // return the exact Callback<> type. See base/bind.h for details.
|
| template <typename T>
|
| - Callback(const internal::InvokerStorageHolder<T>& invoker_holder)
|
| - : CallbackBase(
|
| - reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke),
|
| - &invoker_holder.invoker_storage_) {
|
| - COMPILE_ASSERT((is_same<PolymorphicInvoke,
|
| - typename T::Invoker::DoInvokeType>::value),
|
| - callback_type_does_not_match_bind_result);
|
| + Callback(const internal::BindStateHolder<T>& bind_state_holder)
|
| + : CallbackBase(NULL, &bind_state_holder.bind_state_) {
|
| + // Force the assignment to a location variable of PolymorphicInvoke
|
| + // so the compiler will typecheck that the passed in Run() method has
|
| + // the correct type.
|
| + PolymorphicInvoke invoke_func = &T::InvokerType::Run;
|
| + polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
|
| }
|
|
|
| bool Equals(const Callback& other) const {
|
| return CallbackBase::Equals(other);
|
| }
|
|
|
| - R Run(typename internal::ParamTraits<A1>::ForwardType a1,
|
| - typename internal::ParamTraits<A2>::ForwardType a2,
|
| - typename internal::ParamTraits<A3>::ForwardType a3,
|
| - typename internal::ParamTraits<A4>::ForwardType a4,
|
| - typename internal::ParamTraits<A5>::ForwardType a5,
|
| - typename internal::ParamTraits<A6>::ForwardType a6) const {
|
| + 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) const {
|
| PolymorphicInvoke f =
|
| reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
|
|
|
| - return f(invoker_storage_.get(), a1,
|
| + return f(bind_state_.get(), a1,
|
| a2,
|
| a3,
|
| a4,
|
| a5,
|
| a6);
|
| }
|
| +
|
| + 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);
|
| +
|
| };
|
|
|
|
|
|
|