Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(127)

Side by Side Diff: base/prebind.h

Issue 6109007: Unified callback system. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/base
Patch Set: pumped up Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // This file was GENERATED by command:
2 // pump.py prebind.h.pump
3 // DO NOT EDIT BY HAND!!!
4
5 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
6 // Use of this source code is governed by a BSD-style license that can be
7 // found in the LICENSE file.
8
9 #ifndef BASE_PREBIND_H_
10 #define BASE_PREBIND_H_
11
12 #include "base/uber_callback.h"
13
14 namespace base {
15
16 namespace internal {
17 // These classes are argument wrappers that affect the refcounting, and storage
18 // semantics for prebound arguments.
19
20 template <typename T>
21 class UnretainedWrapper {
22 public:
23 explicit UnretainedWrapper(T* o) : obj_(o) {}
24 T* get() { return obj_; }
25 private:
26 T* obj_;
27 };
28
29 template <typename T>
30 class ConstRefWrapper {
31 public:
32 explicit ConstRefWrapper(const T& o) : ptr_(&o) {}
33 const T* get() { return ptr_; }
34 private:
35 const T* ptr_;
36 };
37
38 // Unwrap for the wrappers above.
39 template <typename T>
40 T Unwrap(T o) { return o; }
41
42 template <typename T>
43 T* Unwrap(UnretainedWrapper<T> unretained) { return unretained.get(); }
44
45 template <typename T>
46 const T* Unwrap(ConstRefWrapper<T> const_ref) { return const_ref.get(); }
47
48 // Optional Refcounting.
49
50 template <bool ref, typename O>
51 struct MaybeRefcount;
52
53 template <typename O>
54 struct MaybeRefcount<false, O> {
55 static void AddRef(const O&) {}
56 static void Release(const O&) {}
57 };
58
59 template <typename O>
60 struct MaybeRefcount<true, UnretainedWrapper<O> > {
61 static void AddRef(const UnretainedWrapper<O>&) {}
62 static void Release(const UnretainedWrapper<O>&) {}
63 };
64
65 template <typename O>
66 struct MaybeRefcount<true, ConstRefWrapper<O> > {
67 static void AddRef(ConstRefWrapper<O> o) { o.get()->AddRef(); }
68 static void Release(ConstRefWrapper<O> o) { o.get()->Release(); }
69 };
70
71 template <typename O>
72 struct MaybeRefcount<true, O* > {
73 static void AddRef(O* o) { o->AddRef(); }
74 static void Release(O* o) { o->Release(); }
75 };
76
77 // The method by which a function is invoked is determined by 3 different
78 // dimensions:
79 //
80 // 1) The type of function (normal, method, const-method)
81 // 2) The arity of the function
82 // 3) The number of bound parameters.
83 //
84 // The FunctionTraitsN classes unwrap the function signature type to
85 // specialize based on the first two dimensions. The N in FunctionTraitsN
86 // specifies the 3rd dimension.
87
88 template <typename StorageType, typename Sig>
89 struct FunctionTraits1;
90
91 // Function: Arity 1 -> 0.
92 template <typename StorageType, typename R, typename X1>
93 struct FunctionTraits1<StorageType, R(*)(X1)> {
94 static const bool kShouldRef = false;
95 static R DoInvoke(InvokerStorageBase* base) {
96 StorageType* invoker = static_cast<StorageType*>(base);
97 return invoker->f_(Unwrap(invoker->p1_));
98 }
99 };
100
101 // Method: Arity 0 -> 0.
102 template <typename StorageType, typename R, typename T>
103 struct FunctionTraits1<StorageType, R(T::*)()> {
104 static const bool kShouldRef = true;
105 static R DoInvoke(InvokerStorageBase* base) {
106 StorageType* invoker = static_cast<StorageType*>(base);
107 return (Unwrap(invoker->p1_)->*invoker->f_)();
108 }
109 };
110
111 // Const Method: Arity 0 -> 0.
112 template <typename StorageType, typename R, typename T>
113 struct FunctionTraits1<StorageType, R(T::*)() const> {
114 static const bool kShouldRef = true;
115 static R DoInvoke(InvokerStorageBase* base) {
116 StorageType* invoker = static_cast<StorageType*>(base);
117 return (Unwrap(invoker->p1_)->*invoker->f_)();
118 }
119 };
120
121 // Function: Arity 2 -> 1.
122 template <typename StorageType, typename R, typename X1, typename X2>
123 struct FunctionTraits1<StorageType, R(*)(X1, X2)> {
124 static const bool kShouldRef = false;
125 static R DoInvoke(InvokerStorageBase* base, X2 x2) {
126 StorageType* invoker = static_cast<StorageType*>(base);
127 return invoker->f_(Unwrap(invoker->p1_), x2);
128 }
129 };
130
131 // Method: Arity 1 -> 1.
132 template <typename StorageType, typename R, typename T, typename X1>
133 struct FunctionTraits1<StorageType, R(T::*)(X1)> {
134 static const bool kShouldRef = true;
135 static R DoInvoke(InvokerStorageBase* base, X1 x1) {
136 StorageType* invoker = static_cast<StorageType*>(base);
137 return (Unwrap(invoker->p1_)->*invoker->f_)(x1);
138 }
139 };
140
141 // Const Method: Arity 1 -> 1.
142 template <typename StorageType, typename R, typename T, typename X1>
143 struct FunctionTraits1<StorageType, R(T::*)(X1) const> {
144 static const bool kShouldRef = true;
145 static R DoInvoke(InvokerStorageBase* base, X1 x1) {
146 StorageType* invoker = static_cast<StorageType*>(base);
147 return (Unwrap(invoker->p1_)->*invoker->f_)(x1);
148 }
149 };
150
151 // Function: Arity 3 -> 2.
152 template <typename StorageType, typename R, typename X1, typename X2,
153 typename X3>
154 struct FunctionTraits1<StorageType, R(*)(X1, X2, X3)> {
155 static const bool kShouldRef = false;
156 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3) {
157 StorageType* invoker = static_cast<StorageType*>(base);
158 return invoker->f_(Unwrap(invoker->p1_), x2, x3);
159 }
160 };
161
162 // Method: Arity 2 -> 2.
163 template <typename StorageType, typename R, typename T, typename X1,
164 typename X2>
165 struct FunctionTraits1<StorageType, R(T::*)(X1, X2)> {
166 static const bool kShouldRef = true;
167 static R DoInvoke(InvokerStorageBase* base, X1 x1, X2 x2) {
168 StorageType* invoker = static_cast<StorageType*>(base);
169 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2);
170 }
171 };
172
173 // Const Method: Arity 2 -> 2.
174 template <typename StorageType, typename R, typename T, typename X1,
175 typename X2>
176 struct FunctionTraits1<StorageType, R(T::*)(X1, X2) const> {
177 static const bool kShouldRef = true;
178 static R DoInvoke(InvokerStorageBase* base, X1 x1, X2 x2) {
179 StorageType* invoker = static_cast<StorageType*>(base);
180 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2);
181 }
182 };
183
184 // Function: Arity 4 -> 3.
185 template <typename StorageType, typename R, typename X1, typename X2,
186 typename X3, typename X4>
187 struct FunctionTraits1<StorageType, R(*)(X1, X2, X3, X4)> {
188 static const bool kShouldRef = false;
189 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3, X4 x4) {
190 StorageType* invoker = static_cast<StorageType*>(base);
191 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4);
192 }
193 };
194
195 // Method: Arity 3 -> 3.
196 template <typename StorageType, typename R, typename T, typename X1,
197 typename X2, typename X3>
198 struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3)> {
199 static const bool kShouldRef = true;
200 static R DoInvoke(InvokerStorageBase* base, X1 x1, X2 x2, X3 x3) {
201 StorageType* invoker = static_cast<StorageType*>(base);
202 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3);
203 }
204 };
205
206 // Const Method: Arity 3 -> 3.
207 template <typename StorageType, typename R, typename T, typename X1,
208 typename X2, typename X3>
209 struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3) const> {
210 static const bool kShouldRef = true;
211 static R DoInvoke(InvokerStorageBase* base, X1 x1, X2 x2, X3 x3) {
212 StorageType* invoker = static_cast<StorageType*>(base);
213 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3);
214 }
215 };
216
217 // Function: Arity 5 -> 4.
218 template <typename StorageType, typename R, typename X1, typename X2,
219 typename X3, typename X4, typename X5>
220 struct FunctionTraits1<StorageType, R(*)(X1, X2, X3, X4, X5)> {
221 static const bool kShouldRef = false;
222 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3, X4 x4, X5 x5) {
223 StorageType* invoker = static_cast<StorageType*>(base);
224 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5);
225 }
226 };
227
228 // Method: Arity 4 -> 4.
229 template <typename StorageType, typename R, typename T, typename X1,
230 typename X2, typename X3, typename X4>
231 struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4)> {
232 static const bool kShouldRef = true;
233 static R DoInvoke(InvokerStorageBase* base, X1 x1, X2 x2, X3 x3, X4 x4) {
234 StorageType* invoker = static_cast<StorageType*>(base);
235 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4);
236 }
237 };
238
239 // Const Method: Arity 4 -> 4.
240 template <typename StorageType, typename R, typename T, typename X1,
241 typename X2, typename X3, typename X4>
242 struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4) const> {
243 static const bool kShouldRef = true;
244 static R DoInvoke(InvokerStorageBase* base, X1 x1, X2 x2, X3 x3, X4 x4) {
245 StorageType* invoker = static_cast<StorageType*>(base);
246 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4);
247 }
248 };
249
250 // Function: Arity 6 -> 5.
251 template <typename StorageType, typename R, typename X1, typename X2,
252 typename X3, typename X4, typename X5, typename X6>
253 struct FunctionTraits1<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
254 static const bool kShouldRef = false;
255 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3, X4 x4, X5 x5,
256 X6 x6) {
257 StorageType* invoker = static_cast<StorageType*>(base);
258 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5, x6);
259 }
260 };
261
262 // Method: Arity 5 -> 5.
263 template <typename StorageType, typename R, typename T, typename X1,
264 typename X2, typename X3, typename X4, typename X5>
265 struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
266 static const bool kShouldRef = true;
267 static R DoInvoke(InvokerStorageBase* base, X1 x1, X2 x2, X3 x3, X4 x4,
268 X5 x5) {
269 StorageType* invoker = static_cast<StorageType*>(base);
270 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4, x5);
271 }
272 };
273
274 // Const Method: Arity 5 -> 5.
275 template <typename StorageType, typename R, typename T, typename X1,
276 typename X2, typename X3, typename X4, typename X5>
277 struct FunctionTraits1<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> {
278 static const bool kShouldRef = true;
279 static R DoInvoke(InvokerStorageBase* base, X1 x1, X2 x2, X3 x3, X4 x4,
280 X5 x5) {
281 StorageType* invoker = static_cast<StorageType*>(base);
282 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4, x5);
283 }
284 };
285
286 template <typename StorageType, typename Sig>
287 struct FunctionTraits2;
288
289 // Function: Arity 2 -> 0.
290 template <typename StorageType, typename R, typename X1, typename X2>
291 struct FunctionTraits2<StorageType, R(*)(X1, X2)> {
292 static const bool kShouldRef = false;
293 static R DoInvoke(InvokerStorageBase* base) {
294 StorageType* invoker = static_cast<StorageType*>(base);
295 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_));
296 }
297 };
298
299 // Method: Arity 1 -> 0.
300 template <typename StorageType, typename R, typename T, typename X1>
301 struct FunctionTraits2<StorageType, R(T::*)(X1)> {
302 static const bool kShouldRef = true;
303 static R DoInvoke(InvokerStorageBase* base) {
304 StorageType* invoker = static_cast<StorageType*>(base);
305 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_));
306 }
307 };
308
309 // Const Method: Arity 1 -> 0.
310 template <typename StorageType, typename R, typename T, typename X1>
311 struct FunctionTraits2<StorageType, R(T::*)(X1) const> {
312 static const bool kShouldRef = true;
313 static R DoInvoke(InvokerStorageBase* base) {
314 StorageType* invoker = static_cast<StorageType*>(base);
315 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_));
316 }
317 };
318
319 // Function: Arity 3 -> 1.
320 template <typename StorageType, typename R, typename X1, typename X2,
321 typename X3>
322 struct FunctionTraits2<StorageType, R(*)(X1, X2, X3)> {
323 static const bool kShouldRef = false;
324 static R DoInvoke(InvokerStorageBase* base, X3 x3) {
325 StorageType* invoker = static_cast<StorageType*>(base);
326 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3);
327 }
328 };
329
330 // Method: Arity 2 -> 1.
331 template <typename StorageType, typename R, typename T, typename X1,
332 typename X2>
333 struct FunctionTraits2<StorageType, R(T::*)(X1, X2)> {
334 static const bool kShouldRef = true;
335 static R DoInvoke(InvokerStorageBase* base, X2 x2) {
336 StorageType* invoker = static_cast<StorageType*>(base);
337 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2);
338 }
339 };
340
341 // Const Method: Arity 2 -> 1.
342 template <typename StorageType, typename R, typename T, typename X1,
343 typename X2>
344 struct FunctionTraits2<StorageType, R(T::*)(X1, X2) const> {
345 static const bool kShouldRef = true;
346 static R DoInvoke(InvokerStorageBase* base, X2 x2) {
347 StorageType* invoker = static_cast<StorageType*>(base);
348 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2);
349 }
350 };
351
352 // Function: Arity 4 -> 2.
353 template <typename StorageType, typename R, typename X1, typename X2,
354 typename X3, typename X4>
355 struct FunctionTraits2<StorageType, R(*)(X1, X2, X3, X4)> {
356 static const bool kShouldRef = false;
357 static R DoInvoke(InvokerStorageBase* base, X3 x3, X4 x4) {
358 StorageType* invoker = static_cast<StorageType*>(base);
359 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4);
360 }
361 };
362
363 // Method: Arity 3 -> 2.
364 template <typename StorageType, typename R, typename T, typename X1,
365 typename X2, typename X3>
366 struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3)> {
367 static const bool kShouldRef = true;
368 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3) {
369 StorageType* invoker = static_cast<StorageType*>(base);
370 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3);
371 }
372 };
373
374 // Const Method: Arity 3 -> 2.
375 template <typename StorageType, typename R, typename T, typename X1,
376 typename X2, typename X3>
377 struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3) const> {
378 static const bool kShouldRef = true;
379 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3) {
380 StorageType* invoker = static_cast<StorageType*>(base);
381 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3);
382 }
383 };
384
385 // Function: Arity 5 -> 3.
386 template <typename StorageType, typename R, typename X1, typename X2,
387 typename X3, typename X4, typename X5>
388 struct FunctionTraits2<StorageType, R(*)(X1, X2, X3, X4, X5)> {
389 static const bool kShouldRef = false;
390 static R DoInvoke(InvokerStorageBase* base, X3 x3, X4 x4, X5 x5) {
391 StorageType* invoker = static_cast<StorageType*>(base);
392 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5);
393 }
394 };
395
396 // Method: Arity 4 -> 3.
397 template <typename StorageType, typename R, typename T, typename X1,
398 typename X2, typename X3, typename X4>
399 struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4)> {
400 static const bool kShouldRef = true;
401 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3, X4 x4) {
402 StorageType* invoker = static_cast<StorageType*>(base);
403 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3,
404 x4);
405 }
406 };
407
408 // Const Method: Arity 4 -> 3.
409 template <typename StorageType, typename R, typename T, typename X1,
410 typename X2, typename X3, typename X4>
411 struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4) const> {
412 static const bool kShouldRef = true;
413 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3, X4 x4) {
414 StorageType* invoker = static_cast<StorageType*>(base);
415 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3,
416 x4);
417 }
418 };
419
420 // Function: Arity 6 -> 4.
421 template <typename StorageType, typename R, typename X1, typename X2,
422 typename X3, typename X4, typename X5, typename X6>
423 struct FunctionTraits2<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
424 static const bool kShouldRef = false;
425 static R DoInvoke(InvokerStorageBase* base, X3 x3, X4 x4, X5 x5, X6 x6) {
426 StorageType* invoker = static_cast<StorageType*>(base);
427 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5,
428 x6);
429 }
430 };
431
432 // Method: Arity 5 -> 4.
433 template <typename StorageType, typename R, typename T, typename X1,
434 typename X2, typename X3, typename X4, typename X5>
435 struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
436 static const bool kShouldRef = true;
437 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3, X4 x4, X5 x5) {
438 StorageType* invoker = static_cast<StorageType*>(base);
439 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3,
440 x4, x5);
441 }
442 };
443
444 // Const Method: Arity 5 -> 4.
445 template <typename StorageType, typename R, typename T, typename X1,
446 typename X2, typename X3, typename X4, typename X5>
447 struct FunctionTraits2<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> {
448 static const bool kShouldRef = true;
449 static R DoInvoke(InvokerStorageBase* base, X2 x2, X3 x3, X4 x4, X5 x5) {
450 StorageType* invoker = static_cast<StorageType*>(base);
451 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3,
452 x4, x5);
453 }
454 };
455
456 template <typename StorageType, typename Sig>
457 struct FunctionTraits3;
458
459 // Function: Arity 3 -> 0.
460 template <typename StorageType, typename R, typename X1, typename X2,
461 typename X3>
462 struct FunctionTraits3<StorageType, R(*)(X1, X2, X3)> {
463 static const bool kShouldRef = false;
464 static R DoInvoke(InvokerStorageBase* base) {
465 StorageType* invoker = static_cast<StorageType*>(base);
466 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
467 Unwrap(invoker->p3_));
468 }
469 };
470
471 // Method: Arity 2 -> 0.
472 template <typename StorageType, typename R, typename T, typename X1,
473 typename X2>
474 struct FunctionTraits3<StorageType, R(T::*)(X1, X2)> {
475 static const bool kShouldRef = true;
476 static R DoInvoke(InvokerStorageBase* base) {
477 StorageType* invoker = static_cast<StorageType*>(base);
478 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
479 Unwrap(invoker->p3_));
480 }
481 };
482
483 // Const Method: Arity 2 -> 0.
484 template <typename StorageType, typename R, typename T, typename X1,
485 typename X2>
486 struct FunctionTraits3<StorageType, R(T::*)(X1, X2) const> {
487 static const bool kShouldRef = true;
488 static R DoInvoke(InvokerStorageBase* base) {
489 StorageType* invoker = static_cast<StorageType*>(base);
490 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
491 Unwrap(invoker->p3_));
492 }
493 };
494
495 // Function: Arity 4 -> 1.
496 template <typename StorageType, typename R, typename X1, typename X2,
497 typename X3, typename X4>
498 struct FunctionTraits3<StorageType, R(*)(X1, X2, X3, X4)> {
499 static const bool kShouldRef = false;
500 static R DoInvoke(InvokerStorageBase* base, X4 x4) {
501 StorageType* invoker = static_cast<StorageType*>(base);
502 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
503 Unwrap(invoker->p3_), x4);
504 }
505 };
506
507 // Method: Arity 3 -> 1.
508 template <typename StorageType, typename R, typename T, typename X1,
509 typename X2, typename X3>
510 struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3)> {
511 static const bool kShouldRef = true;
512 static R DoInvoke(InvokerStorageBase* base, X3 x3) {
513 StorageType* invoker = static_cast<StorageType*>(base);
514 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
515 Unwrap(invoker->p3_), x3);
516 }
517 };
518
519 // Const Method: Arity 3 -> 1.
520 template <typename StorageType, typename R, typename T, typename X1,
521 typename X2, typename X3>
522 struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3) const> {
523 static const bool kShouldRef = true;
524 static R DoInvoke(InvokerStorageBase* base, X3 x3) {
525 StorageType* invoker = static_cast<StorageType*>(base);
526 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
527 Unwrap(invoker->p3_), x3);
528 }
529 };
530
531 // Function: Arity 5 -> 2.
532 template <typename StorageType, typename R, typename X1, typename X2,
533 typename X3, typename X4, typename X5>
534 struct FunctionTraits3<StorageType, R(*)(X1, X2, X3, X4, X5)> {
535 static const bool kShouldRef = false;
536 static R DoInvoke(InvokerStorageBase* base, X4 x4, X5 x5) {
537 StorageType* invoker = static_cast<StorageType*>(base);
538 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
539 Unwrap(invoker->p3_), x4, x5);
540 }
541 };
542
543 // Method: Arity 4 -> 2.
544 template <typename StorageType, typename R, typename T, typename X1,
545 typename X2, typename X3, typename X4>
546 struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4)> {
547 static const bool kShouldRef = true;
548 static R DoInvoke(InvokerStorageBase* base, X3 x3, X4 x4) {
549 StorageType* invoker = static_cast<StorageType*>(base);
550 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
551 Unwrap(invoker->p3_), x3, x4);
552 }
553 };
554
555 // Const Method: Arity 4 -> 2.
556 template <typename StorageType, typename R, typename T, typename X1,
557 typename X2, typename X3, typename X4>
558 struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4) const> {
559 static const bool kShouldRef = true;
560 static R DoInvoke(InvokerStorageBase* base, X3 x3, X4 x4) {
561 StorageType* invoker = static_cast<StorageType*>(base);
562 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
563 Unwrap(invoker->p3_), x3, x4);
564 }
565 };
566
567 // Function: Arity 6 -> 3.
568 template <typename StorageType, typename R, typename X1, typename X2,
569 typename X3, typename X4, typename X5, typename X6>
570 struct FunctionTraits3<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
571 static const bool kShouldRef = false;
572 static R DoInvoke(InvokerStorageBase* base, X4 x4, X5 x5, X6 x6) {
573 StorageType* invoker = static_cast<StorageType*>(base);
574 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
575 Unwrap(invoker->p3_), x4, x5, x6);
576 }
577 };
578
579 // Method: Arity 5 -> 3.
580 template <typename StorageType, typename R, typename T, typename X1,
581 typename X2, typename X3, typename X4, typename X5>
582 struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
583 static const bool kShouldRef = true;
584 static R DoInvoke(InvokerStorageBase* base, X3 x3, X4 x4, X5 x5) {
585 StorageType* invoker = static_cast<StorageType*>(base);
586 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
587 Unwrap(invoker->p3_), x3, x4, x5);
588 }
589 };
590
591 // Const Method: Arity 5 -> 3.
592 template <typename StorageType, typename R, typename T, typename X1,
593 typename X2, typename X3, typename X4, typename X5>
594 struct FunctionTraits3<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> {
595 static const bool kShouldRef = true;
596 static R DoInvoke(InvokerStorageBase* base, X3 x3, X4 x4, X5 x5) {
597 StorageType* invoker = static_cast<StorageType*>(base);
598 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
599 Unwrap(invoker->p3_), x3, x4, x5);
600 }
601 };
602
603 template <typename StorageType, typename Sig>
604 struct FunctionTraits4;
605
606 // Function: Arity 4 -> 0.
607 template <typename StorageType, typename R, typename X1, typename X2,
608 typename X3, typename X4>
609 struct FunctionTraits4<StorageType, R(*)(X1, X2, X3, X4)> {
610 static const bool kShouldRef = false;
611 static R DoInvoke(InvokerStorageBase* base) {
612 StorageType* invoker = static_cast<StorageType*>(base);
613 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
614 Unwrap(invoker->p3_), Unwrap(invoker->p4_));
615 }
616 };
617
618 // Method: Arity 3 -> 0.
619 template <typename StorageType, typename R, typename T, typename X1,
620 typename X2, typename X3>
621 struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3)> {
622 static const bool kShouldRef = true;
623 static R DoInvoke(InvokerStorageBase* base) {
624 StorageType* invoker = static_cast<StorageType*>(base);
625 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
626 Unwrap(invoker->p3_), Unwrap(invoker->p4_));
627 }
628 };
629
630 // Const Method: Arity 3 -> 0.
631 template <typename StorageType, typename R, typename T, typename X1,
632 typename X2, typename X3>
633 struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3) const> {
634 static const bool kShouldRef = true;
635 static R DoInvoke(InvokerStorageBase* base) {
636 StorageType* invoker = static_cast<StorageType*>(base);
637 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
638 Unwrap(invoker->p3_), Unwrap(invoker->p4_));
639 }
640 };
641
642 // Function: Arity 5 -> 1.
643 template <typename StorageType, typename R, typename X1, typename X2,
644 typename X3, typename X4, typename X5>
645 struct FunctionTraits4<StorageType, R(*)(X1, X2, X3, X4, X5)> {
646 static const bool kShouldRef = false;
647 static R DoInvoke(InvokerStorageBase* base, X5 x5) {
648 StorageType* invoker = static_cast<StorageType*>(base);
649 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
650 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5);
651 }
652 };
653
654 // Method: Arity 4 -> 1.
655 template <typename StorageType, typename R, typename T, typename X1,
656 typename X2, typename X3, typename X4>
657 struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4)> {
658 static const bool kShouldRef = true;
659 static R DoInvoke(InvokerStorageBase* base, X4 x4) {
660 StorageType* invoker = static_cast<StorageType*>(base);
661 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
662 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4);
663 }
664 };
665
666 // Const Method: Arity 4 -> 1.
667 template <typename StorageType, typename R, typename T, typename X1,
668 typename X2, typename X3, typename X4>
669 struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4) const> {
670 static const bool kShouldRef = true;
671 static R DoInvoke(InvokerStorageBase* base, X4 x4) {
672 StorageType* invoker = static_cast<StorageType*>(base);
673 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
674 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4);
675 }
676 };
677
678 // Function: Arity 6 -> 2.
679 template <typename StorageType, typename R, typename X1, typename X2,
680 typename X3, typename X4, typename X5, typename X6>
681 struct FunctionTraits4<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
682 static const bool kShouldRef = false;
683 static R DoInvoke(InvokerStorageBase* base, X5 x5, X6 x6) {
684 StorageType* invoker = static_cast<StorageType*>(base);
685 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
686 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5, x6);
687 }
688 };
689
690 // Method: Arity 5 -> 2.
691 template <typename StorageType, typename R, typename T, typename X1,
692 typename X2, typename X3, typename X4, typename X5>
693 struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
694 static const bool kShouldRef = true;
695 static R DoInvoke(InvokerStorageBase* base, X4 x4, X5 x5) {
696 StorageType* invoker = static_cast<StorageType*>(base);
697 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
698 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4, x5);
699 }
700 };
701
702 // Const Method: Arity 5 -> 2.
703 template <typename StorageType, typename R, typename T, typename X1,
704 typename X2, typename X3, typename X4, typename X5>
705 struct FunctionTraits4<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> {
706 static const bool kShouldRef = true;
707 static R DoInvoke(InvokerStorageBase* base, X4 x4, X5 x5) {
708 StorageType* invoker = static_cast<StorageType*>(base);
709 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
710 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4, x5);
711 }
712 };
713
714 template <typename StorageType, typename Sig>
715 struct FunctionTraits5;
716
717 // Function: Arity 5 -> 0.
718 template <typename StorageType, typename R, typename X1, typename X2,
719 typename X3, typename X4, typename X5>
720 struct FunctionTraits5<StorageType, R(*)(X1, X2, X3, X4, X5)> {
721 static const bool kShouldRef = false;
722 static R DoInvoke(InvokerStorageBase* base) {
723 StorageType* invoker = static_cast<StorageType*>(base);
724 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
725 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_));
726 }
727 };
728
729 // Method: Arity 4 -> 0.
730 template <typename StorageType, typename R, typename T, typename X1,
731 typename X2, typename X3, typename X4>
732 struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4)> {
733 static const bool kShouldRef = true;
734 static R DoInvoke(InvokerStorageBase* base) {
735 StorageType* invoker = static_cast<StorageType*>(base);
736 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
737 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_));
738 }
739 };
740
741 // Const Method: Arity 4 -> 0.
742 template <typename StorageType, typename R, typename T, typename X1,
743 typename X2, typename X3, typename X4>
744 struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4) const> {
745 static const bool kShouldRef = true;
746 static R DoInvoke(InvokerStorageBase* base) {
747 StorageType* invoker = static_cast<StorageType*>(base);
748 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
749 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_));
750 }
751 };
752
753 // Function: Arity 6 -> 1.
754 template <typename StorageType, typename R, typename X1, typename X2,
755 typename X3, typename X4, typename X5, typename X6>
756 struct FunctionTraits5<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
757 static const bool kShouldRef = false;
758 static R DoInvoke(InvokerStorageBase* base, X6 x6) {
759 StorageType* invoker = static_cast<StorageType*>(base);
760 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
761 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x6);
762 }
763 };
764
765 // Method: Arity 5 -> 1.
766 template <typename StorageType, typename R, typename T, typename X1,
767 typename X2, typename X3, typename X4, typename X5>
768 struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
769 static const bool kShouldRef = true;
770 static R DoInvoke(InvokerStorageBase* base, X5 x5) {
771 StorageType* invoker = static_cast<StorageType*>(base);
772 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
773 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5);
774 }
775 };
776
777 // Const Method: Arity 5 -> 1.
778 template <typename StorageType, typename R, typename T, typename X1,
779 typename X2, typename X3, typename X4, typename X5>
780 struct FunctionTraits5<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> {
781 static const bool kShouldRef = true;
782 static R DoInvoke(InvokerStorageBase* base, X5 x5) {
783 StorageType* invoker = static_cast<StorageType*>(base);
784 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
785 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5);
786 }
787 };
788
789 template <typename StorageType, typename Sig>
790 struct FunctionTraits6;
791
792 // Function: Arity 6 -> 0.
793 template <typename StorageType, typename R, typename X1, typename X2,
794 typename X3, typename X4, typename X5, typename X6>
795 struct FunctionTraits6<StorageType, R(*)(X1, X2, X3, X4, X5, X6)> {
796 static const bool kShouldRef = false;
797 static R DoInvoke(InvokerStorageBase* base) {
798 StorageType* invoker = static_cast<StorageType*>(base);
799 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
800 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_),
801 Unwrap(invoker->p6_));
802 }
803 };
804
805 // Method: Arity 5 -> 0.
806 template <typename StorageType, typename R, typename T, typename X1,
807 typename X2, typename X3, typename X4, typename X5>
808 struct FunctionTraits6<StorageType, R(T::*)(X1, X2, X3, X4, X5)> {
809 static const bool kShouldRef = true;
810 static R DoInvoke(InvokerStorageBase* base) {
811 StorageType* invoker = static_cast<StorageType*>(base);
812 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
813 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_),
814 Unwrap(invoker->p6_));
815 }
816 };
817
818 // Const Method: Arity 5 -> 0.
819 template <typename StorageType, typename R, typename T, typename X1,
820 typename X2, typename X3, typename X4, typename X5>
821 struct FunctionTraits6<StorageType, R(T::*)(X1, X2, X3, X4, X5) const> {
822 static const bool kShouldRef = true;
823 static R DoInvoke(InvokerStorageBase* base) {
824 StorageType* invoker = static_cast<StorageType*>(base);
825 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
826 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_),
827 Unwrap(invoker->p6_));
828 }
829 };
830
831
832 // These are the actual storage classes for the invokers.
833
834 template <typename Sig, typename P1>
835 class InvokerStorage1 : public InvokerStorageBase {
836 public:
837 typedef InvokerStorage1 StorageType;
838 typedef FunctionTraits1<StorageType, Sig> FunctionTraits;
839
840 InvokerStorage1(Sig f, const P1& p1)
841 : f_(f), p1_(p1) {
842 MaybeRefcount<FunctionTraits::kShouldRef, P1>::AddRef(p1_);
843 }
844
845 virtual ~InvokerStorage1() {
846 MaybeRefcount<FunctionTraits::kShouldRef, P1>::Release(p1_);
847 }
848
849 Sig f_;
850 P1 p1_;
851 };
852
853 template <typename Sig, typename P1, typename P2>
854 class InvokerStorage2 : public InvokerStorageBase {
855 public:
856 typedef InvokerStorage2 StorageType;
857 typedef FunctionTraits2<StorageType, Sig> FunctionTraits;
858
859 InvokerStorage2(Sig f, const P1& p1, const P2& p2)
860 : f_(f), p1_(p1), p2_(p2) {
861 MaybeRefcount<FunctionTraits::kShouldRef, P1>::AddRef(p1_);
862 }
863
864 virtual ~InvokerStorage2() {
865 MaybeRefcount<FunctionTraits::kShouldRef, P1>::Release(p1_);
866 }
867
868 Sig f_;
869 P1 p1_;
870 P2 p2_;
871 };
872
873 template <typename Sig, typename P1, typename P2, typename P3>
874 class InvokerStorage3 : public InvokerStorageBase {
875 public:
876 typedef InvokerStorage3 StorageType;
877 typedef FunctionTraits3<StorageType, Sig> FunctionTraits;
878
879 InvokerStorage3(Sig f, const P1& p1, const P2& p2, const P3& p3)
880 : f_(f), p1_(p1), p2_(p2), p3_(p3) {
881 MaybeRefcount<FunctionTraits::kShouldRef, P1>::AddRef(p1_);
882 }
883
884 virtual ~InvokerStorage3() {
885 MaybeRefcount<FunctionTraits::kShouldRef, P1>::Release(p1_);
886 }
887
888 Sig f_;
889 P1 p1_;
890 P2 p2_;
891 P3 p3_;
892 };
893
894 template <typename Sig, typename P1, typename P2, typename P3, typename P4>
895 class InvokerStorage4 : public InvokerStorageBase {
896 public:
897 typedef InvokerStorage4 StorageType;
898 typedef FunctionTraits4<StorageType, Sig> FunctionTraits;
899
900 InvokerStorage4(Sig f, const P1& p1, const P2& p2, const P3& p3, const P4& p4)
901 : f_(f), p1_(p1), p2_(p2), p3_(p3), p4_(p4) {
902 MaybeRefcount<FunctionTraits::kShouldRef, P1>::AddRef(p1_);
903 }
904
905 virtual ~InvokerStorage4() {
906 MaybeRefcount<FunctionTraits::kShouldRef, P1>::Release(p1_);
907 }
908
909 Sig f_;
910 P1 p1_;
911 P2 p2_;
912 P3 p3_;
913 P4 p4_;
914 };
915
916 template <typename Sig, typename P1, typename P2, typename P3, typename P4,
917 typename P5>
918 class InvokerStorage5 : public InvokerStorageBase {
919 public:
920 typedef InvokerStorage5 StorageType;
921 typedef FunctionTraits5<StorageType, Sig> FunctionTraits;
922
923 InvokerStorage5(Sig f, const P1& p1, const P2& p2, const P3& p3,
924 const P4& p4, const P5& p5)
925 : f_(f), p1_(p1), p2_(p2), p3_(p3), p4_(p4), p5_(p5) {
926 MaybeRefcount<FunctionTraits::kShouldRef, P1>::AddRef(p1_);
927 }
928
929 virtual ~InvokerStorage5() {
930 MaybeRefcount<FunctionTraits::kShouldRef, P1>::Release(p1_);
931 }
932
933 Sig f_;
934 P1 p1_;
935 P2 p2_;
936 P3 p3_;
937 P4 p4_;
938 P5 p5_;
939 };
940
941 template <typename Sig, typename P1, typename P2, typename P3, typename P4,
942 typename P5, typename P6>
943 class InvokerStorage6 : public InvokerStorageBase {
944 public:
945 typedef InvokerStorage6 StorageType;
946 typedef FunctionTraits6<StorageType, Sig> FunctionTraits;
947
948 InvokerStorage6(Sig f, const P1& p1, const P2& p2, const P3& p3,
949 const P4& p4, const P5& p5, const P6& p6)
950 : f_(f), p1_(p1), p2_(p2), p3_(p3), p4_(p4), p5_(p5), p6_(p6) {
951 MaybeRefcount<FunctionTraits::kShouldRef, P1>::AddRef(p1_);
952 }
953
954 virtual ~InvokerStorage6() {
955 MaybeRefcount<FunctionTraits::kShouldRef, P1>::Release(p1_);
956 }
957
958 Sig f_;
959 P1 p1_;
960 P2 p2_;
961 P3 p3_;
962 P4 p4_;
963 P5 p5_;
964 P6 p6_;
965 };
966
967 } // namespace internal
968
969
970 template <typename Sig, typename P1>
971 InvokerStorageHolder<internal::InvokerStorage1<Sig, P1> >
972 Prebind(Sig f, const P1& p1) {
973 return MakeInvokerStorageHolder(
974 new internal::InvokerStorage1<Sig, P1>(
975 f, p1));
976 }
977
978 template <typename Sig, typename P1, typename P2>
979 InvokerStorageHolder<internal::InvokerStorage2<Sig, P1, P2> >
980 Prebind(Sig f, const P1& p1, const P2& p2) {
981 return MakeInvokerStorageHolder(
982 new internal::InvokerStorage2<Sig, P1, P2>(
983 f, p1, p2));
984 }
985
986 template <typename Sig, typename P1, typename P2, typename P3>
987 InvokerStorageHolder<internal::InvokerStorage3<Sig, P1, P2, P3> >
988 Prebind(Sig f, const P1& p1, const P2& p2, const P3& p3) {
989 return MakeInvokerStorageHolder(
990 new internal::InvokerStorage3<Sig, P1, P2, P3>(
991 f, p1, p2, p3));
992 }
993
994 template <typename Sig, typename P1, typename P2, typename P3, typename P4>
995 InvokerStorageHolder<internal::InvokerStorage4<Sig, P1, P2, P3, P4> >
996 Prebind(Sig f, const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
997 return MakeInvokerStorageHolder(
998 new internal::InvokerStorage4<Sig, P1, P2, P3, P4>(
999 f, p1, p2, p3, p4));
1000 }
1001
1002 template <typename Sig, typename P1, typename P2, typename P3, typename P4,
1003 typename P5>
1004 InvokerStorageHolder<internal::InvokerStorage5<Sig, P1, P2, P3, P4, P5> >
1005 Prebind(Sig f, const P1& p1, const P2& p2, const P3& p3, const P4& p4,
1006 const P5& p5) {
1007 return MakeInvokerStorageHolder(
1008 new internal::InvokerStorage5<Sig, P1, P2, P3, P4, P5>(
1009 f, p1, p2, p3, p4, p5));
1010 }
1011
1012 template <typename Sig, typename P1, typename P2, typename P3, typename P4,
1013 typename P5, typename P6>
1014 InvokerStorageHolder<internal::InvokerStorage6<Sig, P1, P2, P3, P4, P5, P6> >
1015 Prebind(Sig f, const P1& p1, const P2& p2, const P3& p3, const P4& p4,
1016 const P5& p5, const P6& p6) {
1017 return MakeInvokerStorageHolder(
1018 new internal::InvokerStorage6<Sig, P1, P2, P3, P4, P5, P6>(
1019 f, p1, p2, p3, p4, p5, p6));
1020 }
1021
1022 template <typename T>
1023 inline internal::UnretainedWrapper<T> Unretained(T* o) {
1024 return internal::UnretainedWrapper<T>(o);
1025 }
1026
1027 template <typename T>
1028 inline internal::ConstRefWrapper<T> ConstRef(const T& o) {
1029 return internal::ConstRefWrapper<T>(o);
1030 }
1031
1032
1033 } // namespace base
1034
1035 #endif // BASE_PREBIND_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698