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)// 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The callback will not be issued if the object is destroyed at the time 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it's issued. 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)// 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void foo(int arg) { cout << arg << endl } 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// int n = 1; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::Closure has_ref = base::Bind(&foo, base::ConstRef(n)); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// n = 2; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// has_ref.Run(); // Prints "2" 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Normally parameters are copied in the closure. DANGER: ConstRef stores a 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// const reference instead, referencing the original parameter. This means 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that you must ensure the object outlives the callback! 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implementation notes 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WHERE IS THIS DESIGN FROM: 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The design Callback and Bind is heavily influenced by C++'s 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tr1::function/tr1::bind, and by the "Google Callback" system used inside 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Google. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HOW THE IMPLEMENTATION WORKS: 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are three main components to the system: 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1) The Callback classes. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2) The Bind() functions. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3) The arguments wrappers (e.g., Unretained() and ConstRef()). 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The Callback classes represent a generic function pointer. Internally, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it stores a refcounted piece of state that represents the target function 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and all its bound parameters. Each Callback specialization has a templated 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// constructor that takes an BindState<>*. In the context of the constructor, 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the static type of this BindState<> pointer uniquely identifies the 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// function it is representing, all its bound parameters, and a Run() method 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that is capable of invoking the target. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Callback's constructor takes the BindState<>* that has the full static type 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and erases the target function type as well as the types of the bound 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// parameters. It does this by storing a pointer to the specific Run() 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// function, and upcasting the state of BindState<>* to a 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BindStateBase*. This is safe as long as this BindStateBase pointer 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is only used with the stored Run() pointer. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To BindState<> objects are created inside the Bind() functions. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These functions, along with a set of internal templates, are responsible for 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Unwrapping the function signature into return type, and parameters 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Determining the number of parameters that are bound 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Creating the BindState storing the bound parameters 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Performing compile-time asserts to avoid error-prone behavior 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Returning an Callback<> with an arity matching the number of unbound 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// parameters and that knows the correct refcounting semantics for the 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// target object if we are binding a method. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The Bind functions do the above using type-inference, and template 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specializations. 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// By default Bind() will store copies of all bound parameters, and attempt 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to refcount a target object if the function being bound is a class method. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These copies are created even if the function takes parameters as const 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// references. (Binding to non-const references is forbidden, see bind.h.) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To change this behavior, we introduce a set of argument wrappers 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (e.g., Unretained(), and ConstRef()). These are simple container templates 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that are passed by value, and wrap a pointer to argument. See the 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// file-level comment in base/bind_helpers.h for more info. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These types are passed to the Unwrap() functions, and the MaybeRefcount() 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// functions respectively to modify the behavior of Bind(). The Unwrap() 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and MaybeRefcount() functions change behavior by doing partial 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specialization based on whether or not a parameter is a wrapper type. 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ConstRef() is similar to tr1::cref. Unretained() is specific to Chromium. 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WHY NOT TR1 FUNCTION/BIND? 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Direct use of tr1::function and tr1::bind was considered, but ultimately 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// rejected because of the number of copy constructors invocations involved 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the binding of arguments during construction, and the forwarding of 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// arguments during invocation. These copies will no longer be an issue in 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// C++0x because C++0x will support rvalue reference allowing for the compiler 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to avoid these copies. However, waiting for C++0x is not an option. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Measured with valgrind on gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5), the 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tr1::bind call itself will invoke a non-trivial copy constructor three times 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for each bound parameter. Also, each when passing a tr1::function, each 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bound argument will be copied again. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In addition to the copies taken at binding and invocation, copying a 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tr1::function causes a copy to be made of all the bound parameters and 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// state. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Furthermore, in Chromium, it is desirable for the Callback to take a 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reference on a target object when representing a class method call. This 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is not supported by tr1. 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Lastly, tr1::function and tr1::bind has a more general and flexible API. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This includes things like argument reordering by use of 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tr1::bind::placeholder, support for non-const reference parameters, and some 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// limited amount of subtyping of the tr1::function object (e.g., 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tr1::function<int(int)> is convertible to tr1::function<void(int)>). 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These are not features that are required in Chromium. Some of them, such as 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// allowing for reference parameters, and subtyping of functions, may actually 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// become a source of errors. Removing support for these features actually 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// allows for a simpler implementation, and a terser Currying API. 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WHY NOT GOOGLE CALLBACKS? 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The Google callback system also does not support refcounting. Furthermore, 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// its implementation has a number of strange edge cases with respect to type 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// conversion of its arguments. In particular, the argument's constness must 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// at times match exactly the function signature, or the type-inference might 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// break. Given the above, writing a custom solution was easier. 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MISSING FUNCTIONALITY 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Invoking the return of Bind. Bind(&foo).Run() does not work; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Binding arrays to functions that take a non-const pointer. 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Example: 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void Foo(const char* ptr); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void Bar(char* ptr); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Bind(&Foo, "test"); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Bind(&Bar, "test"); // This fails because ptr is not const. 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// First, we forward declare the Callback class template. This informs the 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// compiler that the template only has 1 type parameter which is the function 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// signature that the Callback is representing. 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// After this, create template specializations for 0-7 parameters. Note that 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// even though the template typelist grows, the specialization still 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// only has one type: the function signature. 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If you are thinking of forward declaring Callback in your own header file, 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// please include "base/callback_forward.h" instead. 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Sig> 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Callback; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable, typename RunType, typename BoundArgsType> 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BindState; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R> 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Callback<R(void)> : public internal::CallbackBase { 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback() : CallbackBase(NULL) { } 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this constructor CANNOT be explicit, and that Bind() CANNOT 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the exact Callback<> type. See base/bind.h for details. 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename Runnable, typename BindRunType, typename BoundArgsType> 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback(internal::BindState<Runnable, BindRunType, 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundArgsType>* bind_state) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CallbackBase(bind_state) { 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the assignment to a local variable of PolymorphicInvoke 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so the compiler will typecheck that the passed in Run() method has 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct type. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke invoke_func = 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::BindState<Runnable, BindRunType, BoundArgsType> 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::InvokerType::Run; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const Callback& other) const { 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallbackBase::Equals(other); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run() const { 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke f = 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f(bind_state_.get()); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(*PolymorphicInvoke)( 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::BindStateBase*); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1> 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Callback<R(A1)> : public internal::CallbackBase { 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(A1); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback() : CallbackBase(NULL) { } 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this constructor CANNOT be explicit, and that Bind() CANNOT 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the exact Callback<> type. See base/bind.h for details. 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename Runnable, typename BindRunType, typename BoundArgsType> 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback(internal::BindState<Runnable, BindRunType, 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundArgsType>* bind_state) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CallbackBase(bind_state) { 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the assignment to a local variable of PolymorphicInvoke 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so the compiler will typecheck that the passed in Run() method has 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct type. 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke invoke_func = 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::BindState<Runnable, BindRunType, BoundArgsType> 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::InvokerType::Run; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const Callback& other) const { 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallbackBase::Equals(other); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1) const { 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke f = 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f(bind_state_.get(), internal::CallbackForward(a1)); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(*PolymorphicInvoke)( 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::BindStateBase*, 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A1>::ForwardType); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2> 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Callback<R(A1, A2)> : public internal::CallbackBase { 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(A1, A2); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback() : CallbackBase(NULL) { } 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this constructor CANNOT be explicit, and that Bind() CANNOT 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the exact Callback<> type. See base/bind.h for details. 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename Runnable, typename BindRunType, typename BoundArgsType> 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback(internal::BindState<Runnable, BindRunType, 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundArgsType>* bind_state) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CallbackBase(bind_state) { 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the assignment to a local variable of PolymorphicInvoke 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so the compiler will typecheck that the passed in Run() method has 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct type. 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke invoke_func = 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::BindState<Runnable, BindRunType, BoundArgsType> 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::InvokerType::Run; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const Callback& other) const { 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallbackBase::Equals(other); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType a2) const { 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke f = 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f(bind_state_.get(), internal::CallbackForward(a1), 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a2)); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(*PolymorphicInvoke)( 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::BindStateBase*, 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A1>::ForwardType, 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3> 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Callback<R(A1, A2, A3)> : public internal::CallbackBase { 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(A1, A2, A3); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback() : CallbackBase(NULL) { } 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this constructor CANNOT be explicit, and that Bind() CANNOT 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the exact Callback<> type. See base/bind.h for details. 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename Runnable, typename BindRunType, typename BoundArgsType> 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback(internal::BindState<Runnable, BindRunType, 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundArgsType>* bind_state) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CallbackBase(bind_state) { 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the assignment to a local variable of PolymorphicInvoke 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so the compiler will typecheck that the passed in Run() method has 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct type. 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke invoke_func = 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::BindState<Runnable, BindRunType, BoundArgsType> 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::InvokerType::Run; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const Callback& other) const { 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallbackBase::Equals(other); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType a2, 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType a3) const { 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke f = 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f(bind_state_.get(), internal::CallbackForward(a1), 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a2), 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a3)); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(*PolymorphicInvoke)( 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::BindStateBase*, 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A1>::ForwardType, 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType, 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4> 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Callback<R(A1, A2, A3, A4)> : public internal::CallbackBase { 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(A1, A2, A3, A4); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback() : CallbackBase(NULL) { } 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this constructor CANNOT be explicit, and that Bind() CANNOT 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the exact Callback<> type. See base/bind.h for details. 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename Runnable, typename BindRunType, typename BoundArgsType> 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback(internal::BindState<Runnable, BindRunType, 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundArgsType>* bind_state) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CallbackBase(bind_state) { 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the assignment to a local variable of PolymorphicInvoke 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so the compiler will typecheck that the passed in Run() method has 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct type. 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke invoke_func = 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::BindState<Runnable, BindRunType, BoundArgsType> 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::InvokerType::Run; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const Callback& other) const { 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallbackBase::Equals(other); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType a2, 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType a3, 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType a4) const { 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke f = 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f(bind_state_.get(), internal::CallbackForward(a1), 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a2), 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a3), 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a4)); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(*PolymorphicInvoke)( 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::BindStateBase*, 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A1>::ForwardType, 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType, 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType, 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4, 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A5> 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Callback<R(A1, A2, A3, A4, A5)> : public internal::CallbackBase { 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(A1, A2, A3, A4, A5); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback() : CallbackBase(NULL) { } 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this constructor CANNOT be explicit, and that Bind() CANNOT 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the exact Callback<> type. See base/bind.h for details. 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename Runnable, typename BindRunType, typename BoundArgsType> 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback(internal::BindState<Runnable, BindRunType, 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundArgsType>* bind_state) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CallbackBase(bind_state) { 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the assignment to a local variable of PolymorphicInvoke 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so the compiler will typecheck that the passed in Run() method has 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct type. 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke invoke_func = 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::BindState<Runnable, BindRunType, BoundArgsType> 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::InvokerType::Run; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const Callback& other) const { 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallbackBase::Equals(other); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType a2, 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType a3, 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType a4, 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A5>::ForwardType a5) const { 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke f = 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f(bind_state_.get(), internal::CallbackForward(a1), 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a2), 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a3), 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a4), 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a5)); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(*PolymorphicInvoke)( 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::BindStateBase*, 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A1>::ForwardType, 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType, 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType, 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType, 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A5>::ForwardType); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4, 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A5, typename A6> 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Callback<R(A1, A2, A3, A4, A5, A6)> : public internal::CallbackBase { 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(A1, A2, A3, A4, A5, A6); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback() : CallbackBase(NULL) { } 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this constructor CANNOT be explicit, and that Bind() CANNOT 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the exact Callback<> type. See base/bind.h for details. 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename Runnable, typename BindRunType, typename BoundArgsType> 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback(internal::BindState<Runnable, BindRunType, 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundArgsType>* bind_state) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CallbackBase(bind_state) { 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the assignment to a local variable of PolymorphicInvoke 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so the compiler will typecheck that the passed in Run() method has 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct type. 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke invoke_func = 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::BindState<Runnable, BindRunType, BoundArgsType> 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::InvokerType::Run; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const Callback& other) const { 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallbackBase::Equals(other); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType a2, 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType a3, 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType a4, 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A5>::ForwardType a5, 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A6>::ForwardType a6) const { 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke f = 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f(bind_state_.get(), internal::CallbackForward(a1), 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a2), 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a3), 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a4), 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a5), 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a6)); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(*PolymorphicInvoke)( 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::BindStateBase*, 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A1>::ForwardType, 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType, 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType, 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType, 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A5>::ForwardType, 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A6>::ForwardType); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4, 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A5, typename A6, typename A7> 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Callback<R(A1, A2, A3, A4, A5, A6, A7)> : public internal::CallbackBase { 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(A1, A2, A3, A4, A5, A6, A7); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback() : CallbackBase(NULL) { } 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this constructor CANNOT be explicit, and that Bind() CANNOT 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the exact Callback<> type. See base/bind.h for details. 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename Runnable, typename BindRunType, typename BoundArgsType> 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Callback(internal::BindState<Runnable, BindRunType, 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundArgsType>* bind_state) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CallbackBase(bind_state) { 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the assignment to a local variable of PolymorphicInvoke 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so the compiler will typecheck that the passed in Run() method has 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct type. 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke invoke_func = 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &internal::BindState<Runnable, BindRunType, BoundArgsType> 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::InvokerType::Run; 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const Callback& other) const { 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CallbackBase::Equals(other); 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType a2, 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType a3, 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType a4, 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A5>::ForwardType a5, 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A6>::ForwardType a6, 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A7>::ForwardType a7) const { 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolymorphicInvoke f = 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f(bind_state_.get(), internal::CallbackForward(a1), 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a2), 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a3), 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a4), 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a5), 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a6), 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::CallbackForward(a7)); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(*PolymorphicInvoke)( 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::BindStateBase*, 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A1>::ForwardType, 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A2>::ForwardType, 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A3>::ForwardType, 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A4>::ForwardType, 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A5>::ForwardType, 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A6>::ForwardType, 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename internal::CallbackParamTraits<A7>::ForwardType); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Syntactic sugar to make Callbacks<void(void)> easier to declare since it 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// will be used in a lot of APIs with delayed execution. 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef Callback<void(void)> Closure; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // BASE_CALLBACK_H 766