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

Side by Side Diff: base/bind_internal.h

Issue 8483003: Callback API Change: Reimplement Bind(); support IgnoreResult, full currying, and use less types (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased Created 9 years, 1 month 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
« no previous file with comments | « base/bind_helpers.h ('k') | base/bind_internal.h.pump » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // This file was GENERATED by command: 1 // This file was GENERATED by command:
2 // pump.py bind_internal.h.pump 2 // pump.py bind_internal.h.pump
3 // DO NOT EDIT BY HAND!!! 3 // DO NOT EDIT BY HAND!!!
4 4
5 5
6 6
7 // TODO(ajwong): If you create an fully unbound method, is there a way to
8 // enforce the first argument must be refcounted? Or do we just say
9 // "oh well"?
10 //
11 // Do we want to allow creating a fully unbound method??
12
7 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 13 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
8 // Use of this source code is governed by a BSD-style license that can be 14 // Use of this source code is governed by a BSD-style license that can be
9 // found in the LICENSE file. 15 // found in the LICENSE file.
10 16
11 #ifndef BASE_BIND_INTERNAL_H_ 17 #ifndef BASE_BIND_INTERNAL_H_
12 #define BASE_BIND_INTERNAL_H_ 18 #define BASE_BIND_INTERNAL_H_
13 #pragma once 19 #pragma once
14 20
15 #include "base/bind_helpers.h" 21 #include "base/bind_helpers.h"
16 #include "base/callback_internal.h" 22 #include "base/callback_internal.h"
17 #include "base/memory/raw_scoped_refptr_mismatch_checker.h" 23 #include "base/memory/raw_scoped_refptr_mismatch_checker.h"
18 #include "base/memory/weak_ptr.h" 24 #include "base/memory/weak_ptr.h"
19 #include "base/template_util.h" 25 #include "base/template_util.h"
20 #include "build/build_config.h" 26 #include "build/build_config.h"
21 27
22 #if defined(OS_WIN) 28 #if defined(OS_WIN)
23 #include "base/bind_internal_win.h" 29 #include "base/bind_internal_win.h"
24 #endif 30 #endif
25 31
26 namespace base { 32 namespace base {
27 namespace internal { 33 namespace internal {
28 34
29 // The method by which a function is invoked is determined by 3 different 35 // CONCEPTS:
30 // dimensions: 36 // Runnable -- A type (really a type class) that has a single Run() method
37 // and a RunType typedef that corresponds to the type of Run().
38 // A Runnable can declare that it should treated like a method
39 // call by including a typedef named IsMethod. The value of
40 // this typedef is NOT inspected, only the existence. When a
41 // Runnable declares itself a method, Bind() will enforce special
42 // refcounting + WeakPtr handling semantics for the first
43 // parameter which is expected to be an object.
44 // Functor -- A copyable type representing something that should be called.
45 // All function pointers, Callback<>, and Runnables are functors
46 // even if the invocation syntax differs.
47 // RunType -- A function type (as opposed to function _pointer_ type) for
48 // a Run() function. Usually just a convenience typedef.
49 // (Bound)ArgsType -- A function type that is being (ab)used to store the
50 // types of set of arguments. The "return" type is always
51 // void here. We use this hack so that we do not need
52 // a new type name for each arity of type. (eg.,
53 // BindState1, BindState2). This makes forward
54 // declarations and friending much much easier.
31 // 55 //
32 // 1) The type of function (normal or method). 56 // Types:
33 // 2) The arity of the function. 57 // RunnableAdapter<> -- Wraps the various "function" pointer types into an
34 // 3) The number of bound parameters. 58 // object that adheres to the Runnable interface.
59 // There are |3*ARITY| RunnableAdapter types.
60 // FunctionTraits<> -- Type traits that unwrap a function signature into a
61 // a set of easier to use typedefs. Used mainly for
62 // compile time asserts.
63 // There are |ARITY| FunctionTraits types.
64 // ForceVoidReturn<> -- Helper class for translating function signatures to
65 // equivalent forms with a "void" return type.
66 // There are |ARITY| ForceVoidReturn types.
67 // FunctorTraits<> -- Type traits used determine the correct RunType and
68 // RunnableType for a Functor. This is where function
69 // signature adapters are applied.
70 // There are |ARITY| ForceVoidReturn types.
71 // MakeRunnable<> -- Takes a Functor and returns an object in the Runnable
72 // type class that represents the underlying Functor.
73 // There are |O(1)| MakeRunnable types.
74 // InvokeHelper<> -- Take a Runnable + arguments and actully invokes it.
75 // Handle the differing syntaxes needed for WeakPtr<> support,
76 // and for ignoring return values. This is separate from
77 // Invoker to avoid creating multiple version of Invoker<>
78 // which grows at O(n^2) with the arity.
79 // There are |k*ARITY| InvokeHelper types.
80 // Invoker<> -- Unwraps the curried parameters and executes the Runnable.
81 // There are |(ARITY^2 + ARITY)/2| Invoketypes.
82 // BindState<> -- Stores the curried parameters, and is the main entry point
83 // into the Bind() system, doing most of the type resolution.
84 // There are ARITY BindState types.
85
86
87 // RunnableAdapter<>
35 // 88 //
36 // The templates below handle the determination of each of these dimensions. 89 // The RunnableAdapter<> templates provide a uniform interface for invoking
37 // In brief: 90 // a function pointer, method pointer, or const method pointer. The adapter
91 // exposes a Run() method with an appropriate signature. Using this wrapper
92 // allows for writing code that supports all three pointer types without
93 // undue repetition. Without it, a lot of code would need to be repeated 3
94 // times.
38 // 95 //
39 // FunctionTraits<> -- Provides a normalied signature, and other traits. 96 // For method pointers and const method pointers the first argument to Run()
40 // InvokerN<> -- Provides a DoInvoke() function that actually executes 97 // is considered to be the received of the method. This is similar to STL's
41 // a calback. 98 // mem_fun().
42 // InvokerStorageN<> -- Provides storage for the bound parameters, and
43 // typedefs to the above.
44 // IsWeakMethod<> -- Determines if we are binding a method to a WeakPtr<>.
45 // 99 //
46 // More details about the design of each class is included in a comment closer 100 // This class also exposes a RunType typedef that is the function type of the
47 // to their defition. 101 // Run() function.
48 102 //
49 103 // If and only if the wrapper contains a method or const method pointer, an
50 // IsWeakMethod determines if we are binding a method to a WeakPtr<> for an 104 // IsMethod typedef is exposed. The existence of this typedef (NOT the value)
51 // object. It is used to select an InvokerN that will no-op itself in the 105 // marks that the wrapper should be considered a method wrapper.
52 // event the WeakPtr<> for the target object is invalidated. 106
53 template <bool IsMethod, typename T> 107 template <typename Functor>
54 struct IsWeakMethod : public false_type {}; 108 class RunnableAdapter;
55 109
56 template <typename T> 110 // Function: Arity 0.
57 struct IsWeakMethod<true, WeakPtr<T> > : public true_type {}; 111 template <typename R>
112 class RunnableAdapter<R(*)()> {
113 public:
114 typedef R (RunType)();
115
116 explicit RunnableAdapter(R(*function)())
117 : function_(function) {
118 }
119
120 R Run() {
121 return function_();
122 }
123
124 private:
125 R (*function_)();
126 };
127
128 // Method: Arity 0.
129 template <typename R, typename T>
130 class RunnableAdapter<R(T::*)()> {
131 public:
132 typedef R (RunType)(T*);
133 typedef true_type IsMethod;
134
135 explicit RunnableAdapter(R(T::*method)())
136 : method_(method) {
137 }
138
139 R Run(T* object) {
140 return (object->*method_)();
141 }
142
143 private:
144 R (T::*method_)();
145 };
146
147 // Const Method: Arity 0.
148 template <typename R, typename T>
149 class RunnableAdapter<R(T::*)() const> {
150 public:
151 typedef R (RunType)(const T*);
152 typedef true_type IsMethod;
153
154 explicit RunnableAdapter(R(T::*method)() const)
155 : method_(method) {
156 }
157
158 R Run(const T* object) {
159 return (object->*method_)();
160 }
161
162 private:
163 R (T::*method_)() const;
164 };
165
166 // Function: Arity 1.
167 template <typename R, typename A1>
168 class RunnableAdapter<R(*)(A1)> {
169 public:
170 typedef R (RunType)(A1);
171
172 explicit RunnableAdapter(R(*function)(A1))
173 : function_(function) {
174 }
175
176 R Run(typename CallbackParamTraits<A1>::ForwardType a1) {
177 return function_(a1);
178 }
179
180 private:
181 R (*function_)(A1);
182 };
183
184 // Method: Arity 1.
185 template <typename R, typename T, typename A1>
186 class RunnableAdapter<R(T::*)(A1)> {
187 public:
188 typedef R (RunType)(T*, A1);
189 typedef true_type IsMethod;
190
191 explicit RunnableAdapter(R(T::*method)(A1))
192 : method_(method) {
193 }
194
195 R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1) {
196 return (object->*method_)(a1);
197 }
198
199 private:
200 R (T::*method_)(A1);
201 };
202
203 // Const Method: Arity 1.
204 template <typename R, typename T, typename A1>
205 class RunnableAdapter<R(T::*)(A1) const> {
206 public:
207 typedef R (RunType)(const T*, A1);
208 typedef true_type IsMethod;
209
210 explicit RunnableAdapter(R(T::*method)(A1) const)
211 : method_(method) {
212 }
213
214 R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1) {
215 return (object->*method_)(a1);
216 }
217
218 private:
219 R (T::*method_)(A1) const;
220 };
221
222 // Function: Arity 2.
223 template <typename R, typename A1, typename A2>
224 class RunnableAdapter<R(*)(A1, A2)> {
225 public:
226 typedef R (RunType)(A1, A2);
227
228 explicit RunnableAdapter(R(*function)(A1, A2))
229 : function_(function) {
230 }
231
232 R Run(typename CallbackParamTraits<A1>::ForwardType a1,
233 typename CallbackParamTraits<A2>::ForwardType a2) {
234 return function_(a1, a2);
235 }
236
237 private:
238 R (*function_)(A1, A2);
239 };
240
241 // Method: Arity 2.
242 template <typename R, typename T, typename A1, typename A2>
243 class RunnableAdapter<R(T::*)(A1, A2)> {
244 public:
245 typedef R (RunType)(T*, A1, A2);
246 typedef true_type IsMethod;
247
248 explicit RunnableAdapter(R(T::*method)(A1, A2))
249 : method_(method) {
250 }
251
252 R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1,
253 typename CallbackParamTraits<A2>::ForwardType a2) {
254 return (object->*method_)(a1, a2);
255 }
256
257 private:
258 R (T::*method_)(A1, A2);
259 };
260
261 // Const Method: Arity 2.
262 template <typename R, typename T, typename A1, typename A2>
263 class RunnableAdapter<R(T::*)(A1, A2) const> {
264 public:
265 typedef R (RunType)(const T*, A1, A2);
266 typedef true_type IsMethod;
267
268 explicit RunnableAdapter(R(T::*method)(A1, A2) const)
269 : method_(method) {
270 }
271
272 R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1,
273 typename CallbackParamTraits<A2>::ForwardType a2) {
274 return (object->*method_)(a1, a2);
275 }
276
277 private:
278 R (T::*method_)(A1, A2) const;
279 };
280
281 // Function: Arity 3.
282 template <typename R, typename A1, typename A2, typename A3>
283 class RunnableAdapter<R(*)(A1, A2, A3)> {
284 public:
285 typedef R (RunType)(A1, A2, A3);
286
287 explicit RunnableAdapter(R(*function)(A1, A2, A3))
288 : function_(function) {
289 }
290
291 R Run(typename CallbackParamTraits<A1>::ForwardType a1,
292 typename CallbackParamTraits<A2>::ForwardType a2,
293 typename CallbackParamTraits<A3>::ForwardType a3) {
294 return function_(a1, a2, a3);
295 }
296
297 private:
298 R (*function_)(A1, A2, A3);
299 };
300
301 // Method: Arity 3.
302 template <typename R, typename T, typename A1, typename A2, typename A3>
303 class RunnableAdapter<R(T::*)(A1, A2, A3)> {
304 public:
305 typedef R (RunType)(T*, A1, A2, A3);
306 typedef true_type IsMethod;
307
308 explicit RunnableAdapter(R(T::*method)(A1, A2, A3))
309 : method_(method) {
310 }
311
312 R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1,
313 typename CallbackParamTraits<A2>::ForwardType a2,
314 typename CallbackParamTraits<A3>::ForwardType a3) {
315 return (object->*method_)(a1, a2, a3);
316 }
317
318 private:
319 R (T::*method_)(A1, A2, A3);
320 };
321
322 // Const Method: Arity 3.
323 template <typename R, typename T, typename A1, typename A2, typename A3>
324 class RunnableAdapter<R(T::*)(A1, A2, A3) const> {
325 public:
326 typedef R (RunType)(const T*, A1, A2, A3);
327 typedef true_type IsMethod;
328
329 explicit RunnableAdapter(R(T::*method)(A1, A2, A3) const)
330 : method_(method) {
331 }
332
333 R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1,
334 typename CallbackParamTraits<A2>::ForwardType a2,
335 typename CallbackParamTraits<A3>::ForwardType a3) {
336 return (object->*method_)(a1, a2, a3);
337 }
338
339 private:
340 R (T::*method_)(A1, A2, A3) const;
341 };
342
343 // Function: Arity 4.
344 template <typename R, typename A1, typename A2, typename A3, typename A4>
345 class RunnableAdapter<R(*)(A1, A2, A3, A4)> {
346 public:
347 typedef R (RunType)(A1, A2, A3, A4);
348
349 explicit RunnableAdapter(R(*function)(A1, A2, A3, A4))
350 : function_(function) {
351 }
352
353 R Run(typename CallbackParamTraits<A1>::ForwardType a1,
354 typename CallbackParamTraits<A2>::ForwardType a2,
355 typename CallbackParamTraits<A3>::ForwardType a3,
356 typename CallbackParamTraits<A4>::ForwardType a4) {
357 return function_(a1, a2, a3, a4);
358 }
359
360 private:
361 R (*function_)(A1, A2, A3, A4);
362 };
363
364 // Method: Arity 4.
365 template <typename R, typename T, typename A1, typename A2, typename A3,
366 typename A4>
367 class RunnableAdapter<R(T::*)(A1, A2, A3, A4)> {
368 public:
369 typedef R (RunType)(T*, A1, A2, A3, A4);
370 typedef true_type IsMethod;
371
372 explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4))
373 : method_(method) {
374 }
375
376 R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1,
377 typename CallbackParamTraits<A2>::ForwardType a2,
378 typename CallbackParamTraits<A3>::ForwardType a3,
379 typename CallbackParamTraits<A4>::ForwardType a4) {
380 return (object->*method_)(a1, a2, a3, a4);
381 }
382
383 private:
384 R (T::*method_)(A1, A2, A3, A4);
385 };
386
387 // Const Method: Arity 4.
388 template <typename R, typename T, typename A1, typename A2, typename A3,
389 typename A4>
390 class RunnableAdapter<R(T::*)(A1, A2, A3, A4) const> {
391 public:
392 typedef R (RunType)(const T*, A1, A2, A3, A4);
393 typedef true_type IsMethod;
394
395 explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4) const)
396 : method_(method) {
397 }
398
399 R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1,
400 typename CallbackParamTraits<A2>::ForwardType a2,
401 typename CallbackParamTraits<A3>::ForwardType a3,
402 typename CallbackParamTraits<A4>::ForwardType a4) {
403 return (object->*method_)(a1, a2, a3, a4);
404 }
405
406 private:
407 R (T::*method_)(A1, A2, A3, A4) const;
408 };
409
410 // Function: Arity 5.
411 template <typename R, typename A1, typename A2, typename A3, typename A4,
412 typename A5>
413 class RunnableAdapter<R(*)(A1, A2, A3, A4, A5)> {
414 public:
415 typedef R (RunType)(A1, A2, A3, A4, A5);
416
417 explicit RunnableAdapter(R(*function)(A1, A2, A3, A4, A5))
418 : function_(function) {
419 }
420
421 R Run(typename CallbackParamTraits<A1>::ForwardType a1,
422 typename CallbackParamTraits<A2>::ForwardType a2,
423 typename CallbackParamTraits<A3>::ForwardType a3,
424 typename CallbackParamTraits<A4>::ForwardType a4,
425 typename CallbackParamTraits<A5>::ForwardType a5) {
426 return function_(a1, a2, a3, a4, a5);
427 }
428
429 private:
430 R (*function_)(A1, A2, A3, A4, A5);
431 };
432
433 // Method: Arity 5.
434 template <typename R, typename T, typename A1, typename A2, typename A3,
435 typename A4, typename A5>
436 class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5)> {
437 public:
438 typedef R (RunType)(T*, A1, A2, A3, A4, A5);
439 typedef true_type IsMethod;
440
441 explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5))
442 : method_(method) {
443 }
444
445 R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1,
446 typename CallbackParamTraits<A2>::ForwardType a2,
447 typename CallbackParamTraits<A3>::ForwardType a3,
448 typename CallbackParamTraits<A4>::ForwardType a4,
449 typename CallbackParamTraits<A5>::ForwardType a5) {
450 return (object->*method_)(a1, a2, a3, a4, a5);
451 }
452
453 private:
454 R (T::*method_)(A1, A2, A3, A4, A5);
455 };
456
457 // Const Method: Arity 5.
458 template <typename R, typename T, typename A1, typename A2, typename A3,
459 typename A4, typename A5>
460 class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5) const> {
461 public:
462 typedef R (RunType)(const T*, A1, A2, A3, A4, A5);
463 typedef true_type IsMethod;
464
465 explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5) const)
466 : method_(method) {
467 }
468
469 R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1,
470 typename CallbackParamTraits<A2>::ForwardType a2,
471 typename CallbackParamTraits<A3>::ForwardType a3,
472 typename CallbackParamTraits<A4>::ForwardType a4,
473 typename CallbackParamTraits<A5>::ForwardType a5) {
474 return (object->*method_)(a1, a2, a3, a4, a5);
475 }
476
477 private:
478 R (T::*method_)(A1, A2, A3, A4, A5) const;
479 };
480
481 // Function: Arity 6.
482 template <typename R, typename A1, typename A2, typename A3, typename A4,
483 typename A5, typename A6>
484 class RunnableAdapter<R(*)(A1, A2, A3, A4, A5, A6)> {
485 public:
486 typedef R (RunType)(A1, A2, A3, A4, A5, A6);
487
488 explicit RunnableAdapter(R(*function)(A1, A2, A3, A4, A5, A6))
489 : function_(function) {
490 }
491
492 R Run(typename CallbackParamTraits<A1>::ForwardType a1,
493 typename CallbackParamTraits<A2>::ForwardType a2,
494 typename CallbackParamTraits<A3>::ForwardType a3,
495 typename CallbackParamTraits<A4>::ForwardType a4,
496 typename CallbackParamTraits<A5>::ForwardType a5,
497 typename CallbackParamTraits<A6>::ForwardType a6) {
498 return function_(a1, a2, a3, a4, a5, a6);
499 }
500
501 private:
502 R (*function_)(A1, A2, A3, A4, A5, A6);
503 };
504
505 // Method: Arity 6.
506 template <typename R, typename T, typename A1, typename A2, typename A3,
507 typename A4, typename A5, typename A6>
508 class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6)> {
509 public:
510 typedef R (RunType)(T*, A1, A2, A3, A4, A5, A6);
511 typedef true_type IsMethod;
512
513 explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6))
514 : method_(method) {
515 }
516
517 R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1,
518 typename CallbackParamTraits<A2>::ForwardType a2,
519 typename CallbackParamTraits<A3>::ForwardType a3,
520 typename CallbackParamTraits<A4>::ForwardType a4,
521 typename CallbackParamTraits<A5>::ForwardType a5,
522 typename CallbackParamTraits<A6>::ForwardType a6) {
523 return (object->*method_)(a1, a2, a3, a4, a5, a6);
524 }
525
526 private:
527 R (T::*method_)(A1, A2, A3, A4, A5, A6);
528 };
529
530 // Const Method: Arity 6.
531 template <typename R, typename T, typename A1, typename A2, typename A3,
532 typename A4, typename A5, typename A6>
533 class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6) const> {
534 public:
535 typedef R (RunType)(const T*, A1, A2, A3, A4, A5, A6);
536 typedef true_type IsMethod;
537
538 explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6) const)
539 : method_(method) {
540 }
541
542 R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1,
543 typename CallbackParamTraits<A2>::ForwardType a2,
544 typename CallbackParamTraits<A3>::ForwardType a3,
545 typename CallbackParamTraits<A4>::ForwardType a4,
546 typename CallbackParamTraits<A5>::ForwardType a5,
547 typename CallbackParamTraits<A6>::ForwardType a6) {
548 return (object->*method_)(a1, a2, a3, a4, a5, a6);
549 }
550
551 private:
552 R (T::*method_)(A1, A2, A3, A4, A5, A6) const;
553 };
554
58 555
59 // FunctionTraits<> 556 // FunctionTraits<>
60 // 557 //
61 // The FunctionTraits<> template determines the type of function, and also 558 // Breaks a function signature apart into typedefs for easier introspection.
62 // creates a NormalizedType used to select the InvokerN classes. It turns out
63 // that syntactically, you only really have 2 variations when invoking a
64 // funciton pointer: normal, and method. One is invoked func_ptr(arg1). The
65 // other is invoked (*obj_->method_ptr(arg1)).
66 //
67 // However, in the type system, there are many more distinctions. In standard
68 // C++, there's all variations of const, and volatile on the function pointer.
69 // In Windows, there are additional calling conventions (eg., __stdcall,
70 // __fastcall, etc.). FunctionTraits<> handles categorizing each of these into
71 // a normalized signature.
72 //
73 // Having a NormalizedSignature signature, reduces the combinatoric
74 // complexity of defintions for the InvokerN<> later. Even though there are
75 // only 2 syntactic variations on invoking a function, without normalizing the
76 // signature, there would need to be one specialization of InvokerN for each
77 // unique (function_type, bound_arg, unbound_args) tuple in order to match all
78 // function signatures.
79 //
80 // By normalizing the function signature, we reduce function_type to exactly 2.
81
82 template <typename Sig> 559 template <typename Sig>
83 struct FunctionTraits; 560 struct FunctionTraits;
84 561
85 // Function: Arity 0.
86 template <typename R> 562 template <typename R>
87 struct FunctionTraits<R(*)()> { 563 struct FunctionTraits<R()> {
88 typedef R (*NormalizedSig)(); 564 typedef R ReturnType;
89 typedef false_type IsMethod; 565 };
90 566
91 typedef R Return; 567 template <typename R, typename A1>
92 568 struct FunctionTraits<R(A1)> {
93 }; 569 typedef R ReturnType;
94 570 typedef A1 A1Type;
95 // Method: Arity 0. 571 };
96 template <typename R, typename T> 572
97 struct FunctionTraits<R(T::*)()> { 573 template <typename R, typename A1, typename A2>
98 typedef R (T::*NormalizedSig)(); 574 struct FunctionTraits<R(A1, A2)> {
99 typedef true_type IsMethod; 575 typedef R ReturnType;
100 576 typedef A1 A1Type;
101 typedef R Return; 577 typedef A2 A2Type;
102 578 };
103 // Target type for each bound parameter. 579
104 typedef T B1; 580 template <typename R, typename A1, typename A2, typename A3>
105 581 struct FunctionTraits<R(A1, A2, A3)> {
106 }; 582 typedef R ReturnType;
107 583 typedef A1 A1Type;
108 // Const Method: Arity 0. 584 typedef A2 A2Type;
109 template <typename R, typename T> 585 typedef A3 A3Type;
110 struct FunctionTraits<R(T::*)() const> { 586 };
111 typedef R (T::*NormalizedSig)(); 587
112 typedef true_type IsMethod; 588 template <typename R, typename A1, typename A2, typename A3, typename A4>
113 589 struct FunctionTraits<R(A1, A2, A3, A4)> {
114 typedef R Return; 590 typedef R ReturnType;
115 591 typedef A1 A1Type;
116 // Target type for each bound parameter. 592 typedef A2 A2Type;
117 typedef T B1; 593 typedef A3 A3Type;
118 594 typedef A4 A4Type;
119 }; 595 };
120 596
121 // Function: Arity 1. 597 template <typename R, typename A1, typename A2, typename A3, typename A4,
122 template <typename R, typename X1> 598 typename A5>
123 struct FunctionTraits<R(*)(X1)> { 599 struct FunctionTraits<R(A1, A2, A3, A4, A5)> {
124 typedef R (*NormalizedSig)(X1); 600 typedef R ReturnType;
125 typedef false_type IsMethod; 601 typedef A1 A1Type;
126 602 typedef A2 A2Type;
127 typedef R Return; 603 typedef A3 A3Type;
128 604 typedef A4 A4Type;
129 // Target type for each bound parameter. 605 typedef A5 A5Type;
130 typedef X1 B1; 606 };
131 607
132 }; 608 template <typename R, typename A1, typename A2, typename A3, typename A4,
133 609 typename A5, typename A6>
134 // Method: Arity 1. 610 struct FunctionTraits<R(A1, A2, A3, A4, A5, A6)> {
135 template <typename R, typename T, typename X1> 611 typedef R ReturnType;
136 struct FunctionTraits<R(T::*)(X1)> { 612 typedef A1 A1Type;
137 typedef R (T::*NormalizedSig)(X1); 613 typedef A2 A2Type;
138 typedef true_type IsMethod; 614 typedef A3 A3Type;
139 615 typedef A4 A4Type;
140 typedef R Return; 616 typedef A5 A5Type;
141 617 typedef A6 A6Type;
142 // Target type for each bound parameter. 618 };
143 typedef T B1; 619
144 typedef X1 B2; 620
145 621 // ForceVoidReturn<>
146 };
147
148 // Const Method: Arity 1.
149 template <typename R, typename T, typename X1>
150 struct FunctionTraits<R(T::*)(X1) const> {
151 typedef R (T::*NormalizedSig)(X1);
152 typedef true_type IsMethod;
153
154 typedef R Return;
155
156 // Target type for each bound parameter.
157 typedef T B1;
158 typedef X1 B2;
159
160 };
161
162 // Function: Arity 2.
163 template <typename R, typename X1, typename X2>
164 struct FunctionTraits<R(*)(X1, X2)> {
165 typedef R (*NormalizedSig)(X1, X2);
166 typedef false_type IsMethod;
167
168 typedef R Return;
169
170 // Target type for each bound parameter.
171 typedef X1 B1;
172 typedef X2 B2;
173
174 };
175
176 // Method: Arity 2.
177 template <typename R, typename T, typename X1, typename X2>
178 struct FunctionTraits<R(T::*)(X1, X2)> {
179 typedef R (T::*NormalizedSig)(X1, X2);
180 typedef true_type IsMethod;
181
182 typedef R Return;
183
184 // Target type for each bound parameter.
185 typedef T B1;
186 typedef X1 B2;
187 typedef X2 B3;
188
189 };
190
191 // Const Method: Arity 2.
192 template <typename R, typename T, typename X1, typename X2>
193 struct FunctionTraits<R(T::*)(X1, X2) const> {
194 typedef R (T::*NormalizedSig)(X1, X2);
195 typedef true_type IsMethod;
196
197 typedef R Return;
198
199 // Target type for each bound parameter.
200 typedef T B1;
201 typedef X1 B2;
202 typedef X2 B3;
203
204 };
205
206 // Function: Arity 3.
207 template <typename R, typename X1, typename X2, typename X3>
208 struct FunctionTraits<R(*)(X1, X2, X3)> {
209 typedef R (*NormalizedSig)(X1, X2, X3);
210 typedef false_type IsMethod;
211
212 typedef R Return;
213
214 // Target type for each bound parameter.
215 typedef X1 B1;
216 typedef X2 B2;
217 typedef X3 B3;
218
219 };
220
221 // Method: Arity 3.
222 template <typename R, typename T, typename X1, typename X2, typename X3>
223 struct FunctionTraits<R(T::*)(X1, X2, X3)> {
224 typedef R (T::*NormalizedSig)(X1, X2, X3);
225 typedef true_type IsMethod;
226
227 typedef R Return;
228
229 // Target type for each bound parameter.
230 typedef T B1;
231 typedef X1 B2;
232 typedef X2 B3;
233 typedef X3 B4;
234
235 };
236
237 // Const Method: Arity 3.
238 template <typename R, typename T, typename X1, typename X2, typename X3>
239 struct FunctionTraits<R(T::*)(X1, X2, X3) const> {
240 typedef R (T::*NormalizedSig)(X1, X2, X3);
241 typedef true_type IsMethod;
242
243 typedef R Return;
244
245 // Target type for each bound parameter.
246 typedef T B1;
247 typedef X1 B2;
248 typedef X2 B3;
249 typedef X3 B4;
250
251 };
252
253 // Function: Arity 4.
254 template <typename R, typename X1, typename X2, typename X3, typename X4>
255 struct FunctionTraits<R(*)(X1, X2, X3, X4)> {
256 typedef R (*NormalizedSig)(X1, X2, X3, X4);
257 typedef false_type IsMethod;
258
259 typedef R Return;
260
261 // Target type for each bound parameter.
262 typedef X1 B1;
263 typedef X2 B2;
264 typedef X3 B3;
265 typedef X4 B4;
266
267 };
268
269 // Method: Arity 4.
270 template <typename R, typename T, typename X1, typename X2, typename X3,
271 typename X4>
272 struct FunctionTraits<R(T::*)(X1, X2, X3, X4)> {
273 typedef R (T::*NormalizedSig)(X1, X2, X3, X4);
274 typedef true_type IsMethod;
275
276 typedef R Return;
277
278 // Target type for each bound parameter.
279 typedef T B1;
280 typedef X1 B2;
281 typedef X2 B3;
282 typedef X3 B4;
283 typedef X4 B5;
284
285 };
286
287 // Const Method: Arity 4.
288 template <typename R, typename T, typename X1, typename X2, typename X3,
289 typename X4>
290 struct FunctionTraits<R(T::*)(X1, X2, X3, X4) const> {
291 typedef R (T::*NormalizedSig)(X1, X2, X3, X4);
292 typedef true_type IsMethod;
293
294 typedef R Return;
295
296 // Target type for each bound parameter.
297 typedef T B1;
298 typedef X1 B2;
299 typedef X2 B3;
300 typedef X3 B4;
301 typedef X4 B5;
302
303 };
304
305 // Function: Arity 5.
306 template <typename R, typename X1, typename X2, typename X3, typename X4,
307 typename X5>
308 struct FunctionTraits<R(*)(X1, X2, X3, X4, X5)> {
309 typedef R (*NormalizedSig)(X1, X2, X3, X4, X5);
310 typedef false_type IsMethod;
311
312 typedef R Return;
313
314 // Target type for each bound parameter.
315 typedef X1 B1;
316 typedef X2 B2;
317 typedef X3 B3;
318 typedef X4 B4;
319 typedef X5 B5;
320
321 };
322
323 // Method: Arity 5.
324 template <typename R, typename T, typename X1, typename X2, typename X3,
325 typename X4, typename X5>
326 struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5)> {
327 typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5);
328 typedef true_type IsMethod;
329
330 typedef R Return;
331
332 // Target type for each bound parameter.
333 typedef T B1;
334 typedef X1 B2;
335 typedef X2 B3;
336 typedef X3 B4;
337 typedef X4 B5;
338 typedef X5 B6;
339
340 };
341
342 // Const Method: Arity 5.
343 template <typename R, typename T, typename X1, typename X2, typename X3,
344 typename X4, typename X5>
345 struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5) const> {
346 typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5);
347 typedef true_type IsMethod;
348
349 typedef R Return;
350
351 // Target type for each bound parameter.
352 typedef T B1;
353 typedef X1 B2;
354 typedef X2 B3;
355 typedef X3 B4;
356 typedef X4 B5;
357 typedef X5 B6;
358
359 };
360
361 // Function: Arity 6.
362 template <typename R, typename X1, typename X2, typename X3, typename X4,
363 typename X5, typename X6>
364 struct FunctionTraits<R(*)(X1, X2, X3, X4, X5, X6)> {
365 typedef R (*NormalizedSig)(X1, X2, X3, X4, X5, X6);
366 typedef false_type IsMethod;
367
368 typedef R Return;
369
370 // Target type for each bound parameter.
371 typedef X1 B1;
372 typedef X2 B2;
373 typedef X3 B3;
374 typedef X4 B4;
375 typedef X5 B5;
376 typedef X6 B6;
377
378 };
379
380 // Method: Arity 6.
381 template <typename R, typename T, typename X1, typename X2, typename X3,
382 typename X4, typename X5, typename X6>
383 struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5, X6)> {
384 typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5, X6);
385 typedef true_type IsMethod;
386
387 typedef R Return;
388
389 // Target type for each bound parameter.
390 typedef T B1;
391 typedef X1 B2;
392 typedef X2 B3;
393 typedef X3 B4;
394 typedef X4 B5;
395 typedef X5 B6;
396 typedef X6 B7;
397
398 };
399
400 // Const Method: Arity 6.
401 template <typename R, typename T, typename X1, typename X2, typename X3,
402 typename X4, typename X5, typename X6>
403 struct FunctionTraits<R(T::*)(X1, X2, X3, X4, X5, X6) const> {
404 typedef R (T::*NormalizedSig)(X1, X2, X3, X4, X5, X6);
405 typedef true_type IsMethod;
406
407 typedef R Return;
408
409 // Target type for each bound parameter.
410 typedef T B1;
411 typedef X1 B2;
412 typedef X2 B3;
413 typedef X3 B4;
414 typedef X4 B5;
415 typedef X5 B6;
416 typedef X6 B7;
417
418 };
419
420 // InvokerN<>
421 // 622 //
422 // The InvokerN templates contain a static DoInvoke() function that is the key 623 // Set of templates that support forcing the function return type to void.
423 // to implementing type erasure in the Callback() classes. 624 template <typename Sig>
625 struct ForceVoidReturn;
626
627 template <typename R>
628 struct ForceVoidReturn<R()> {
629 typedef void(RunType)();
630 };
631
632 template <typename R, typename A1>
633 struct ForceVoidReturn<R(A1)> {
634 typedef void(RunType)(A1);
635 };
636
637 template <typename R, typename A1, typename A2>
638 struct ForceVoidReturn<R(A1, A2)> {
639 typedef void(RunType)(A1, A2);
640 };
641
642 template <typename R, typename A1, typename A2, typename A3>
643 struct ForceVoidReturn<R(A1, A2, A3)> {
644 typedef void(RunType)(A1, A2, A3);
645 };
646
647 template <typename R, typename A1, typename A2, typename A3, typename A4>
648 struct ForceVoidReturn<R(A1, A2, A3, A4)> {
649 typedef void(RunType)(A1, A2, A3, A4);
650 };
651
652 template <typename R, typename A1, typename A2, typename A3, typename A4,
653 typename A5>
654 struct ForceVoidReturn<R(A1, A2, A3, A4, A5)> {
655 typedef void(RunType)(A1, A2, A3, A4, A5);
656 };
657
658 template <typename R, typename A1, typename A2, typename A3, typename A4,
659 typename A5, typename A6>
660 struct ForceVoidReturn<R(A1, A2, A3, A4, A5, A6)> {
661 typedef void(RunType)(A1, A2, A3, A4, A5, A6);
662 };
663
664
665 // FunctorTraits<>
424 // 666 //
425 // DoInvoke() is a static function with a fixed signature that is independent 667 // See description at top of file.
426 // of StorageType; its first argument is a pointer to the non-templated common 668 template <typename T>
427 // baseclass of StorageType. This lets us store pointer to DoInvoke() in a 669 struct FunctorTraits {
428 // function pointer that has knowledge of the specific StorageType, and thus 670 typedef RunnableAdapter<T> RunnableType;
429 // no knowledge of the bound function and bound parameter types. 671 typedef typename RunnableType::RunType RunType;
672 };
673
674 template <typename T>
675 struct FunctorTraits<IgnoreResultHelper<T> > {
676 typedef typename FunctorTraits<T>::RunnableType RunnableType;
677 typedef typename ForceVoidReturn<
678 typename RunnableType::RunType>::RunType RunType;
679 };
680
681 template <typename T>
682 struct FunctorTraits<Callback<T> > {
683 typedef Callback<T> RunnableType;
684 typedef typename Callback<T>::RunType RunType;
685 };
686
687
688 // MakeRunnable<>
430 // 689 //
431 // As long as we ensure that DoInvoke() is only used with pointers there were 690 // Converts a passed in functor to a RunnableType using type inference.
432 // upcasted from the correct StorageType, we can be sure that execution is 691
433 // safe. 692 template <typename T>
693 typename FunctorTraits<T>::RunnableType MakeRunnable(const T& t) {
694 return RunnableAdapter<T>(t);
695 }
696
697 template <typename T>
698 typename FunctorTraits<T>::RunnableType
699 MakeRunnable(const IgnoreResultHelper<T>& t) {
700 return MakeRunnable(t.functor_);
701 }
702
703 template <typename T>
704 const typename FunctorTraits<Callback<T> >::RunnableType&
705 MakeRunnable(const Callback<T>& t) {
706 return t;
707 }
708
709
710 // InvokeHelper<>
434 // 711 //
435 // The InvokerN templates are the only point that knows the number of bound 712 // There are 3 logical InvokeHelper<> specializations: normal, void-return,
436 // and unbound arguments. This is intentional because it allows the other 713 // WeakCalls.
437 // templates classes in the system to only have as many specializations as 714 //
438 // the max arity of function we wish to support. 715 // The normal type just calls the underlying runnable.
439 716 //
440 template <bool IsWeak, typename StorageType, typename NormalizedSig> 717 // We need a InvokeHelper to handle void return types in order to support
441 struct Invoker0; 718 // IgnoreResult(). Normally, if the Runnable's RunType had a void return,
442 719 // the template system would just accept "return functor.Run()" ignoring
443 // Function: Arity 0 -> 0. 720 // the fact that a void function is being used with return. This piece of
721 // sugar breaks though when the Runnable's RunType is not void. Thus, we
722 // need a partial specialization to change the syntax to drop the "return"
723 // from the invocation call.
724 //
725 // WeakCalls similarly need special syntax that is applied to the first
726 // argument to check if they should no-op themselves.
727 template <bool IsWeakCall, typename ReturnType, typename Runnable,
728 typename ArgsType>
729 struct InvokeHelper;
730
731 template <typename ReturnType, typename Runnable>
732 struct InvokeHelper<false, ReturnType, Runnable,
733 void()> {
734 static ReturnType MakeItSo(Runnable runnable) {
735 return runnable.Run();
736 }
737 };
738
739 template <typename Runnable>
740 struct InvokeHelper<false, void, Runnable,
741 void()> {
742 static void MakeItSo(Runnable runnable) {
743 runnable.Run();
744 }
745 };
746
747 template <typename ReturnType, typename Runnable,typename A1>
748 struct InvokeHelper<false, ReturnType, Runnable,
749 void(A1)> {
750 static ReturnType MakeItSo(Runnable runnable, A1 a1) {
751 return runnable.Run(a1);
752 }
753 };
754
755 template <typename Runnable,typename A1>
756 struct InvokeHelper<false, void, Runnable,
757 void(A1)> {
758 static void MakeItSo(Runnable runnable, A1 a1) {
759 runnable.Run(a1);
760 }
761 };
762
763 template <typename Runnable, typename A1>
764 struct InvokeHelper<true, void, Runnable,
765 void(A1)> {
766 static void MakeItSo(Runnable runnable, A1 a1) {
767 if (!a1.get()) {
768 return;
769 }
770
771 runnable.Run(a1);
772 }
773 };
774
775 template <typename ReturnType, typename Runnable,typename A1, typename A2>
776 struct InvokeHelper<false, ReturnType, Runnable,
777 void(A1, A2)> {
778 static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2) {
779 return runnable.Run(a1, a2);
780 }
781 };
782
783 template <typename Runnable,typename A1, typename A2>
784 struct InvokeHelper<false, void, Runnable,
785 void(A1, A2)> {
786 static void MakeItSo(Runnable runnable, A1 a1, A2 a2) {
787 runnable.Run(a1, a2);
788 }
789 };
790
791 template <typename Runnable, typename A1, typename A2>
792 struct InvokeHelper<true, void, Runnable,
793 void(A1, A2)> {
794 static void MakeItSo(Runnable runnable, A1 a1, A2 a2) {
795 if (!a1.get()) {
796 return;
797 }
798
799 runnable.Run(a1, a2);
800 }
801 };
802
803 template <typename ReturnType, typename Runnable,typename A1, typename A2,
804 typename A3>
805 struct InvokeHelper<false, ReturnType, Runnable,
806 void(A1, A2, A3)> {
807 static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3) {
808 return runnable.Run(a1, a2, a3);
809 }
810 };
811
812 template <typename Runnable,typename A1, typename A2, typename A3>
813 struct InvokeHelper<false, void, Runnable,
814 void(A1, A2, A3)> {
815 static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3) {
816 runnable.Run(a1, a2, a3);
817 }
818 };
819
820 template <typename Runnable, typename A1, typename A2, typename A3>
821 struct InvokeHelper<true, void, Runnable,
822 void(A1, A2, A3)> {
823 static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3) {
824 if (!a1.get()) {
825 return;
826 }
827
828 runnable.Run(a1, a2, a3);
829 }
830 };
831
832 template <typename ReturnType, typename Runnable,typename A1, typename A2,
833 typename A3, typename A4>
834 struct InvokeHelper<false, ReturnType, Runnable,
835 void(A1, A2, A3, A4)> {
836 static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4) {
837 return runnable.Run(a1, a2, a3, a4);
838 }
839 };
840
841 template <typename Runnable,typename A1, typename A2, typename A3, typename A4>
842 struct InvokeHelper<false, void, Runnable,
843 void(A1, A2, A3, A4)> {
844 static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4) {
845 runnable.Run(a1, a2, a3, a4);
846 }
847 };
848
849 template <typename Runnable, typename A1, typename A2, typename A3, typename A4>
850 struct InvokeHelper<true, void, Runnable,
851 void(A1, A2, A3, A4)> {
852 static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4) {
853 if (!a1.get()) {
854 return;
855 }
856
857 runnable.Run(a1, a2, a3, a4);
858 }
859 };
860
861 template <typename ReturnType, typename Runnable,typename A1, typename A2,
862 typename A3, typename A4, typename A5>
863 struct InvokeHelper<false, ReturnType, Runnable,
864 void(A1, A2, A3, A4, A5)> {
865 static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4,
866 A5 a5) {
867 return runnable.Run(a1, a2, a3, a4, a5);
868 }
869 };
870
871 template <typename Runnable,typename A1, typename A2, typename A3, typename A4,
872 typename A5>
873 struct InvokeHelper<false, void, Runnable,
874 void(A1, A2, A3, A4, A5)> {
875 static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
876 runnable.Run(a1, a2, a3, a4, a5);
877 }
878 };
879
880 template <typename Runnable, typename A1, typename A2, typename A3,
881 typename A4, typename A5>
882 struct InvokeHelper<true, void, Runnable,
883 void(A1, A2, A3, A4, A5)> {
884 static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
885 if (!a1.get()) {
886 return;
887 }
888
889 runnable.Run(a1, a2, a3, a4, a5);
890 }
891 };
892
893 template <typename ReturnType, typename Runnable,typename A1, typename A2,
894 typename A3, typename A4, typename A5, typename A6>
895 struct InvokeHelper<false, ReturnType, Runnable,
896 void(A1, A2, A3, A4, A5, A6)> {
897 static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4,
898 A5 a5, A6 a6) {
899 return runnable.Run(a1, a2, a3, a4, a5, a6);
900 }
901 };
902
903 template <typename Runnable,typename A1, typename A2, typename A3, typename A4,
904 typename A5, typename A6>
905 struct InvokeHelper<false, void, Runnable,
906 void(A1, A2, A3, A4, A5, A6)> {
907 static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5,
908 A6 a6) {
909 runnable.Run(a1, a2, a3, a4, a5, a6);
910 }
911 };
912
913 template <typename Runnable, typename A1, typename A2, typename A3,
914 typename A4, typename A5, typename A6>
915 struct InvokeHelper<true, void, Runnable,
916 void(A1, A2, A3, A4, A5, A6)> {
917 static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5,
918 A6 a6) {
919 if (!a1.get()) {
920 return;
921 }
922
923 runnable.Run(a1, a2, a3, a4, a5, a6);
924 }
925 };
926
927 #if !defined(_MSC_VER)
928
929 template <typename ReturnType, typename Runnable, typename ArgsType>
930 struct InvokeHelper<true, ReturnType, Runnable, ArgsType> {
931 // WeakCalls are only supported for functions with a void return type.
932 // Otherwise, the function result would be undefined if the the WeakPtr<>
933 // is invalidated.
934 COMPILE_ASSERT(is_void<ReturnType>::value,
935 weak_ptrs_can_only_bind_to_methods_without_return_values);
936 };
937
938 #endif
939
940 // Invoker<>
941 //
942 // See description at the top of the file.
943 template <int NumBound, typename Storage, typename RunType>
944 struct Invoker;
945
946 // Arity 0 -> 0.
444 template <typename StorageType, typename R> 947 template <typename StorageType, typename R>
445 struct Invoker0<false, StorageType, R(*)()> { 948 struct Invoker<0, StorageType, R()> {
446 typedef R(*DoInvokeType)( 949 typedef R(RunType)(BindStateBase*);
447 internal::InvokerStorageBase*); 950
448 951 typedef R(UnboundRunType)();
449 static R DoInvoke(InvokerStorageBase* base) { 952
450 StorageType* invoker = static_cast<StorageType*>(base); 953 static R Run(BindStateBase* base) {
451 return invoker->f_(); 954 StorageType* storage = static_cast<StorageType*>(base);
452 } 955
453 }; 956 // Local references to make debugger stepping easier. If in a debugger,
454 957 // you really want to warp ahead and step through the
455 // Function: Arity 1 -> 1. 958 // InvokeHelper<>::MakeItSo() call below.
959
960 return InvokeHelper<StorageType::IsWeakCall::value, R,
961 typename StorageType::RunnableType,
962 void()>
963 ::MakeItSo(storage->runnable_);
964 }
965 };
966
967 // Arity 1 -> 1.
456 template <typename StorageType, typename R,typename X1> 968 template <typename StorageType, typename R,typename X1>
457 struct Invoker0<false, StorageType, R(*)(X1)> { 969 struct Invoker<0, StorageType, R(X1)> {
458 typedef R(*DoInvokeType)( 970 typedef R(RunType)(BindStateBase*,
459 internal::InvokerStorageBase*, 971 typename CallbackParamTraits<X1>::ForwardType);
460 typename internal::ParamTraits<X1>::ForwardType); 972
461 973 typedef R(UnboundRunType)(X1);
462 static R DoInvoke(InvokerStorageBase* base, 974
463 typename internal::ParamTraits<X1>::ForwardType x1) { 975 static R Run(BindStateBase* base,
464 StorageType* invoker = static_cast<StorageType*>(base); 976 typename CallbackParamTraits<X1>::ForwardType x1) {
465 return invoker->f_(x1); 977 StorageType* storage = static_cast<StorageType*>(base);
466 } 978
467 }; 979 // Local references to make debugger stepping easier. If in a debugger,
468 980 // you really want to warp ahead and step through the
469 // Function: Arity 2 -> 2. 981 // InvokeHelper<>::MakeItSo() call below.
982
983 return InvokeHelper<StorageType::IsWeakCall::value, R,
984 typename StorageType::RunnableType,
985 void(typename CallbackParamTraits<X1>::ForwardType x1)>
986 ::MakeItSo(storage->runnable_, x1);
987 }
988 };
989
990 // Arity 1 -> 0.
991 template <typename StorageType, typename R,typename X1>
992 struct Invoker<1, StorageType, R(X1)> {
993 typedef R(RunType)(BindStateBase*);
994
995 typedef R(UnboundRunType)();
996
997 static R Run(BindStateBase* base) {
998 StorageType* storage = static_cast<StorageType*>(base);
999
1000 // Local references to make debugger stepping easier. If in a debugger,
1001 // you really want to warp ahead and step through the
1002 // InvokeHelper<>::MakeItSo() call below.
1003 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1004
1005 typename Bound1UnwrapTraits::ForwardType x1 =
1006 Bound1UnwrapTraits::Unwrap(storage->p1_);
1007 return InvokeHelper<StorageType::IsWeakCall::value, R,
1008 typename StorageType::RunnableType,
1009 void(typename Bound1UnwrapTraits::ForwardType)>
1010 ::MakeItSo(storage->runnable_, x1);
1011 }
1012 };
1013
1014 // Arity 2 -> 2.
470 template <typename StorageType, typename R,typename X1, typename X2> 1015 template <typename StorageType, typename R,typename X1, typename X2>
471 struct Invoker0<false, StorageType, R(*)(X1, X2)> { 1016 struct Invoker<0, StorageType, R(X1, X2)> {
472 typedef R(*DoInvokeType)( 1017 typedef R(RunType)(BindStateBase*,
473 internal::InvokerStorageBase*, 1018 typename CallbackParamTraits<X1>::ForwardType,
474 typename internal::ParamTraits<X1>::ForwardType, 1019 typename CallbackParamTraits<X2>::ForwardType);
475 typename internal::ParamTraits<X2>::ForwardType); 1020
476 1021 typedef R(UnboundRunType)(X1, X2);
477 static R DoInvoke(InvokerStorageBase* base, 1022
478 typename internal::ParamTraits<X1>::ForwardType x1, 1023 static R Run(BindStateBase* base,
479 typename internal::ParamTraits<X2>::ForwardType x2) { 1024 typename CallbackParamTraits<X1>::ForwardType x1,
480 StorageType* invoker = static_cast<StorageType*>(base); 1025 typename CallbackParamTraits<X2>::ForwardType x2) {
481 return invoker->f_(x1, x2); 1026 StorageType* storage = static_cast<StorageType*>(base);
482 } 1027
483 }; 1028 // Local references to make debugger stepping easier. If in a debugger,
484 1029 // you really want to warp ahead and step through the
485 // Function: Arity 3 -> 3. 1030 // InvokeHelper<>::MakeItSo() call below.
1031
1032 return InvokeHelper<StorageType::IsWeakCall::value, R,
1033 typename StorageType::RunnableType,
1034 void(typename CallbackParamTraits<X1>::ForwardType x1,
1035 typename CallbackParamTraits<X2>::ForwardType x2)>
1036 ::MakeItSo(storage->runnable_, x1, x2);
1037 }
1038 };
1039
1040 // Arity 2 -> 1.
1041 template <typename StorageType, typename R,typename X1, typename X2>
1042 struct Invoker<1, StorageType, R(X1, X2)> {
1043 typedef R(RunType)(BindStateBase*,
1044 typename CallbackParamTraits<X2>::ForwardType);
1045
1046 typedef R(UnboundRunType)(X2);
1047
1048 static R Run(BindStateBase* base,
1049 typename CallbackParamTraits<X2>::ForwardType x2) {
1050 StorageType* storage = static_cast<StorageType*>(base);
1051
1052 // Local references to make debugger stepping easier. If in a debugger,
1053 // you really want to warp ahead and step through the
1054 // InvokeHelper<>::MakeItSo() call below.
1055 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1056
1057 typename Bound1UnwrapTraits::ForwardType x1 =
1058 Bound1UnwrapTraits::Unwrap(storage->p1_);
1059 return InvokeHelper<StorageType::IsWeakCall::value, R,
1060 typename StorageType::RunnableType,
1061 void(typename Bound1UnwrapTraits::ForwardType,
1062 typename CallbackParamTraits<X2>::ForwardType x2)>
1063 ::MakeItSo(storage->runnable_, x1, x2);
1064 }
1065 };
1066
1067 // Arity 2 -> 0.
1068 template <typename StorageType, typename R,typename X1, typename X2>
1069 struct Invoker<2, StorageType, R(X1, X2)> {
1070 typedef R(RunType)(BindStateBase*);
1071
1072 typedef R(UnboundRunType)();
1073
1074 static R Run(BindStateBase* base) {
1075 StorageType* storage = static_cast<StorageType*>(base);
1076
1077 // Local references to make debugger stepping easier. If in a debugger,
1078 // you really want to warp ahead and step through the
1079 // InvokeHelper<>::MakeItSo() call below.
1080 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1081 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1082
1083 typename Bound1UnwrapTraits::ForwardType x1 =
1084 Bound1UnwrapTraits::Unwrap(storage->p1_);
1085 typename Bound2UnwrapTraits::ForwardType x2 =
1086 Bound2UnwrapTraits::Unwrap(storage->p2_);
1087 return InvokeHelper<StorageType::IsWeakCall::value, R,
1088 typename StorageType::RunnableType,
1089 void(typename Bound1UnwrapTraits::ForwardType,
1090 typename Bound2UnwrapTraits::ForwardType)>
1091 ::MakeItSo(storage->runnable_, x1, x2);
1092 }
1093 };
1094
1095 // Arity 3 -> 3.
486 template <typename StorageType, typename R,typename X1, typename X2, 1096 template <typename StorageType, typename R,typename X1, typename X2,
487 typename X3> 1097 typename X3>
488 struct Invoker0<false, StorageType, R(*)(X1, X2, X3)> { 1098 struct Invoker<0, StorageType, R(X1, X2, X3)> {
489 typedef R(*DoInvokeType)( 1099 typedef R(RunType)(BindStateBase*,
490 internal::InvokerStorageBase*, 1100 typename CallbackParamTraits<X1>::ForwardType,
491 typename internal::ParamTraits<X1>::ForwardType, 1101 typename CallbackParamTraits<X2>::ForwardType,
492 typename internal::ParamTraits<X2>::ForwardType, 1102 typename CallbackParamTraits<X3>::ForwardType);
493 typename internal::ParamTraits<X3>::ForwardType); 1103
494 1104 typedef R(UnboundRunType)(X1, X2, X3);
495 static R DoInvoke(InvokerStorageBase* base, 1105
496 typename internal::ParamTraits<X1>::ForwardType x1, 1106 static R Run(BindStateBase* base,
497 typename internal::ParamTraits<X2>::ForwardType x2, 1107 typename CallbackParamTraits<X1>::ForwardType x1,
498 typename internal::ParamTraits<X3>::ForwardType x3) { 1108 typename CallbackParamTraits<X2>::ForwardType x2,
499 StorageType* invoker = static_cast<StorageType*>(base); 1109 typename CallbackParamTraits<X3>::ForwardType x3) {
500 return invoker->f_(x1, x2, x3); 1110 StorageType* storage = static_cast<StorageType*>(base);
501 } 1111
502 }; 1112 // Local references to make debugger stepping easier. If in a debugger,
503 1113 // you really want to warp ahead and step through the
504 // Function: Arity 4 -> 4. 1114 // InvokeHelper<>::MakeItSo() call below.
1115
1116 return InvokeHelper<StorageType::IsWeakCall::value, R,
1117 typename StorageType::RunnableType,
1118 void(typename CallbackParamTraits<X1>::ForwardType x1,
1119 typename CallbackParamTraits<X2>::ForwardType x2,
1120 typename CallbackParamTraits<X3>::ForwardType x3)>
1121 ::MakeItSo(storage->runnable_, x1, x2, x3);
1122 }
1123 };
1124
1125 // Arity 3 -> 2.
1126 template <typename StorageType, typename R,typename X1, typename X2,
1127 typename X3>
1128 struct Invoker<1, StorageType, R(X1, X2, X3)> {
1129 typedef R(RunType)(BindStateBase*,
1130 typename CallbackParamTraits<X2>::ForwardType,
1131 typename CallbackParamTraits<X3>::ForwardType);
1132
1133 typedef R(UnboundRunType)(X2, X3);
1134
1135 static R Run(BindStateBase* base,
1136 typename CallbackParamTraits<X2>::ForwardType x2,
1137 typename CallbackParamTraits<X3>::ForwardType x3) {
1138 StorageType* storage = static_cast<StorageType*>(base);
1139
1140 // Local references to make debugger stepping easier. If in a debugger,
1141 // you really want to warp ahead and step through the
1142 // InvokeHelper<>::MakeItSo() call below.
1143 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1144
1145 typename Bound1UnwrapTraits::ForwardType x1 =
1146 Bound1UnwrapTraits::Unwrap(storage->p1_);
1147 return InvokeHelper<StorageType::IsWeakCall::value, R,
1148 typename StorageType::RunnableType,
1149 void(typename Bound1UnwrapTraits::ForwardType,
1150 typename CallbackParamTraits<X2>::ForwardType x2,
1151 typename CallbackParamTraits<X3>::ForwardType x3)>
1152 ::MakeItSo(storage->runnable_, x1, x2, x3);
1153 }
1154 };
1155
1156 // Arity 3 -> 1.
1157 template <typename StorageType, typename R,typename X1, typename X2,
1158 typename X3>
1159 struct Invoker<2, StorageType, R(X1, X2, X3)> {
1160 typedef R(RunType)(BindStateBase*,
1161 typename CallbackParamTraits<X3>::ForwardType);
1162
1163 typedef R(UnboundRunType)(X3);
1164
1165 static R Run(BindStateBase* base,
1166 typename CallbackParamTraits<X3>::ForwardType x3) {
1167 StorageType* storage = static_cast<StorageType*>(base);
1168
1169 // Local references to make debugger stepping easier. If in a debugger,
1170 // you really want to warp ahead and step through the
1171 // InvokeHelper<>::MakeItSo() call below.
1172 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1173 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1174
1175 typename Bound1UnwrapTraits::ForwardType x1 =
1176 Bound1UnwrapTraits::Unwrap(storage->p1_);
1177 typename Bound2UnwrapTraits::ForwardType x2 =
1178 Bound2UnwrapTraits::Unwrap(storage->p2_);
1179 return InvokeHelper<StorageType::IsWeakCall::value, R,
1180 typename StorageType::RunnableType,
1181 void(typename Bound1UnwrapTraits::ForwardType,
1182 typename Bound2UnwrapTraits::ForwardType,
1183 typename CallbackParamTraits<X3>::ForwardType x3)>
1184 ::MakeItSo(storage->runnable_, x1, x2, x3);
1185 }
1186 };
1187
1188 // Arity 3 -> 0.
1189 template <typename StorageType, typename R,typename X1, typename X2,
1190 typename X3>
1191 struct Invoker<3, StorageType, R(X1, X2, X3)> {
1192 typedef R(RunType)(BindStateBase*);
1193
1194 typedef R(UnboundRunType)();
1195
1196 static R Run(BindStateBase* base) {
1197 StorageType* storage = static_cast<StorageType*>(base);
1198
1199 // Local references to make debugger stepping easier. If in a debugger,
1200 // you really want to warp ahead and step through the
1201 // InvokeHelper<>::MakeItSo() call below.
1202 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1203 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1204 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1205
1206 typename Bound1UnwrapTraits::ForwardType x1 =
1207 Bound1UnwrapTraits::Unwrap(storage->p1_);
1208 typename Bound2UnwrapTraits::ForwardType x2 =
1209 Bound2UnwrapTraits::Unwrap(storage->p2_);
1210 typename Bound3UnwrapTraits::ForwardType x3 =
1211 Bound3UnwrapTraits::Unwrap(storage->p3_);
1212 return InvokeHelper<StorageType::IsWeakCall::value, R,
1213 typename StorageType::RunnableType,
1214 void(typename Bound1UnwrapTraits::ForwardType,
1215 typename Bound2UnwrapTraits::ForwardType,
1216 typename Bound3UnwrapTraits::ForwardType)>
1217 ::MakeItSo(storage->runnable_, x1, x2, x3);
1218 }
1219 };
1220
1221 // Arity 4 -> 4.
505 template <typename StorageType, typename R,typename X1, typename X2, 1222 template <typename StorageType, typename R,typename X1, typename X2,
506 typename X3, typename X4> 1223 typename X3, typename X4>
507 struct Invoker0<false, StorageType, R(*)(X1, X2, X3, X4)> { 1224 struct Invoker<0, StorageType, R(X1, X2, X3, X4)> {
508 typedef R(*DoInvokeType)( 1225 typedef R(RunType)(BindStateBase*,
509 internal::InvokerStorageBase*, 1226 typename CallbackParamTraits<X1>::ForwardType,
510 typename internal::ParamTraits<X1>::ForwardType, 1227 typename CallbackParamTraits<X2>::ForwardType,
511 typename internal::ParamTraits<X2>::ForwardType, 1228 typename CallbackParamTraits<X3>::ForwardType,
512 typename internal::ParamTraits<X3>::ForwardType, 1229 typename CallbackParamTraits<X4>::ForwardType);
513 typename internal::ParamTraits<X4>::ForwardType); 1230
514 1231 typedef R(UnboundRunType)(X1, X2, X3, X4);
515 static R DoInvoke(InvokerStorageBase* base, 1232
516 typename internal::ParamTraits<X1>::ForwardType x1, 1233 static R Run(BindStateBase* base,
517 typename internal::ParamTraits<X2>::ForwardType x2, 1234 typename CallbackParamTraits<X1>::ForwardType x1,
518 typename internal::ParamTraits<X3>::ForwardType x3, 1235 typename CallbackParamTraits<X2>::ForwardType x2,
519 typename internal::ParamTraits<X4>::ForwardType x4) { 1236 typename CallbackParamTraits<X3>::ForwardType x3,
520 StorageType* invoker = static_cast<StorageType*>(base); 1237 typename CallbackParamTraits<X4>::ForwardType x4) {
521 return invoker->f_(x1, x2, x3, x4); 1238 StorageType* storage = static_cast<StorageType*>(base);
522 } 1239
523 }; 1240 // Local references to make debugger stepping easier. If in a debugger,
524 1241 // you really want to warp ahead and step through the
525 // Function: Arity 5 -> 5. 1242 // InvokeHelper<>::MakeItSo() call below.
1243
1244 return InvokeHelper<StorageType::IsWeakCall::value, R,
1245 typename StorageType::RunnableType,
1246 void(typename CallbackParamTraits<X1>::ForwardType x1,
1247 typename CallbackParamTraits<X2>::ForwardType x2,
1248 typename CallbackParamTraits<X3>::ForwardType x3,
1249 typename CallbackParamTraits<X4>::ForwardType x4)>
1250 ::MakeItSo(storage->runnable_, x1, x2, x3, x4);
1251 }
1252 };
1253
1254 // Arity 4 -> 3.
1255 template <typename StorageType, typename R,typename X1, typename X2,
1256 typename X3, typename X4>
1257 struct Invoker<1, StorageType, R(X1, X2, X3, X4)> {
1258 typedef R(RunType)(BindStateBase*,
1259 typename CallbackParamTraits<X2>::ForwardType,
1260 typename CallbackParamTraits<X3>::ForwardType,
1261 typename CallbackParamTraits<X4>::ForwardType);
1262
1263 typedef R(UnboundRunType)(X2, X3, X4);
1264
1265 static R Run(BindStateBase* base,
1266 typename CallbackParamTraits<X2>::ForwardType x2,
1267 typename CallbackParamTraits<X3>::ForwardType x3,
1268 typename CallbackParamTraits<X4>::ForwardType x4) {
1269 StorageType* storage = static_cast<StorageType*>(base);
1270
1271 // Local references to make debugger stepping easier. If in a debugger,
1272 // you really want to warp ahead and step through the
1273 // InvokeHelper<>::MakeItSo() call below.
1274 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1275
1276 typename Bound1UnwrapTraits::ForwardType x1 =
1277 Bound1UnwrapTraits::Unwrap(storage->p1_);
1278 return InvokeHelper<StorageType::IsWeakCall::value, R,
1279 typename StorageType::RunnableType,
1280 void(typename Bound1UnwrapTraits::ForwardType,
1281 typename CallbackParamTraits<X2>::ForwardType x2,
1282 typename CallbackParamTraits<X3>::ForwardType x3,
1283 typename CallbackParamTraits<X4>::ForwardType x4)>
1284 ::MakeItSo(storage->runnable_, x1, x2, x3, x4);
1285 }
1286 };
1287
1288 // Arity 4 -> 2.
1289 template <typename StorageType, typename R,typename X1, typename X2,
1290 typename X3, typename X4>
1291 struct Invoker<2, StorageType, R(X1, X2, X3, X4)> {
1292 typedef R(RunType)(BindStateBase*,
1293 typename CallbackParamTraits<X3>::ForwardType,
1294 typename CallbackParamTraits<X4>::ForwardType);
1295
1296 typedef R(UnboundRunType)(X3, X4);
1297
1298 static R Run(BindStateBase* base,
1299 typename CallbackParamTraits<X3>::ForwardType x3,
1300 typename CallbackParamTraits<X4>::ForwardType x4) {
1301 StorageType* storage = static_cast<StorageType*>(base);
1302
1303 // Local references to make debugger stepping easier. If in a debugger,
1304 // you really want to warp ahead and step through the
1305 // InvokeHelper<>::MakeItSo() call below.
1306 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1307 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1308
1309 typename Bound1UnwrapTraits::ForwardType x1 =
1310 Bound1UnwrapTraits::Unwrap(storage->p1_);
1311 typename Bound2UnwrapTraits::ForwardType x2 =
1312 Bound2UnwrapTraits::Unwrap(storage->p2_);
1313 return InvokeHelper<StorageType::IsWeakCall::value, R,
1314 typename StorageType::RunnableType,
1315 void(typename Bound1UnwrapTraits::ForwardType,
1316 typename Bound2UnwrapTraits::ForwardType,
1317 typename CallbackParamTraits<X3>::ForwardType x3,
1318 typename CallbackParamTraits<X4>::ForwardType x4)>
1319 ::MakeItSo(storage->runnable_, x1, x2, x3, x4);
1320 }
1321 };
1322
1323 // Arity 4 -> 1.
1324 template <typename StorageType, typename R,typename X1, typename X2,
1325 typename X3, typename X4>
1326 struct Invoker<3, StorageType, R(X1, X2, X3, X4)> {
1327 typedef R(RunType)(BindStateBase*,
1328 typename CallbackParamTraits<X4>::ForwardType);
1329
1330 typedef R(UnboundRunType)(X4);
1331
1332 static R Run(BindStateBase* base,
1333 typename CallbackParamTraits<X4>::ForwardType x4) {
1334 StorageType* storage = static_cast<StorageType*>(base);
1335
1336 // Local references to make debugger stepping easier. If in a debugger,
1337 // you really want to warp ahead and step through the
1338 // InvokeHelper<>::MakeItSo() call below.
1339 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1340 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1341 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1342
1343 typename Bound1UnwrapTraits::ForwardType x1 =
1344 Bound1UnwrapTraits::Unwrap(storage->p1_);
1345 typename Bound2UnwrapTraits::ForwardType x2 =
1346 Bound2UnwrapTraits::Unwrap(storage->p2_);
1347 typename Bound3UnwrapTraits::ForwardType x3 =
1348 Bound3UnwrapTraits::Unwrap(storage->p3_);
1349 return InvokeHelper<StorageType::IsWeakCall::value, R,
1350 typename StorageType::RunnableType,
1351 void(typename Bound1UnwrapTraits::ForwardType,
1352 typename Bound2UnwrapTraits::ForwardType,
1353 typename Bound3UnwrapTraits::ForwardType,
1354 typename CallbackParamTraits<X4>::ForwardType x4)>
1355 ::MakeItSo(storage->runnable_, x1, x2, x3, x4);
1356 }
1357 };
1358
1359 // Arity 4 -> 0.
1360 template <typename StorageType, typename R,typename X1, typename X2,
1361 typename X3, typename X4>
1362 struct Invoker<4, StorageType, R(X1, X2, X3, X4)> {
1363 typedef R(RunType)(BindStateBase*);
1364
1365 typedef R(UnboundRunType)();
1366
1367 static R Run(BindStateBase* base) {
1368 StorageType* storage = static_cast<StorageType*>(base);
1369
1370 // Local references to make debugger stepping easier. If in a debugger,
1371 // you really want to warp ahead and step through the
1372 // InvokeHelper<>::MakeItSo() call below.
1373 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1374 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1375 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1376 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
1377
1378 typename Bound1UnwrapTraits::ForwardType x1 =
1379 Bound1UnwrapTraits::Unwrap(storage->p1_);
1380 typename Bound2UnwrapTraits::ForwardType x2 =
1381 Bound2UnwrapTraits::Unwrap(storage->p2_);
1382 typename Bound3UnwrapTraits::ForwardType x3 =
1383 Bound3UnwrapTraits::Unwrap(storage->p3_);
1384 typename Bound4UnwrapTraits::ForwardType x4 =
1385 Bound4UnwrapTraits::Unwrap(storage->p4_);
1386 return InvokeHelper<StorageType::IsWeakCall::value, R,
1387 typename StorageType::RunnableType,
1388 void(typename Bound1UnwrapTraits::ForwardType,
1389 typename Bound2UnwrapTraits::ForwardType,
1390 typename Bound3UnwrapTraits::ForwardType,
1391 typename Bound4UnwrapTraits::ForwardType)>
1392 ::MakeItSo(storage->runnable_, x1, x2, x3, x4);
1393 }
1394 };
1395
1396 // Arity 5 -> 5.
526 template <typename StorageType, typename R,typename X1, typename X2, 1397 template <typename StorageType, typename R,typename X1, typename X2,
527 typename X3, typename X4, typename X5> 1398 typename X3, typename X4, typename X5>
528 struct Invoker0<false, StorageType, R(*)(X1, X2, X3, X4, X5)> { 1399 struct Invoker<0, StorageType, R(X1, X2, X3, X4, X5)> {
529 typedef R(*DoInvokeType)( 1400 typedef R(RunType)(BindStateBase*,
530 internal::InvokerStorageBase*, 1401 typename CallbackParamTraits<X1>::ForwardType,
531 typename internal::ParamTraits<X1>::ForwardType, 1402 typename CallbackParamTraits<X2>::ForwardType,
532 typename internal::ParamTraits<X2>::ForwardType, 1403 typename CallbackParamTraits<X3>::ForwardType,
533 typename internal::ParamTraits<X3>::ForwardType, 1404 typename CallbackParamTraits<X4>::ForwardType,
534 typename internal::ParamTraits<X4>::ForwardType, 1405 typename CallbackParamTraits<X5>::ForwardType);
535 typename internal::ParamTraits<X5>::ForwardType); 1406
536 1407 typedef R(UnboundRunType)(X1, X2, X3, X4, X5);
537 static R DoInvoke(InvokerStorageBase* base, 1408
538 typename internal::ParamTraits<X1>::ForwardType x1, 1409 static R Run(BindStateBase* base,
539 typename internal::ParamTraits<X2>::ForwardType x2, 1410 typename CallbackParamTraits<X1>::ForwardType x1,
540 typename internal::ParamTraits<X3>::ForwardType x3, 1411 typename CallbackParamTraits<X2>::ForwardType x2,
541 typename internal::ParamTraits<X4>::ForwardType x4, 1412 typename CallbackParamTraits<X3>::ForwardType x3,
542 typename internal::ParamTraits<X5>::ForwardType x5) { 1413 typename CallbackParamTraits<X4>::ForwardType x4,
543 StorageType* invoker = static_cast<StorageType*>(base); 1414 typename CallbackParamTraits<X5>::ForwardType x5) {
544 return invoker->f_(x1, x2, x3, x4, x5); 1415 StorageType* storage = static_cast<StorageType*>(base);
545 } 1416
546 }; 1417 // Local references to make debugger stepping easier. If in a debugger,
547 1418 // you really want to warp ahead and step through the
548 // Function: Arity 6 -> 6. 1419 // InvokeHelper<>::MakeItSo() call below.
1420
1421 return InvokeHelper<StorageType::IsWeakCall::value, R,
1422 typename StorageType::RunnableType,
1423 void(typename CallbackParamTraits<X1>::ForwardType x1,
1424 typename CallbackParamTraits<X2>::ForwardType x2,
1425 typename CallbackParamTraits<X3>::ForwardType x3,
1426 typename CallbackParamTraits<X4>::ForwardType x4,
1427 typename CallbackParamTraits<X5>::ForwardType x5)>
1428 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5);
1429 }
1430 };
1431
1432 // Arity 5 -> 4.
1433 template <typename StorageType, typename R,typename X1, typename X2,
1434 typename X3, typename X4, typename X5>
1435 struct Invoker<1, StorageType, R(X1, X2, X3, X4, X5)> {
1436 typedef R(RunType)(BindStateBase*,
1437 typename CallbackParamTraits<X2>::ForwardType,
1438 typename CallbackParamTraits<X3>::ForwardType,
1439 typename CallbackParamTraits<X4>::ForwardType,
1440 typename CallbackParamTraits<X5>::ForwardType);
1441
1442 typedef R(UnboundRunType)(X2, X3, X4, X5);
1443
1444 static R Run(BindStateBase* base,
1445 typename CallbackParamTraits<X2>::ForwardType x2,
1446 typename CallbackParamTraits<X3>::ForwardType x3,
1447 typename CallbackParamTraits<X4>::ForwardType x4,
1448 typename CallbackParamTraits<X5>::ForwardType x5) {
1449 StorageType* storage = static_cast<StorageType*>(base);
1450
1451 // Local references to make debugger stepping easier. If in a debugger,
1452 // you really want to warp ahead and step through the
1453 // InvokeHelper<>::MakeItSo() call below.
1454 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1455
1456 typename Bound1UnwrapTraits::ForwardType x1 =
1457 Bound1UnwrapTraits::Unwrap(storage->p1_);
1458 return InvokeHelper<StorageType::IsWeakCall::value, R,
1459 typename StorageType::RunnableType,
1460 void(typename Bound1UnwrapTraits::ForwardType,
1461 typename CallbackParamTraits<X2>::ForwardType x2,
1462 typename CallbackParamTraits<X3>::ForwardType x3,
1463 typename CallbackParamTraits<X4>::ForwardType x4,
1464 typename CallbackParamTraits<X5>::ForwardType x5)>
1465 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5);
1466 }
1467 };
1468
1469 // Arity 5 -> 3.
1470 template <typename StorageType, typename R,typename X1, typename X2,
1471 typename X3, typename X4, typename X5>
1472 struct Invoker<2, StorageType, R(X1, X2, X3, X4, X5)> {
1473 typedef R(RunType)(BindStateBase*,
1474 typename CallbackParamTraits<X3>::ForwardType,
1475 typename CallbackParamTraits<X4>::ForwardType,
1476 typename CallbackParamTraits<X5>::ForwardType);
1477
1478 typedef R(UnboundRunType)(X3, X4, X5);
1479
1480 static R Run(BindStateBase* base,
1481 typename CallbackParamTraits<X3>::ForwardType x3,
1482 typename CallbackParamTraits<X4>::ForwardType x4,
1483 typename CallbackParamTraits<X5>::ForwardType x5) {
1484 StorageType* storage = static_cast<StorageType*>(base);
1485
1486 // Local references to make debugger stepping easier. If in a debugger,
1487 // you really want to warp ahead and step through the
1488 // InvokeHelper<>::MakeItSo() call below.
1489 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1490 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1491
1492 typename Bound1UnwrapTraits::ForwardType x1 =
1493 Bound1UnwrapTraits::Unwrap(storage->p1_);
1494 typename Bound2UnwrapTraits::ForwardType x2 =
1495 Bound2UnwrapTraits::Unwrap(storage->p2_);
1496 return InvokeHelper<StorageType::IsWeakCall::value, R,
1497 typename StorageType::RunnableType,
1498 void(typename Bound1UnwrapTraits::ForwardType,
1499 typename Bound2UnwrapTraits::ForwardType,
1500 typename CallbackParamTraits<X3>::ForwardType x3,
1501 typename CallbackParamTraits<X4>::ForwardType x4,
1502 typename CallbackParamTraits<X5>::ForwardType x5)>
1503 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5);
1504 }
1505 };
1506
1507 // Arity 5 -> 2.
1508 template <typename StorageType, typename R,typename X1, typename X2,
1509 typename X3, typename X4, typename X5>
1510 struct Invoker<3, StorageType, R(X1, X2, X3, X4, X5)> {
1511 typedef R(RunType)(BindStateBase*,
1512 typename CallbackParamTraits<X4>::ForwardType,
1513 typename CallbackParamTraits<X5>::ForwardType);
1514
1515 typedef R(UnboundRunType)(X4, X5);
1516
1517 static R Run(BindStateBase* base,
1518 typename CallbackParamTraits<X4>::ForwardType x4,
1519 typename CallbackParamTraits<X5>::ForwardType x5) {
1520 StorageType* storage = static_cast<StorageType*>(base);
1521
1522 // Local references to make debugger stepping easier. If in a debugger,
1523 // you really want to warp ahead and step through the
1524 // InvokeHelper<>::MakeItSo() call below.
1525 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1526 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1527 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1528
1529 typename Bound1UnwrapTraits::ForwardType x1 =
1530 Bound1UnwrapTraits::Unwrap(storage->p1_);
1531 typename Bound2UnwrapTraits::ForwardType x2 =
1532 Bound2UnwrapTraits::Unwrap(storage->p2_);
1533 typename Bound3UnwrapTraits::ForwardType x3 =
1534 Bound3UnwrapTraits::Unwrap(storage->p3_);
1535 return InvokeHelper<StorageType::IsWeakCall::value, R,
1536 typename StorageType::RunnableType,
1537 void(typename Bound1UnwrapTraits::ForwardType,
1538 typename Bound2UnwrapTraits::ForwardType,
1539 typename Bound3UnwrapTraits::ForwardType,
1540 typename CallbackParamTraits<X4>::ForwardType x4,
1541 typename CallbackParamTraits<X5>::ForwardType x5)>
1542 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5);
1543 }
1544 };
1545
1546 // Arity 5 -> 1.
1547 template <typename StorageType, typename R,typename X1, typename X2,
1548 typename X3, typename X4, typename X5>
1549 struct Invoker<4, StorageType, R(X1, X2, X3, X4, X5)> {
1550 typedef R(RunType)(BindStateBase*,
1551 typename CallbackParamTraits<X5>::ForwardType);
1552
1553 typedef R(UnboundRunType)(X5);
1554
1555 static R Run(BindStateBase* base,
1556 typename CallbackParamTraits<X5>::ForwardType x5) {
1557 StorageType* storage = static_cast<StorageType*>(base);
1558
1559 // Local references to make debugger stepping easier. If in a debugger,
1560 // you really want to warp ahead and step through the
1561 // InvokeHelper<>::MakeItSo() call below.
1562 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1563 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1564 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1565 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
1566
1567 typename Bound1UnwrapTraits::ForwardType x1 =
1568 Bound1UnwrapTraits::Unwrap(storage->p1_);
1569 typename Bound2UnwrapTraits::ForwardType x2 =
1570 Bound2UnwrapTraits::Unwrap(storage->p2_);
1571 typename Bound3UnwrapTraits::ForwardType x3 =
1572 Bound3UnwrapTraits::Unwrap(storage->p3_);
1573 typename Bound4UnwrapTraits::ForwardType x4 =
1574 Bound4UnwrapTraits::Unwrap(storage->p4_);
1575 return InvokeHelper<StorageType::IsWeakCall::value, R,
1576 typename StorageType::RunnableType,
1577 void(typename Bound1UnwrapTraits::ForwardType,
1578 typename Bound2UnwrapTraits::ForwardType,
1579 typename Bound3UnwrapTraits::ForwardType,
1580 typename Bound4UnwrapTraits::ForwardType,
1581 typename CallbackParamTraits<X5>::ForwardType x5)>
1582 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5);
1583 }
1584 };
1585
1586 // Arity 5 -> 0.
1587 template <typename StorageType, typename R,typename X1, typename X2,
1588 typename X3, typename X4, typename X5>
1589 struct Invoker<5, StorageType, R(X1, X2, X3, X4, X5)> {
1590 typedef R(RunType)(BindStateBase*);
1591
1592 typedef R(UnboundRunType)();
1593
1594 static R Run(BindStateBase* base) {
1595 StorageType* storage = static_cast<StorageType*>(base);
1596
1597 // Local references to make debugger stepping easier. If in a debugger,
1598 // you really want to warp ahead and step through the
1599 // InvokeHelper<>::MakeItSo() call below.
1600 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1601 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1602 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1603 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
1604 typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
1605
1606 typename Bound1UnwrapTraits::ForwardType x1 =
1607 Bound1UnwrapTraits::Unwrap(storage->p1_);
1608 typename Bound2UnwrapTraits::ForwardType x2 =
1609 Bound2UnwrapTraits::Unwrap(storage->p2_);
1610 typename Bound3UnwrapTraits::ForwardType x3 =
1611 Bound3UnwrapTraits::Unwrap(storage->p3_);
1612 typename Bound4UnwrapTraits::ForwardType x4 =
1613 Bound4UnwrapTraits::Unwrap(storage->p4_);
1614 typename Bound5UnwrapTraits::ForwardType x5 =
1615 Bound5UnwrapTraits::Unwrap(storage->p5_);
1616 return InvokeHelper<StorageType::IsWeakCall::value, R,
1617 typename StorageType::RunnableType,
1618 void(typename Bound1UnwrapTraits::ForwardType,
1619 typename Bound2UnwrapTraits::ForwardType,
1620 typename Bound3UnwrapTraits::ForwardType,
1621 typename Bound4UnwrapTraits::ForwardType,
1622 typename Bound5UnwrapTraits::ForwardType)>
1623 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5);
1624 }
1625 };
1626
1627 // Arity 6 -> 6.
549 template <typename StorageType, typename R,typename X1, typename X2, 1628 template <typename StorageType, typename R,typename X1, typename X2,
550 typename X3, typename X4, typename X5, typename X6> 1629 typename X3, typename X4, typename X5, typename X6>
551 struct Invoker0<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 1630 struct Invoker<0, StorageType, R(X1, X2, X3, X4, X5, X6)> {
552 typedef R(*DoInvokeType)( 1631 typedef R(RunType)(BindStateBase*,
553 internal::InvokerStorageBase*, 1632 typename CallbackParamTraits<X1>::ForwardType,
554 typename internal::ParamTraits<X1>::ForwardType, 1633 typename CallbackParamTraits<X2>::ForwardType,
555 typename internal::ParamTraits<X2>::ForwardType, 1634 typename CallbackParamTraits<X3>::ForwardType,
556 typename internal::ParamTraits<X3>::ForwardType, 1635 typename CallbackParamTraits<X4>::ForwardType,
557 typename internal::ParamTraits<X4>::ForwardType, 1636 typename CallbackParamTraits<X5>::ForwardType,
558 typename internal::ParamTraits<X5>::ForwardType, 1637 typename CallbackParamTraits<X6>::ForwardType);
559 typename internal::ParamTraits<X6>::ForwardType); 1638
560 1639 typedef R(UnboundRunType)(X1, X2, X3, X4, X5, X6);
561 static R DoInvoke(InvokerStorageBase* base, 1640
562 typename internal::ParamTraits<X1>::ForwardType x1, 1641 static R Run(BindStateBase* base,
563 typename internal::ParamTraits<X2>::ForwardType x2, 1642 typename CallbackParamTraits<X1>::ForwardType x1,
564 typename internal::ParamTraits<X3>::ForwardType x3, 1643 typename CallbackParamTraits<X2>::ForwardType x2,
565 typename internal::ParamTraits<X4>::ForwardType x4, 1644 typename CallbackParamTraits<X3>::ForwardType x3,
566 typename internal::ParamTraits<X5>::ForwardType x5, 1645 typename CallbackParamTraits<X4>::ForwardType x4,
567 typename internal::ParamTraits<X6>::ForwardType x6) { 1646 typename CallbackParamTraits<X5>::ForwardType x5,
568 StorageType* invoker = static_cast<StorageType*>(base); 1647 typename CallbackParamTraits<X6>::ForwardType x6) {
569 return invoker->f_(x1, x2, x3, x4, x5, x6); 1648 StorageType* storage = static_cast<StorageType*>(base);
570 } 1649
571 }; 1650 // Local references to make debugger stepping easier. If in a debugger,
572 1651 // you really want to warp ahead and step through the
573 template <bool IsWeak, typename StorageType, typename NormalizedSig> 1652 // InvokeHelper<>::MakeItSo() call below.
574 struct Invoker1; 1653
575 1654 return InvokeHelper<StorageType::IsWeakCall::value, R,
576 // Function: Arity 1 -> 0. 1655 typename StorageType::RunnableType,
577 template <typename StorageType, typename R,typename X1> 1656 void(typename CallbackParamTraits<X1>::ForwardType x1,
578 struct Invoker1<false, StorageType, R(*)(X1)> { 1657 typename CallbackParamTraits<X2>::ForwardType x2,
579 typedef R(*DoInvokeType)( 1658 typename CallbackParamTraits<X3>::ForwardType x3,
580 internal::InvokerStorageBase*); 1659 typename CallbackParamTraits<X4>::ForwardType x4,
581 1660 typename CallbackParamTraits<X5>::ForwardType x5,
582 static R DoInvoke(InvokerStorageBase* base) { 1661 typename CallbackParamTraits<X6>::ForwardType x6)>
583 StorageType* invoker = static_cast<StorageType*>(base); 1662 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6);
584 return invoker->f_(Unwrap(invoker->p1_)); 1663 }
585 } 1664 };
586 }; 1665
587 1666 // Arity 6 -> 5.
588 // Method: Arity 0 -> 0.
589 template <typename StorageType, typename R, typename T>
590 struct Invoker1<false, StorageType, R(T::*)()> {
591 typedef R(*DoInvokeType)(
592 internal::InvokerStorageBase*);
593
594 static R DoInvoke(InvokerStorageBase* base) {
595 StorageType* invoker = static_cast<StorageType*>(base);
596 return (Unwrap(invoker->p1_)->*invoker->f_)();
597 }
598 };
599
600 // WeakPtr Method: Arity 0 -> 0.
601 template <typename StorageType, typename T>
602 struct Invoker1<true, StorageType, void(T::*)()> {
603 typedef void(*DoInvokeType)(
604 internal::InvokerStorageBase*);
605
606 static void DoInvoke(InvokerStorageBase* base) {
607 StorageType* invoker = static_cast<StorageType*>(base);
608 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
609 if (!weak_ptr.get()) {
610 return;
611 }
612 (weak_ptr->*invoker->f_)();
613 }
614 };
615
616 // Function: Arity 2 -> 1.
617 template <typename StorageType, typename R,typename X1, typename X2>
618 struct Invoker1<false, StorageType, R(*)(X1, X2)> {
619 typedef R(*DoInvokeType)(
620 internal::InvokerStorageBase*,
621 typename internal::ParamTraits<X2>::ForwardType);
622
623 static R DoInvoke(InvokerStorageBase* base,
624 typename internal::ParamTraits<X2>::ForwardType x2) {
625 StorageType* invoker = static_cast<StorageType*>(base);
626 return invoker->f_(Unwrap(invoker->p1_), x2);
627 }
628 };
629
630 // Method: Arity 1 -> 1.
631 template <typename StorageType, typename R, typename T, typename X1>
632 struct Invoker1<false, StorageType, R(T::*)(X1)> {
633 typedef R(*DoInvokeType)(
634 internal::InvokerStorageBase*,
635 typename internal::ParamTraits<X1>::ForwardType);
636
637 static R DoInvoke(InvokerStorageBase* base,
638 typename internal::ParamTraits<X1>::ForwardType x1) {
639 StorageType* invoker = static_cast<StorageType*>(base);
640 return (Unwrap(invoker->p1_)->*invoker->f_)(x1);
641 }
642 };
643
644 // WeakPtr Method: Arity 1 -> 1.
645 template <typename StorageType, typename T, typename X1>
646 struct Invoker1<true, StorageType, void(T::*)(X1)> {
647 typedef void(*DoInvokeType)(
648 internal::InvokerStorageBase*,
649 typename internal::ParamTraits<X1>::ForwardType);
650
651 static void DoInvoke(InvokerStorageBase* base,
652 typename internal::ParamTraits<X1>::ForwardType x1) {
653 StorageType* invoker = static_cast<StorageType*>(base);
654 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
655 if (!weak_ptr.get()) {
656 return;
657 }
658 (weak_ptr->*invoker->f_)(x1);
659 }
660 };
661
662 // Function: Arity 3 -> 2.
663 template <typename StorageType, typename R,typename X1, typename X2,
664 typename X3>
665 struct Invoker1<false, StorageType, R(*)(X1, X2, X3)> {
666 typedef R(*DoInvokeType)(
667 internal::InvokerStorageBase*,
668 typename internal::ParamTraits<X2>::ForwardType,
669 typename internal::ParamTraits<X3>::ForwardType);
670
671 static R DoInvoke(InvokerStorageBase* base,
672 typename internal::ParamTraits<X2>::ForwardType x2,
673 typename internal::ParamTraits<X3>::ForwardType x3) {
674 StorageType* invoker = static_cast<StorageType*>(base);
675 return invoker->f_(Unwrap(invoker->p1_), x2, x3);
676 }
677 };
678
679 // Method: Arity 2 -> 2.
680 template <typename StorageType, typename R, typename T, typename X1,
681 typename X2>
682 struct Invoker1<false, StorageType, R(T::*)(X1, X2)> {
683 typedef R(*DoInvokeType)(
684 internal::InvokerStorageBase*,
685 typename internal::ParamTraits<X1>::ForwardType,
686 typename internal::ParamTraits<X2>::ForwardType);
687
688 static R DoInvoke(InvokerStorageBase* base,
689 typename internal::ParamTraits<X1>::ForwardType x1,
690 typename internal::ParamTraits<X2>::ForwardType x2) {
691 StorageType* invoker = static_cast<StorageType*>(base);
692 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2);
693 }
694 };
695
696 // WeakPtr Method: Arity 2 -> 2.
697 template <typename StorageType, typename T, typename X1, typename X2>
698 struct Invoker1<true, StorageType, void(T::*)(X1, X2)> {
699 typedef void(*DoInvokeType)(
700 internal::InvokerStorageBase*,
701 typename internal::ParamTraits<X1>::ForwardType,
702 typename internal::ParamTraits<X2>::ForwardType);
703
704 static void DoInvoke(InvokerStorageBase* base,
705 typename internal::ParamTraits<X1>::ForwardType x1,
706 typename internal::ParamTraits<X2>::ForwardType x2) {
707 StorageType* invoker = static_cast<StorageType*>(base);
708 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
709 if (!weak_ptr.get()) {
710 return;
711 }
712 (weak_ptr->*invoker->f_)(x1, x2);
713 }
714 };
715
716 // Function: Arity 4 -> 3.
717 template <typename StorageType, typename R,typename X1, typename X2,
718 typename X3, typename X4>
719 struct Invoker1<false, StorageType, R(*)(X1, X2, X3, X4)> {
720 typedef R(*DoInvokeType)(
721 internal::InvokerStorageBase*,
722 typename internal::ParamTraits<X2>::ForwardType,
723 typename internal::ParamTraits<X3>::ForwardType,
724 typename internal::ParamTraits<X4>::ForwardType);
725
726 static R DoInvoke(InvokerStorageBase* base,
727 typename internal::ParamTraits<X2>::ForwardType x2,
728 typename internal::ParamTraits<X3>::ForwardType x3,
729 typename internal::ParamTraits<X4>::ForwardType x4) {
730 StorageType* invoker = static_cast<StorageType*>(base);
731 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4);
732 }
733 };
734
735 // Method: Arity 3 -> 3.
736 template <typename StorageType, typename R, typename T, typename X1,
737 typename X2, typename X3>
738 struct Invoker1<false, StorageType, R(T::*)(X1, X2, X3)> {
739 typedef R(*DoInvokeType)(
740 internal::InvokerStorageBase*,
741 typename internal::ParamTraits<X1>::ForwardType,
742 typename internal::ParamTraits<X2>::ForwardType,
743 typename internal::ParamTraits<X3>::ForwardType);
744
745 static R DoInvoke(InvokerStorageBase* base,
746 typename internal::ParamTraits<X1>::ForwardType x1,
747 typename internal::ParamTraits<X2>::ForwardType x2,
748 typename internal::ParamTraits<X3>::ForwardType x3) {
749 StorageType* invoker = static_cast<StorageType*>(base);
750 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3);
751 }
752 };
753
754 // WeakPtr Method: Arity 3 -> 3.
755 template <typename StorageType, typename T, typename X1, typename X2,
756 typename X3>
757 struct Invoker1<true, StorageType, void(T::*)(X1, X2, X3)> {
758 typedef void(*DoInvokeType)(
759 internal::InvokerStorageBase*,
760 typename internal::ParamTraits<X1>::ForwardType,
761 typename internal::ParamTraits<X2>::ForwardType,
762 typename internal::ParamTraits<X3>::ForwardType);
763
764 static void DoInvoke(InvokerStorageBase* base,
765 typename internal::ParamTraits<X1>::ForwardType x1,
766 typename internal::ParamTraits<X2>::ForwardType x2,
767 typename internal::ParamTraits<X3>::ForwardType x3) {
768 StorageType* invoker = static_cast<StorageType*>(base);
769 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
770 if (!weak_ptr.get()) {
771 return;
772 }
773 (weak_ptr->*invoker->f_)(x1, x2, x3);
774 }
775 };
776
777 // Function: Arity 5 -> 4.
778 template <typename StorageType, typename R,typename X1, typename X2,
779 typename X3, typename X4, typename X5>
780 struct Invoker1<false, StorageType, R(*)(X1, X2, X3, X4, X5)> {
781 typedef R(*DoInvokeType)(
782 internal::InvokerStorageBase*,
783 typename internal::ParamTraits<X2>::ForwardType,
784 typename internal::ParamTraits<X3>::ForwardType,
785 typename internal::ParamTraits<X4>::ForwardType,
786 typename internal::ParamTraits<X5>::ForwardType);
787
788 static R DoInvoke(InvokerStorageBase* base,
789 typename internal::ParamTraits<X2>::ForwardType x2,
790 typename internal::ParamTraits<X3>::ForwardType x3,
791 typename internal::ParamTraits<X4>::ForwardType x4,
792 typename internal::ParamTraits<X5>::ForwardType x5) {
793 StorageType* invoker = static_cast<StorageType*>(base);
794 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5);
795 }
796 };
797
798 // Method: Arity 4 -> 4.
799 template <typename StorageType, typename R, typename T, typename X1,
800 typename X2, typename X3, typename X4>
801 struct Invoker1<false, StorageType, R(T::*)(X1, X2, X3, X4)> {
802 typedef R(*DoInvokeType)(
803 internal::InvokerStorageBase*,
804 typename internal::ParamTraits<X1>::ForwardType,
805 typename internal::ParamTraits<X2>::ForwardType,
806 typename internal::ParamTraits<X3>::ForwardType,
807 typename internal::ParamTraits<X4>::ForwardType);
808
809 static R DoInvoke(InvokerStorageBase* base,
810 typename internal::ParamTraits<X1>::ForwardType x1,
811 typename internal::ParamTraits<X2>::ForwardType x2,
812 typename internal::ParamTraits<X3>::ForwardType x3,
813 typename internal::ParamTraits<X4>::ForwardType x4) {
814 StorageType* invoker = static_cast<StorageType*>(base);
815 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4);
816 }
817 };
818
819 // WeakPtr Method: Arity 4 -> 4.
820 template <typename StorageType, typename T, typename X1, typename X2,
821 typename X3, typename X4>
822 struct Invoker1<true, StorageType, void(T::*)(X1, X2, X3, X4)> {
823 typedef void(*DoInvokeType)(
824 internal::InvokerStorageBase*,
825 typename internal::ParamTraits<X1>::ForwardType,
826 typename internal::ParamTraits<X2>::ForwardType,
827 typename internal::ParamTraits<X3>::ForwardType,
828 typename internal::ParamTraits<X4>::ForwardType);
829
830 static void DoInvoke(InvokerStorageBase* base,
831 typename internal::ParamTraits<X1>::ForwardType x1,
832 typename internal::ParamTraits<X2>::ForwardType x2,
833 typename internal::ParamTraits<X3>::ForwardType x3,
834 typename internal::ParamTraits<X4>::ForwardType x4) {
835 StorageType* invoker = static_cast<StorageType*>(base);
836 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
837 if (!weak_ptr.get()) {
838 return;
839 }
840 (weak_ptr->*invoker->f_)(x1, x2, x3, x4);
841 }
842 };
843
844 // Function: Arity 6 -> 5.
845 template <typename StorageType, typename R,typename X1, typename X2, 1667 template <typename StorageType, typename R,typename X1, typename X2,
846 typename X3, typename X4, typename X5, typename X6> 1668 typename X3, typename X4, typename X5, typename X6>
847 struct Invoker1<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 1669 struct Invoker<1, StorageType, R(X1, X2, X3, X4, X5, X6)> {
848 typedef R(*DoInvokeType)( 1670 typedef R(RunType)(BindStateBase*,
849 internal::InvokerStorageBase*, 1671 typename CallbackParamTraits<X2>::ForwardType,
850 typename internal::ParamTraits<X2>::ForwardType, 1672 typename CallbackParamTraits<X3>::ForwardType,
851 typename internal::ParamTraits<X3>::ForwardType, 1673 typename CallbackParamTraits<X4>::ForwardType,
852 typename internal::ParamTraits<X4>::ForwardType, 1674 typename CallbackParamTraits<X5>::ForwardType,
853 typename internal::ParamTraits<X5>::ForwardType, 1675 typename CallbackParamTraits<X6>::ForwardType);
854 typename internal::ParamTraits<X6>::ForwardType); 1676
855 1677 typedef R(UnboundRunType)(X2, X3, X4, X5, X6);
856 static R DoInvoke(InvokerStorageBase* base, 1678
857 typename internal::ParamTraits<X2>::ForwardType x2, 1679 static R Run(BindStateBase* base,
858 typename internal::ParamTraits<X3>::ForwardType x3, 1680 typename CallbackParamTraits<X2>::ForwardType x2,
859 typename internal::ParamTraits<X4>::ForwardType x4, 1681 typename CallbackParamTraits<X3>::ForwardType x3,
860 typename internal::ParamTraits<X5>::ForwardType x5, 1682 typename CallbackParamTraits<X4>::ForwardType x4,
861 typename internal::ParamTraits<X6>::ForwardType x6) { 1683 typename CallbackParamTraits<X5>::ForwardType x5,
862 StorageType* invoker = static_cast<StorageType*>(base); 1684 typename CallbackParamTraits<X6>::ForwardType x6) {
863 return invoker->f_(Unwrap(invoker->p1_), x2, x3, x4, x5, x6); 1685 StorageType* storage = static_cast<StorageType*>(base);
864 } 1686
865 }; 1687 // Local references to make debugger stepping easier. If in a debugger,
866 1688 // you really want to warp ahead and step through the
867 // Method: Arity 5 -> 5. 1689 // InvokeHelper<>::MakeItSo() call below.
868 template <typename StorageType, typename R, typename T, typename X1, 1690 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
869 typename X2, typename X3, typename X4, typename X5> 1691
870 struct Invoker1<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> { 1692 typename Bound1UnwrapTraits::ForwardType x1 =
871 typedef R(*DoInvokeType)( 1693 Bound1UnwrapTraits::Unwrap(storage->p1_);
872 internal::InvokerStorageBase*, 1694 return InvokeHelper<StorageType::IsWeakCall::value, R,
873 typename internal::ParamTraits<X1>::ForwardType, 1695 typename StorageType::RunnableType,
874 typename internal::ParamTraits<X2>::ForwardType, 1696 void(typename Bound1UnwrapTraits::ForwardType,
875 typename internal::ParamTraits<X3>::ForwardType, 1697 typename CallbackParamTraits<X2>::ForwardType x2,
876 typename internal::ParamTraits<X4>::ForwardType, 1698 typename CallbackParamTraits<X3>::ForwardType x3,
877 typename internal::ParamTraits<X5>::ForwardType); 1699 typename CallbackParamTraits<X4>::ForwardType x4,
878 1700 typename CallbackParamTraits<X5>::ForwardType x5,
879 static R DoInvoke(InvokerStorageBase* base, 1701 typename CallbackParamTraits<X6>::ForwardType x6)>
880 typename internal::ParamTraits<X1>::ForwardType x1, 1702 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6);
881 typename internal::ParamTraits<X2>::ForwardType x2, 1703 }
882 typename internal::ParamTraits<X3>::ForwardType x3, 1704 };
883 typename internal::ParamTraits<X4>::ForwardType x4, 1705
884 typename internal::ParamTraits<X5>::ForwardType x5) { 1706 // Arity 6 -> 4.
885 StorageType* invoker = static_cast<StorageType*>(base);
886 return (Unwrap(invoker->p1_)->*invoker->f_)(x1, x2, x3, x4, x5);
887 }
888 };
889
890 // WeakPtr Method: Arity 5 -> 5.
891 template <typename StorageType, typename T, typename X1, typename X2,
892 typename X3, typename X4, typename X5>
893 struct Invoker1<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> {
894 typedef void(*DoInvokeType)(
895 internal::InvokerStorageBase*,
896 typename internal::ParamTraits<X1>::ForwardType,
897 typename internal::ParamTraits<X2>::ForwardType,
898 typename internal::ParamTraits<X3>::ForwardType,
899 typename internal::ParamTraits<X4>::ForwardType,
900 typename internal::ParamTraits<X5>::ForwardType);
901
902 static void DoInvoke(InvokerStorageBase* base,
903 typename internal::ParamTraits<X1>::ForwardType x1,
904 typename internal::ParamTraits<X2>::ForwardType x2,
905 typename internal::ParamTraits<X3>::ForwardType x3,
906 typename internal::ParamTraits<X4>::ForwardType x4,
907 typename internal::ParamTraits<X5>::ForwardType x5) {
908 StorageType* invoker = static_cast<StorageType*>(base);
909 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
910 if (!weak_ptr.get()) {
911 return;
912 }
913 (weak_ptr->*invoker->f_)(x1, x2, x3, x4, x5);
914 }
915 };
916
917 template <bool IsWeak, typename StorageType, typename NormalizedSig>
918 struct Invoker2;
919
920 // Function: Arity 2 -> 0.
921 template <typename StorageType, typename R,typename X1, typename X2>
922 struct Invoker2<false, StorageType, R(*)(X1, X2)> {
923 typedef R(*DoInvokeType)(
924 internal::InvokerStorageBase*);
925
926 static R DoInvoke(InvokerStorageBase* base) {
927 StorageType* invoker = static_cast<StorageType*>(base);
928 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_));
929 }
930 };
931
932 // Method: Arity 1 -> 0.
933 template <typename StorageType, typename R, typename T, typename X1>
934 struct Invoker2<false, StorageType, R(T::*)(X1)> {
935 typedef R(*DoInvokeType)(
936 internal::InvokerStorageBase*);
937
938 static R DoInvoke(InvokerStorageBase* base) {
939 StorageType* invoker = static_cast<StorageType*>(base);
940 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_));
941 }
942 };
943
944 // WeakPtr Method: Arity 1 -> 0.
945 template <typename StorageType, typename T, typename X1>
946 struct Invoker2<true, StorageType, void(T::*)(X1)> {
947 typedef void(*DoInvokeType)(
948 internal::InvokerStorageBase*);
949
950 static void DoInvoke(InvokerStorageBase* base) {
951 StorageType* invoker = static_cast<StorageType*>(base);
952 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
953 if (!weak_ptr.get()) {
954 return;
955 }
956 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_));
957 }
958 };
959
960 // Function: Arity 3 -> 1.
961 template <typename StorageType, typename R,typename X1, typename X2,
962 typename X3>
963 struct Invoker2<false, StorageType, R(*)(X1, X2, X3)> {
964 typedef R(*DoInvokeType)(
965 internal::InvokerStorageBase*,
966 typename internal::ParamTraits<X3>::ForwardType);
967
968 static R DoInvoke(InvokerStorageBase* base,
969 typename internal::ParamTraits<X3>::ForwardType x3) {
970 StorageType* invoker = static_cast<StorageType*>(base);
971 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3);
972 }
973 };
974
975 // Method: Arity 2 -> 1.
976 template <typename StorageType, typename R, typename T, typename X1,
977 typename X2>
978 struct Invoker2<false, StorageType, R(T::*)(X1, X2)> {
979 typedef R(*DoInvokeType)(
980 internal::InvokerStorageBase*,
981 typename internal::ParamTraits<X2>::ForwardType);
982
983 static R DoInvoke(InvokerStorageBase* base,
984 typename internal::ParamTraits<X2>::ForwardType x2) {
985 StorageType* invoker = static_cast<StorageType*>(base);
986 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2);
987 }
988 };
989
990 // WeakPtr Method: Arity 2 -> 1.
991 template <typename StorageType, typename T, typename X1, typename X2>
992 struct Invoker2<true, StorageType, void(T::*)(X1, X2)> {
993 typedef void(*DoInvokeType)(
994 internal::InvokerStorageBase*,
995 typename internal::ParamTraits<X2>::ForwardType);
996
997 static void DoInvoke(InvokerStorageBase* base,
998 typename internal::ParamTraits<X2>::ForwardType x2) {
999 StorageType* invoker = static_cast<StorageType*>(base);
1000 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
1001 if (!weak_ptr.get()) {
1002 return;
1003 }
1004 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), x2);
1005 }
1006 };
1007
1008 // Function: Arity 4 -> 2.
1009 template <typename StorageType, typename R,typename X1, typename X2,
1010 typename X3, typename X4>
1011 struct Invoker2<false, StorageType, R(*)(X1, X2, X3, X4)> {
1012 typedef R(*DoInvokeType)(
1013 internal::InvokerStorageBase*,
1014 typename internal::ParamTraits<X3>::ForwardType,
1015 typename internal::ParamTraits<X4>::ForwardType);
1016
1017 static R DoInvoke(InvokerStorageBase* base,
1018 typename internal::ParamTraits<X3>::ForwardType x3,
1019 typename internal::ParamTraits<X4>::ForwardType x4) {
1020 StorageType* invoker = static_cast<StorageType*>(base);
1021 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4);
1022 }
1023 };
1024
1025 // Method: Arity 3 -> 2.
1026 template <typename StorageType, typename R, typename T, typename X1,
1027 typename X2, typename X3>
1028 struct Invoker2<false, StorageType, R(T::*)(X1, X2, X3)> {
1029 typedef R(*DoInvokeType)(
1030 internal::InvokerStorageBase*,
1031 typename internal::ParamTraits<X2>::ForwardType,
1032 typename internal::ParamTraits<X3>::ForwardType);
1033
1034 static R DoInvoke(InvokerStorageBase* base,
1035 typename internal::ParamTraits<X2>::ForwardType x2,
1036 typename internal::ParamTraits<X3>::ForwardType x3) {
1037 StorageType* invoker = static_cast<StorageType*>(base);
1038 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3);
1039 }
1040 };
1041
1042 // WeakPtr Method: Arity 3 -> 2.
1043 template <typename StorageType, typename T, typename X1, typename X2,
1044 typename X3>
1045 struct Invoker2<true, StorageType, void(T::*)(X1, X2, X3)> {
1046 typedef void(*DoInvokeType)(
1047 internal::InvokerStorageBase*,
1048 typename internal::ParamTraits<X2>::ForwardType,
1049 typename internal::ParamTraits<X3>::ForwardType);
1050
1051 static void DoInvoke(InvokerStorageBase* base,
1052 typename internal::ParamTraits<X2>::ForwardType x2,
1053 typename internal::ParamTraits<X3>::ForwardType x3) {
1054 StorageType* invoker = static_cast<StorageType*>(base);
1055 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
1056 if (!weak_ptr.get()) {
1057 return;
1058 }
1059 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), x2, x3);
1060 }
1061 };
1062
1063 // Function: Arity 5 -> 3.
1064 template <typename StorageType, typename R,typename X1, typename X2,
1065 typename X3, typename X4, typename X5>
1066 struct Invoker2<false, StorageType, R(*)(X1, X2, X3, X4, X5)> {
1067 typedef R(*DoInvokeType)(
1068 internal::InvokerStorageBase*,
1069 typename internal::ParamTraits<X3>::ForwardType,
1070 typename internal::ParamTraits<X4>::ForwardType,
1071 typename internal::ParamTraits<X5>::ForwardType);
1072
1073 static R DoInvoke(InvokerStorageBase* base,
1074 typename internal::ParamTraits<X3>::ForwardType x3,
1075 typename internal::ParamTraits<X4>::ForwardType x4,
1076 typename internal::ParamTraits<X5>::ForwardType x5) {
1077 StorageType* invoker = static_cast<StorageType*>(base);
1078 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5);
1079 }
1080 };
1081
1082 // Method: Arity 4 -> 3.
1083 template <typename StorageType, typename R, typename T, typename X1,
1084 typename X2, typename X3, typename X4>
1085 struct Invoker2<false, StorageType, R(T::*)(X1, X2, X3, X4)> {
1086 typedef R(*DoInvokeType)(
1087 internal::InvokerStorageBase*,
1088 typename internal::ParamTraits<X2>::ForwardType,
1089 typename internal::ParamTraits<X3>::ForwardType,
1090 typename internal::ParamTraits<X4>::ForwardType);
1091
1092 static R DoInvoke(InvokerStorageBase* base,
1093 typename internal::ParamTraits<X2>::ForwardType x2,
1094 typename internal::ParamTraits<X3>::ForwardType x3,
1095 typename internal::ParamTraits<X4>::ForwardType x4) {
1096 StorageType* invoker = static_cast<StorageType*>(base);
1097 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3,
1098 x4);
1099 }
1100 };
1101
1102 // WeakPtr Method: Arity 4 -> 3.
1103 template <typename StorageType, typename T, typename X1, typename X2,
1104 typename X3, typename X4>
1105 struct Invoker2<true, StorageType, void(T::*)(X1, X2, X3, X4)> {
1106 typedef void(*DoInvokeType)(
1107 internal::InvokerStorageBase*,
1108 typename internal::ParamTraits<X2>::ForwardType,
1109 typename internal::ParamTraits<X3>::ForwardType,
1110 typename internal::ParamTraits<X4>::ForwardType);
1111
1112 static void DoInvoke(InvokerStorageBase* base,
1113 typename internal::ParamTraits<X2>::ForwardType x2,
1114 typename internal::ParamTraits<X3>::ForwardType x3,
1115 typename internal::ParamTraits<X4>::ForwardType x4) {
1116 StorageType* invoker = static_cast<StorageType*>(base);
1117 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
1118 if (!weak_ptr.get()) {
1119 return;
1120 }
1121 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, x4);
1122 }
1123 };
1124
1125 // Function: Arity 6 -> 4.
1126 template <typename StorageType, typename R,typename X1, typename X2, 1707 template <typename StorageType, typename R,typename X1, typename X2,
1127 typename X3, typename X4, typename X5, typename X6> 1708 typename X3, typename X4, typename X5, typename X6>
1128 struct Invoker2<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 1709 struct Invoker<2, StorageType, R(X1, X2, X3, X4, X5, X6)> {
1129 typedef R(*DoInvokeType)( 1710 typedef R(RunType)(BindStateBase*,
1130 internal::InvokerStorageBase*, 1711 typename CallbackParamTraits<X3>::ForwardType,
1131 typename internal::ParamTraits<X3>::ForwardType, 1712 typename CallbackParamTraits<X4>::ForwardType,
1132 typename internal::ParamTraits<X4>::ForwardType, 1713 typename CallbackParamTraits<X5>::ForwardType,
1133 typename internal::ParamTraits<X5>::ForwardType, 1714 typename CallbackParamTraits<X6>::ForwardType);
1134 typename internal::ParamTraits<X6>::ForwardType); 1715
1135 1716 typedef R(UnboundRunType)(X3, X4, X5, X6);
1136 static R DoInvoke(InvokerStorageBase* base, 1717
1137 typename internal::ParamTraits<X3>::ForwardType x3, 1718 static R Run(BindStateBase* base,
1138 typename internal::ParamTraits<X4>::ForwardType x4, 1719 typename CallbackParamTraits<X3>::ForwardType x3,
1139 typename internal::ParamTraits<X5>::ForwardType x5, 1720 typename CallbackParamTraits<X4>::ForwardType x4,
1140 typename internal::ParamTraits<X6>::ForwardType x6) { 1721 typename CallbackParamTraits<X5>::ForwardType x5,
1141 StorageType* invoker = static_cast<StorageType*>(base); 1722 typename CallbackParamTraits<X6>::ForwardType x6) {
1142 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), x3, x4, x5, 1723 StorageType* storage = static_cast<StorageType*>(base);
1143 x6); 1724
1144 } 1725 // Local references to make debugger stepping easier. If in a debugger,
1145 }; 1726 // you really want to warp ahead and step through the
1146 1727 // InvokeHelper<>::MakeItSo() call below.
1147 // Method: Arity 5 -> 4. 1728 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1148 template <typename StorageType, typename R, typename T, typename X1, 1729 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1149 typename X2, typename X3, typename X4, typename X5> 1730
1150 struct Invoker2<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> { 1731 typename Bound1UnwrapTraits::ForwardType x1 =
1151 typedef R(*DoInvokeType)( 1732 Bound1UnwrapTraits::Unwrap(storage->p1_);
1152 internal::InvokerStorageBase*, 1733 typename Bound2UnwrapTraits::ForwardType x2 =
1153 typename internal::ParamTraits<X2>::ForwardType, 1734 Bound2UnwrapTraits::Unwrap(storage->p2_);
1154 typename internal::ParamTraits<X3>::ForwardType, 1735 return InvokeHelper<StorageType::IsWeakCall::value, R,
1155 typename internal::ParamTraits<X4>::ForwardType, 1736 typename StorageType::RunnableType,
1156 typename internal::ParamTraits<X5>::ForwardType); 1737 void(typename Bound1UnwrapTraits::ForwardType,
1157 1738 typename Bound2UnwrapTraits::ForwardType,
1158 static R DoInvoke(InvokerStorageBase* base, 1739 typename CallbackParamTraits<X3>::ForwardType x3,
1159 typename internal::ParamTraits<X2>::ForwardType x2, 1740 typename CallbackParamTraits<X4>::ForwardType x4,
1160 typename internal::ParamTraits<X3>::ForwardType x3, 1741 typename CallbackParamTraits<X5>::ForwardType x5,
1161 typename internal::ParamTraits<X4>::ForwardType x4, 1742 typename CallbackParamTraits<X6>::ForwardType x6)>
1162 typename internal::ParamTraits<X5>::ForwardType x5) { 1743 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6);
1163 StorageType* invoker = static_cast<StorageType*>(base); 1744 }
1164 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, 1745 };
1165 x4, x5); 1746
1166 } 1747 // Arity 6 -> 3.
1167 };
1168
1169 // WeakPtr Method: Arity 5 -> 4.
1170 template <typename StorageType, typename T, typename X1, typename X2,
1171 typename X3, typename X4, typename X5>
1172 struct Invoker2<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> {
1173 typedef void(*DoInvokeType)(
1174 internal::InvokerStorageBase*,
1175 typename internal::ParamTraits<X2>::ForwardType,
1176 typename internal::ParamTraits<X3>::ForwardType,
1177 typename internal::ParamTraits<X4>::ForwardType,
1178 typename internal::ParamTraits<X5>::ForwardType);
1179
1180 static void DoInvoke(InvokerStorageBase* base,
1181 typename internal::ParamTraits<X2>::ForwardType x2,
1182 typename internal::ParamTraits<X3>::ForwardType x3,
1183 typename internal::ParamTraits<X4>::ForwardType x4,
1184 typename internal::ParamTraits<X5>::ForwardType x5) {
1185 StorageType* invoker = static_cast<StorageType*>(base);
1186 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
1187 if (!weak_ptr.get()) {
1188 return;
1189 }
1190 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), x2, x3, x4, x5);
1191 }
1192 };
1193
1194 template <bool IsWeak, typename StorageType, typename NormalizedSig>
1195 struct Invoker3;
1196
1197 // Function: Arity 3 -> 0.
1198 template <typename StorageType, typename R,typename X1, typename X2,
1199 typename X3>
1200 struct Invoker3<false, StorageType, R(*)(X1, X2, X3)> {
1201 typedef R(*DoInvokeType)(
1202 internal::InvokerStorageBase*);
1203
1204 static R DoInvoke(InvokerStorageBase* base) {
1205 StorageType* invoker = static_cast<StorageType*>(base);
1206 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
1207 Unwrap(invoker->p3_));
1208 }
1209 };
1210
1211 // Method: Arity 2 -> 0.
1212 template <typename StorageType, typename R, typename T, typename X1,
1213 typename X2>
1214 struct Invoker3<false, StorageType, R(T::*)(X1, X2)> {
1215 typedef R(*DoInvokeType)(
1216 internal::InvokerStorageBase*);
1217
1218 static R DoInvoke(InvokerStorageBase* base) {
1219 StorageType* invoker = static_cast<StorageType*>(base);
1220 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1221 Unwrap(invoker->p3_));
1222 }
1223 };
1224
1225 // WeakPtr Method: Arity 2 -> 0.
1226 template <typename StorageType, typename T, typename X1, typename X2>
1227 struct Invoker3<true, StorageType, void(T::*)(X1, X2)> {
1228 typedef void(*DoInvokeType)(
1229 internal::InvokerStorageBase*);
1230
1231 static void DoInvoke(InvokerStorageBase* base) {
1232 StorageType* invoker = static_cast<StorageType*>(base);
1233 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
1234 if (!weak_ptr.get()) {
1235 return;
1236 }
1237 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_));
1238 }
1239 };
1240
1241 // Function: Arity 4 -> 1.
1242 template <typename StorageType, typename R,typename X1, typename X2,
1243 typename X3, typename X4>
1244 struct Invoker3<false, StorageType, R(*)(X1, X2, X3, X4)> {
1245 typedef R(*DoInvokeType)(
1246 internal::InvokerStorageBase*,
1247 typename internal::ParamTraits<X4>::ForwardType);
1248
1249 static R DoInvoke(InvokerStorageBase* base,
1250 typename internal::ParamTraits<X4>::ForwardType x4) {
1251 StorageType* invoker = static_cast<StorageType*>(base);
1252 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
1253 Unwrap(invoker->p3_), x4);
1254 }
1255 };
1256
1257 // Method: Arity 3 -> 1.
1258 template <typename StorageType, typename R, typename T, typename X1,
1259 typename X2, typename X3>
1260 struct Invoker3<false, StorageType, R(T::*)(X1, X2, X3)> {
1261 typedef R(*DoInvokeType)(
1262 internal::InvokerStorageBase*,
1263 typename internal::ParamTraits<X3>::ForwardType);
1264
1265 static R DoInvoke(InvokerStorageBase* base,
1266 typename internal::ParamTraits<X3>::ForwardType x3) {
1267 StorageType* invoker = static_cast<StorageType*>(base);
1268 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1269 Unwrap(invoker->p3_), x3);
1270 }
1271 };
1272
1273 // WeakPtr Method: Arity 3 -> 1.
1274 template <typename StorageType, typename T, typename X1, typename X2,
1275 typename X3>
1276 struct Invoker3<true, StorageType, void(T::*)(X1, X2, X3)> {
1277 typedef void(*DoInvokeType)(
1278 internal::InvokerStorageBase*,
1279 typename internal::ParamTraits<X3>::ForwardType);
1280
1281 static void DoInvoke(InvokerStorageBase* base,
1282 typename internal::ParamTraits<X3>::ForwardType x3) {
1283 StorageType* invoker = static_cast<StorageType*>(base);
1284 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
1285 if (!weak_ptr.get()) {
1286 return;
1287 }
1288 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_), x3);
1289 }
1290 };
1291
1292 // Function: Arity 5 -> 2.
1293 template <typename StorageType, typename R,typename X1, typename X2,
1294 typename X3, typename X4, typename X5>
1295 struct Invoker3<false, StorageType, R(*)(X1, X2, X3, X4, X5)> {
1296 typedef R(*DoInvokeType)(
1297 internal::InvokerStorageBase*,
1298 typename internal::ParamTraits<X4>::ForwardType,
1299 typename internal::ParamTraits<X5>::ForwardType);
1300
1301 static R DoInvoke(InvokerStorageBase* base,
1302 typename internal::ParamTraits<X4>::ForwardType x4,
1303 typename internal::ParamTraits<X5>::ForwardType x5) {
1304 StorageType* invoker = static_cast<StorageType*>(base);
1305 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
1306 Unwrap(invoker->p3_), x4, x5);
1307 }
1308 };
1309
1310 // Method: Arity 4 -> 2.
1311 template <typename StorageType, typename R, typename T, typename X1,
1312 typename X2, typename X3, typename X4>
1313 struct Invoker3<false, StorageType, R(T::*)(X1, X2, X3, X4)> {
1314 typedef R(*DoInvokeType)(
1315 internal::InvokerStorageBase*,
1316 typename internal::ParamTraits<X3>::ForwardType,
1317 typename internal::ParamTraits<X4>::ForwardType);
1318
1319 static R DoInvoke(InvokerStorageBase* base,
1320 typename internal::ParamTraits<X3>::ForwardType x3,
1321 typename internal::ParamTraits<X4>::ForwardType x4) {
1322 StorageType* invoker = static_cast<StorageType*>(base);
1323 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1324 Unwrap(invoker->p3_), x3, x4);
1325 }
1326 };
1327
1328 // WeakPtr Method: Arity 4 -> 2.
1329 template <typename StorageType, typename T, typename X1, typename X2,
1330 typename X3, typename X4>
1331 struct Invoker3<true, StorageType, void(T::*)(X1, X2, X3, X4)> {
1332 typedef void(*DoInvokeType)(
1333 internal::InvokerStorageBase*,
1334 typename internal::ParamTraits<X3>::ForwardType,
1335 typename internal::ParamTraits<X4>::ForwardType);
1336
1337 static void DoInvoke(InvokerStorageBase* base,
1338 typename internal::ParamTraits<X3>::ForwardType x3,
1339 typename internal::ParamTraits<X4>::ForwardType x4) {
1340 StorageType* invoker = static_cast<StorageType*>(base);
1341 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
1342 if (!weak_ptr.get()) {
1343 return;
1344 }
1345 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_), x3,
1346 x4);
1347 }
1348 };
1349
1350 // Function: Arity 6 -> 3.
1351 template <typename StorageType, typename R,typename X1, typename X2, 1748 template <typename StorageType, typename R,typename X1, typename X2,
1352 typename X3, typename X4, typename X5, typename X6> 1749 typename X3, typename X4, typename X5, typename X6>
1353 struct Invoker3<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 1750 struct Invoker<3, StorageType, R(X1, X2, X3, X4, X5, X6)> {
1354 typedef R(*DoInvokeType)( 1751 typedef R(RunType)(BindStateBase*,
1355 internal::InvokerStorageBase*, 1752 typename CallbackParamTraits<X4>::ForwardType,
1356 typename internal::ParamTraits<X4>::ForwardType, 1753 typename CallbackParamTraits<X5>::ForwardType,
1357 typename internal::ParamTraits<X5>::ForwardType, 1754 typename CallbackParamTraits<X6>::ForwardType);
1358 typename internal::ParamTraits<X6>::ForwardType); 1755
1359 1756 typedef R(UnboundRunType)(X4, X5, X6);
1360 static R DoInvoke(InvokerStorageBase* base, 1757
1361 typename internal::ParamTraits<X4>::ForwardType x4, 1758 static R Run(BindStateBase* base,
1362 typename internal::ParamTraits<X5>::ForwardType x5, 1759 typename CallbackParamTraits<X4>::ForwardType x4,
1363 typename internal::ParamTraits<X6>::ForwardType x6) { 1760 typename CallbackParamTraits<X5>::ForwardType x5,
1364 StorageType* invoker = static_cast<StorageType*>(base); 1761 typename CallbackParamTraits<X6>::ForwardType x6) {
1365 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 1762 StorageType* storage = static_cast<StorageType*>(base);
1366 Unwrap(invoker->p3_), x4, x5, x6); 1763
1367 } 1764 // Local references to make debugger stepping easier. If in a debugger,
1368 }; 1765 // you really want to warp ahead and step through the
1369 1766 // InvokeHelper<>::MakeItSo() call below.
1370 // Method: Arity 5 -> 3. 1767 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1371 template <typename StorageType, typename R, typename T, typename X1, 1768 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1372 typename X2, typename X3, typename X4, typename X5> 1769 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1373 struct Invoker3<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> { 1770
1374 typedef R(*DoInvokeType)( 1771 typename Bound1UnwrapTraits::ForwardType x1 =
1375 internal::InvokerStorageBase*, 1772 Bound1UnwrapTraits::Unwrap(storage->p1_);
1376 typename internal::ParamTraits<X3>::ForwardType, 1773 typename Bound2UnwrapTraits::ForwardType x2 =
1377 typename internal::ParamTraits<X4>::ForwardType, 1774 Bound2UnwrapTraits::Unwrap(storage->p2_);
1378 typename internal::ParamTraits<X5>::ForwardType); 1775 typename Bound3UnwrapTraits::ForwardType x3 =
1379 1776 Bound3UnwrapTraits::Unwrap(storage->p3_);
1380 static R DoInvoke(InvokerStorageBase* base, 1777 return InvokeHelper<StorageType::IsWeakCall::value, R,
1381 typename internal::ParamTraits<X3>::ForwardType x3, 1778 typename StorageType::RunnableType,
1382 typename internal::ParamTraits<X4>::ForwardType x4, 1779 void(typename Bound1UnwrapTraits::ForwardType,
1383 typename internal::ParamTraits<X5>::ForwardType x5) { 1780 typename Bound2UnwrapTraits::ForwardType,
1384 StorageType* invoker = static_cast<StorageType*>(base); 1781 typename Bound3UnwrapTraits::ForwardType,
1385 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 1782 typename CallbackParamTraits<X4>::ForwardType x4,
1386 Unwrap(invoker->p3_), x3, x4, x5); 1783 typename CallbackParamTraits<X5>::ForwardType x5,
1387 } 1784 typename CallbackParamTraits<X6>::ForwardType x6)>
1388 }; 1785 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6);
1389 1786 }
1390 // WeakPtr Method: Arity 5 -> 3. 1787 };
1391 template <typename StorageType, typename T, typename X1, typename X2, 1788
1392 typename X3, typename X4, typename X5> 1789 // Arity 6 -> 2.
1393 struct Invoker3<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> {
1394 typedef void(*DoInvokeType)(
1395 internal::InvokerStorageBase*,
1396 typename internal::ParamTraits<X3>::ForwardType,
1397 typename internal::ParamTraits<X4>::ForwardType,
1398 typename internal::ParamTraits<X5>::ForwardType);
1399
1400 static void DoInvoke(InvokerStorageBase* base,
1401 typename internal::ParamTraits<X3>::ForwardType x3,
1402 typename internal::ParamTraits<X4>::ForwardType x4,
1403 typename internal::ParamTraits<X5>::ForwardType x5) {
1404 StorageType* invoker = static_cast<StorageType*>(base);
1405 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
1406 if (!weak_ptr.get()) {
1407 return;
1408 }
1409 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_), x3,
1410 x4, x5);
1411 }
1412 };
1413
1414 template <bool IsWeak, typename StorageType, typename NormalizedSig>
1415 struct Invoker4;
1416
1417 // Function: Arity 4 -> 0.
1418 template <typename StorageType, typename R,typename X1, typename X2,
1419 typename X3, typename X4>
1420 struct Invoker4<false, StorageType, R(*)(X1, X2, X3, X4)> {
1421 typedef R(*DoInvokeType)(
1422 internal::InvokerStorageBase*);
1423
1424 static R DoInvoke(InvokerStorageBase* base) {
1425 StorageType* invoker = static_cast<StorageType*>(base);
1426 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
1427 Unwrap(invoker->p3_), Unwrap(invoker->p4_));
1428 }
1429 };
1430
1431 // Method: Arity 3 -> 0.
1432 template <typename StorageType, typename R, typename T, typename X1,
1433 typename X2, typename X3>
1434 struct Invoker4<false, StorageType, R(T::*)(X1, X2, X3)> {
1435 typedef R(*DoInvokeType)(
1436 internal::InvokerStorageBase*);
1437
1438 static R DoInvoke(InvokerStorageBase* base) {
1439 StorageType* invoker = static_cast<StorageType*>(base);
1440 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1441 Unwrap(invoker->p3_), Unwrap(invoker->p4_));
1442 }
1443 };
1444
1445 // WeakPtr Method: Arity 3 -> 0.
1446 template <typename StorageType, typename T, typename X1, typename X2,
1447 typename X3>
1448 struct Invoker4<true, StorageType, void(T::*)(X1, X2, X3)> {
1449 typedef void(*DoInvokeType)(
1450 internal::InvokerStorageBase*);
1451
1452 static void DoInvoke(InvokerStorageBase* base) {
1453 StorageType* invoker = static_cast<StorageType*>(base);
1454 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
1455 if (!weak_ptr.get()) {
1456 return;
1457 }
1458 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
1459 Unwrap(invoker->p4_));
1460 }
1461 };
1462
1463 // Function: Arity 5 -> 1.
1464 template <typename StorageType, typename R,typename X1, typename X2,
1465 typename X3, typename X4, typename X5>
1466 struct Invoker4<false, StorageType, R(*)(X1, X2, X3, X4, X5)> {
1467 typedef R(*DoInvokeType)(
1468 internal::InvokerStorageBase*,
1469 typename internal::ParamTraits<X5>::ForwardType);
1470
1471 static R DoInvoke(InvokerStorageBase* base,
1472 typename internal::ParamTraits<X5>::ForwardType x5) {
1473 StorageType* invoker = static_cast<StorageType*>(base);
1474 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
1475 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5);
1476 }
1477 };
1478
1479 // Method: Arity 4 -> 1.
1480 template <typename StorageType, typename R, typename T, typename X1,
1481 typename X2, typename X3, typename X4>
1482 struct Invoker4<false, StorageType, R(T::*)(X1, X2, X3, X4)> {
1483 typedef R(*DoInvokeType)(
1484 internal::InvokerStorageBase*,
1485 typename internal::ParamTraits<X4>::ForwardType);
1486
1487 static R DoInvoke(InvokerStorageBase* base,
1488 typename internal::ParamTraits<X4>::ForwardType x4) {
1489 StorageType* invoker = static_cast<StorageType*>(base);
1490 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1491 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4);
1492 }
1493 };
1494
1495 // WeakPtr Method: Arity 4 -> 1.
1496 template <typename StorageType, typename T, typename X1, typename X2,
1497 typename X3, typename X4>
1498 struct Invoker4<true, StorageType, void(T::*)(X1, X2, X3, X4)> {
1499 typedef void(*DoInvokeType)(
1500 internal::InvokerStorageBase*,
1501 typename internal::ParamTraits<X4>::ForwardType);
1502
1503 static void DoInvoke(InvokerStorageBase* base,
1504 typename internal::ParamTraits<X4>::ForwardType x4) {
1505 StorageType* invoker = static_cast<StorageType*>(base);
1506 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
1507 if (!weak_ptr.get()) {
1508 return;
1509 }
1510 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
1511 Unwrap(invoker->p4_), x4);
1512 }
1513 };
1514
1515 // Function: Arity 6 -> 2.
1516 template <typename StorageType, typename R,typename X1, typename X2, 1790 template <typename StorageType, typename R,typename X1, typename X2,
1517 typename X3, typename X4, typename X5, typename X6> 1791 typename X3, typename X4, typename X5, typename X6>
1518 struct Invoker4<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 1792 struct Invoker<4, StorageType, R(X1, X2, X3, X4, X5, X6)> {
1519 typedef R(*DoInvokeType)( 1793 typedef R(RunType)(BindStateBase*,
1520 internal::InvokerStorageBase*, 1794 typename CallbackParamTraits<X5>::ForwardType,
1521 typename internal::ParamTraits<X5>::ForwardType, 1795 typename CallbackParamTraits<X6>::ForwardType);
1522 typename internal::ParamTraits<X6>::ForwardType); 1796
1523 1797 typedef R(UnboundRunType)(X5, X6);
1524 static R DoInvoke(InvokerStorageBase* base, 1798
1525 typename internal::ParamTraits<X5>::ForwardType x5, 1799 static R Run(BindStateBase* base,
1526 typename internal::ParamTraits<X6>::ForwardType x6) { 1800 typename CallbackParamTraits<X5>::ForwardType x5,
1527 StorageType* invoker = static_cast<StorageType*>(base); 1801 typename CallbackParamTraits<X6>::ForwardType x6) {
1528 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 1802 StorageType* storage = static_cast<StorageType*>(base);
1529 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x5, x6); 1803
1530 } 1804 // Local references to make debugger stepping easier. If in a debugger,
1531 }; 1805 // you really want to warp ahead and step through the
1532 1806 // InvokeHelper<>::MakeItSo() call below.
1533 // Method: Arity 5 -> 2. 1807 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1534 template <typename StorageType, typename R, typename T, typename X1, 1808 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1535 typename X2, typename X3, typename X4, typename X5> 1809 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1536 struct Invoker4<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> { 1810 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
1537 typedef R(*DoInvokeType)( 1811
1538 internal::InvokerStorageBase*, 1812 typename Bound1UnwrapTraits::ForwardType x1 =
1539 typename internal::ParamTraits<X4>::ForwardType, 1813 Bound1UnwrapTraits::Unwrap(storage->p1_);
1540 typename internal::ParamTraits<X5>::ForwardType); 1814 typename Bound2UnwrapTraits::ForwardType x2 =
1541 1815 Bound2UnwrapTraits::Unwrap(storage->p2_);
1542 static R DoInvoke(InvokerStorageBase* base, 1816 typename Bound3UnwrapTraits::ForwardType x3 =
1543 typename internal::ParamTraits<X4>::ForwardType x4, 1817 Bound3UnwrapTraits::Unwrap(storage->p3_);
1544 typename internal::ParamTraits<X5>::ForwardType x5) { 1818 typename Bound4UnwrapTraits::ForwardType x4 =
1545 StorageType* invoker = static_cast<StorageType*>(base); 1819 Bound4UnwrapTraits::Unwrap(storage->p4_);
1546 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 1820 return InvokeHelper<StorageType::IsWeakCall::value, R,
1547 Unwrap(invoker->p3_), Unwrap(invoker->p4_), x4, x5); 1821 typename StorageType::RunnableType,
1548 } 1822 void(typename Bound1UnwrapTraits::ForwardType,
1549 }; 1823 typename Bound2UnwrapTraits::ForwardType,
1550 1824 typename Bound3UnwrapTraits::ForwardType,
1551 // WeakPtr Method: Arity 5 -> 2. 1825 typename Bound4UnwrapTraits::ForwardType,
1552 template <typename StorageType, typename T, typename X1, typename X2, 1826 typename CallbackParamTraits<X5>::ForwardType x5,
1553 typename X3, typename X4, typename X5> 1827 typename CallbackParamTraits<X6>::ForwardType x6)>
1554 struct Invoker4<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> { 1828 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6);
1555 typedef void(*DoInvokeType)( 1829 }
1556 internal::InvokerStorageBase*, 1830 };
1557 typename internal::ParamTraits<X4>::ForwardType, 1831
1558 typename internal::ParamTraits<X5>::ForwardType); 1832 // Arity 6 -> 1.
1559
1560 static void DoInvoke(InvokerStorageBase* base,
1561 typename internal::ParamTraits<X4>::ForwardType x4,
1562 typename internal::ParamTraits<X5>::ForwardType x5) {
1563 StorageType* invoker = static_cast<StorageType*>(base);
1564 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
1565 if (!weak_ptr.get()) {
1566 return;
1567 }
1568 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
1569 Unwrap(invoker->p4_), x4, x5);
1570 }
1571 };
1572
1573 template <bool IsWeak, typename StorageType, typename NormalizedSig>
1574 struct Invoker5;
1575
1576 // Function: Arity 5 -> 0.
1577 template <typename StorageType, typename R,typename X1, typename X2,
1578 typename X3, typename X4, typename X5>
1579 struct Invoker5<false, StorageType, R(*)(X1, X2, X3, X4, X5)> {
1580 typedef R(*DoInvokeType)(
1581 internal::InvokerStorageBase*);
1582
1583 static R DoInvoke(InvokerStorageBase* base) {
1584 StorageType* invoker = static_cast<StorageType*>(base);
1585 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_),
1586 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_));
1587 }
1588 };
1589
1590 // Method: Arity 4 -> 0.
1591 template <typename StorageType, typename R, typename T, typename X1,
1592 typename X2, typename X3, typename X4>
1593 struct Invoker5<false, StorageType, R(T::*)(X1, X2, X3, X4)> {
1594 typedef R(*DoInvokeType)(
1595 internal::InvokerStorageBase*);
1596
1597 static R DoInvoke(InvokerStorageBase* base) {
1598 StorageType* invoker = static_cast<StorageType*>(base);
1599 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_),
1600 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_));
1601 }
1602 };
1603
1604 // WeakPtr Method: Arity 4 -> 0.
1605 template <typename StorageType, typename T, typename X1, typename X2,
1606 typename X3, typename X4>
1607 struct Invoker5<true, StorageType, void(T::*)(X1, X2, X3, X4)> {
1608 typedef void(*DoInvokeType)(
1609 internal::InvokerStorageBase*);
1610
1611 static void DoInvoke(InvokerStorageBase* base) {
1612 StorageType* invoker = static_cast<StorageType*>(base);
1613 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_;
1614 if (!weak_ptr.get()) {
1615 return;
1616 }
1617 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
1618 Unwrap(invoker->p4_), Unwrap(invoker->p5_));
1619 }
1620 };
1621
1622 // Function: Arity 6 -> 1.
1623 template <typename StorageType, typename R,typename X1, typename X2, 1833 template <typename StorageType, typename R,typename X1, typename X2,
1624 typename X3, typename X4, typename X5, typename X6> 1834 typename X3, typename X4, typename X5, typename X6>
1625 struct Invoker5<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 1835 struct Invoker<5, StorageType, R(X1, X2, X3, X4, X5, X6)> {
1626 typedef R(*DoInvokeType)( 1836 typedef R(RunType)(BindStateBase*,
1627 internal::InvokerStorageBase*, 1837 typename CallbackParamTraits<X6>::ForwardType);
1628 typename internal::ParamTraits<X6>::ForwardType); 1838
1629 1839 typedef R(UnboundRunType)(X6);
1630 static R DoInvoke(InvokerStorageBase* base, 1840
1631 typename internal::ParamTraits<X6>::ForwardType x6) { 1841 static R Run(BindStateBase* base,
1632 StorageType* invoker = static_cast<StorageType*>(base); 1842 typename CallbackParamTraits<X6>::ForwardType x6) {
1633 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 1843 StorageType* storage = static_cast<StorageType*>(base);
1634 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x6); 1844
1635 } 1845 // Local references to make debugger stepping easier. If in a debugger,
1636 }; 1846 // you really want to warp ahead and step through the
1637 1847 // InvokeHelper<>::MakeItSo() call below.
1638 // Method: Arity 5 -> 1. 1848 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1639 template <typename StorageType, typename R, typename T, typename X1, 1849 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1640 typename X2, typename X3, typename X4, typename X5> 1850 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1641 struct Invoker5<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> { 1851 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
1642 typedef R(*DoInvokeType)( 1852 typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
1643 internal::InvokerStorageBase*, 1853
1644 typename internal::ParamTraits<X5>::ForwardType); 1854 typename Bound1UnwrapTraits::ForwardType x1 =
1645 1855 Bound1UnwrapTraits::Unwrap(storage->p1_);
1646 static R DoInvoke(InvokerStorageBase* base, 1856 typename Bound2UnwrapTraits::ForwardType x2 =
1647 typename internal::ParamTraits<X5>::ForwardType x5) { 1857 Bound2UnwrapTraits::Unwrap(storage->p2_);
1648 StorageType* invoker = static_cast<StorageType*>(base); 1858 typename Bound3UnwrapTraits::ForwardType x3 =
1649 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 1859 Bound3UnwrapTraits::Unwrap(storage->p3_);
1650 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5); 1860 typename Bound4UnwrapTraits::ForwardType x4 =
1651 } 1861 Bound4UnwrapTraits::Unwrap(storage->p4_);
1652 }; 1862 typename Bound5UnwrapTraits::ForwardType x5 =
1653 1863 Bound5UnwrapTraits::Unwrap(storage->p5_);
1654 // WeakPtr Method: Arity 5 -> 1. 1864 return InvokeHelper<StorageType::IsWeakCall::value, R,
1655 template <typename StorageType, typename T, typename X1, typename X2, 1865 typename StorageType::RunnableType,
1656 typename X3, typename X4, typename X5> 1866 void(typename Bound1UnwrapTraits::ForwardType,
1657 struct Invoker5<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> { 1867 typename Bound2UnwrapTraits::ForwardType,
1658 typedef void(*DoInvokeType)( 1868 typename Bound3UnwrapTraits::ForwardType,
1659 internal::InvokerStorageBase*, 1869 typename Bound4UnwrapTraits::ForwardType,
1660 typename internal::ParamTraits<X5>::ForwardType); 1870 typename Bound5UnwrapTraits::ForwardType,
1661 1871 typename CallbackParamTraits<X6>::ForwardType x6)>
1662 static void DoInvoke(InvokerStorageBase* base, 1872 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6);
1663 typename internal::ParamTraits<X5>::ForwardType x5) { 1873 }
1664 StorageType* invoker = static_cast<StorageType*>(base); 1874 };
1665 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; 1875
1666 if (!weak_ptr.get()) { 1876 // Arity 6 -> 0.
1667 return;
1668 }
1669 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_),
1670 Unwrap(invoker->p4_), Unwrap(invoker->p5_), x5);
1671 }
1672 };
1673
1674 template <bool IsWeak, typename StorageType, typename NormalizedSig>
1675 struct Invoker6;
1676
1677 // Function: Arity 6 -> 0.
1678 template <typename StorageType, typename R,typename X1, typename X2, 1877 template <typename StorageType, typename R,typename X1, typename X2,
1679 typename X3, typename X4, typename X5, typename X6> 1878 typename X3, typename X4, typename X5, typename X6>
1680 struct Invoker6<false, StorageType, R(*)(X1, X2, X3, X4, X5, X6)> { 1879 struct Invoker<6, StorageType, R(X1, X2, X3, X4, X5, X6)> {
1681 typedef R(*DoInvokeType)( 1880 typedef R(RunType)(BindStateBase*);
1682 internal::InvokerStorageBase*); 1881
1683 1882 typedef R(UnboundRunType)();
1684 static R DoInvoke(InvokerStorageBase* base) { 1883
1685 StorageType* invoker = static_cast<StorageType*>(base); 1884 static R Run(BindStateBase* base) {
1686 return invoker->f_(Unwrap(invoker->p1_), Unwrap(invoker->p2_), 1885 StorageType* storage = static_cast<StorageType*>(base);
1687 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), 1886
1688 Unwrap(invoker->p6_)); 1887 // Local references to make debugger stepping easier. If in a debugger,
1689 } 1888 // you really want to warp ahead and step through the
1690 }; 1889 // InvokeHelper<>::MakeItSo() call below.
1691 1890 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1692 // Method: Arity 5 -> 0. 1891 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1693 template <typename StorageType, typename R, typename T, typename X1, 1892 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1694 typename X2, typename X3, typename X4, typename X5> 1893 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
1695 struct Invoker6<false, StorageType, R(T::*)(X1, X2, X3, X4, X5)> { 1894 typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
1696 typedef R(*DoInvokeType)( 1895 typedef typename StorageType::Bound6UnwrapTraits Bound6UnwrapTraits;
1697 internal::InvokerStorageBase*); 1896
1698 1897 typename Bound1UnwrapTraits::ForwardType x1 =
1699 static R DoInvoke(InvokerStorageBase* base) { 1898 Bound1UnwrapTraits::Unwrap(storage->p1_);
1700 StorageType* invoker = static_cast<StorageType*>(base); 1899 typename Bound2UnwrapTraits::ForwardType x2 =
1701 return (Unwrap(invoker->p1_)->*invoker->f_)(Unwrap(invoker->p2_), 1900 Bound2UnwrapTraits::Unwrap(storage->p2_);
1702 Unwrap(invoker->p3_), Unwrap(invoker->p4_), Unwrap(invoker->p5_), 1901 typename Bound3UnwrapTraits::ForwardType x3 =
1703 Unwrap(invoker->p6_)); 1902 Bound3UnwrapTraits::Unwrap(storage->p3_);
1704 } 1903 typename Bound4UnwrapTraits::ForwardType x4 =
1705 }; 1904 Bound4UnwrapTraits::Unwrap(storage->p4_);
1706 1905 typename Bound5UnwrapTraits::ForwardType x5 =
1707 // WeakPtr Method: Arity 5 -> 0. 1906 Bound5UnwrapTraits::Unwrap(storage->p5_);
1708 template <typename StorageType, typename T, typename X1, typename X2, 1907 typename Bound6UnwrapTraits::ForwardType x6 =
1709 typename X3, typename X4, typename X5> 1908 Bound6UnwrapTraits::Unwrap(storage->p6_);
1710 struct Invoker6<true, StorageType, void(T::*)(X1, X2, X3, X4, X5)> { 1909 return InvokeHelper<StorageType::IsWeakCall::value, R,
1711 typedef void(*DoInvokeType)( 1910 typename StorageType::RunnableType,
1712 internal::InvokerStorageBase*); 1911 void(typename Bound1UnwrapTraits::ForwardType,
1713 1912 typename Bound2UnwrapTraits::ForwardType,
1714 static void DoInvoke(InvokerStorageBase* base) { 1913 typename Bound3UnwrapTraits::ForwardType,
1715 StorageType* invoker = static_cast<StorageType*>(base); 1914 typename Bound4UnwrapTraits::ForwardType,
1716 typename StorageType::P1Traits::StorageType& weak_ptr = invoker->p1_; 1915 typename Bound5UnwrapTraits::ForwardType,
1717 if (!weak_ptr.get()) { 1916 typename Bound6UnwrapTraits::ForwardType)>
1718 return; 1917 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6);
1719 } 1918 }
1720 (weak_ptr->*invoker->f_)(Unwrap(invoker->p2_), Unwrap(invoker->p3_), 1919 };
1721 Unwrap(invoker->p4_), Unwrap(invoker->p5_), Unwrap(invoker->p6_)); 1920
1722 } 1921
1723 }; 1922 // BindState<>
1724
1725 // BindMoreFuncN<>
1726 // 1923 //
1727 // This set of functions help in fully binding the free parameters in a 1924 // This stores all the state passed into Bind() and is also where most
1728 // Callback<>. 1925 // of the template resolution magic occurs.
1729 template <typename Sig, typename P1>
1730 void BindMoreFunc1(const base::Callback<Sig>& callback, const P1& p1) {
1731 callback.Run(p1);
1732 }
1733
1734 template <typename Sig, typename P1, typename P2>
1735 void BindMoreFunc2(const base::Callback<Sig>& callback, const P1& p1,
1736 const P2& p2) {
1737 callback.Run(p1, p2);
1738 }
1739
1740 template <typename Sig, typename P1, typename P2, typename P3>
1741 void BindMoreFunc3(const base::Callback<Sig>& callback, const P1& p1,
1742 const P2& p2, const P3& p3) {
1743 callback.Run(p1, p2, p3);
1744 }
1745
1746 template <typename Sig, typename P1, typename P2, typename P3, typename P4>
1747 void BindMoreFunc4(const base::Callback<Sig>& callback, const P1& p1,
1748 const P2& p2, const P3& p3, const P4& p4) {
1749 callback.Run(p1, p2, p3, p4);
1750 }
1751
1752 template <typename Sig, typename P1, typename P2, typename P3, typename P4,
1753 typename P5>
1754 void BindMoreFunc5(const base::Callback<Sig>& callback, const P1& p1,
1755 const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
1756 callback.Run(p1, p2, p3, p4, p5);
1757 }
1758
1759 template <typename Sig, typename P1, typename P2, typename P3, typename P4,
1760 typename P5, typename P6>
1761 void BindMoreFunc6(const base::Callback<Sig>& callback, const P1& p1,
1762 const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
1763 callback.Run(p1, p2, p3, p4, p5, p6);
1764 }
1765
1766 // InvokerStorageN<>
1767 // 1926 //
1768 // These are the actual storage classes for the Invokers. 1927 // Runnable is the functor we are binding arguments to.
1928 // RunType is type of the Run() function that the Invoker<> should use.
1929 // Normally, this is the same as the RunType of the Runnable, but it can
1930 // be different if an adapter like IgnoreResult() has been used.
1769 // 1931 //
1770 // Though these types are "classes", they are being used as structs with 1932 // BoundArgsType contains the storage type for all the bound arguments by
1771 // all member variable public. We cannot make it a struct because it inherits 1933 // (ab)using a function type.
1772 // from a class which causes a compiler warning. We cannot add a "Run()" method 1934 template <typename Runnable, typename RunType, typename BoundArgsType>
1773 // that forwards the unbound arguments because that would require we unwrap the 1935 struct BindState;
1774 // Sig type like in InvokerN above to know the return type, and the arity 1936
1775 // of Run(). 1937 template <typename Runnable, typename RunType>
1776 // 1938 struct BindState<Runnable, RunType, void()> : public BindStateBase {
1777 // An alternate solution would be to merge InvokerN and InvokerStorageN, 1939 typedef Runnable RunnableType;
1778 // but the generated code seemed harder to read. 1940 typedef false_type IsWeakCall;
1779 1941 typedef Invoker<0, BindState, RunType> InvokerType;
1780 template <typename Sig> 1942 typedef typename InvokerType::UnboundRunType UnboundRunType;
1781 class InvokerStorage0 : public InvokerStorageBase { 1943 explicit BindState(const Runnable& runnable)
1782 public: 1944 : runnable_(runnable) {
1783 typedef InvokerStorage0 StorageType; 1945 }
1784 typedef FunctionTraits<Sig> TargetTraits; 1946
1785 typedef typename TargetTraits::IsMethod IsMethod; 1947 virtual ~BindState() { }
1786 typedef Sig Signature; 1948
1787 typedef Invoker0<false, StorageType, 1949 RunnableType runnable_;
1788 typename TargetTraits::NormalizedSig> Invoker; 1950 };
1789 1951
1790 1952 template <typename Runnable, typename RunType, typename P1>
1791 1953 struct BindState<Runnable, RunType, void(P1)> : public BindStateBase {
1792 InvokerStorage0(Sig f) 1954 typedef Runnable RunnableType;
1793 : f_(f) { 1955 typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
1794 } 1956 typedef Invoker<1, BindState, RunType> InvokerType;
1795 1957 typedef typename InvokerType::UnboundRunType UnboundRunType;
1796 virtual ~InvokerStorage0() { } 1958
1797 1959 // Convenience typedefs for bound argument types.
1798 Sig f_; 1960 typedef UnwrapTraits<P1> Bound1UnwrapTraits;
1799 }; 1961
1800 1962 BindState(const Runnable& runnable, const P1& p1)
1801 template <typename Sig, typename P1> 1963 : runnable_(runnable),
1802 class InvokerStorage1 : public InvokerStorageBase { 1964 p1_(p1) {
1803 public: 1965 MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
1804 typedef InvokerStorage1 StorageType; 1966 }
1805 typedef FunctionTraits<Sig> TargetTraits; 1967
1806 typedef typename TargetTraits::IsMethod IsMethod; 1968 virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
1807 typedef Sig Signature; 1969 P1>::Release(p1_); }
1808 typedef ParamTraits<P1> P1Traits; 1970
1809 typedef Invoker1<IsWeakMethod<IsMethod::value, P1>::value, StorageType, 1971 RunnableType runnable_;
1810 typename TargetTraits::NormalizedSig> Invoker; 1972 P1 p1_;
1811 COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) || 1973 };
1812 is_void<typename TargetTraits::Return>::value, 1974
1813 weak_ptrs_can_only_bind_to_methods_without_return_values); 1975 template <typename Runnable, typename RunType, typename P1, typename P2>
1814 1976 struct BindState<Runnable, RunType, void(P1, P2)> : public BindStateBase {
1815 // For methods, we need to be careful for parameter 1. We skip the 1977 typedef Runnable RunnableType;
1816 // scoped_refptr check because the binder itself takes care of this. We also 1978 typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
1817 // disallow binding of an array as the method's target object. 1979 typedef Invoker<2, BindState, RunType> InvokerType;
1818 COMPILE_ASSERT(IsMethod::value || 1980 typedef typename InvokerType::UnboundRunType UnboundRunType;
1819 internal::NeedsScopedRefptrButGetsRawPtr< 1981
1820 typename ParamTraits<P1>::StorageType>::value == 0, 1982 // Convenience typedefs for bound argument types.
1821 p1_is_refcounted_type_and_needs_scoped_refptr); 1983 typedef UnwrapTraits<P1> Bound1UnwrapTraits;
1822 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, 1984 typedef UnwrapTraits<P2> Bound2UnwrapTraits;
1823 first_bound_argument_to_method_cannot_be_array); 1985
1824 1986 BindState(const Runnable& runnable, const P1& p1, const P2& p2)
1825 // Do not allow binding a non-const reference parameter. Non-const reference 1987 : runnable_(runnable),
1826 // parameters are disallowed by the Google style guide. Also, binding a 1988 p1_(p1),
1827 // non-const reference parameter can make for subtle bugs because the 1989 p2_(p2) {
1828 // invoked function will receive a reference to the stored copy of the 1990 MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
1829 // argument and not the original. 1991 }
1830 COMPILE_ASSERT( 1992
1831 !( is_non_const_reference<typename TargetTraits::B1>::value ), 1993 virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
1832 do_not_bind_functions_with_nonconst_ref); 1994 P1>::Release(p1_); }
1833 1995
1834 1996 RunnableType runnable_;
1835 InvokerStorage1(Sig f, const P1& p1) 1997 P1 p1_;
1836 : f_(f), p1_(static_cast<typename ParamTraits<P1>::StorageType>(p1)) { 1998 P2 p2_;
1837 MaybeRefcount<IsMethod, P1>::AddRef(p1_); 1999 };
1838 } 2000
1839 2001 template <typename Runnable, typename RunType, typename P1, typename P2,
1840 virtual ~InvokerStorage1() { 2002 typename P3>
1841 MaybeRefcount<IsMethod, P1>::Release(p1_); 2003 struct BindState<Runnable, RunType, void(P1, P2, P3)> : public BindStateBase {
1842 } 2004 typedef Runnable RunnableType;
1843 2005 typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
1844 Sig f_; 2006 typedef Invoker<3, BindState, RunType> InvokerType;
1845 typename ParamTraits<P1>::StorageType p1_; 2007 typedef typename InvokerType::UnboundRunType UnboundRunType;
1846 }; 2008
1847 2009 // Convenience typedefs for bound argument types.
1848 template <typename Sig, typename P1, typename P2> 2010 typedef UnwrapTraits<P1> Bound1UnwrapTraits;
1849 class InvokerStorage2 : public InvokerStorageBase { 2011 typedef UnwrapTraits<P2> Bound2UnwrapTraits;
1850 public: 2012 typedef UnwrapTraits<P3> Bound3UnwrapTraits;
1851 typedef InvokerStorage2 StorageType; 2013
1852 typedef FunctionTraits<Sig> TargetTraits; 2014 BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3)
1853 typedef typename TargetTraits::IsMethod IsMethod; 2015 : runnable_(runnable),
1854 typedef Sig Signature; 2016 p1_(p1),
1855 typedef ParamTraits<P1> P1Traits; 2017 p2_(p2),
1856 typedef ParamTraits<P2> P2Traits; 2018 p3_(p3) {
1857 typedef Invoker2<IsWeakMethod<IsMethod::value, P1>::value, StorageType, 2019 MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
1858 typename TargetTraits::NormalizedSig> Invoker; 2020 }
1859 COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) || 2021
1860 is_void<typename TargetTraits::Return>::value, 2022 virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
1861 weak_ptrs_can_only_bind_to_methods_without_return_values); 2023 P1>::Release(p1_); }
1862 2024
1863 // For methods, we need to be careful for parameter 1. We skip the 2025 RunnableType runnable_;
1864 // scoped_refptr check because the binder itself takes care of this. We also 2026 P1 p1_;
1865 // disallow binding of an array as the method's target object. 2027 P2 p2_;
1866 COMPILE_ASSERT(IsMethod::value || 2028 P3 p3_;
1867 internal::NeedsScopedRefptrButGetsRawPtr< 2029 };
1868 typename ParamTraits<P1>::StorageType>::value == 0, 2030
1869 p1_is_refcounted_type_and_needs_scoped_refptr); 2031 template <typename Runnable, typename RunType, typename P1, typename P2,
1870 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value, 2032 typename P3, typename P4>
1871 first_bound_argument_to_method_cannot_be_array); 2033 struct BindState<Runnable, RunType, void(P1, P2, P3,
1872 COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr< 2034 P4)> : public BindStateBase {
1873 typename ParamTraits<P2>::StorageType>::value == 0, 2035 typedef Runnable RunnableType;
1874 p2_is_refcounted_type_and_needs_scoped_refptr); 2036 typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
1875 2037 typedef Invoker<4, BindState, RunType> InvokerType;
1876 // Do not allow binding a non-const reference parameter. Non-const reference 2038 typedef typename InvokerType::UnboundRunType UnboundRunType;
1877 // parameters are disallowed by the Google style guide. Also, binding a 2039
1878 // non-const reference parameter can make for subtle bugs because the 2040 // Convenience typedefs for bound argument types.
1879 // invoked function will receive a reference to the stored copy of the 2041 typedef UnwrapTraits<P1> Bound1UnwrapTraits;
1880 // argument and not the original. 2042 typedef UnwrapTraits<P2> Bound2UnwrapTraits;
1881 COMPILE_ASSERT( 2043 typedef UnwrapTraits<P3> Bound3UnwrapTraits;
1882 !( is_non_const_reference<typename TargetTraits::B1>::value || 2044 typedef UnwrapTraits<P4> Bound4UnwrapTraits;
1883 is_non_const_reference<typename TargetTraits::B2>::value ), 2045
1884 do_not_bind_functions_with_nonconst_ref); 2046 BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3,
1885 2047 const P4& p4)
1886 2048 : runnable_(runnable),
1887 InvokerStorage2(Sig f, const P1& p1, const P2& p2) 2049 p1_(p1),
1888 : f_(f), p1_(static_cast<typename ParamTraits<P1>::StorageType>(p1)), 2050 p2_(p2),
1889 p2_(static_cast<typename ParamTraits<P2>::StorageType>(p2)) { 2051 p3_(p3),
1890 MaybeRefcount<IsMethod, P1>::AddRef(p1_); 2052 p4_(p4) {
1891 } 2053 MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
1892 2054 }
1893 virtual ~InvokerStorage2() { 2055
1894 MaybeRefcount<IsMethod, P1>::Release(p1_); 2056 virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
1895 } 2057 P1>::Release(p1_); }
1896 2058
1897 Sig f_; 2059 RunnableType runnable_;
1898 typename ParamTraits<P1>::StorageType p1_; 2060 P1 p1_;
1899 typename ParamTraits<P2>::StorageType p2_; 2061 P2 p2_;
1900 }; 2062 P3 p3_;
1901 2063 P4 p4_;
1902 template <typename Sig, typename P1, typename P2, typename P3> 2064 };
1903 class InvokerStorage3 : public InvokerStorageBase { 2065
1904 public: 2066 template <typename Runnable, typename RunType, typename P1, typename P2,
1905 typedef InvokerStorage3 StorageType; 2067 typename P3, typename P4, typename P5>
1906 typedef FunctionTraits<Sig> TargetTraits; 2068 struct BindState<Runnable, RunType, void(P1, P2, P3, P4,
1907 typedef typename TargetTraits::IsMethod IsMethod; 2069 P5)> : public BindStateBase {
1908 typedef Sig Signature; 2070 typedef Runnable RunnableType;
1909 typedef ParamTraits<P1> P1Traits; 2071 typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
1910 typedef ParamTraits<P2> P2Traits; 2072 typedef Invoker<5, BindState, RunType> InvokerType;
1911 typedef ParamTraits<P3> P3Traits; 2073 typedef typename InvokerType::UnboundRunType UnboundRunType;
1912 typedef Invoker3<IsWeakMethod<IsMethod::value, P1>::value, StorageType, 2074
1913 typename TargetTraits::NormalizedSig> Invoker; 2075 // Convenience typedefs for bound argument types.
1914 COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) || 2076 typedef UnwrapTraits<P1> Bound1UnwrapTraits;
1915 is_void<typename TargetTraits::Return>::value, 2077 typedef UnwrapTraits<P2> Bound2UnwrapTraits;
1916 weak_ptrs_can_only_bind_to_methods_without_return_values); 2078 typedef UnwrapTraits<P3> Bound3UnwrapTraits;
1917 2079 typedef UnwrapTraits<P4> Bound4UnwrapTraits;
1918 // For methods, we need to be careful for parameter 1. We skip the 2080 typedef UnwrapTraits<P5> Bound5UnwrapTraits;
1919 // scoped_refptr check because the binder itself takes care of this. We also 2081
1920 // disallow binding of an array as the method's target object. 2082 BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3,
1921 COMPILE_ASSERT(IsMethod::value ||
1922 internal::NeedsScopedRefptrButGetsRawPtr<
1923 typename ParamTraits<P1>::StorageType>::value == 0,
1924 p1_is_refcounted_type_and_needs_scoped_refptr);
1925 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1926 first_bound_argument_to_method_cannot_be_array);
1927 COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr<
1928 typename ParamTraits<P2>::StorageType>::value == 0,
1929 p2_is_refcounted_type_and_needs_scoped_refptr);
1930 COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr<
1931 typename ParamTraits<P3>::StorageType>::value == 0,
1932 p3_is_refcounted_type_and_needs_scoped_refptr);
1933
1934 // Do not allow binding a non-const reference parameter. Non-const reference
1935 // parameters are disallowed by the Google style guide. Also, binding a
1936 // non-const reference parameter can make for subtle bugs because the
1937 // invoked function will receive a reference to the stored copy of the
1938 // argument and not the original.
1939 COMPILE_ASSERT(
1940 !( is_non_const_reference<typename TargetTraits::B1>::value ||
1941 is_non_const_reference<typename TargetTraits::B2>::value ||
1942 is_non_const_reference<typename TargetTraits::B3>::value ),
1943 do_not_bind_functions_with_nonconst_ref);
1944
1945
1946 InvokerStorage3(Sig f, const P1& p1, const P2& p2, const P3& p3)
1947 : f_(f), p1_(static_cast<typename ParamTraits<P1>::StorageType>(p1)),
1948 p2_(static_cast<typename ParamTraits<P2>::StorageType>(p2)),
1949 p3_(static_cast<typename ParamTraits<P3>::StorageType>(p3)) {
1950 MaybeRefcount<IsMethod, P1>::AddRef(p1_);
1951 }
1952
1953 virtual ~InvokerStorage3() {
1954 MaybeRefcount<IsMethod, P1>::Release(p1_);
1955 }
1956
1957 Sig f_;
1958 typename ParamTraits<P1>::StorageType p1_;
1959 typename ParamTraits<P2>::StorageType p2_;
1960 typename ParamTraits<P3>::StorageType p3_;
1961 };
1962
1963 template <typename Sig, typename P1, typename P2, typename P3, typename P4>
1964 class InvokerStorage4 : public InvokerStorageBase {
1965 public:
1966 typedef InvokerStorage4 StorageType;
1967 typedef FunctionTraits<Sig> TargetTraits;
1968 typedef typename TargetTraits::IsMethod IsMethod;
1969 typedef Sig Signature;
1970 typedef ParamTraits<P1> P1Traits;
1971 typedef ParamTraits<P2> P2Traits;
1972 typedef ParamTraits<P3> P3Traits;
1973 typedef ParamTraits<P4> P4Traits;
1974 typedef Invoker4<IsWeakMethod<IsMethod::value, P1>::value, StorageType,
1975 typename TargetTraits::NormalizedSig> Invoker;
1976 COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) ||
1977 is_void<typename TargetTraits::Return>::value,
1978 weak_ptrs_can_only_bind_to_methods_without_return_values);
1979
1980 // For methods, we need to be careful for parameter 1. We skip the
1981 // scoped_refptr check because the binder itself takes care of this. We also
1982 // disallow binding of an array as the method's target object.
1983 COMPILE_ASSERT(IsMethod::value ||
1984 internal::NeedsScopedRefptrButGetsRawPtr<
1985 typename ParamTraits<P1>::StorageType>::value == 0,
1986 p1_is_refcounted_type_and_needs_scoped_refptr);
1987 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
1988 first_bound_argument_to_method_cannot_be_array);
1989 COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr<
1990 typename ParamTraits<P2>::StorageType>::value == 0,
1991 p2_is_refcounted_type_and_needs_scoped_refptr);
1992 COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr<
1993 typename ParamTraits<P3>::StorageType>::value == 0,
1994 p3_is_refcounted_type_and_needs_scoped_refptr);
1995 COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr<
1996 typename ParamTraits<P4>::StorageType>::value == 0,
1997 p4_is_refcounted_type_and_needs_scoped_refptr);
1998
1999 // Do not allow binding a non-const reference parameter. Non-const reference
2000 // parameters are disallowed by the Google style guide. Also, binding a
2001 // non-const reference parameter can make for subtle bugs because the
2002 // invoked function will receive a reference to the stored copy of the
2003 // argument and not the original.
2004 COMPILE_ASSERT(
2005 !( is_non_const_reference<typename TargetTraits::B1>::value ||
2006 is_non_const_reference<typename TargetTraits::B2>::value ||
2007 is_non_const_reference<typename TargetTraits::B3>::value ||
2008 is_non_const_reference<typename TargetTraits::B4>::value ),
2009 do_not_bind_functions_with_nonconst_ref);
2010
2011
2012 InvokerStorage4(Sig f, const P1& p1, const P2& p2, const P3& p3, const P4& p4)
2013 : f_(f), p1_(static_cast<typename ParamTraits<P1>::StorageType>(p1)),
2014 p2_(static_cast<typename ParamTraits<P2>::StorageType>(p2)),
2015 p3_(static_cast<typename ParamTraits<P3>::StorageType>(p3)),
2016 p4_(static_cast<typename ParamTraits<P4>::StorageType>(p4)) {
2017 MaybeRefcount<IsMethod, P1>::AddRef(p1_);
2018 }
2019
2020 virtual ~InvokerStorage4() {
2021 MaybeRefcount<IsMethod, P1>::Release(p1_);
2022 }
2023
2024 Sig f_;
2025 typename ParamTraits<P1>::StorageType p1_;
2026 typename ParamTraits<P2>::StorageType p2_;
2027 typename ParamTraits<P3>::StorageType p3_;
2028 typename ParamTraits<P4>::StorageType p4_;
2029 };
2030
2031 template <typename Sig, typename P1, typename P2, typename P3, typename P4,
2032 typename P5>
2033 class InvokerStorage5 : public InvokerStorageBase {
2034 public:
2035 typedef InvokerStorage5 StorageType;
2036 typedef FunctionTraits<Sig> TargetTraits;
2037 typedef typename TargetTraits::IsMethod IsMethod;
2038 typedef Sig Signature;
2039 typedef ParamTraits<P1> P1Traits;
2040 typedef ParamTraits<P2> P2Traits;
2041 typedef ParamTraits<P3> P3Traits;
2042 typedef ParamTraits<P4> P4Traits;
2043 typedef ParamTraits<P5> P5Traits;
2044 typedef Invoker5<IsWeakMethod<IsMethod::value, P1>::value, StorageType,
2045 typename TargetTraits::NormalizedSig> Invoker;
2046 COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) ||
2047 is_void<typename TargetTraits::Return>::value,
2048 weak_ptrs_can_only_bind_to_methods_without_return_values);
2049
2050 // For methods, we need to be careful for parameter 1. We skip the
2051 // scoped_refptr check because the binder itself takes care of this. We also
2052 // disallow binding of an array as the method's target object.
2053 COMPILE_ASSERT(IsMethod::value ||
2054 internal::NeedsScopedRefptrButGetsRawPtr<
2055 typename ParamTraits<P1>::StorageType>::value == 0,
2056 p1_is_refcounted_type_and_needs_scoped_refptr);
2057 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
2058 first_bound_argument_to_method_cannot_be_array);
2059 COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr<
2060 typename ParamTraits<P2>::StorageType>::value == 0,
2061 p2_is_refcounted_type_and_needs_scoped_refptr);
2062 COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr<
2063 typename ParamTraits<P3>::StorageType>::value == 0,
2064 p3_is_refcounted_type_and_needs_scoped_refptr);
2065 COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr<
2066 typename ParamTraits<P4>::StorageType>::value == 0,
2067 p4_is_refcounted_type_and_needs_scoped_refptr);
2068 COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr<
2069 typename ParamTraits<P5>::StorageType>::value == 0,
2070 p5_is_refcounted_type_and_needs_scoped_refptr);
2071
2072 // Do not allow binding a non-const reference parameter. Non-const reference
2073 // parameters are disallowed by the Google style guide. Also, binding a
2074 // non-const reference parameter can make for subtle bugs because the
2075 // invoked function will receive a reference to the stored copy of the
2076 // argument and not the original.
2077 COMPILE_ASSERT(
2078 !( is_non_const_reference<typename TargetTraits::B1>::value ||
2079 is_non_const_reference<typename TargetTraits::B2>::value ||
2080 is_non_const_reference<typename TargetTraits::B3>::value ||
2081 is_non_const_reference<typename TargetTraits::B4>::value ||
2082 is_non_const_reference<typename TargetTraits::B5>::value ),
2083 do_not_bind_functions_with_nonconst_ref);
2084
2085
2086 InvokerStorage5(Sig f, const P1& p1, const P2& p2, const P3& p3,
2087 const P4& p4, const P5& p5) 2083 const P4& p4, const P5& p5)
2088 : f_(f), p1_(static_cast<typename ParamTraits<P1>::StorageType>(p1)), 2084 : runnable_(runnable),
2089 p2_(static_cast<typename ParamTraits<P2>::StorageType>(p2)), 2085 p1_(p1),
2090 p3_(static_cast<typename ParamTraits<P3>::StorageType>(p3)), 2086 p2_(p2),
2091 p4_(static_cast<typename ParamTraits<P4>::StorageType>(p4)), 2087 p3_(p3),
2092 p5_(static_cast<typename ParamTraits<P5>::StorageType>(p5)) { 2088 p4_(p4),
2093 MaybeRefcount<IsMethod, P1>::AddRef(p1_); 2089 p5_(p5) {
2094 } 2090 MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
2095 2091 }
2096 virtual ~InvokerStorage5() { 2092
2097 MaybeRefcount<IsMethod, P1>::Release(p1_); 2093 virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
2098 } 2094 P1>::Release(p1_); }
2099 2095
2100 Sig f_; 2096 RunnableType runnable_;
2101 typename ParamTraits<P1>::StorageType p1_; 2097 P1 p1_;
2102 typename ParamTraits<P2>::StorageType p2_; 2098 P2 p2_;
2103 typename ParamTraits<P3>::StorageType p3_; 2099 P3 p3_;
2104 typename ParamTraits<P4>::StorageType p4_; 2100 P4 p4_;
2105 typename ParamTraits<P5>::StorageType p5_; 2101 P5 p5_;
2106 }; 2102 };
2107 2103
2108 template <typename Sig, typename P1, typename P2, typename P3, typename P4, 2104 template <typename Runnable, typename RunType, typename P1, typename P2,
2109 typename P5, typename P6> 2105 typename P3, typename P4, typename P5, typename P6>
2110 class InvokerStorage6 : public InvokerStorageBase { 2106 struct BindState<Runnable, RunType, void(P1, P2, P3, P4, P5,
2111 public: 2107 P6)> : public BindStateBase {
2112 typedef InvokerStorage6 StorageType; 2108 typedef Runnable RunnableType;
2113 typedef FunctionTraits<Sig> TargetTraits; 2109 typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
2114 typedef typename TargetTraits::IsMethod IsMethod; 2110 typedef Invoker<6, BindState, RunType> InvokerType;
2115 typedef Sig Signature; 2111 typedef typename InvokerType::UnboundRunType UnboundRunType;
2116 typedef ParamTraits<P1> P1Traits; 2112
2117 typedef ParamTraits<P2> P2Traits; 2113 // Convenience typedefs for bound argument types.
2118 typedef ParamTraits<P3> P3Traits; 2114 typedef UnwrapTraits<P1> Bound1UnwrapTraits;
2119 typedef ParamTraits<P4> P4Traits; 2115 typedef UnwrapTraits<P2> Bound2UnwrapTraits;
2120 typedef ParamTraits<P5> P5Traits; 2116 typedef UnwrapTraits<P3> Bound3UnwrapTraits;
2121 typedef ParamTraits<P6> P6Traits; 2117 typedef UnwrapTraits<P4> Bound4UnwrapTraits;
2122 typedef Invoker6<IsWeakMethod<IsMethod::value, P1>::value, StorageType, 2118 typedef UnwrapTraits<P5> Bound5UnwrapTraits;
2123 typename TargetTraits::NormalizedSig> Invoker; 2119 typedef UnwrapTraits<P6> Bound6UnwrapTraits;
2124 COMPILE_ASSERT(!(IsWeakMethod<IsMethod::value, P1>::value) || 2120
2125 is_void<typename TargetTraits::Return>::value, 2121 BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3,
2126 weak_ptrs_can_only_bind_to_methods_without_return_values);
2127
2128 // For methods, we need to be careful for parameter 1. We skip the
2129 // scoped_refptr check because the binder itself takes care of this. We also
2130 // disallow binding of an array as the method's target object.
2131 COMPILE_ASSERT(IsMethod::value ||
2132 internal::NeedsScopedRefptrButGetsRawPtr<
2133 typename ParamTraits<P1>::StorageType>::value == 0,
2134 p1_is_refcounted_type_and_needs_scoped_refptr);
2135 COMPILE_ASSERT(!IsMethod::value || !is_array<P1>::value,
2136 first_bound_argument_to_method_cannot_be_array);
2137 COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr<
2138 typename ParamTraits<P2>::StorageType>::value == 0,
2139 p2_is_refcounted_type_and_needs_scoped_refptr);
2140 COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr<
2141 typename ParamTraits<P3>::StorageType>::value == 0,
2142 p3_is_refcounted_type_and_needs_scoped_refptr);
2143 COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr<
2144 typename ParamTraits<P4>::StorageType>::value == 0,
2145 p4_is_refcounted_type_and_needs_scoped_refptr);
2146 COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr<
2147 typename ParamTraits<P5>::StorageType>::value == 0,
2148 p5_is_refcounted_type_and_needs_scoped_refptr);
2149 COMPILE_ASSERT(internal::NeedsScopedRefptrButGetsRawPtr<
2150 typename ParamTraits<P6>::StorageType>::value == 0,
2151 p6_is_refcounted_type_and_needs_scoped_refptr);
2152
2153 // Do not allow binding a non-const reference parameter. Non-const reference
2154 // parameters are disallowed by the Google style guide. Also, binding a
2155 // non-const reference parameter can make for subtle bugs because the
2156 // invoked function will receive a reference to the stored copy of the
2157 // argument and not the original.
2158 COMPILE_ASSERT(
2159 !( is_non_const_reference<typename TargetTraits::B1>::value ||
2160 is_non_const_reference<typename TargetTraits::B2>::value ||
2161 is_non_const_reference<typename TargetTraits::B3>::value ||
2162 is_non_const_reference<typename TargetTraits::B4>::value ||
2163 is_non_const_reference<typename TargetTraits::B5>::value ||
2164 is_non_const_reference<typename TargetTraits::B6>::value ),
2165 do_not_bind_functions_with_nonconst_ref);
2166
2167
2168 InvokerStorage6(Sig f, const P1& p1, const P2& p2, const P3& p3,
2169 const P4& p4, const P5& p5, const P6& p6) 2122 const P4& p4, const P5& p5, const P6& p6)
2170 : f_(f), p1_(static_cast<typename ParamTraits<P1>::StorageType>(p1)), 2123 : runnable_(runnable),
2171 p2_(static_cast<typename ParamTraits<P2>::StorageType>(p2)), 2124 p1_(p1),
2172 p3_(static_cast<typename ParamTraits<P3>::StorageType>(p3)), 2125 p2_(p2),
2173 p4_(static_cast<typename ParamTraits<P4>::StorageType>(p4)), 2126 p3_(p3),
2174 p5_(static_cast<typename ParamTraits<P5>::StorageType>(p5)), 2127 p4_(p4),
2175 p6_(static_cast<typename ParamTraits<P6>::StorageType>(p6)) { 2128 p5_(p5),
2176 MaybeRefcount<IsMethod, P1>::AddRef(p1_); 2129 p6_(p6) {
2177 } 2130 MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
2178 2131 }
2179 virtual ~InvokerStorage6() { 2132
2180 MaybeRefcount<IsMethod, P1>::Release(p1_); 2133 virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
2181 } 2134 P1>::Release(p1_); }
2182 2135
2183 Sig f_; 2136 RunnableType runnable_;
2184 typename ParamTraits<P1>::StorageType p1_; 2137 P1 p1_;
2185 typename ParamTraits<P2>::StorageType p2_; 2138 P2 p2_;
2186 typename ParamTraits<P3>::StorageType p3_; 2139 P3 p3_;
2187 typename ParamTraits<P4>::StorageType p4_; 2140 P4 p4_;
2188 typename ParamTraits<P5>::StorageType p5_; 2141 P5 p5_;
2189 typename ParamTraits<P6>::StorageType p6_; 2142 P6 p6_;
2190 }; 2143 };
2191 2144
2192 } // namespace internal 2145 } // namespace internal
2193 } // namespace base 2146 } // namespace base
2194 2147
2195 #endif // BASE_BIND_INTERNAL_H_ 2148 #endif // BASE_BIND_INTERNAL_H_
OLDNEW
« no previous file with comments | « base/bind_helpers.h ('k') | base/bind_internal.h.pump » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698