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