Disable crashing tests, my previous checkin to mark them flaky did not help.
[chromium-blink-merge.git] / base / callback.h
blob2e17ae9bf549e1257bc1866b8b6248bb6dba45de
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_
13 #pragma once
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.
22 // WHAT IS THIS:
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.
44 // EXAMPLE USAGE:
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> {
57 // public:
58 // int Foo() { return 3; }
59 // void PrintBye() { LOG(INFO) << "bye."; }
60 // };
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.
69 // *
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.
74 // */
75 // class NoRef {
76 // public:
77 // int Foo() { return 4; }
78 // void PrintWhy() { LOG(INFO) << "why???"; }
79 // };
80 // NoRef no_ref;
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; }
91 // int value = 1;
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.
97 // value = 2;
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
106 // Google.
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
141 // method.
143 // The Bind functions do the above using type-inference, and template
144 // specializations.
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
178 // state.
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.
208 // Example:
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.
214 namespace base {
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>
224 class Callback;
226 template <typename R>
227 class Callback<R(void)> : public internal::CallbackBase {
228 public:
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)
243 : CallbackBase(
244 reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke),
245 &invoker_holder.invoker_storage_) {
248 R Run() const {
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 {
258 public:
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)
274 : CallbackBase(
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 {
289 public:
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)
306 : CallbackBase(
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,
317 a2);
321 template <typename R, typename A1, typename A2, typename A3>
322 class Callback<R(A1, A2, A3)> : public internal::CallbackBase {
323 public:
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)
341 : CallbackBase(
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,
354 a3);
358 template <typename R, typename A1, typename A2, typename A3, typename A4>
359 class Callback<R(A1, A2, A3, A4)> : public internal::CallbackBase {
360 public:
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)
379 : CallbackBase(
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,
394 a4);
398 template <typename R, typename A1, typename A2, typename A3, typename A4,
399 typename A5>
400 class Callback<R(A1, A2, A3, A4, A5)> : public internal::CallbackBase {
401 public:
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)
421 : CallbackBase(
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,
438 a5);
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 {
445 public:
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)
466 : CallbackBase(
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,
485 a6);
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;
494 } // namespace base
496 #endif // BASE_CALLBACK_H