15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file was GENERATED by command: 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pump.py callback.h.pump 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DO NOT EDIT BY HAND!!! 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_CALLBACK_H_ 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_CALLBACK_H_ 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_internal.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/template_util.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: Header files that do not require the full definition of Callback or 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Closure should #include "base/callback_forward.h" instead of this file. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Introduction 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The templated Callback class is a generalized function object. Together 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with the Bind() function in bind.h, they provide a type-safe method for 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// performing partial application of functions. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Partial application (or "currying") is the process of binding a subset of 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// a function's arguments to produce another function that takes fewer 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// arguments. This can be used to pass around a unit of delayed execution, 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// much like lexical closures are used in other languages. For example, it 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is used in Chromium code to schedule tasks on different MessageLoops. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A callback with no unbound input parameters (base::Callback<void(void)>) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is called a base::Closure. Note that this is NOT the same as what other 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// languages refer to as a closure -- it does not retain a reference to its 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// enclosing environment. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MEMORY MANAGEMENT AND PASSING 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The Callback objects themselves should be passed by const-reference, and 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// stored by copy. They internally store their state via a refcounted class 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and thus do not need to be deleted. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The reason to pass via a const-reference is to avoid unnecessary 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AddRef/Release pairs to the internal state. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Quick reference for basic stuff 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BINDING A BARE FUNCTION 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// int Return5() { return 5; } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::Callback<int(void)> func_cb = base::Bind(&Return5); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LOG(INFO) << func_cb.Run(); // Prints 5. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BINDING A CLASS METHOD 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The first argument to bind is the member function to call, the second is 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the object on which to call it. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class Ref : public base::RefCountedThreadSafe<Ref> { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// public: 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// int Foo() { return 3; } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void PrintBye() { LOG(INFO) << "bye."; } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// }; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// scoped_refptr<Ref> ref = new Ref(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::Callback<void(void)> ref_cb = base::Bind(&Ref::Foo, ref); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LOG(INFO) << ref_cb.Run(); // Prints out 3. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// By default the object must support RefCounted or you will get a compiler 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// error. If you're passing between threads, be sure it's 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RefCountedThreadSafe! See "Advanced binding of member functions" below if 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// you don't want to use reference counting. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RUNNING A CALLBACK 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Callbacks can be run with their "Run" method, which has the same 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// signature as the template argument to the callback. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void DoSomething(const base::Callback<void(int, std::string)>& callback) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// callback.Run(5, "hello"); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Callbacks can be run more than once (they don't get deleted or marked when 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// run). However, this precludes using base::Passed (see below). 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void DoSomething(const base::Callback<double(double)>& callback) { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// double myresult = callback.Run(3.14159); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// myresult += callback.Run(2.71828); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PASSING UNBOUND INPUT PARAMETERS 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Unbound parameters are specified at the time a callback is Run(). They are 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specified in the Callback template type: 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void MyFunc(int i, const std::string& str) {} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::Callback<void(int, const std::string&)> cb = base::Bind(&MyFunc); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cb.Run(23, "hello, world"); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PASSING BOUND INPUT PARAMETERS 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Bound parameters are specified when you create thee callback as arguments 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to Bind(). They will be passed to the function and the Run()ner of the 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// callback doesn't see those values or even know that the function it's 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// calling. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void MyFunc(int i, const std::string& str) {} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::Callback<void(void)> cb = base::Bind(&MyFunc, 23, "hello world"); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cb.Run(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A callback with no unbound input parameters (base::Callback<void(void)>) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is called a base::Closure. So we could have also written: 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::Closure cb = base::Bind(&MyFunc, 23, "hello world"); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When calling member functions, bound parameters just go after the object 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pointer. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::Closure cb = base::Bind(&MyClass::MyFunc, this, 23, "hello world"); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PARTIAL BINDING OF PARAMETERS 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// You can specify some parameters when you create the callback, and specify 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the rest when you execute the callback. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void MyFunc(int i, const std::string& str) {} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::Callback<void(const std::string&)> cb = base::Bind(&MyFunc, 23); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cb.Run("hello world"); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When calling a function bound parameters are first, followed by unbound 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// parameters. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Quick reference for advanced binding 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BINDING A CLASS METHOD WITH WEAK POINTERS 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::Bind(&MyClass::Foo, GetWeakPtr()); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// The callback will not be run if the object has already been destroyed. 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// DANGER: weak pointers are not threadsafe, so don't use this 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// when passing between threads! 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BINDING A CLASS METHOD WITH MANUAL LIFETIME MANAGEMENT 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::Bind(&MyClass::Foo, base::Unretained(this)); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This disables all lifetime management on the object. You're responsible 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for making sure the object is alive at the time of the call. You break it, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// you own it! 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BINDING A CLASS METHOD AND HAVING THE CALLBACK OWN THE CLASS 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MyClass* myclass = new MyClass; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::Bind(&MyClass::Foo, base::Owned(myclass)); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The object will be deleted when the callback is destroyed, even if it's 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not run (like if you post a task during shutdown). Potentially useful for 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "fire and forget" cases. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IGNORING RETURN VALUES 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sometimes you want to call a function that returns a value in a callback 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that doesn't expect a return value. 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// int DoSomething(int arg) { cout << arg << endl; } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::Callback<void<int>) cb = 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::Bind(base::IgnoreResult(&DoSomething)); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Quick reference for binding parameters to Bind() 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Bound parameters are specified as arguments to Bind() and are passed to the 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// function. A callback with no parameters or no unbound parameters is called a 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Closure (base::Callback<void(void)> and base::Closure are the same thing). 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PASSING PARAMETERS OWNED BY THE CALLBACK 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void Foo(int* arg) { cout << *arg << endl; } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// int* pn = new int(1); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::Closure foo_callback = base::Bind(&foo, base::Owned(pn)); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The parameter will be deleted when the callback is destroyed, even if it's 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not run (like if you post a task during shutdown). 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PASSING PARAMETERS AS A scoped_ptr 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void TakesOwnership(scoped_ptr<Foo> arg) {} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// scoped_ptr<Foo> f(new Foo); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // f becomes null during the following call. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::Closure cb = base::Bind(&TakesOwnership, base::Passed(&f)); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ownership of the parameter will be with the callback until the it is run, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// when ownership is passed to the callback function. This means the callback 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// can only be run once. If the callback is never run, it will delete the 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// object when it's destroyed. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PASSING PARAMETERS AS A scoped_refptr 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void TakesOneRef(scoped_refptr<Foo> arg) {} 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// scoped_refptr<Foo> f(new Foo) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::Closure cb = base::Bind(&TakesOneRef, f); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This should "just work." The closure will take a reference as long as it 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is alive, and another reference will be taken for the called function. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PASSING PARAMETERS BY REFERENCE 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Const references are *copied* unless ConstRef is used. Example: 218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// void foo(const int& arg) { printf("%d %p\n", arg, &arg); } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// int n = 1; 221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// base::Closure has_copy = base::Bind(&foo, n); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::Closure has_ref = base::Bind(&foo, base::ConstRef(n)); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// n = 2; 224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// foo(n); // Prints "2 0xaaaaaaaaaaaa" 225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// has_copy.Run(); // Prints "1 0xbbbbbbbbbbbb" 226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// has_ref.Run(); // Prints "2 0xaaaaaaaaaaaa" 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Normally parameters are copied in the closure. DANGER: ConstRef stores a 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// const reference instead, referencing the original parameter. This means 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that you must ensure the object outlives the callback! 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implementation notes 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WHERE IS THIS DESIGN FROM: 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The design Callback and Bind is heavily influenced by C++'s 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tr1::function/tr1::bind, and by the "Google Callback" system used inside 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Google. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HOW THE IMPLEMENTATION WORKS: 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are three main components to the system: 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1) The Callback classes. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2) The Bind() functions. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3) The arguments wrappers (e.g., Unretained() and ConstRef()). 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The Callback classes represent a generic function pointer. Internally, 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it stores a refcounted piece of state that represents the target function 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and all its bound parameters. Each Callback specialization has a templated 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// constructor that takes an BindState<>*. In the context of the constructor, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the static type of this BindState<> pointer uniquely identifies the 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// function it is representing, all its bound parameters, and a Run() method 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that is capable of invoking the target. 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Callback's constructor takes the BindState<>* that has the full static type 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and erases the target function type as well as the types of the bound 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// parameters. It does this by storing a pointer to the specific Run() 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// function, and upcasting the state of BindState<>* to a 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BindStateBase*. This is safe as long as this BindStateBase pointer 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is only used with the stored Run() pointer. 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To BindState<> objects are created inside the Bind() functions. 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These functions, along with a set of internal templates, are responsible for 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Unwrapping the function signature into return type, and parameters 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Determining the number of parameters that are bound 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Creating the BindState storing the bound parameters 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Performing compile-time asserts to avoid error-prone behavior 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Returning an Callback<> with an arity matching the number of unbound 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// parameters and that knows the correct refcounting semantics for the 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// target object if we are binding a method. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The Bind functions do the above using type-inference, and template 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specializations. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// By default Bind() will store copies of all bound parameters, and attempt 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to refcount a target object if the function being bound is a class method. 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These copies are created even if the function takes parameters as const 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// references. (Binding to non-const references is forbidden, see bind.h.) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To change this behavior, we introduce a set of argument wrappers 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (e.g., Unretained(), and ConstRef()). These are simple container templates 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that are passed by value, and wrap a pointer to argument. See the 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file-level comment in base/bind_helpers.h for more info. 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These types are passed to the Unwrap() functions, and the MaybeRefcount() 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// functions respectively to modify the behavior of Bind(). The Unwrap() 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and MaybeRefcount() functions change behavior by doing partial 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specialization based on whether or not a parameter is a wrapper type. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ConstRef() is similar to tr1::cref. Unretained() is specific to Chromium. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WHY NOT TR1 FUNCTION/BIND? 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Direct use of tr1::function and tr1::bind was considered, but ultimately 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// rejected because of the number of copy constructors invocations involved 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the binding of arguments during construction, and the forwarding of 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// arguments during invocation. These copies will no longer be an issue in 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// C++0x because C++0x will support rvalue reference allowing for the compiler 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to avoid these copies. However, waiting for C++0x is not an option. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Measured with valgrind on gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5), the 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tr1::bind call itself will invoke a non-trivial copy constructor three times 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for each bound parameter. Also, each when passing a tr1::function, each 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bound argument will be copied again. 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In addition to the copies taken at binding and invocation, copying a 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tr1::function causes a copy to be made of all the bound parameters and 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// state. 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Furthermore, in Chromium, it is desirable for the Callback to take a 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reference on a target object when representing a class method call. This 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is not supported by tr1. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Lastly, tr1::function and tr1::bind has a more general and flexible API. 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This includes things like argument reordering by use of 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tr1::bind::placeholder, support for non-const reference parameters, and some 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// limited amount of subtyping of the tr1::function object (e.g., 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tr1::function<int(int)> is convertible to tr1::function<void(int)>). 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These are not features that are required in Chromium. Some of them, such as 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// allowing for reference parameters, and subtyping of functions, may actually 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// become a source of errors. Removing support for these features actually 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// allows for a simpler implementation, and a terser Currying API. 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WHY NOT GOOGLE CALLBACKS? 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The Google callback system also does not support refcounting. Furthermore, 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// its implementation has a number of strange edge cases with respect to type 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// conversion of its arguments. In particular, the argument's constness must 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// at times match exactly the function signature, or the type-inference might 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// break. Given the above, writing a custom solution was easier. 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MISSING FUNCTIONALITY 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Invoking the return of Bind. Bind(&foo).Run() does not work; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Binding arrays to functions that take a non-const pointer. 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Example: 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void Foo(const char* ptr); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void Bar(char* ptr); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Bind(&Foo, "test"); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Bind(&Bar, "test"); // This fails because ptr is not const. 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// First, we forward declare the Callback class template. This informs the 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// compiler that the template only has 1 type parameter which is the function 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// signature that the Callback is representing. 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// After this, create template specializations for 0-7 parameters. Note that 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// even though the template typelist grows, the specialization still 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// only has one type: the function signature. 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If you are thinking of forward declaring Callback in your own header file, 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// please include "base/callback_forward.h" instead. 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Sig> 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Callback; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable, typename RunType, typename BoundArgsType> 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BindState; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R> 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Callback<R(void)> : public internal::CallbackBase { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback() : CallbackBase(NULL) { } 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this constructor CANNOT be explicit, and that Bind() CANNOT 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the exact Callback<> type. See base/bind.h for details. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename Runnable, typename BindRunType, typename BoundArgsType> 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback(internal::BindState<Runnable, BindRunType, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundArgsType>* bind_state) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CallbackBase(bind_state) { 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the assignment to a local variable of PolymorphicInvoke 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so the compiler will typecheck that the passed in Run() method has 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct type. 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke invoke_func = 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::BindState<Runnable, BindRunType, BoundArgsType> 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::InvokerType::Run; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const Callback& other) const { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallbackBase::Equals(other); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run() const { 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke f = 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f(bind_state_.get()); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(*PolymorphicInvoke)( 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::BindStateBase*); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1> 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Callback<R(A1)> : public internal::CallbackBase { 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(A1); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback() : CallbackBase(NULL) { } 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this constructor CANNOT be explicit, and that Bind() CANNOT 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the exact Callback<> type. See base/bind.h for details. 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename Runnable, typename BindRunType, typename BoundArgsType> 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback(internal::BindState<Runnable, BindRunType, 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundArgsType>* bind_state) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CallbackBase(bind_state) { 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the assignment to a local variable of PolymorphicInvoke 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so the compiler will typecheck that the passed in Run() method has 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct type. 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke invoke_func = 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::BindState<Runnable, BindRunType, BoundArgsType> 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::InvokerType::Run; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const Callback& other) const { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallbackBase::Equals(other); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1) const { 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke f = 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f(bind_state_.get(), internal::CallbackForward(a1)); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(*PolymorphicInvoke)( 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::BindStateBase*, 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A1>::ForwardType); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2> 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Callback<R(A1, A2)> : public internal::CallbackBase { 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(A1, A2); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback() : CallbackBase(NULL) { } 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this constructor CANNOT be explicit, and that Bind() CANNOT 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the exact Callback<> type. See base/bind.h for details. 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename Runnable, typename BindRunType, typename BoundArgsType> 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback(internal::BindState<Runnable, BindRunType, 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundArgsType>* bind_state) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CallbackBase(bind_state) { 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the assignment to a local variable of PolymorphicInvoke 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so the compiler will typecheck that the passed in Run() method has 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct type. 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke invoke_func = 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::BindState<Runnable, BindRunType, BoundArgsType> 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::InvokerType::Run; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const Callback& other) const { 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallbackBase::Equals(other); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType a2) const { 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke f = 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f(bind_state_.get(), internal::CallbackForward(a1), 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a2)); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(*PolymorphicInvoke)( 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::BindStateBase*, 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A1>::ForwardType, 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3> 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Callback<R(A1, A2, A3)> : public internal::CallbackBase { 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(A1, A2, A3); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback() : CallbackBase(NULL) { } 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this constructor CANNOT be explicit, and that Bind() CANNOT 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the exact Callback<> type. See base/bind.h for details. 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename Runnable, typename BindRunType, typename BoundArgsType> 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback(internal::BindState<Runnable, BindRunType, 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundArgsType>* bind_state) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CallbackBase(bind_state) { 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the assignment to a local variable of PolymorphicInvoke 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so the compiler will typecheck that the passed in Run() method has 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct type. 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke invoke_func = 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::BindState<Runnable, BindRunType, BoundArgsType> 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::InvokerType::Run; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const Callback& other) const { 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallbackBase::Equals(other); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType a2, 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType a3) const { 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke f = 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f(bind_state_.get(), internal::CallbackForward(a1), 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a2), 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a3)); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(*PolymorphicInvoke)( 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::BindStateBase*, 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A1>::ForwardType, 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType, 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4> 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Callback<R(A1, A2, A3, A4)> : public internal::CallbackBase { 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(A1, A2, A3, A4); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback() : CallbackBase(NULL) { } 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this constructor CANNOT be explicit, and that Bind() CANNOT 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the exact Callback<> type. See base/bind.h for details. 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename Runnable, typename BindRunType, typename BoundArgsType> 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback(internal::BindState<Runnable, BindRunType, 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundArgsType>* bind_state) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CallbackBase(bind_state) { 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the assignment to a local variable of PolymorphicInvoke 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so the compiler will typecheck that the passed in Run() method has 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct type. 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke invoke_func = 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::BindState<Runnable, BindRunType, BoundArgsType> 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::InvokerType::Run; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const Callback& other) const { 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallbackBase::Equals(other); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType a2, 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType a3, 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType a4) const { 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke f = 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f(bind_state_.get(), internal::CallbackForward(a1), 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a2), 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a3), 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a4)); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(*PolymorphicInvoke)( 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::BindStateBase*, 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A1>::ForwardType, 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType, 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType, 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4, 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A5> 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Callback<R(A1, A2, A3, A4, A5)> : public internal::CallbackBase { 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(A1, A2, A3, A4, A5); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback() : CallbackBase(NULL) { } 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this constructor CANNOT be explicit, and that Bind() CANNOT 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the exact Callback<> type. See base/bind.h for details. 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename Runnable, typename BindRunType, typename BoundArgsType> 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback(internal::BindState<Runnable, BindRunType, 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundArgsType>* bind_state) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CallbackBase(bind_state) { 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the assignment to a local variable of PolymorphicInvoke 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so the compiler will typecheck that the passed in Run() method has 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct type. 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke invoke_func = 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::BindState<Runnable, BindRunType, BoundArgsType> 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::InvokerType::Run; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const Callback& other) const { 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallbackBase::Equals(other); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType a2, 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType a3, 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType a4, 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A5>::ForwardType a5) const { 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke f = 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f(bind_state_.get(), internal::CallbackForward(a1), 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a2), 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a3), 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a4), 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a5)); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(*PolymorphicInvoke)( 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::BindStateBase*, 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A1>::ForwardType, 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType, 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType, 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType, 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A5>::ForwardType); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4, 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A5, typename A6> 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Callback<R(A1, A2, A3, A4, A5, A6)> : public internal::CallbackBase { 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(A1, A2, A3, A4, A5, A6); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback() : CallbackBase(NULL) { } 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this constructor CANNOT be explicit, and that Bind() CANNOT 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the exact Callback<> type. See base/bind.h for details. 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename Runnable, typename BindRunType, typename BoundArgsType> 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback(internal::BindState<Runnable, BindRunType, 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundArgsType>* bind_state) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CallbackBase(bind_state) { 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the assignment to a local variable of PolymorphicInvoke 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so the compiler will typecheck that the passed in Run() method has 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct type. 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke invoke_func = 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::BindState<Runnable, BindRunType, BoundArgsType> 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::InvokerType::Run; 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const Callback& other) const { 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallbackBase::Equals(other); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType a2, 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType a3, 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType a4, 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A5>::ForwardType a5, 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A6>::ForwardType a6) const { 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke f = 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f(bind_state_.get(), internal::CallbackForward(a1), 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a2), 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a3), 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a4), 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a5), 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a6)); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(*PolymorphicInvoke)( 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::BindStateBase*, 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A1>::ForwardType, 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType, 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType, 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType, 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A5>::ForwardType, 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A6>::ForwardType); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4, 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A5, typename A6, typename A7> 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Callback<R(A1, A2, A3, A4, A5, A6, A7)> : public internal::CallbackBase { 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(A1, A2, A3, A4, A5, A6, A7); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback() : CallbackBase(NULL) { } 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this constructor CANNOT be explicit, and that Bind() CANNOT 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the exact Callback<> type. See base/bind.h for details. 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename Runnable, typename BindRunType, typename BoundArgsType> 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback(internal::BindState<Runnable, BindRunType, 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundArgsType>* bind_state) 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CallbackBase(bind_state) { 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the assignment to a local variable of PolymorphicInvoke 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so the compiler will typecheck that the passed in Run() method has 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct type. 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke invoke_func = 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::BindState<Runnable, BindRunType, BoundArgsType> 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::InvokerType::Run; 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const Callback& other) const { 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallbackBase::Equals(other); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType a2, 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType a3, 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType a4, 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A5>::ForwardType a5, 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A6>::ForwardType a6, 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A7>::ForwardType a7) const { 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke f = 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f(bind_state_.get(), internal::CallbackForward(a1), 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a2), 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a3), 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a4), 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a5), 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a6), 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a7)); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(*PolymorphicInvoke)( 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::BindStateBase*, 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A1>::ForwardType, 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType, 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType, 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType, 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A5>::ForwardType, 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A6>::ForwardType, 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A7>::ForwardType); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 764116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Syntactic sugar to make Callback<void(void)> easier to declare since it 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// will be used in a lot of APIs with delayed execution. 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef Callback<void(void)> Closure; 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // BASE_CALLBACK_H 771