1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// This file was GENERATED by command: 2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// pump.py callback.h.pump 3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// DO NOT EDIT BY HAND!!! 4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/* 6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Copyright 2012 The WebRTC Project Authors. All rights reserved. 7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * 8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * Use of this source code is governed by a BSD-style license 9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * in the file PATENTS. All contributing project authors may 12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */ 14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// To generate callback.h from callback.h.pump, execute: 16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// /home/build/google3/third_party/gtest/scripts/pump.py callback.h.pump 17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Callbacks are callable object containers. They can hold a function pointer 19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// or a function object and behave like a value type. Internally, data is 20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// reference-counted, making copies and pass-by-value inexpensive. 21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// 22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Callbacks are typed using template arguments. The format is: 23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// CallbackN<ReturnType, ParamType1, ..., ParamTypeN> 24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// where N is the number of arguments supplied to the callable object. 25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Callbacks are invoked using operator(), just like a function or a function 26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// object. Default-constructed callbacks are "empty," and executing an empty 27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// callback does nothing. A callback can be made empty by assigning it from 28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// a default-constructed callback. 29f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// 30f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Callbacks are similar in purpose to std::function (which isn't available on 31f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// all platforms we support) and a lightweight alternative to sigslots. Since 32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// they effectively hide the type of the object they call, they're useful in 33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// breaking dependencies between objects that need to interact with one another. 34f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Notably, they can hold the results of Bind(), std::bind*, etc, without 35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// needing 36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// to know the resulting object type of those calls. 37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// 38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Sigslots, on the other hand, provide a fuller feature set, such as multiple 39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// subscriptions to a signal, optional thread-safety, and lifetime tracking of 40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// slots. When these features are needed, choose sigslots. 41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// 42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Example: 43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// int sqr(int x) { return x * x; } 44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// struct AddK { 45f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// int k; 46f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// int operator()(int x) const { return x + k; } 47f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// } add_k = {5}; 48f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// 49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Callback1<int, int> my_callback; 50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// cout << my_callback.empty() << endl; // true 51f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// 52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// my_callback = Callback1<int, int>(&sqr); 53f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// cout << my_callback.empty() << endl; // false 54f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// cout << my_callback(3) << endl; // 9 55f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// 56f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// my_callback = Callback1<int, int>(add_k); 57f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// cout << my_callback(10) << endl; // 15 58f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// 59f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// my_callback = Callback1<int, int>(); 60f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// cout << my_callback.empty() << endl; // true 61f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 62f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#ifndef WEBRTC_BASE_CALLBACK_H_ 63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define WEBRTC_BASE_CALLBACK_H_ 64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 65f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/refcount.h" 66f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/scoped_ref_ptr.h" 67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc { 69f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class R> 71f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Callback0 { 72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Default copy operations are appropriate for this class. 74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Callback0() {} 75f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org template <class T> Callback0(const T& functor) 76f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org : helper_(new RefCountedObject< HelperImpl<T> >(functor)) {} 77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org R operator()() { 78f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (empty()) 79f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return R(); 80f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return helper_->Run(); 81f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 82f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool empty() const { return !helper_; } 83f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 84f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 85f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org struct Helper : RefCountInterface { 86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual ~Helper() {} 87f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual R Run() = 0; 88f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org }; 89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org template <class T> struct HelperImpl : Helper { 90f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org explicit HelperImpl(const T& functor) : functor_(functor) {} 91f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual R Run() { 92f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return functor_(); 93f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 94f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org T functor_; 95f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org }; 96f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org scoped_refptr<Helper> helper_; 97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 98f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 99f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class R, 100f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org class P1> 101f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Callback1 { 102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 103f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Default copy operations are appropriate for this class. 104f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Callback1() {} 105f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org template <class T> Callback1(const T& functor) 106f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org : helper_(new RefCountedObject< HelperImpl<T> >(functor)) {} 107f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org R operator()(P1 p1) { 108f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (empty()) 109f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return R(); 110f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return helper_->Run(p1); 111f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 112f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool empty() const { return !helper_; } 113f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 114f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 115f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org struct Helper : RefCountInterface { 116f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual ~Helper() {} 117f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual R Run(P1 p1) = 0; 118f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org }; 119f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org template <class T> struct HelperImpl : Helper { 120f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org explicit HelperImpl(const T& functor) : functor_(functor) {} 121f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual R Run(P1 p1) { 122f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return functor_(p1); 123f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 124f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org T functor_; 125f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org }; 126f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org scoped_refptr<Helper> helper_; 127f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 128f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 129f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class R, 130f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org class P1, 131f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org class P2> 132f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Callback2 { 133f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 134f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Default copy operations are appropriate for this class. 135f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Callback2() {} 136f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org template <class T> Callback2(const T& functor) 137f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org : helper_(new RefCountedObject< HelperImpl<T> >(functor)) {} 138f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org R operator()(P1 p1, P2 p2) { 139f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (empty()) 140f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return R(); 141f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return helper_->Run(p1, p2); 142f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 143f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool empty() const { return !helper_; } 144f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 145f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 146f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org struct Helper : RefCountInterface { 147f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual ~Helper() {} 148f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual R Run(P1 p1, P2 p2) = 0; 149f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org }; 150f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org template <class T> struct HelperImpl : Helper { 151f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org explicit HelperImpl(const T& functor) : functor_(functor) {} 152f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual R Run(P1 p1, P2 p2) { 153f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return functor_(p1, p2); 154f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 155f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org T functor_; 156f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org }; 157f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org scoped_refptr<Helper> helper_; 158f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 159f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 160f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class R, 161f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org class P1, 162f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org class P2, 163f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org class P3> 164f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Callback3 { 165f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 166f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Default copy operations are appropriate for this class. 167f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Callback3() {} 168f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org template <class T> Callback3(const T& functor) 169f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org : helper_(new RefCountedObject< HelperImpl<T> >(functor)) {} 170f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org R operator()(P1 p1, P2 p2, P3 p3) { 171f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (empty()) 172f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return R(); 173f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return helper_->Run(p1, p2, p3); 174f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 175f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool empty() const { return !helper_; } 176f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 177f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 178f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org struct Helper : RefCountInterface { 179f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual ~Helper() {} 180f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual R Run(P1 p1, P2 p2, P3 p3) = 0; 181f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org }; 182f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org template <class T> struct HelperImpl : Helper { 183f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org explicit HelperImpl(const T& functor) : functor_(functor) {} 184f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual R Run(P1 p1, P2 p2, P3 p3) { 185f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return functor_(p1, p2, p3); 186f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 187f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org T functor_; 188f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org }; 189f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org scoped_refptr<Helper> helper_; 190f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 191f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 192f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class R, 193f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org class P1, 194f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org class P2, 195f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org class P3, 196f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org class P4> 197f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Callback4 { 198f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 199f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Default copy operations are appropriate for this class. 200f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Callback4() {} 201f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org template <class T> Callback4(const T& functor) 202f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org : helper_(new RefCountedObject< HelperImpl<T> >(functor)) {} 203f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org R operator()(P1 p1, P2 p2, P3 p3, P4 p4) { 204f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (empty()) 205f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return R(); 206f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return helper_->Run(p1, p2, p3, p4); 207f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 208f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool empty() const { return !helper_; } 209f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 210f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 211f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org struct Helper : RefCountInterface { 212f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual ~Helper() {} 213f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual R Run(P1 p1, P2 p2, P3 p3, P4 p4) = 0; 214f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org }; 215f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org template <class T> struct HelperImpl : Helper { 216f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org explicit HelperImpl(const T& functor) : functor_(functor) {} 217f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual R Run(P1 p1, P2 p2, P3 p3, P4 p4) { 218f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return functor_(p1, p2, p3, p4); 219f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 220f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org T functor_; 221f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org }; 222f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org scoped_refptr<Helper> helper_; 223f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 224f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 225f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgtemplate <class R, 226f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org class P1, 227f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org class P2, 228f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org class P3, 229f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org class P4, 230f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org class P5> 231f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Callback5 { 232f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public: 233f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org // Default copy operations are appropriate for this class. 234f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org Callback5() {} 235f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org template <class T> Callback5(const T& functor) 236f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org : helper_(new RefCountedObject< HelperImpl<T> >(functor)) {} 237f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org R operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) { 238f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org if (empty()) 239f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return R(); 240f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return helper_->Run(p1, p2, p3, p4, p5); 241f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 242f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org bool empty() const { return !helper_; } 243f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 244f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private: 245f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org struct Helper : RefCountInterface { 246f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual ~Helper() {} 247f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual R Run(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) = 0; 248f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org }; 249f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org template <class T> struct HelperImpl : Helper { 250f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org explicit HelperImpl(const T& functor) : functor_(functor) {} 251f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org virtual R Run(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) { 252f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org return functor_(p1, p2, p3, p4, p5); 253f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org } 254f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org T functor_; 255f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org }; 256f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org scoped_refptr<Helper> helper_; 257f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}; 258f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org} // namespace rtc 259f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org 260f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif // WEBRTC_BASE_CALLBACK_H_ 261