1 // This file was GENERATED by command:
2 // pump.py callback.h.pump
3 // DO NOT EDIT BY HAND!!!
7 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
8 // Use of this source code is governed by a BSD-style license that can be
9 // found in the LICENSE file.
11 #ifndef BASE_CALLBACK_H_
12 #define BASE_CALLBACK_H_
15 #include "base/callback_internal.h"
16 #include "base/callback_old.h"
18 // New, super-duper, unified Callback system. This will eventually replace
19 // NewRunnableMethod, NewRunnableFunction, CreateFunctor, and CreateCallback
20 // systems currently in the Chromium code base.
24 // The templated Callback class is a generalized function object. Together
25 // with the Bind() function in bind.h, they provide a type-safe method for
26 // performing currying of arguments, and creating a "closure."
28 // In programing languages, a closure is a first-class function where all its
29 // parameters have been bound (usually via currying). Closures are well
30 // suited for representing, and passing around a unit of delayed execution.
31 // They are used in Chromium code to schedule tasks on different MessageLoops.
34 // MEMORY MANAGEMENT AND PASSING
36 // The Callback objects themselves should be passed by const-reference, and
37 // stored by copy. They internally store their state via a refcounted class
38 // and thus do not need to be deleted.
40 // The reason to pass via a const-reference is to avoid unnecessary
41 // AddRef/Release pairs to the internal state.
46 // /* Binding a normal function. */
47 // int Return5() { return 5; }
48 // base::Callback<int(int)> func_cb = base::Bind(&Return5);
49 // LOG(INFO) << func_cb.Run(5); // Prints 5.
51 // void PrintHi() { LOG(INFO) << "hi."; }
52 // base::Closure void_func_cb = base::Bind(&PrintHi);
53 // LOG(INFO) << void_func_cb.Run(); // Prints: hi.
55 // /* Binding a class method. */
56 // class Ref : public RefCountedThreadSafe<Ref> {
58 // int Foo() { return 3; }
59 // void PrintBye() { LOG(INFO) << "bye."; }
61 // scoped_refptr<Ref> ref = new Ref();
62 // base::Callback<int(void)> ref_cb = base::Bind(&Ref::Foo, ref.get());
63 // LOG(INFO) << ref_cb.Run(); // Prints out 3.
65 // base::Closure void_ref_cb = base::Bind(&Ref::PrintBye, ref.get());
66 // void_ref_cb.Run(); // Prints: bye.
68 // /* Binding a class method in a non-refcounted class.
70 // * WARNING: You must be sure the referee outlives the callback!
71 // * This is particularly important if you post a closure to a
72 // * MessageLoop because then it becomes hard to know what the
73 // * lifetime of the referee needs to be.
77 // int Foo() { return 4; }
78 // void PrintWhy() { LOG(INFO) << "why???"; }
81 // base::Callback<int(void)> base::no_ref_cb =
82 // base::Bind(&NoRef::Foo, base::Unretained(&no_ref));
83 // LOG(INFO) << ref_cb.Run(); // Prints out 4.
85 // base::Closure void_no_ref_cb =
86 // base::Bind(&NoRef::PrintWhy, base::Unretained(no_ref));
87 // void_no_ref_cb.Run(); // Prints: why???
89 // /* Binding a reference. */
90 // int Identity(int n) { return n; }
92 // base::Callback<int(void)> bound_copy_cb = base::Bind(&Identity, value);
93 // base::Callback<int(void)> bound_ref_cb =
94 // base::Bind(&Identity, base::ConstRef(value));
95 // LOG(INFO) << bound_copy_cb.Run(); // Prints 1.
96 // LOG(INFO) << bound_ref_cb.Run(); // Prints 1.
98 // LOG(INFO) << bound_copy_cb.Run(); // Prints 1.
99 // LOG(INFO) << bound_ref_cb.Run(); // Prints 2.
102 // WHERE IS THIS DESIGN FROM:
104 // The design Callback and Bind is heavily influenced by C++'s
105 // tr1::function/tr1::bind, and by the "Google Callback" system used inside
109 // HOW THE IMPLEMENTATION WORKS:
111 // There are three main components to the system:
112 // 1) The Callback classes.
113 // 2) The Bind() functions.
114 // 3) The arguments wrappers (eg., Unretained() and ConstRef()).
116 // The Callback classes represent a generic function pointer. Internally,
117 // it stores a refcounted piece of state that represents the target function
118 // and all its bound parameters. Each Callback specialization has a templated
119 // constructor that takes an InvokerStorageHolder<> object. In the context of
120 // the constructor, the static type of this InvokerStorageHolder<> object
121 // uniquely identifies the function it is representing, all its bound
122 // parameters, and a DoInvoke() that is capable of invoking the target.
124 // Callback's constructor is takes the InvokerStorageHolder<> that has the
125 // full static type and erases the target function type, and the bound
126 // parameters. It does this by storing a pointer to the specific DoInvoke()
127 // function, and upcasting the state of InvokerStorageHolder<> to a
128 // InvokerStorageBase. This is safe as long as this InvokerStorageBase pointer
129 // is only used with the stored DoInvoke() pointer.
131 // To create InvokerStorageHolder<> objects, we use the Bind() functions.
132 // These functions, along with a set of internal templates, are reponsible for
134 // - Unwrapping the function signature into return type, and parameters
135 // - Determining the number of parameters that are bound
136 // - Creating the storage for the bound parameters
137 // - Performing compile-time asserts to avoid error-prone behavior
138 // - Returning an InvokerStorageHolder<> with an DoInvoke() that has an arity
139 // matching the number of unbound parameters, and knows the correct
140 // refcounting semantics for the target object if we are binding a class
143 // The Bind functions do the above using type-inference, and template
146 // By default Bind() will store copies of all bound parameters, and attempt
147 // to refcount a target object if the function being bound is a class method.
149 // To change this behavior, we introduce a set of argument wrappers
150 // (eg. Unretained(), and ConstRef()). These are simple container templates
151 // that are passed by value, and wrap a pointer to argument. See the
152 // file-level comment in base/bind_helpers.h for more info.
154 // These types are passed to the Unwrap() functions, and the MaybeRefcount()
155 // functions respectively to modify the behavior of Bind(). The Unwrap()
156 // and MaybeRefcount() functions change behavior by doing partial
157 // specialization based on whether or not a parameter is a wrapper type.
159 // ConstRef() is similar to tr1::cref. Unretained() is specific to Chromium.
162 // WHY NOT TR1 FUNCTION/BIND?
164 // Direct use of tr1::function and tr1::bind was considered, but ultimately
165 // rejected because of the number of copy constructors invocations involved
166 // in the binding of arguments during construction, and the forwarding of
167 // arguments during invocation. These copies will no longer be an issue in
168 // C++0x because C++0x will support rvalue reference allowing for the compiler
169 // to avoid these copies. However, waiting for C++0x is not an option.
171 // Measured with valgrind on gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5), the
172 // tr1::bind call itself will invoke a non-trivial copy constructor three times
173 // for each bound parameter. Also, each when passing a tr1::function, each
174 // bound argument will be copied again.
176 // In addition to the copies taken at binding and invocation, copying a
177 // tr1::function causes a copy to be made of all the bound parameters and
180 // Furthermore, in Chromium, it is desirable for the Callback to take a
181 // reference on a target object when representing a class method call. This
182 // is not supported by tr1.
184 // Lastly, tr1::function and tr1::bind has a more general and flexible API.
185 // This includes things like argument reordering by use of
186 // tr1::bind::placeholder, support for non-const reference parameters, and some
187 // limited amount of subtyping of the tr1::function object (eg.,
188 // tr1::function<int(int)> is convertible to tr1::function<void(int)>).
190 // These are not features that are required in Chromium. Some of them, such as
191 // allowing for reference parameters, and subtyping of functions, may actually
192 // because a source of errors. Removing support for these features actually
193 // allows for a simpler implementation, and a terser Currying API.
196 // WHY NOT GOOGLE CALLBACKS?
198 // The Google callback system also does not support refcounting. Furthermore,
199 // its implementation has a number of strange edge cases with respect to type
200 // conversion of its arguments. In particular, the argument's constness must
201 // at times match exactly the function signature, or the type-inference might
202 // break. Given the above, writing a custom solution was easier.
205 // MISSING FUNCTIONALITY
206 // - Invoking the return of Bind. Bind(&foo).Run() does not work;
207 // - Binding arrays to functions that take a non-const pointer.
209 // void Foo(const char* ptr);
210 // void Bar(char* ptr);
211 // Bind(&Foo, "test");
212 // Bind(&Bar, "test"); // This fails because ptr is not const.
216 // First, we forward declare the Callback class template. This informs the
217 // compiler that the template only has 1 type parameter which is the function
218 // signature that the Callback is representing.
220 // After this, create template specializations for 0-6 parameters. Note that
221 // even though the template typelist grows, the specialization still
222 // only has one type: the function signature.
223 template <typename Sig
>
226 template <typename R
>
227 class Callback
<R(void)> : public internal::CallbackBase
{
229 typedef R(*PolymorphicInvoke
)(
230 internal::InvokerStorageBase
*);
232 Callback() : CallbackBase(NULL
, NULL
) { }
234 // We pass InvokerStorageHolder by const ref to avoid incurring an
235 // unnecessary AddRef/Unref pair even though we will modify the object.
236 // We cannot use a normal reference because the compiler will warn
237 // since this is often used on a return value, which is a temporary.
239 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
240 // return the exact Callback<> type. See base/bind.h for details.
241 template <typename T
>
242 Callback(const internal::InvokerStorageHolder
<T
>& invoker_holder
)
244 reinterpret_cast<InvokeFuncStorage
>(&T::Invoker::DoInvoke
),
245 &invoker_holder
.invoker_storage_
) {
249 PolymorphicInvoke f
=
250 reinterpret_cast<PolymorphicInvoke
>(polymorphic_invoke_
);
252 return f(invoker_storage_
.get());
256 template <typename R
, typename A1
>
257 class Callback
<R(A1
)> : public internal::CallbackBase
{
259 typedef R(*PolymorphicInvoke
)(
260 internal::InvokerStorageBase
*,
261 typename
internal::ParamTraits
<A1
>::ForwardType
);
263 Callback() : CallbackBase(NULL
, NULL
) { }
265 // We pass InvokerStorageHolder by const ref to avoid incurring an
266 // unnecessary AddRef/Unref pair even though we will modify the object.
267 // We cannot use a normal reference because the compiler will warn
268 // since this is often used on a return value, which is a temporary.
270 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
271 // return the exact Callback<> type. See base/bind.h for details.
272 template <typename T
>
273 Callback(const internal::InvokerStorageHolder
<T
>& invoker_holder
)
275 reinterpret_cast<InvokeFuncStorage
>(&T::Invoker::DoInvoke
),
276 &invoker_holder
.invoker_storage_
) {
279 R
Run(typename
internal::ParamTraits
<A1
>::ForwardType a1
) const {
280 PolymorphicInvoke f
=
281 reinterpret_cast<PolymorphicInvoke
>(polymorphic_invoke_
);
283 return f(invoker_storage_
.get(), a1
);
287 template <typename R
, typename A1
, typename A2
>
288 class Callback
<R(A1
, A2
)> : public internal::CallbackBase
{
290 typedef R(*PolymorphicInvoke
)(
291 internal::InvokerStorageBase
*,
292 typename
internal::ParamTraits
<A1
>::ForwardType
,
293 typename
internal::ParamTraits
<A2
>::ForwardType
);
295 Callback() : CallbackBase(NULL
, NULL
) { }
297 // We pass InvokerStorageHolder by const ref to avoid incurring an
298 // unnecessary AddRef/Unref pair even though we will modify the object.
299 // We cannot use a normal reference because the compiler will warn
300 // since this is often used on a return value, which is a temporary.
302 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
303 // return the exact Callback<> type. See base/bind.h for details.
304 template <typename T
>
305 Callback(const internal::InvokerStorageHolder
<T
>& invoker_holder
)
307 reinterpret_cast<InvokeFuncStorage
>(&T::Invoker::DoInvoke
),
308 &invoker_holder
.invoker_storage_
) {
311 R
Run(typename
internal::ParamTraits
<A1
>::ForwardType a1
,
312 typename
internal::ParamTraits
<A2
>::ForwardType a2
) const {
313 PolymorphicInvoke f
=
314 reinterpret_cast<PolymorphicInvoke
>(polymorphic_invoke_
);
316 return f(invoker_storage_
.get(), a1
,
321 template <typename R
, typename A1
, typename A2
, typename A3
>
322 class Callback
<R(A1
, A2
, A3
)> : public internal::CallbackBase
{
324 typedef R(*PolymorphicInvoke
)(
325 internal::InvokerStorageBase
*,
326 typename
internal::ParamTraits
<A1
>::ForwardType
,
327 typename
internal::ParamTraits
<A2
>::ForwardType
,
328 typename
internal::ParamTraits
<A3
>::ForwardType
);
330 Callback() : CallbackBase(NULL
, NULL
) { }
332 // We pass InvokerStorageHolder by const ref to avoid incurring an
333 // unnecessary AddRef/Unref pair even though we will modify the object.
334 // We cannot use a normal reference because the compiler will warn
335 // since this is often used on a return value, which is a temporary.
337 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
338 // return the exact Callback<> type. See base/bind.h for details.
339 template <typename T
>
340 Callback(const internal::InvokerStorageHolder
<T
>& invoker_holder
)
342 reinterpret_cast<InvokeFuncStorage
>(&T::Invoker::DoInvoke
),
343 &invoker_holder
.invoker_storage_
) {
346 R
Run(typename
internal::ParamTraits
<A1
>::ForwardType a1
,
347 typename
internal::ParamTraits
<A2
>::ForwardType a2
,
348 typename
internal::ParamTraits
<A3
>::ForwardType a3
) const {
349 PolymorphicInvoke f
=
350 reinterpret_cast<PolymorphicInvoke
>(polymorphic_invoke_
);
352 return f(invoker_storage_
.get(), a1
,
358 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
>
359 class Callback
<R(A1
, A2
, A3
, A4
)> : public internal::CallbackBase
{
361 typedef R(*PolymorphicInvoke
)(
362 internal::InvokerStorageBase
*,
363 typename
internal::ParamTraits
<A1
>::ForwardType
,
364 typename
internal::ParamTraits
<A2
>::ForwardType
,
365 typename
internal::ParamTraits
<A3
>::ForwardType
,
366 typename
internal::ParamTraits
<A4
>::ForwardType
);
368 Callback() : CallbackBase(NULL
, NULL
) { }
370 // We pass InvokerStorageHolder by const ref to avoid incurring an
371 // unnecessary AddRef/Unref pair even though we will modify the object.
372 // We cannot use a normal reference because the compiler will warn
373 // since this is often used on a return value, which is a temporary.
375 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
376 // return the exact Callback<> type. See base/bind.h for details.
377 template <typename T
>
378 Callback(const internal::InvokerStorageHolder
<T
>& invoker_holder
)
380 reinterpret_cast<InvokeFuncStorage
>(&T::Invoker::DoInvoke
),
381 &invoker_holder
.invoker_storage_
) {
384 R
Run(typename
internal::ParamTraits
<A1
>::ForwardType a1
,
385 typename
internal::ParamTraits
<A2
>::ForwardType a2
,
386 typename
internal::ParamTraits
<A3
>::ForwardType a3
,
387 typename
internal::ParamTraits
<A4
>::ForwardType a4
) const {
388 PolymorphicInvoke f
=
389 reinterpret_cast<PolymorphicInvoke
>(polymorphic_invoke_
);
391 return f(invoker_storage_
.get(), a1
,
398 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
400 class Callback
<R(A1
, A2
, A3
, A4
, A5
)> : public internal::CallbackBase
{
402 typedef R(*PolymorphicInvoke
)(
403 internal::InvokerStorageBase
*,
404 typename
internal::ParamTraits
<A1
>::ForwardType
,
405 typename
internal::ParamTraits
<A2
>::ForwardType
,
406 typename
internal::ParamTraits
<A3
>::ForwardType
,
407 typename
internal::ParamTraits
<A4
>::ForwardType
,
408 typename
internal::ParamTraits
<A5
>::ForwardType
);
410 Callback() : CallbackBase(NULL
, NULL
) { }
412 // We pass InvokerStorageHolder by const ref to avoid incurring an
413 // unnecessary AddRef/Unref pair even though we will modify the object.
414 // We cannot use a normal reference because the compiler will warn
415 // since this is often used on a return value, which is a temporary.
417 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
418 // return the exact Callback<> type. See base/bind.h for details.
419 template <typename T
>
420 Callback(const internal::InvokerStorageHolder
<T
>& invoker_holder
)
422 reinterpret_cast<InvokeFuncStorage
>(&T::Invoker::DoInvoke
),
423 &invoker_holder
.invoker_storage_
) {
426 R
Run(typename
internal::ParamTraits
<A1
>::ForwardType a1
,
427 typename
internal::ParamTraits
<A2
>::ForwardType a2
,
428 typename
internal::ParamTraits
<A3
>::ForwardType a3
,
429 typename
internal::ParamTraits
<A4
>::ForwardType a4
,
430 typename
internal::ParamTraits
<A5
>::ForwardType a5
) const {
431 PolymorphicInvoke f
=
432 reinterpret_cast<PolymorphicInvoke
>(polymorphic_invoke_
);
434 return f(invoker_storage_
.get(), a1
,
442 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
443 typename A5
, typename A6
>
444 class Callback
<R(A1
, A2
, A3
, A4
, A5
, A6
)> : public internal::CallbackBase
{
446 typedef R(*PolymorphicInvoke
)(
447 internal::InvokerStorageBase
*,
448 typename
internal::ParamTraits
<A1
>::ForwardType
,
449 typename
internal::ParamTraits
<A2
>::ForwardType
,
450 typename
internal::ParamTraits
<A3
>::ForwardType
,
451 typename
internal::ParamTraits
<A4
>::ForwardType
,
452 typename
internal::ParamTraits
<A5
>::ForwardType
,
453 typename
internal::ParamTraits
<A6
>::ForwardType
);
455 Callback() : CallbackBase(NULL
, NULL
) { }
457 // We pass InvokerStorageHolder by const ref to avoid incurring an
458 // unnecessary AddRef/Unref pair even though we will modify the object.
459 // We cannot use a normal reference because the compiler will warn
460 // since this is often used on a return value, which is a temporary.
462 // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
463 // return the exact Callback<> type. See base/bind.h for details.
464 template <typename T
>
465 Callback(const internal::InvokerStorageHolder
<T
>& invoker_holder
)
467 reinterpret_cast<InvokeFuncStorage
>(&T::Invoker::DoInvoke
),
468 &invoker_holder
.invoker_storage_
) {
471 R
Run(typename
internal::ParamTraits
<A1
>::ForwardType a1
,
472 typename
internal::ParamTraits
<A2
>::ForwardType a2
,
473 typename
internal::ParamTraits
<A3
>::ForwardType a3
,
474 typename
internal::ParamTraits
<A4
>::ForwardType a4
,
475 typename
internal::ParamTraits
<A5
>::ForwardType a5
,
476 typename
internal::ParamTraits
<A6
>::ForwardType a6
) const {
477 PolymorphicInvoke f
=
478 reinterpret_cast<PolymorphicInvoke
>(polymorphic_invoke_
);
480 return f(invoker_storage_
.get(), a1
,
490 // Syntactic sugar to make Callbacks<void(void)> easier to declare since it
491 // will be used in a lot of APIs with delayed execution.
492 typedef Callback
<void(void)> Closure
;
496 #endif // BASE_CALLBACK_H