| Index: base/callback.h
|
| ===================================================================
|
| --- base/callback.h (revision 114494)
|
| +++ base/callback.h (working copy)
|
| @@ -129,28 +129,29 @@
|
| // 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 BindState<>*. In the context of the constructor,
|
| -// the static type of this BindState<> pointer uniquely identifies the
|
| -// function it is representing, all its bound parameters, and a Run() method
|
| -// that is capable of invoking the target.
|
| +// 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 takes the BindState<>* that has the full static type
|
| -// and erases the target function type as well as the types of the bound
|
| -// parameters. It does this by storing a pointer to the specific Run()
|
| -// function, and upcasting the state of BindState<>* to a
|
| -// BindStateBase*. This is safe as long as this BindStateBase pointer
|
| -// is only used with the stored Run() pointer.
|
| +// 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 BindStateHolder<> to a
|
| +// BindStateBase. This is safe as long as this BindStateBase pointer
|
| +// is only used with the stored DoInvoke() pointer.
|
| //
|
| -// To BindState<> objects are created inside the Bind() functions.
|
| -// These functions, along with a set of internal templates, are responsible for
|
| +// 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 BindState storing the bound parameters
|
| +// - Creating the storage for the bound parameters
|
| // - Performing compile-time asserts to avoid error-prone behavior
|
| -// - Returning an Callback<> with an arity matching the number of unbound
|
| -// parameters and that knows the correct refcounting semantics for the
|
| -// target object if we are binding a method.
|
| +// - 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.
|
| //
|
| // The Bind functions do the above using type-inference, and template
|
| // specializations.
|
| @@ -238,30 +239,27 @@
|
| template <typename Sig>
|
| class Callback;
|
|
|
| -namespace internal {
|
| -template <typename Runnable, typename RunType, typename BoundArgsType>
|
| -struct BindState;
|
| -} // namespace internal
|
| -
|
| template <typename R>
|
| class Callback<R(void)> : public internal::CallbackBase {
|
| public:
|
| typedef R(RunType)();
|
|
|
| - Callback() : CallbackBase(NULL) { }
|
| + Callback() : CallbackBase(NULL, NULL) { }
|
|
|
| + // 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.
|
| + //
|
| // 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 RunType, typename BoundArgsType>
|
| - Callback(internal::BindState<Runnable, RunType, BoundArgsType>* bind_state)
|
| - : CallbackBase(bind_state) {
|
| -
|
| - // Force the assignment to a local variable of PolymorphicInvoke
|
| + template <typename T>
|
| + 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 =
|
| - &internal::BindState<Runnable, RunType, BoundArgsType>
|
| - ::InvokerType::Run;
|
| + PolymorphicInvoke invoke_func = &T::InvokerType::Run;
|
| polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
|
| }
|
|
|
| @@ -287,20 +285,22 @@
|
| public:
|
| typedef R(RunType)(A1);
|
|
|
| - Callback() : CallbackBase(NULL) { }
|
| + Callback() : CallbackBase(NULL, NULL) { }
|
|
|
| + // 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.
|
| + //
|
| // 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 RunType, typename BoundArgsType>
|
| - Callback(internal::BindState<Runnable, RunType, BoundArgsType>* bind_state)
|
| - : CallbackBase(bind_state) {
|
| -
|
| - // Force the assignment to a local variable of PolymorphicInvoke
|
| + template <typename T>
|
| + 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 =
|
| - &internal::BindState<Runnable, RunType, BoundArgsType>
|
| - ::InvokerType::Run;
|
| + PolymorphicInvoke invoke_func = &T::InvokerType::Run;
|
| polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
|
| }
|
|
|
| @@ -327,20 +327,22 @@
|
| public:
|
| typedef R(RunType)(A1, A2);
|
|
|
| - Callback() : CallbackBase(NULL) { }
|
| + Callback() : CallbackBase(NULL, NULL) { }
|
|
|
| + // 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.
|
| + //
|
| // 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 RunType, typename BoundArgsType>
|
| - Callback(internal::BindState<Runnable, RunType, BoundArgsType>* bind_state)
|
| - : CallbackBase(bind_state) {
|
| -
|
| - // Force the assignment to a local variable of PolymorphicInvoke
|
| + template <typename T>
|
| + 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 =
|
| - &internal::BindState<Runnable, RunType, BoundArgsType>
|
| - ::InvokerType::Run;
|
| + PolymorphicInvoke invoke_func = &T::InvokerType::Run;
|
| polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
|
| }
|
|
|
| @@ -370,20 +372,22 @@
|
| public:
|
| typedef R(RunType)(A1, A2, A3);
|
|
|
| - Callback() : CallbackBase(NULL) { }
|
| + Callback() : CallbackBase(NULL, NULL) { }
|
|
|
| + // 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.
|
| + //
|
| // 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 RunType, typename BoundArgsType>
|
| - Callback(internal::BindState<Runnable, RunType, BoundArgsType>* bind_state)
|
| - : CallbackBase(bind_state) {
|
| -
|
| - // Force the assignment to a local variable of PolymorphicInvoke
|
| + template <typename T>
|
| + 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 =
|
| - &internal::BindState<Runnable, RunType, BoundArgsType>
|
| - ::InvokerType::Run;
|
| + PolymorphicInvoke invoke_func = &T::InvokerType::Run;
|
| polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
|
| }
|
|
|
| @@ -416,20 +420,22 @@
|
| public:
|
| typedef R(RunType)(A1, A2, A3, A4);
|
|
|
| - Callback() : CallbackBase(NULL) { }
|
| + Callback() : CallbackBase(NULL, NULL) { }
|
|
|
| + // 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.
|
| + //
|
| // 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 RunType, typename BoundArgsType>
|
| - Callback(internal::BindState<Runnable, RunType, BoundArgsType>* bind_state)
|
| - : CallbackBase(bind_state) {
|
| -
|
| - // Force the assignment to a local variable of PolymorphicInvoke
|
| + template <typename T>
|
| + 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 =
|
| - &internal::BindState<Runnable, RunType, BoundArgsType>
|
| - ::InvokerType::Run;
|
| + PolymorphicInvoke invoke_func = &T::InvokerType::Run;
|
| polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
|
| }
|
|
|
| @@ -466,20 +472,22 @@
|
| public:
|
| typedef R(RunType)(A1, A2, A3, A4, A5);
|
|
|
| - Callback() : CallbackBase(NULL) { }
|
| + Callback() : CallbackBase(NULL, NULL) { }
|
|
|
| + // 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.
|
| + //
|
| // 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 RunType, typename BoundArgsType>
|
| - Callback(internal::BindState<Runnable, RunType, BoundArgsType>* bind_state)
|
| - : CallbackBase(bind_state) {
|
| -
|
| - // Force the assignment to a local variable of PolymorphicInvoke
|
| + template <typename T>
|
| + 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 =
|
| - &internal::BindState<Runnable, RunType, BoundArgsType>
|
| - ::InvokerType::Run;
|
| + PolymorphicInvoke invoke_func = &T::InvokerType::Run;
|
| polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
|
| }
|
|
|
| @@ -519,20 +527,22 @@
|
| public:
|
| typedef R(RunType)(A1, A2, A3, A4, A5, A6);
|
|
|
| - Callback() : CallbackBase(NULL) { }
|
| + Callback() : CallbackBase(NULL, NULL) { }
|
|
|
| + // 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.
|
| + //
|
| // 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 RunType, typename BoundArgsType>
|
| - Callback(internal::BindState<Runnable, RunType, BoundArgsType>* bind_state)
|
| - : CallbackBase(bind_state) {
|
| -
|
| - // Force the assignment to a local variable of PolymorphicInvoke
|
| + template <typename T>
|
| + 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 =
|
| - &internal::BindState<Runnable, RunType, BoundArgsType>
|
| - ::InvokerType::Run;
|
| + PolymorphicInvoke invoke_func = &T::InvokerType::Run;
|
| polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
|
| }
|
|
|
| @@ -575,20 +585,22 @@
|
| public:
|
| typedef R(RunType)(A1, A2, A3, A4, A5, A6, A7);
|
|
|
| - Callback() : CallbackBase(NULL) { }
|
| + Callback() : CallbackBase(NULL, NULL) { }
|
|
|
| + // 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.
|
| + //
|
| // 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 RunType, typename BoundArgsType>
|
| - Callback(internal::BindState<Runnable, RunType, BoundArgsType>* bind_state)
|
| - : CallbackBase(bind_state) {
|
| -
|
| - // Force the assignment to a local variable of PolymorphicInvoke
|
| + template <typename T>
|
| + 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 =
|
| - &internal::BindState<Runnable, RunType, BoundArgsType>
|
| - ::InvokerType::Run;
|
| + PolymorphicInvoke invoke_func = &T::InvokerType::Run;
|
| polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func);
|
| }
|
|
|
|
|