172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// This file was GENERATED by command:
272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//     pump.py callback.h.pump
372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// DO NOT EDIT BY HAND!!!
472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef BASE_CALLBACK_H_
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define BASE_CALLBACK_H_
133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/callback_internal.h"
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/callback_old.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// New, super-duper, unified Callback system.  This will eventually replace
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// NewRunnableMethod, NewRunnableFunction, CreateFunctor, and CreateCallback
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// systems currently in the Chromium code base.
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// WHAT IS THIS:
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// The templated Callback class is a generalized function object. Together
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// with the Bind() function in bind.h, they provide a type-safe method for
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// performing currying of arguments, and creating a "closure."
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// In programing languages, a closure is a first-class function where all its
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// parameters have been bound (usually via currying).  Closures are well
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// suited for representing, and passing around a unit of delayed execution.
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// They are used in Chromium code to schedule tasks on different MessageLoops.
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// MEMORY MANAGEMENT AND PASSING
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// The Callback objects themselves should be passed by const-reference, and
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// stored by copy. They internally store their state via a refcounted class
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// and thus do not need to be deleted.
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// The reason to pass via a const-reference is to avoid unnecessary
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// AddRef/Release pairs to the internal state.
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// EXAMPLE USAGE:
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// /* Binding a normal function. */
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// int Return5() { return 5; }
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// base::Callback<int(void)> func_cb = base::Bind(&Return5);
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// LOG(INFO) << func_cb.Run();  // Prints 5.
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// void PrintHi() { LOG(INFO) << "hi."; }
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// base::Closure void_func_cb = base::Bind(&PrintHi);
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// LOG(INFO) << void_func_cb.Run();  // Prints: hi.
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// /* Binding a class method. */
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// class Ref : public RefCountedThreadSafe<Ref> {
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//  public:
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//   int Foo() { return 3; }
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//   void PrintBye() { LOG(INFO) << "bye."; }
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// };
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// scoped_refptr<Ref> ref = new Ref();
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// base::Callback<int(void)> ref_cb = base::Bind(&Ref::Foo, ref.get());
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// LOG(INFO) << ref_cb.Run();  // Prints out 3.
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// base::Closure void_ref_cb = base::Bind(&Ref::PrintBye, ref.get());
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// void_ref_cb.Run();  // Prints: bye.
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// /* Binding a class method in a non-refcounted class.
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//  *
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//  * WARNING: You must be sure the referee outlives the callback!
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//  *          This is particularly important if you post a closure to a
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//  *          MessageLoop because then it becomes hard to know what the
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//  *          lifetime of the referee needs to be.
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//  */
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// class NoRef {
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//  public:
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//   int Foo() { return 4; }
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//   void PrintWhy() { LOG(INFO) << "why???"; }
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// };
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// NoRef no_ref;
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// base::Callback<int(void)> base::no_ref_cb =
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//     base::Bind(&NoRef::Foo, base::Unretained(&no_ref));
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// LOG(INFO) << ref_cb.Run();  // Prints out 4.
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// base::Closure void_no_ref_cb =
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//     base::Bind(&NoRef::PrintWhy, base::Unretained(no_ref));
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// void_no_ref_cb.Run();  // Prints: why???
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// /* Binding a reference. */
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// int Identity(int n) { return n; }
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// int value = 1;
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// base::Callback<int(void)> bound_copy_cb = base::Bind(&Identity, value);
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// base::Callback<int(void)> bound_ref_cb =
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//     base::Bind(&Identity, base::ConstRef(value));
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// LOG(INFO) << bound_copy_cb.Run();  // Prints 1.
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// LOG(INFO) << bound_ref_cb.Run();  // Prints 1.
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// value = 2;
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// LOG(INFO) << bound_copy_cb.Run();  // Prints 1.
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// LOG(INFO) << bound_ref_cb.Run();  // Prints 2.
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// WHERE IS THIS DESIGN FROM:
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// The design Callback and Bind is heavily influenced by C++'s
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// tr1::function/tr1::bind, and by the "Google Callback" system used inside
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Google.
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// HOW THE IMPLEMENTATION WORKS:
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// There are three main components to the system:
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//   1) The Callback classes.
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//   2) The Bind() functions.
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//   3) The arguments wrappers (eg., Unretained() and ConstRef()).
11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// The Callback classes represent a generic function pointer. Internally,
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// it stores a refcounted piece of state that represents the target function
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// and all its bound parameters.  Each Callback specialization has a templated
11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// constructor that takes an InvokerStorageHolder<> object.  In the context of
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// the constructor, the static type of this InvokerStorageHolder<> object
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// uniquely identifies the function it is representing, all its bound
12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// parameters, and a DoInvoke() that is capable of invoking the target.
12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Callback's constructor is takes the InvokerStorageHolder<> that has the
12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// full static type and erases the target function type, and the bound
12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// parameters.  It does this by storing a pointer to the specific DoInvoke()
12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// function, and upcasting the state of InvokerStorageHolder<> to a
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// InvokerStorageBase. This is safe as long as this InvokerStorageBase pointer
12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// is only used with the stored DoInvoke() pointer.
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// To create InvokerStorageHolder<> objects, we use the Bind() functions.
13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// These functions, along with a set of internal templates, are reponsible for
13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//  - Unwrapping the function signature into return type, and parameters
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//  - Determining the number of parameters that are bound
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//  - Creating the storage for the bound parameters
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//  - Performing compile-time asserts to avoid error-prone behavior
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//  - Returning an InvokerStorageHolder<> with an DoInvoke() that has an arity
13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//    matching the number of unbound parameters, and knows the correct
14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//    refcounting semantics for the target object if we are binding a class
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//    method.
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// The Bind functions do the above using type-inference, and template
14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// specializations.
14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// By default Bind() will store copies of all bound parameters, and attempt
14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// to refcount a target object if the function being bound is a class method.
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// To change this behavior, we introduce a set of argument wrappers
15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// (eg. Unretained(), and ConstRef()).  These are simple container templates
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// that are passed by value, and wrap a pointer to argument.  See the
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// file-level comment in base/bind_helpers.h for more info.
15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// These types are passed to the Unwrap() functions, and the MaybeRefcount()
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// functions respectively to modify the behavior of Bind().  The Unwrap()
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// and MaybeRefcount() functions change behavior by doing partial
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// specialization based on whether or not a parameter is a wrapper type.
15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// ConstRef() is similar to tr1::cref.  Unretained() is specific to Chromium.
16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// WHY NOT TR1 FUNCTION/BIND?
16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Direct use of tr1::function and tr1::bind was considered, but ultimately
16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// rejected because of the number of copy constructors invocations involved
16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// in the binding of arguments during construction, and the forwarding of
16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// arguments during invocation.  These copies will no longer be an issue in
16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// C++0x because C++0x will support rvalue reference allowing for the compiler
16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// to avoid these copies.  However, waiting for C++0x is not an option.
17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Measured with valgrind on gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5), the
17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// tr1::bind call itself will invoke a non-trivial copy constructor three times
17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// for each bound parameter.  Also, each when passing a tr1::function, each
17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// bound argument will be copied again.
17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// In addition to the copies taken at binding and invocation, copying a
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// tr1::function causes a copy to be made of all the bound parameters and
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// state.
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Furthermore, in Chromium, it is desirable for the Callback to take a
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// reference on a target object when representing a class method call.  This
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// is not supported by tr1.
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Lastly, tr1::function and tr1::bind has a more general and flexible API.
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// This includes things like argument reordering by use of
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// tr1::bind::placeholder, support for non-const reference parameters, and some
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// limited amount of subtyping of the tr1::function object (eg.,
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// tr1::function<int(int)> is convertible to tr1::function<void(int)>).
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// These are not features that are required in Chromium. Some of them, such as
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// allowing for reference parameters, and subtyping of functions, may actually
192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// become a source of errors. Removing support for these features actually
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// allows for a simpler implementation, and a terser Currying API.
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// WHY NOT GOOGLE CALLBACKS?
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// The Google callback system also does not support refcounting.  Furthermore,
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// its implementation has a number of strange edge cases with respect to type
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// conversion of its arguments.  In particular, the argument's constness must
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// at times match exactly the function signature, or the type-inference might
20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// break.  Given the above, writing a custom solution was easier.
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// MISSING FUNCTIONALITY
20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//  - Invoking the return of Bind.  Bind(&foo).Run() does not work;
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//  - Binding arrays to functions that take a non-const pointer.
20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//    Example:
20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//      void Foo(const char* ptr);
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//      void Bar(char* ptr);
21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//      Bind(&Foo, "test");
21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//      Bind(&Bar, "test");  // This fails because ptr is not const.
21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace base {
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// First, we forward declare the Callback class template. This informs the
21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// compiler that the template only has 1 type parameter which is the function
21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// signature that the Callback is representing.
21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen//
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// After this, create template specializations for 0-6 parameters. Note that
22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// even though the template typelist grows, the specialization still
22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// only has one type: the function signature.
22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsentemplate <typename Sig>
22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass Callback;
22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsentemplate <typename R>
227dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass Callback<R(void)> : public internal::CallbackBase {
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  typedef R(*PolymorphicInvoke)(
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      internal::InvokerStorageBase*);
23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
232dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback() : CallbackBase(NULL, NULL) { }
23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We pass InvokerStorageHolder by const ref to avoid incurring an
23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // unnecessary AddRef/Unref pair even though we will modify the object.
23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We cannot use a normal reference because the compiler will warn
23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // since this is often used on a return value, which is a temporary.
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  //
23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
24072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // return the exact Callback<> type.  See base/bind.h for details.
24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  template <typename T>
24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Callback(const internal::InvokerStorageHolder<T>& invoker_holder)
243dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : CallbackBase(
244dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke),
245dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          &invoker_holder.invoker_storage_) {
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
248dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  R Run() const {
249dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    PolymorphicInvoke f =
250dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
252dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return f(invoker_storage_.get());
253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsentemplate <typename R, typename A1>
257dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass Callback<R(A1)> : public internal::CallbackBase {
25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  typedef R(*PolymorphicInvoke)(
260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      internal::InvokerStorageBase*,
261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A1>::ForwardType);
26272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
263dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback() : CallbackBase(NULL, NULL) { }
26472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
26572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We pass InvokerStorageHolder by const ref to avoid incurring an
26672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // unnecessary AddRef/Unref pair even though we will modify the object.
26772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We cannot use a normal reference because the compiler will warn
26872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // since this is often used on a return value, which is a temporary.
26972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  //
27072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
27172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // return the exact Callback<> type.  See base/bind.h for details.
27272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  template <typename T>
27372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Callback(const internal::InvokerStorageHolder<T>& invoker_holder)
274dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : CallbackBase(
275dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke),
276dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          &invoker_holder.invoker_storage_) {
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  R Run(typename internal::ParamTraits<A1>::ForwardType a1) const {
280dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    PolymorphicInvoke f =
281dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return f(invoker_storage_.get(), a1);
284dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsentemplate <typename R, typename A1, typename A2>
288dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass Callback<R(A1, A2)> : public internal::CallbackBase {
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  typedef R(*PolymorphicInvoke)(
291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      internal::InvokerStorageBase*,
292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A1>::ForwardType,
293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A2>::ForwardType);
29472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
295dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback() : CallbackBase(NULL, NULL) { }
29672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
29772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We pass InvokerStorageHolder by const ref to avoid incurring an
29872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // unnecessary AddRef/Unref pair even though we will modify the object.
29972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We cannot use a normal reference because the compiler will warn
30072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // since this is often used on a return value, which is a temporary.
30172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  //
30272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
30372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // return the exact Callback<> type.  See base/bind.h for details.
30472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  template <typename T>
30572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Callback(const internal::InvokerStorageHolder<T>& invoker_holder)
306dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : CallbackBase(
307dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke),
308dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          &invoker_holder.invoker_storage_) {
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
31072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  R Run(typename internal::ParamTraits<A1>::ForwardType a1,
312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        typename internal::ParamTraits<A2>::ForwardType a2) const {
313dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    PolymorphicInvoke f =
314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
316dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return f(invoker_storage_.get(), a1,
317dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen             a2);
318dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsentemplate <typename R, typename A1, typename A2, typename A3>
322dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass Callback<R(A1, A2, A3)> : public internal::CallbackBase {
32372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  typedef R(*PolymorphicInvoke)(
325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      internal::InvokerStorageBase*,
326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A1>::ForwardType,
327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A2>::ForwardType,
328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A3>::ForwardType);
32972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
330dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback() : CallbackBase(NULL, NULL) { }
33172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
33272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We pass InvokerStorageHolder by const ref to avoid incurring an
33372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // unnecessary AddRef/Unref pair even though we will modify the object.
33472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We cannot use a normal reference because the compiler will warn
33572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // since this is often used on a return value, which is a temporary.
33672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  //
33772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
33872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // return the exact Callback<> type.  See base/bind.h for details.
33972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  template <typename T>
34072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Callback(const internal::InvokerStorageHolder<T>& invoker_holder)
341dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : CallbackBase(
342dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke),
343dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          &invoker_holder.invoker_storage_) {
34472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  R Run(typename internal::ParamTraits<A1>::ForwardType a1,
347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        typename internal::ParamTraits<A2>::ForwardType a2,
348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        typename internal::ParamTraits<A3>::ForwardType a3) const {
349dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    PolymorphicInvoke f =
350dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
352dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return f(invoker_storage_.get(), a1,
353dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen             a2,
354dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen             a3);
355dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsentemplate <typename R, typename A1, typename A2, typename A3, typename A4>
359dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass Callback<R(A1, A2, A3, A4)> : public internal::CallbackBase {
36072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  typedef R(*PolymorphicInvoke)(
362ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      internal::InvokerStorageBase*,
363ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A1>::ForwardType,
364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A2>::ForwardType,
365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A3>::ForwardType,
366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A4>::ForwardType);
36772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
368dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback() : CallbackBase(NULL, NULL) { }
36972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
37072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We pass InvokerStorageHolder by const ref to avoid incurring an
37172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // unnecessary AddRef/Unref pair even though we will modify the object.
37272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We cannot use a normal reference because the compiler will warn
37372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // since this is often used on a return value, which is a temporary.
37472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  //
37572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
37672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // return the exact Callback<> type.  See base/bind.h for details.
37772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  template <typename T>
37872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Callback(const internal::InvokerStorageHolder<T>& invoker_holder)
379dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : CallbackBase(
380dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke),
381dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          &invoker_holder.invoker_storage_) {
38272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  R Run(typename internal::ParamTraits<A1>::ForwardType a1,
385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        typename internal::ParamTraits<A2>::ForwardType a2,
386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        typename internal::ParamTraits<A3>::ForwardType a3,
387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        typename internal::ParamTraits<A4>::ForwardType a4) const {
388dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    PolymorphicInvoke f =
389dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
391dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return f(invoker_storage_.get(), a1,
392dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen             a2,
393dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen             a3,
394dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen             a4);
395dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsentemplate <typename R, typename A1, typename A2, typename A3, typename A4,
39972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    typename A5>
400dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass Callback<R(A1, A2, A3, A4, A5)> : public internal::CallbackBase {
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
402ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  typedef R(*PolymorphicInvoke)(
403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      internal::InvokerStorageBase*,
404ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A1>::ForwardType,
405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A2>::ForwardType,
406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A3>::ForwardType,
407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A4>::ForwardType,
408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A5>::ForwardType);
40972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
410dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback() : CallbackBase(NULL, NULL) { }
41172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
41272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We pass InvokerStorageHolder by const ref to avoid incurring an
41372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // unnecessary AddRef/Unref pair even though we will modify the object.
41472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We cannot use a normal reference because the compiler will warn
41572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // since this is often used on a return value, which is a temporary.
41672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  //
41772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
41872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // return the exact Callback<> type.  See base/bind.h for details.
41972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  template <typename T>
42072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Callback(const internal::InvokerStorageHolder<T>& invoker_holder)
421dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : CallbackBase(
422dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke),
423dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          &invoker_holder.invoker_storage_) {
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
42572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  R Run(typename internal::ParamTraits<A1>::ForwardType a1,
427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        typename internal::ParamTraits<A2>::ForwardType a2,
428ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        typename internal::ParamTraits<A3>::ForwardType a3,
429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        typename internal::ParamTraits<A4>::ForwardType a4,
430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        typename internal::ParamTraits<A5>::ForwardType a5) const {
431dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    PolymorphicInvoke f =
432dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
433dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
434dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return f(invoker_storage_.get(), a1,
435dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen             a2,
436dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen             a3,
437dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen             a4,
438dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen             a5);
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsentemplate <typename R, typename A1, typename A2, typename A3, typename A4,
44372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    typename A5, typename A6>
444dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass Callback<R(A1, A2, A3, A4, A5, A6)> : public internal::CallbackBase {
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  typedef R(*PolymorphicInvoke)(
447ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      internal::InvokerStorageBase*,
448ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A1>::ForwardType,
449ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A2>::ForwardType,
450ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A3>::ForwardType,
451ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A4>::ForwardType,
452ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A5>::ForwardType,
453ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          typename internal::ParamTraits<A6>::ForwardType);
45472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
455dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Callback() : CallbackBase(NULL, NULL) { }
45672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
45772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We pass InvokerStorageHolder by const ref to avoid incurring an
45872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // unnecessary AddRef/Unref pair even though we will modify the object.
45972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We cannot use a normal reference because the compiler will warn
46072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // since this is often used on a return value, which is a temporary.
46172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  //
46272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Note that this constructor CANNOT be explicit, and that Bind() CANNOT
46372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // return the exact Callback<> type.  See base/bind.h for details.
46472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  template <typename T>
46572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Callback(const internal::InvokerStorageHolder<T>& invoker_holder)
466dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : CallbackBase(
467dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          reinterpret_cast<InvokeFuncStorage>(&T::Invoker::DoInvoke),
468dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          &invoker_holder.invoker_storage_) {
46972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  R Run(typename internal::ParamTraits<A1>::ForwardType a1,
472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        typename internal::ParamTraits<A2>::ForwardType a2,
473ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        typename internal::ParamTraits<A3>::ForwardType a3,
474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        typename internal::ParamTraits<A4>::ForwardType a4,
475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        typename internal::ParamTraits<A5>::ForwardType a5,
476ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        typename internal::ParamTraits<A6>::ForwardType a6) const {
477dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    PolymorphicInvoke f =
478dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
479dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
480dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return f(invoker_storage_.get(), a1,
481dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen             a2,
482dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen             a3,
483dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen             a4,
484dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen             a5,
485dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen             a6);
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
49072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Syntactic sugar to make Callbacks<void(void)> easier to declare since it
49172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// will be used in a lot of APIs with delayed execution.
49272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsentypedef Callback<void(void)> Closure;
49372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
49472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace base
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // BASE_CALLBACK_H
497