Chromium Code Reviews| Index: base/callback.h.pump |
| diff --git a/base/callback.h.pump b/base/callback.h.pump |
| index aa43ad525bc3137ac60e4c6685e72c71815577f8..78f8cede3b1e932aa87503425ed3fca077d9e808 100644 |
| --- a/base/callback.h.pump |
| +++ b/base/callback.h.pump |
| @@ -130,29 +130,28 @@ $var MAX_ARITY = 7 |
| // 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 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 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 create BindStateHolder<> objects, we use the Bind() functions. |
| +// 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. |
| +// |
| +// 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. |
| +// |
| +// To BindState<> objects are created inside the Bind() functions. |
| // These functions, along with a set of internal templates, are reponsible for |
|
akalin
2011/12/02 18:54:45
reponsible -> responsible
awong
2011/12/06 00:21:12
Done.
|
| // |
| // - Unwrapping the function signature into return type, and parameters |
| // - Determining the number of parameters that are bound |
| -// - Creating the storage for the bound parameters |
| +// - Creating the BindState storing the bound parameters |
| // - Performing compile-time asserts to avoid error-prone behavior |
| -// - 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. |
| +// - 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. |
| // |
| // The Bind functions do the above using type-inference, and template |
| // specializations. |
| @@ -237,6 +236,11 @@ namespace base { |
| template <typename Sig> |
| class Callback; |
| +namespace internal { |
| +template <typename Runnable, typename RunType, typename BoundArgsType> |
| +struct BindState; |
| +} // namespace internal |
| + |
| $range ARITY 0..MAX_ARITY |
| $for ARITY [[ |
| @@ -253,22 +257,20 @@ class Callback<R($for ARG , [[A$(ARG)]])> : public internal::CallbackBase { |
| public: |
| typedef R(RunType)($for ARG , [[A$(ARG)]]); |
| - Callback() : CallbackBase(NULL, NULL) { } |
| + Callback() : CallbackBase(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 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 |
| + 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 |
| // so the compiler will typecheck that the passed in Run() method has |
| // the correct type. |
| - PolymorphicInvoke invoke_func = &T::InvokerType::Run; |
| + PolymorphicInvoke invoke_func = |
| + &internal::BindState<Runnable, RunType, BoundArgsType> |
| + ::InvokerType::Run; |
| polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); |
| } |