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