1 // This file was GENERATED by command:
2 // pump.py bind_internal.h.pump
3 // DO NOT EDIT BY HAND!!!
6 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
7 // Use of this source code is governed by a BSD-style license that can be
8 // found in the LICENSE file.
10 #ifndef BASE_BIND_INTERNAL_H_
11 #define BASE_BIND_INTERNAL_H_
13 #include "base/bind_helpers.h"
14 #include "base/callback_internal.h"
15 #include "base/memory/raw_scoped_refptr_mismatch_checker.h"
16 #include "base/memory/weak_ptr.h"
17 #include "base/template_util.h"
18 #include "build/build_config.h"
21 #include "base/bind_internal_win.h"
27 // See base/callback.h for user documentation.
31 // Runnable -- A type (really a type class) that has a single Run() method
32 // and a RunType typedef that corresponds to the type of Run().
33 // A Runnable can declare that it should treated like a method
34 // call by including a typedef named IsMethod. The value of
35 // this typedef is NOT inspected, only the existence. When a
36 // Runnable declares itself a method, Bind() will enforce special
37 // refcounting + WeakPtr handling semantics for the first
38 // parameter which is expected to be an object.
39 // Functor -- A copyable type representing something that should be called.
40 // All function pointers, Callback<>, and Runnables are functors
41 // even if the invocation syntax differs.
42 // RunType -- A function type (as opposed to function _pointer_ type) for
43 // a Run() function. Usually just a convenience typedef.
44 // (Bound)ArgsType -- A function type that is being (ab)used to store the
45 // types of set of arguments. The "return" type is always
46 // void here. We use this hack so that we do not need
47 // a new type name for each arity of type. (eg.,
48 // BindState1, BindState2). This makes forward
49 // declarations and friending much much easier.
52 // RunnableAdapter<> -- Wraps the various "function" pointer types into an
53 // object that adheres to the Runnable interface.
54 // There are |3*ARITY| RunnableAdapter types.
55 // FunctionTraits<> -- Type traits that unwrap a function signature into a
56 // a set of easier to use typedefs. Used mainly for
57 // compile time asserts.
58 // There are |ARITY| FunctionTraits types.
59 // ForceVoidReturn<> -- Helper class for translating function signatures to
60 // equivalent forms with a "void" return type.
61 // There are |ARITY| ForceVoidReturn types.
62 // FunctorTraits<> -- Type traits used determine the correct RunType and
63 // RunnableType for a Functor. This is where function
64 // signature adapters are applied.
65 // There are |ARITY| ForceVoidReturn types.
66 // MakeRunnable<> -- Takes a Functor and returns an object in the Runnable
67 // type class that represents the underlying Functor.
68 // There are |O(1)| MakeRunnable types.
69 // InvokeHelper<> -- Take a Runnable + arguments and actully invokes it.
70 // Handle the differing syntaxes needed for WeakPtr<> support,
71 // and for ignoring return values. This is separate from
72 // Invoker to avoid creating multiple version of Invoker<>
73 // which grows at O(n^2) with the arity.
74 // There are |k*ARITY| InvokeHelper types.
75 // Invoker<> -- Unwraps the curried parameters and executes the Runnable.
76 // There are |(ARITY^2 + ARITY)/2| Invoketypes.
77 // BindState<> -- Stores the curried parameters, and is the main entry point
78 // into the Bind() system, doing most of the type resolution.
79 // There are ARITY BindState types.
83 // The RunnableAdapter<> templates provide a uniform interface for invoking
84 // a function pointer, method pointer, or const method pointer. The adapter
85 // exposes a Run() method with an appropriate signature. Using this wrapper
86 // allows for writing code that supports all three pointer types without
87 // undue repetition. Without it, a lot of code would need to be repeated 3
90 // For method pointers and const method pointers the first argument to Run()
91 // is considered to be the received of the method. This is similar to STL's
94 // This class also exposes a RunType typedef that is the function type of the
97 // If and only if the wrapper contains a method or const method pointer, an
98 // IsMethod typedef is exposed. The existence of this typedef (NOT the value)
99 // marks that the wrapper should be considered a method wrapper.
101 template <typename Functor
>
102 class RunnableAdapter
;
104 // Function: Arity 0.
105 template <typename R
>
106 class RunnableAdapter
<R(*)()> {
108 typedef R (RunType
)();
110 explicit RunnableAdapter(R(*function
)())
111 : function_(function
) {
123 template <typename R
, typename T
>
124 class RunnableAdapter
<R(T::*)()> {
126 typedef R (RunType
)(T
*);
127 typedef true_type IsMethod
;
129 explicit RunnableAdapter(R(T::*method
)())
134 return (object
->*method_
)();
141 // Const Method: Arity 0.
142 template <typename R
, typename T
>
143 class RunnableAdapter
<R(T::*)() const> {
145 typedef R (RunType
)(const T
*);
146 typedef true_type IsMethod
;
148 explicit RunnableAdapter(R(T::*method
)() const)
152 R
Run(const T
* object
) {
153 return (object
->*method_
)();
157 R (T::*method_
)() const;
160 // Function: Arity 1.
161 template <typename R
, typename A1
>
162 class RunnableAdapter
<R(*)(A1
)> {
164 typedef R (RunType
)(A1
);
166 explicit RunnableAdapter(R(*function
)(A1
))
167 : function_(function
) {
170 R
Run(typename CallbackParamTraits
<A1
>::ForwardType a1
) {
171 return function_(CallbackForward(a1
));
179 template <typename R
, typename T
, typename A1
>
180 class RunnableAdapter
<R(T::*)(A1
)> {
182 typedef R (RunType
)(T
*, A1
);
183 typedef true_type IsMethod
;
185 explicit RunnableAdapter(R(T::*method
)(A1
))
189 R
Run(T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
) {
190 return (object
->*method_
)(CallbackForward(a1
));
197 // Const Method: Arity 1.
198 template <typename R
, typename T
, typename A1
>
199 class RunnableAdapter
<R(T::*)(A1
) const> {
201 typedef R (RunType
)(const T
*, A1
);
202 typedef true_type IsMethod
;
204 explicit RunnableAdapter(R(T::*method
)(A1
) const)
208 R
Run(const T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
) {
209 return (object
->*method_
)(CallbackForward(a1
));
213 R (T::*method_
)(A1
) const;
216 // Function: Arity 2.
217 template <typename R
, typename A1
, typename A2
>
218 class RunnableAdapter
<R(*)(A1
, A2
)> {
220 typedef R (RunType
)(A1
, A2
);
222 explicit RunnableAdapter(R(*function
)(A1
, A2
))
223 : function_(function
) {
226 R
Run(typename CallbackParamTraits
<A1
>::ForwardType a1
,
227 typename CallbackParamTraits
<A2
>::ForwardType a2
) {
228 return function_(CallbackForward(a1
), CallbackForward(a2
));
232 R (*function_
)(A1
, A2
);
236 template <typename R
, typename T
, typename A1
, typename A2
>
237 class RunnableAdapter
<R(T::*)(A1
, A2
)> {
239 typedef R (RunType
)(T
*, A1
, A2
);
240 typedef true_type IsMethod
;
242 explicit RunnableAdapter(R(T::*method
)(A1
, A2
))
246 R
Run(T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
247 typename CallbackParamTraits
<A2
>::ForwardType a2
) {
248 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
));
252 R (T::*method_
)(A1
, A2
);
255 // Const Method: Arity 2.
256 template <typename R
, typename T
, typename A1
, typename A2
>
257 class RunnableAdapter
<R(T::*)(A1
, A2
) const> {
259 typedef R (RunType
)(const T
*, A1
, A2
);
260 typedef true_type IsMethod
;
262 explicit RunnableAdapter(R(T::*method
)(A1
, A2
) const)
266 R
Run(const T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
267 typename CallbackParamTraits
<A2
>::ForwardType a2
) {
268 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
));
272 R (T::*method_
)(A1
, A2
) const;
275 // Function: Arity 3.
276 template <typename R
, typename A1
, typename A2
, typename A3
>
277 class RunnableAdapter
<R(*)(A1
, A2
, A3
)> {
279 typedef R (RunType
)(A1
, A2
, A3
);
281 explicit RunnableAdapter(R(*function
)(A1
, A2
, A3
))
282 : function_(function
) {
285 R
Run(typename CallbackParamTraits
<A1
>::ForwardType a1
,
286 typename CallbackParamTraits
<A2
>::ForwardType a2
,
287 typename CallbackParamTraits
<A3
>::ForwardType a3
) {
288 return function_(CallbackForward(a1
), CallbackForward(a2
),
289 CallbackForward(a3
));
293 R (*function_
)(A1
, A2
, A3
);
297 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
>
298 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
)> {
300 typedef R (RunType
)(T
*, A1
, A2
, A3
);
301 typedef true_type IsMethod
;
303 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
))
307 R
Run(T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
308 typename CallbackParamTraits
<A2
>::ForwardType a2
,
309 typename CallbackParamTraits
<A3
>::ForwardType a3
) {
310 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
311 CallbackForward(a3
));
315 R (T::*method_
)(A1
, A2
, A3
);
318 // Const Method: Arity 3.
319 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
>
320 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
) const> {
322 typedef R (RunType
)(const T
*, A1
, A2
, A3
);
323 typedef true_type IsMethod
;
325 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
) const)
329 R
Run(const T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
330 typename CallbackParamTraits
<A2
>::ForwardType a2
,
331 typename CallbackParamTraits
<A3
>::ForwardType a3
) {
332 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
333 CallbackForward(a3
));
337 R (T::*method_
)(A1
, A2
, A3
) const;
340 // Function: Arity 4.
341 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
>
342 class RunnableAdapter
<R(*)(A1
, A2
, A3
, A4
)> {
344 typedef R (RunType
)(A1
, A2
, A3
, A4
);
346 explicit RunnableAdapter(R(*function
)(A1
, A2
, A3
, A4
))
347 : function_(function
) {
350 R
Run(typename CallbackParamTraits
<A1
>::ForwardType a1
,
351 typename CallbackParamTraits
<A2
>::ForwardType a2
,
352 typename CallbackParamTraits
<A3
>::ForwardType a3
,
353 typename CallbackParamTraits
<A4
>::ForwardType a4
) {
354 return function_(CallbackForward(a1
), CallbackForward(a2
),
355 CallbackForward(a3
), CallbackForward(a4
));
359 R (*function_
)(A1
, A2
, A3
, A4
);
363 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
,
365 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
, A4
)> {
367 typedef R (RunType
)(T
*, A1
, A2
, A3
, A4
);
368 typedef true_type IsMethod
;
370 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
, A4
))
374 R
Run(T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
375 typename CallbackParamTraits
<A2
>::ForwardType a2
,
376 typename CallbackParamTraits
<A3
>::ForwardType a3
,
377 typename CallbackParamTraits
<A4
>::ForwardType a4
) {
378 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
379 CallbackForward(a3
), CallbackForward(a4
));
383 R (T::*method_
)(A1
, A2
, A3
, A4
);
386 // Const Method: Arity 4.
387 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
,
389 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
, A4
) const> {
391 typedef R (RunType
)(const T
*, A1
, A2
, A3
, A4
);
392 typedef true_type IsMethod
;
394 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
, A4
) const)
398 R
Run(const T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
399 typename CallbackParamTraits
<A2
>::ForwardType a2
,
400 typename CallbackParamTraits
<A3
>::ForwardType a3
,
401 typename CallbackParamTraits
<A4
>::ForwardType a4
) {
402 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
403 CallbackForward(a3
), CallbackForward(a4
));
407 R (T::*method_
)(A1
, A2
, A3
, A4
) const;
410 // Function: Arity 5.
411 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
413 class RunnableAdapter
<R(*)(A1
, A2
, A3
, A4
, A5
)> {
415 typedef R (RunType
)(A1
, A2
, A3
, A4
, A5
);
417 explicit RunnableAdapter(R(*function
)(A1
, A2
, A3
, A4
, A5
))
418 : function_(function
) {
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_(CallbackForward(a1
), CallbackForward(a2
),
427 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
));
431 R (*function_
)(A1
, A2
, A3
, A4
, A5
);
435 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
,
436 typename A4
, typename A5
>
437 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
, A4
, A5
)> {
439 typedef R (RunType
)(T
*, A1
, A2
, A3
, A4
, A5
);
440 typedef true_type IsMethod
;
442 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
, A4
, A5
))
446 R
Run(T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
447 typename CallbackParamTraits
<A2
>::ForwardType a2
,
448 typename CallbackParamTraits
<A3
>::ForwardType a3
,
449 typename CallbackParamTraits
<A4
>::ForwardType a4
,
450 typename CallbackParamTraits
<A5
>::ForwardType a5
) {
451 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
452 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
));
456 R (T::*method_
)(A1
, A2
, A3
, A4
, A5
);
459 // Const Method: Arity 5.
460 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
,
461 typename A4
, typename A5
>
462 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
, A4
, A5
) const> {
464 typedef R (RunType
)(const T
*, A1
, A2
, A3
, A4
, A5
);
465 typedef true_type IsMethod
;
467 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
, A4
, A5
) const)
471 R
Run(const T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
472 typename CallbackParamTraits
<A2
>::ForwardType a2
,
473 typename CallbackParamTraits
<A3
>::ForwardType a3
,
474 typename CallbackParamTraits
<A4
>::ForwardType a4
,
475 typename CallbackParamTraits
<A5
>::ForwardType a5
) {
476 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
477 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
));
481 R (T::*method_
)(A1
, A2
, A3
, A4
, A5
) const;
484 // Function: Arity 6.
485 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
486 typename A5
, typename A6
>
487 class RunnableAdapter
<R(*)(A1
, A2
, A3
, A4
, A5
, A6
)> {
489 typedef R (RunType
)(A1
, A2
, A3
, A4
, A5
, A6
);
491 explicit RunnableAdapter(R(*function
)(A1
, A2
, A3
, A4
, A5
, A6
))
492 : function_(function
) {
495 R
Run(typename CallbackParamTraits
<A1
>::ForwardType a1
,
496 typename CallbackParamTraits
<A2
>::ForwardType a2
,
497 typename CallbackParamTraits
<A3
>::ForwardType a3
,
498 typename CallbackParamTraits
<A4
>::ForwardType a4
,
499 typename CallbackParamTraits
<A5
>::ForwardType a5
,
500 typename CallbackParamTraits
<A6
>::ForwardType a6
) {
501 return function_(CallbackForward(a1
), CallbackForward(a2
),
502 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
),
503 CallbackForward(a6
));
507 R (*function_
)(A1
, A2
, A3
, A4
, A5
, A6
);
511 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
,
512 typename A4
, typename A5
, typename A6
>
513 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
, A4
, A5
, A6
)> {
515 typedef R (RunType
)(T
*, A1
, A2
, A3
, A4
, A5
, A6
);
516 typedef true_type IsMethod
;
518 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
, A4
, A5
, A6
))
522 R
Run(T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
523 typename CallbackParamTraits
<A2
>::ForwardType a2
,
524 typename CallbackParamTraits
<A3
>::ForwardType a3
,
525 typename CallbackParamTraits
<A4
>::ForwardType a4
,
526 typename CallbackParamTraits
<A5
>::ForwardType a5
,
527 typename CallbackParamTraits
<A6
>::ForwardType a6
) {
528 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
529 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
),
530 CallbackForward(a6
));
534 R (T::*method_
)(A1
, A2
, A3
, A4
, A5
, A6
);
537 // Const Method: Arity 6.
538 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
,
539 typename A4
, typename A5
, typename A6
>
540 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
, A4
, A5
, A6
) const> {
542 typedef R (RunType
)(const T
*, A1
, A2
, A3
, A4
, A5
, A6
);
543 typedef true_type IsMethod
;
545 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
, A4
, A5
, A6
) const)
549 R
Run(const T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
550 typename CallbackParamTraits
<A2
>::ForwardType a2
,
551 typename CallbackParamTraits
<A3
>::ForwardType a3
,
552 typename CallbackParamTraits
<A4
>::ForwardType a4
,
553 typename CallbackParamTraits
<A5
>::ForwardType a5
,
554 typename CallbackParamTraits
<A6
>::ForwardType a6
) {
555 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
556 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
),
557 CallbackForward(a6
));
561 R (T::*method_
)(A1
, A2
, A3
, A4
, A5
, A6
) const;
564 // Function: Arity 7.
565 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
566 typename A5
, typename A6
, typename A7
>
567 class RunnableAdapter
<R(*)(A1
, A2
, A3
, A4
, A5
, A6
, A7
)> {
569 typedef R (RunType
)(A1
, A2
, A3
, A4
, A5
, A6
, A7
);
571 explicit RunnableAdapter(R(*function
)(A1
, A2
, A3
, A4
, A5
, A6
, A7
))
572 : function_(function
) {
575 R
Run(typename CallbackParamTraits
<A1
>::ForwardType a1
,
576 typename CallbackParamTraits
<A2
>::ForwardType a2
,
577 typename CallbackParamTraits
<A3
>::ForwardType a3
,
578 typename CallbackParamTraits
<A4
>::ForwardType a4
,
579 typename CallbackParamTraits
<A5
>::ForwardType a5
,
580 typename CallbackParamTraits
<A6
>::ForwardType a6
,
581 typename CallbackParamTraits
<A7
>::ForwardType a7
) {
582 return function_(CallbackForward(a1
), CallbackForward(a2
),
583 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
),
584 CallbackForward(a6
), CallbackForward(a7
));
588 R (*function_
)(A1
, A2
, A3
, A4
, A5
, A6
, A7
);
592 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
,
593 typename A4
, typename A5
, typename A6
, typename A7
>
594 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
, A4
, A5
, A6
, A7
)> {
596 typedef R (RunType
)(T
*, A1
, A2
, A3
, A4
, A5
, A6
, A7
);
597 typedef true_type IsMethod
;
599 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
, A4
, A5
, A6
, A7
))
603 R
Run(T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
604 typename CallbackParamTraits
<A2
>::ForwardType a2
,
605 typename CallbackParamTraits
<A3
>::ForwardType a3
,
606 typename CallbackParamTraits
<A4
>::ForwardType a4
,
607 typename CallbackParamTraits
<A5
>::ForwardType a5
,
608 typename CallbackParamTraits
<A6
>::ForwardType a6
,
609 typename CallbackParamTraits
<A7
>::ForwardType a7
) {
610 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
611 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
),
612 CallbackForward(a6
), CallbackForward(a7
));
616 R (T::*method_
)(A1
, A2
, A3
, A4
, A5
, A6
, A7
);
619 // Const Method: Arity 7.
620 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
,
621 typename A4
, typename A5
, typename A6
, typename A7
>
622 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
, A4
, A5
, A6
, A7
) const> {
624 typedef R (RunType
)(const T
*, A1
, A2
, A3
, A4
, A5
, A6
, A7
);
625 typedef true_type IsMethod
;
627 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
, A4
, A5
, A6
, A7
) const)
631 R
Run(const T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
632 typename CallbackParamTraits
<A2
>::ForwardType a2
,
633 typename CallbackParamTraits
<A3
>::ForwardType a3
,
634 typename CallbackParamTraits
<A4
>::ForwardType a4
,
635 typename CallbackParamTraits
<A5
>::ForwardType a5
,
636 typename CallbackParamTraits
<A6
>::ForwardType a6
,
637 typename CallbackParamTraits
<A7
>::ForwardType a7
) {
638 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
639 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
),
640 CallbackForward(a6
), CallbackForward(a7
));
644 R (T::*method_
)(A1
, A2
, A3
, A4
, A5
, A6
, A7
) const;
650 // Breaks a function signature apart into typedefs for easier introspection.
651 template <typename Sig
>
652 struct FunctionTraits
;
654 template <typename R
>
655 struct FunctionTraits
<R()> {
656 typedef R ReturnType
;
659 template <typename R
, typename A1
>
660 struct FunctionTraits
<R(A1
)> {
661 typedef R ReturnType
;
665 template <typename R
, typename A1
, typename A2
>
666 struct FunctionTraits
<R(A1
, A2
)> {
667 typedef R ReturnType
;
672 template <typename R
, typename A1
, typename A2
, typename A3
>
673 struct FunctionTraits
<R(A1
, A2
, A3
)> {
674 typedef R ReturnType
;
680 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
>
681 struct FunctionTraits
<R(A1
, A2
, A3
, A4
)> {
682 typedef R ReturnType
;
689 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
691 struct FunctionTraits
<R(A1
, A2
, A3
, A4
, A5
)> {
692 typedef R ReturnType
;
700 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
701 typename A5
, typename A6
>
702 struct FunctionTraits
<R(A1
, A2
, A3
, A4
, A5
, A6
)> {
703 typedef R ReturnType
;
712 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
713 typename A5
, typename A6
, typename A7
>
714 struct FunctionTraits
<R(A1
, A2
, A3
, A4
, A5
, A6
, A7
)> {
715 typedef R ReturnType
;
728 // Set of templates that support forcing the function return type to void.
729 template <typename Sig
>
730 struct ForceVoidReturn
;
732 template <typename R
>
733 struct ForceVoidReturn
<R()> {
734 typedef void(RunType
)();
737 template <typename R
, typename A1
>
738 struct ForceVoidReturn
<R(A1
)> {
739 typedef void(RunType
)(A1
);
742 template <typename R
, typename A1
, typename A2
>
743 struct ForceVoidReturn
<R(A1
, A2
)> {
744 typedef void(RunType
)(A1
, A2
);
747 template <typename R
, typename A1
, typename A2
, typename A3
>
748 struct ForceVoidReturn
<R(A1
, A2
, A3
)> {
749 typedef void(RunType
)(A1
, A2
, A3
);
752 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
>
753 struct ForceVoidReturn
<R(A1
, A2
, A3
, A4
)> {
754 typedef void(RunType
)(A1
, A2
, A3
, A4
);
757 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
759 struct ForceVoidReturn
<R(A1
, A2
, A3
, A4
, A5
)> {
760 typedef void(RunType
)(A1
, A2
, A3
, A4
, A5
);
763 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
764 typename A5
, typename A6
>
765 struct ForceVoidReturn
<R(A1
, A2
, A3
, A4
, A5
, A6
)> {
766 typedef void(RunType
)(A1
, A2
, A3
, A4
, A5
, A6
);
769 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
770 typename A5
, typename A6
, typename A7
>
771 struct ForceVoidReturn
<R(A1
, A2
, A3
, A4
, A5
, A6
, A7
)> {
772 typedef void(RunType
)(A1
, A2
, A3
, A4
, A5
, A6
, A7
);
778 // See description at top of file.
779 template <typename T
>
780 struct FunctorTraits
{
781 typedef RunnableAdapter
<T
> RunnableType
;
782 typedef typename
RunnableType::RunType RunType
;
785 template <typename T
>
786 struct FunctorTraits
<IgnoreResultHelper
<T
> > {
787 typedef typename FunctorTraits
<T
>::RunnableType RunnableType
;
788 typedef typename ForceVoidReturn
<
789 typename
RunnableType::RunType
>::RunType RunType
;
792 template <typename T
>
793 struct FunctorTraits
<Callback
<T
> > {
794 typedef Callback
<T
> RunnableType
;
795 typedef typename Callback
<T
>::RunType RunType
;
801 // Converts a passed in functor to a RunnableType using type inference.
803 template <typename T
>
804 typename FunctorTraits
<T
>::RunnableType
MakeRunnable(const T
& t
) {
805 return RunnableAdapter
<T
>(t
);
808 template <typename T
>
809 typename FunctorTraits
<T
>::RunnableType
810 MakeRunnable(const IgnoreResultHelper
<T
>& t
) {
811 return MakeRunnable(t
.functor_
);
814 template <typename T
>
815 const typename FunctorTraits
<Callback
<T
> >::RunnableType
&
816 MakeRunnable(const Callback
<T
>& t
) {
817 DCHECK(!t
.is_null());
824 // There are 3 logical InvokeHelper<> specializations: normal, void-return,
827 // The normal type just calls the underlying runnable.
829 // We need a InvokeHelper to handle void return types in order to support
830 // IgnoreResult(). Normally, if the Runnable's RunType had a void return,
831 // the template system would just accept "return functor.Run()" ignoring
832 // the fact that a void function is being used with return. This piece of
833 // sugar breaks though when the Runnable's RunType is not void. Thus, we
834 // need a partial specialization to change the syntax to drop the "return"
835 // from the invocation call.
837 // WeakCalls similarly need special syntax that is applied to the first
838 // argument to check if they should no-op themselves.
839 template <bool IsWeakCall
, typename ReturnType
, typename Runnable
,
843 template <typename ReturnType
, typename Runnable
>
844 struct InvokeHelper
<false, ReturnType
, Runnable
,
846 static ReturnType
MakeItSo(Runnable runnable
) {
847 return runnable
.Run();
851 template <typename Runnable
>
852 struct InvokeHelper
<false, void, Runnable
,
854 static void MakeItSo(Runnable runnable
) {
859 template <typename ReturnType
, typename Runnable
,typename A1
>
860 struct InvokeHelper
<false, ReturnType
, Runnable
,
862 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
) {
863 return runnable
.Run(CallbackForward(a1
));
867 template <typename Runnable
,typename A1
>
868 struct InvokeHelper
<false, void, Runnable
,
870 static void MakeItSo(Runnable runnable
, A1 a1
) {
871 runnable
.Run(CallbackForward(a1
));
875 template <typename Runnable
, typename A1
>
876 struct InvokeHelper
<true, void, Runnable
,
878 static void MakeItSo(Runnable runnable
, A1 a1
) {
883 runnable
.Run(CallbackForward(a1
));
887 template <typename ReturnType
, typename Runnable
,typename A1
, typename A2
>
888 struct InvokeHelper
<false, ReturnType
, Runnable
,
890 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
, A2 a2
) {
891 return runnable
.Run(CallbackForward(a1
), CallbackForward(a2
));
895 template <typename Runnable
,typename A1
, typename A2
>
896 struct InvokeHelper
<false, void, Runnable
,
898 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
) {
899 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
));
903 template <typename Runnable
, typename A1
, typename A2
>
904 struct InvokeHelper
<true, void, Runnable
,
906 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
) {
911 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
));
915 template <typename ReturnType
, typename Runnable
,typename A1
, typename A2
,
917 struct InvokeHelper
<false, ReturnType
, Runnable
,
919 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
) {
920 return runnable
.Run(CallbackForward(a1
), CallbackForward(a2
),
921 CallbackForward(a3
));
925 template <typename Runnable
,typename A1
, typename A2
, typename A3
>
926 struct InvokeHelper
<false, void, Runnable
,
928 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
) {
929 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
));
933 template <typename Runnable
, typename A1
, typename A2
, typename A3
>
934 struct InvokeHelper
<true, void, Runnable
,
936 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
) {
941 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
));
945 template <typename ReturnType
, typename Runnable
,typename A1
, typename A2
,
946 typename A3
, typename A4
>
947 struct InvokeHelper
<false, ReturnType
, Runnable
,
948 void(A1
, A2
, A3
, A4
)> {
949 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
) {
950 return runnable
.Run(CallbackForward(a1
), CallbackForward(a2
),
951 CallbackForward(a3
), CallbackForward(a4
));
955 template <typename Runnable
,typename A1
, typename A2
, typename A3
, typename A4
>
956 struct InvokeHelper
<false, void, Runnable
,
957 void(A1
, A2
, A3
, A4
)> {
958 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
) {
959 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
960 CallbackForward(a4
));
964 template <typename Runnable
, typename A1
, typename A2
, typename A3
, typename A4
>
965 struct InvokeHelper
<true, void, Runnable
,
966 void(A1
, A2
, A3
, A4
)> {
967 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
) {
972 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
973 CallbackForward(a4
));
977 template <typename ReturnType
, typename Runnable
,typename A1
, typename A2
,
978 typename A3
, typename A4
, typename A5
>
979 struct InvokeHelper
<false, ReturnType
, Runnable
,
980 void(A1
, A2
, A3
, A4
, A5
)> {
981 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
,
983 return runnable
.Run(CallbackForward(a1
), CallbackForward(a2
),
984 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
));
988 template <typename Runnable
,typename A1
, typename A2
, typename A3
, typename A4
,
990 struct InvokeHelper
<false, void, Runnable
,
991 void(A1
, A2
, A3
, A4
, A5
)> {
992 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
, A5 a5
) {
993 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
994 CallbackForward(a4
), CallbackForward(a5
));
998 template <typename Runnable
, typename A1
, typename A2
, typename A3
,
999 typename A4
, typename A5
>
1000 struct InvokeHelper
<true, void, Runnable
,
1001 void(A1
, A2
, A3
, A4
, A5
)> {
1002 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
, A5 a5
) {
1007 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
1008 CallbackForward(a4
), CallbackForward(a5
));
1012 template <typename ReturnType
, typename Runnable
,typename A1
, typename A2
,
1013 typename A3
, typename A4
, typename A5
, typename A6
>
1014 struct InvokeHelper
<false, ReturnType
, Runnable
,
1015 void(A1
, A2
, A3
, A4
, A5
, A6
)> {
1016 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
,
1018 return runnable
.Run(CallbackForward(a1
), CallbackForward(a2
),
1019 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
),
1020 CallbackForward(a6
));
1024 template <typename Runnable
,typename A1
, typename A2
, typename A3
, typename A4
,
1025 typename A5
, typename A6
>
1026 struct InvokeHelper
<false, void, Runnable
,
1027 void(A1
, A2
, A3
, A4
, A5
, A6
)> {
1028 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
, A5 a5
,
1030 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
1031 CallbackForward(a4
), CallbackForward(a5
), CallbackForward(a6
));
1035 template <typename Runnable
, typename A1
, typename A2
, typename A3
,
1036 typename A4
, typename A5
, typename A6
>
1037 struct InvokeHelper
<true, void, Runnable
,
1038 void(A1
, A2
, A3
, A4
, A5
, A6
)> {
1039 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
, A5 a5
,
1045 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
1046 CallbackForward(a4
), CallbackForward(a5
), CallbackForward(a6
));
1050 template <typename ReturnType
, typename Runnable
,typename A1
, typename A2
,
1051 typename A3
, typename A4
, typename A5
, typename A6
, typename A7
>
1052 struct InvokeHelper
<false, ReturnType
, Runnable
,
1053 void(A1
, A2
, A3
, A4
, A5
, A6
, A7
)> {
1054 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
,
1055 A5 a5
, A6 a6
, A7 a7
) {
1056 return runnable
.Run(CallbackForward(a1
), CallbackForward(a2
),
1057 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
),
1058 CallbackForward(a6
), CallbackForward(a7
));
1062 template <typename Runnable
,typename A1
, typename A2
, typename A3
, typename A4
,
1063 typename A5
, typename A6
, typename A7
>
1064 struct InvokeHelper
<false, void, Runnable
,
1065 void(A1
, A2
, A3
, A4
, A5
, A6
, A7
)> {
1066 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
, A5 a5
,
1068 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
1069 CallbackForward(a4
), CallbackForward(a5
), CallbackForward(a6
),
1070 CallbackForward(a7
));
1074 template <typename Runnable
, typename A1
, typename A2
, typename A3
,
1075 typename A4
, typename A5
, typename A6
, typename A7
>
1076 struct InvokeHelper
<true, void, Runnable
,
1077 void(A1
, A2
, A3
, A4
, A5
, A6
, A7
)> {
1078 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
, A5 a5
,
1084 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
1085 CallbackForward(a4
), CallbackForward(a5
), CallbackForward(a6
),
1086 CallbackForward(a7
));
1090 #if !defined(_MSC_VER)
1092 template <typename ReturnType
, typename Runnable
, typename ArgsType
>
1093 struct InvokeHelper
<true, ReturnType
, Runnable
, ArgsType
> {
1094 // WeakCalls are only supported for functions with a void return type.
1095 // Otherwise, the function result would be undefined if the the WeakPtr<>
1097 COMPILE_ASSERT(is_void
<ReturnType
>::value
,
1098 weak_ptrs_can_only_bind_to_methods_without_return_values
);
1105 // See description at the top of the file.
1106 template <int NumBound
, typename Storage
, typename RunType
>
1110 template <typename StorageType
, typename R
>
1111 struct Invoker
<0, StorageType
, R()> {
1112 typedef R(RunType
)(BindStateBase
*);
1114 typedef R(UnboundRunType
)();
1116 static R
Run(BindStateBase
* base
) {
1117 StorageType
* storage
= static_cast<StorageType
*>(base
);
1119 // Local references to make debugger stepping easier. If in a debugger,
1120 // you really want to warp ahead and step through the
1121 // InvokeHelper<>::MakeItSo() call below.
1123 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1124 typename
StorageType::RunnableType
,
1126 ::MakeItSo(storage
->runnable_
);
1131 template <typename StorageType
, typename R
,typename X1
>
1132 struct Invoker
<0, StorageType
, R(X1
)> {
1133 typedef R(RunType
)(BindStateBase
*,
1134 typename CallbackParamTraits
<X1
>::ForwardType
);
1136 typedef R(UnboundRunType
)(X1
);
1138 static R
Run(BindStateBase
* base
,
1139 typename CallbackParamTraits
<X1
>::ForwardType x1
) {
1140 StorageType
* storage
= static_cast<StorageType
*>(base
);
1142 // Local references to make debugger stepping easier. If in a debugger,
1143 // you really want to warp ahead and step through the
1144 // InvokeHelper<>::MakeItSo() call below.
1146 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1147 typename
StorageType::RunnableType
,
1148 void(typename CallbackParamTraits
<X1
>::ForwardType x1
)>
1149 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
));
1154 template <typename StorageType
, typename R
,typename X1
>
1155 struct Invoker
<1, StorageType
, R(X1
)> {
1156 typedef R(RunType
)(BindStateBase
*);
1158 typedef R(UnboundRunType
)();
1160 static R
Run(BindStateBase
* base
) {
1161 StorageType
* storage
= static_cast<StorageType
*>(base
);
1163 // Local references to make debugger stepping easier. If in a debugger,
1164 // you really want to warp ahead and step through the
1165 // InvokeHelper<>::MakeItSo() call below.
1166 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1168 typename
Bound1UnwrapTraits::ForwardType x1
=
1169 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1170 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1171 typename
StorageType::RunnableType
,
1172 void(typename
Bound1UnwrapTraits::ForwardType
)>
1173 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
));
1178 template <typename StorageType
, typename R
,typename X1
, typename X2
>
1179 struct Invoker
<0, StorageType
, R(X1
, X2
)> {
1180 typedef R(RunType
)(BindStateBase
*,
1181 typename CallbackParamTraits
<X1
>::ForwardType
,
1182 typename CallbackParamTraits
<X2
>::ForwardType
);
1184 typedef R(UnboundRunType
)(X1
, X2
);
1186 static R
Run(BindStateBase
* base
,
1187 typename CallbackParamTraits
<X1
>::ForwardType x1
,
1188 typename CallbackParamTraits
<X2
>::ForwardType x2
) {
1189 StorageType
* storage
= static_cast<StorageType
*>(base
);
1191 // Local references to make debugger stepping easier. If in a debugger,
1192 // you really want to warp ahead and step through the
1193 // InvokeHelper<>::MakeItSo() call below.
1195 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1196 typename
StorageType::RunnableType
,
1197 void(typename CallbackParamTraits
<X1
>::ForwardType x1
,
1198 typename CallbackParamTraits
<X2
>::ForwardType x2
)>
1199 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1200 CallbackForward(x2
));
1205 template <typename StorageType
, typename R
,typename X1
, typename X2
>
1206 struct Invoker
<1, StorageType
, R(X1
, X2
)> {
1207 typedef R(RunType
)(BindStateBase
*,
1208 typename CallbackParamTraits
<X2
>::ForwardType
);
1210 typedef R(UnboundRunType
)(X2
);
1212 static R
Run(BindStateBase
* base
,
1213 typename CallbackParamTraits
<X2
>::ForwardType x2
) {
1214 StorageType
* storage
= static_cast<StorageType
*>(base
);
1216 // Local references to make debugger stepping easier. If in a debugger,
1217 // you really want to warp ahead and step through the
1218 // InvokeHelper<>::MakeItSo() call below.
1219 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1221 typename
Bound1UnwrapTraits::ForwardType x1
=
1222 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1223 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1224 typename
StorageType::RunnableType
,
1225 void(typename
Bound1UnwrapTraits::ForwardType
,
1226 typename CallbackParamTraits
<X2
>::ForwardType x2
)>
1227 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1228 CallbackForward(x2
));
1233 template <typename StorageType
, typename R
,typename X1
, typename X2
>
1234 struct Invoker
<2, StorageType
, R(X1
, X2
)> {
1235 typedef R(RunType
)(BindStateBase
*);
1237 typedef R(UnboundRunType
)();
1239 static R
Run(BindStateBase
* base
) {
1240 StorageType
* storage
= static_cast<StorageType
*>(base
);
1242 // Local references to make debugger stepping easier. If in a debugger,
1243 // you really want to warp ahead and step through the
1244 // InvokeHelper<>::MakeItSo() call below.
1245 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1246 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1248 typename
Bound1UnwrapTraits::ForwardType x1
=
1249 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1250 typename
Bound2UnwrapTraits::ForwardType x2
=
1251 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1252 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1253 typename
StorageType::RunnableType
,
1254 void(typename
Bound1UnwrapTraits::ForwardType
,
1255 typename
Bound2UnwrapTraits::ForwardType
)>
1256 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1257 CallbackForward(x2
));
1262 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1264 struct Invoker
<0, StorageType
, R(X1
, X2
, X3
)> {
1265 typedef R(RunType
)(BindStateBase
*,
1266 typename CallbackParamTraits
<X1
>::ForwardType
,
1267 typename CallbackParamTraits
<X2
>::ForwardType
,
1268 typename CallbackParamTraits
<X3
>::ForwardType
);
1270 typedef R(UnboundRunType
)(X1
, X2
, X3
);
1272 static R
Run(BindStateBase
* base
,
1273 typename CallbackParamTraits
<X1
>::ForwardType x1
,
1274 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1275 typename CallbackParamTraits
<X3
>::ForwardType x3
) {
1276 StorageType
* storage
= static_cast<StorageType
*>(base
);
1278 // Local references to make debugger stepping easier. If in a debugger,
1279 // you really want to warp ahead and step through the
1280 // InvokeHelper<>::MakeItSo() call below.
1282 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1283 typename
StorageType::RunnableType
,
1284 void(typename CallbackParamTraits
<X1
>::ForwardType x1
,
1285 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1286 typename CallbackParamTraits
<X3
>::ForwardType x3
)>
1287 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1288 CallbackForward(x2
), CallbackForward(x3
));
1293 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1295 struct Invoker
<1, StorageType
, R(X1
, X2
, X3
)> {
1296 typedef R(RunType
)(BindStateBase
*,
1297 typename CallbackParamTraits
<X2
>::ForwardType
,
1298 typename CallbackParamTraits
<X3
>::ForwardType
);
1300 typedef R(UnboundRunType
)(X2
, X3
);
1302 static R
Run(BindStateBase
* base
,
1303 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1304 typename CallbackParamTraits
<X3
>::ForwardType x3
) {
1305 StorageType
* storage
= static_cast<StorageType
*>(base
);
1307 // Local references to make debugger stepping easier. If in a debugger,
1308 // you really want to warp ahead and step through the
1309 // InvokeHelper<>::MakeItSo() call below.
1310 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1312 typename
Bound1UnwrapTraits::ForwardType x1
=
1313 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1314 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1315 typename
StorageType::RunnableType
,
1316 void(typename
Bound1UnwrapTraits::ForwardType
,
1317 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1318 typename CallbackParamTraits
<X3
>::ForwardType x3
)>
1319 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1320 CallbackForward(x2
), CallbackForward(x3
));
1325 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1327 struct Invoker
<2, StorageType
, R(X1
, X2
, X3
)> {
1328 typedef R(RunType
)(BindStateBase
*,
1329 typename CallbackParamTraits
<X3
>::ForwardType
);
1331 typedef R(UnboundRunType
)(X3
);
1333 static R
Run(BindStateBase
* base
,
1334 typename CallbackParamTraits
<X3
>::ForwardType x3
) {
1335 StorageType
* storage
= static_cast<StorageType
*>(base
);
1337 // Local references to make debugger stepping easier. If in a debugger,
1338 // you really want to warp ahead and step through the
1339 // InvokeHelper<>::MakeItSo() call below.
1340 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1341 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1343 typename
Bound1UnwrapTraits::ForwardType x1
=
1344 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1345 typename
Bound2UnwrapTraits::ForwardType x2
=
1346 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1347 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1348 typename
StorageType::RunnableType
,
1349 void(typename
Bound1UnwrapTraits::ForwardType
,
1350 typename
Bound2UnwrapTraits::ForwardType
,
1351 typename CallbackParamTraits
<X3
>::ForwardType x3
)>
1352 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1353 CallbackForward(x2
), CallbackForward(x3
));
1358 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1360 struct Invoker
<3, StorageType
, R(X1
, X2
, X3
)> {
1361 typedef R(RunType
)(BindStateBase
*);
1363 typedef R(UnboundRunType
)();
1365 static R
Run(BindStateBase
* base
) {
1366 StorageType
* storage
= static_cast<StorageType
*>(base
);
1368 // Local references to make debugger stepping easier. If in a debugger,
1369 // you really want to warp ahead and step through the
1370 // InvokeHelper<>::MakeItSo() call below.
1371 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1372 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1373 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1375 typename
Bound1UnwrapTraits::ForwardType x1
=
1376 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1377 typename
Bound2UnwrapTraits::ForwardType x2
=
1378 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1379 typename
Bound3UnwrapTraits::ForwardType x3
=
1380 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1381 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1382 typename
StorageType::RunnableType
,
1383 void(typename
Bound1UnwrapTraits::ForwardType
,
1384 typename
Bound2UnwrapTraits::ForwardType
,
1385 typename
Bound3UnwrapTraits::ForwardType
)>
1386 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1387 CallbackForward(x2
), CallbackForward(x3
));
1392 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1393 typename X3
, typename X4
>
1394 struct Invoker
<0, StorageType
, R(X1
, X2
, X3
, X4
)> {
1395 typedef R(RunType
)(BindStateBase
*,
1396 typename CallbackParamTraits
<X1
>::ForwardType
,
1397 typename CallbackParamTraits
<X2
>::ForwardType
,
1398 typename CallbackParamTraits
<X3
>::ForwardType
,
1399 typename CallbackParamTraits
<X4
>::ForwardType
);
1401 typedef R(UnboundRunType
)(X1
, X2
, X3
, X4
);
1403 static R
Run(BindStateBase
* base
,
1404 typename CallbackParamTraits
<X1
>::ForwardType x1
,
1405 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1406 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1407 typename CallbackParamTraits
<X4
>::ForwardType x4
) {
1408 StorageType
* storage
= static_cast<StorageType
*>(base
);
1410 // Local references to make debugger stepping easier. If in a debugger,
1411 // you really want to warp ahead and step through the
1412 // InvokeHelper<>::MakeItSo() call below.
1414 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1415 typename
StorageType::RunnableType
,
1416 void(typename CallbackParamTraits
<X1
>::ForwardType x1
,
1417 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1418 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1419 typename CallbackParamTraits
<X4
>::ForwardType x4
)>
1420 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1421 CallbackForward(x2
), CallbackForward(x3
),
1422 CallbackForward(x4
));
1427 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1428 typename X3
, typename X4
>
1429 struct Invoker
<1, StorageType
, R(X1
, X2
, X3
, X4
)> {
1430 typedef R(RunType
)(BindStateBase
*,
1431 typename CallbackParamTraits
<X2
>::ForwardType
,
1432 typename CallbackParamTraits
<X3
>::ForwardType
,
1433 typename CallbackParamTraits
<X4
>::ForwardType
);
1435 typedef R(UnboundRunType
)(X2
, X3
, X4
);
1437 static R
Run(BindStateBase
* base
,
1438 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1439 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1440 typename CallbackParamTraits
<X4
>::ForwardType x4
) {
1441 StorageType
* storage
= static_cast<StorageType
*>(base
);
1443 // Local references to make debugger stepping easier. If in a debugger,
1444 // you really want to warp ahead and step through the
1445 // InvokeHelper<>::MakeItSo() call below.
1446 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1448 typename
Bound1UnwrapTraits::ForwardType x1
=
1449 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1450 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1451 typename
StorageType::RunnableType
,
1452 void(typename
Bound1UnwrapTraits::ForwardType
,
1453 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1454 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1455 typename CallbackParamTraits
<X4
>::ForwardType x4
)>
1456 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1457 CallbackForward(x2
), CallbackForward(x3
),
1458 CallbackForward(x4
));
1463 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1464 typename X3
, typename X4
>
1465 struct Invoker
<2, StorageType
, R(X1
, X2
, X3
, X4
)> {
1466 typedef R(RunType
)(BindStateBase
*,
1467 typename CallbackParamTraits
<X3
>::ForwardType
,
1468 typename CallbackParamTraits
<X4
>::ForwardType
);
1470 typedef R(UnboundRunType
)(X3
, X4
);
1472 static R
Run(BindStateBase
* base
,
1473 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1474 typename CallbackParamTraits
<X4
>::ForwardType x4
) {
1475 StorageType
* storage
= static_cast<StorageType
*>(base
);
1477 // Local references to make debugger stepping easier. If in a debugger,
1478 // you really want to warp ahead and step through the
1479 // InvokeHelper<>::MakeItSo() call below.
1480 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1481 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1483 typename
Bound1UnwrapTraits::ForwardType x1
=
1484 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1485 typename
Bound2UnwrapTraits::ForwardType x2
=
1486 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1487 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1488 typename
StorageType::RunnableType
,
1489 void(typename
Bound1UnwrapTraits::ForwardType
,
1490 typename
Bound2UnwrapTraits::ForwardType
,
1491 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1492 typename CallbackParamTraits
<X4
>::ForwardType x4
)>
1493 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1494 CallbackForward(x2
), CallbackForward(x3
),
1495 CallbackForward(x4
));
1500 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1501 typename X3
, typename X4
>
1502 struct Invoker
<3, StorageType
, R(X1
, X2
, X3
, X4
)> {
1503 typedef R(RunType
)(BindStateBase
*,
1504 typename CallbackParamTraits
<X4
>::ForwardType
);
1506 typedef R(UnboundRunType
)(X4
);
1508 static R
Run(BindStateBase
* base
,
1509 typename CallbackParamTraits
<X4
>::ForwardType x4
) {
1510 StorageType
* storage
= static_cast<StorageType
*>(base
);
1512 // Local references to make debugger stepping easier. If in a debugger,
1513 // you really want to warp ahead and step through the
1514 // InvokeHelper<>::MakeItSo() call below.
1515 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1516 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1517 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1519 typename
Bound1UnwrapTraits::ForwardType x1
=
1520 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1521 typename
Bound2UnwrapTraits::ForwardType x2
=
1522 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1523 typename
Bound3UnwrapTraits::ForwardType x3
=
1524 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1525 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1526 typename
StorageType::RunnableType
,
1527 void(typename
Bound1UnwrapTraits::ForwardType
,
1528 typename
Bound2UnwrapTraits::ForwardType
,
1529 typename
Bound3UnwrapTraits::ForwardType
,
1530 typename CallbackParamTraits
<X4
>::ForwardType x4
)>
1531 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1532 CallbackForward(x2
), CallbackForward(x3
),
1533 CallbackForward(x4
));
1538 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1539 typename X3
, typename X4
>
1540 struct Invoker
<4, StorageType
, R(X1
, X2
, X3
, X4
)> {
1541 typedef R(RunType
)(BindStateBase
*);
1543 typedef R(UnboundRunType
)();
1545 static R
Run(BindStateBase
* base
) {
1546 StorageType
* storage
= static_cast<StorageType
*>(base
);
1548 // Local references to make debugger stepping easier. If in a debugger,
1549 // you really want to warp ahead and step through the
1550 // InvokeHelper<>::MakeItSo() call below.
1551 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1552 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1553 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1554 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
1556 typename
Bound1UnwrapTraits::ForwardType x1
=
1557 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1558 typename
Bound2UnwrapTraits::ForwardType x2
=
1559 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1560 typename
Bound3UnwrapTraits::ForwardType x3
=
1561 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1562 typename
Bound4UnwrapTraits::ForwardType x4
=
1563 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
1564 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1565 typename
StorageType::RunnableType
,
1566 void(typename
Bound1UnwrapTraits::ForwardType
,
1567 typename
Bound2UnwrapTraits::ForwardType
,
1568 typename
Bound3UnwrapTraits::ForwardType
,
1569 typename
Bound4UnwrapTraits::ForwardType
)>
1570 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1571 CallbackForward(x2
), CallbackForward(x3
),
1572 CallbackForward(x4
));
1577 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1578 typename X3
, typename X4
, typename X5
>
1579 struct Invoker
<0, StorageType
, R(X1
, X2
, X3
, X4
, X5
)> {
1580 typedef R(RunType
)(BindStateBase
*,
1581 typename CallbackParamTraits
<X1
>::ForwardType
,
1582 typename CallbackParamTraits
<X2
>::ForwardType
,
1583 typename CallbackParamTraits
<X3
>::ForwardType
,
1584 typename CallbackParamTraits
<X4
>::ForwardType
,
1585 typename CallbackParamTraits
<X5
>::ForwardType
);
1587 typedef R(UnboundRunType
)(X1
, X2
, X3
, X4
, X5
);
1589 static R
Run(BindStateBase
* base
,
1590 typename CallbackParamTraits
<X1
>::ForwardType x1
,
1591 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1592 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1593 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1594 typename CallbackParamTraits
<X5
>::ForwardType x5
) {
1595 StorageType
* storage
= static_cast<StorageType
*>(base
);
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.
1601 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1602 typename
StorageType::RunnableType
,
1603 void(typename CallbackParamTraits
<X1
>::ForwardType x1
,
1604 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1605 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1606 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1607 typename CallbackParamTraits
<X5
>::ForwardType x5
)>
1608 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1609 CallbackForward(x2
), CallbackForward(x3
),
1610 CallbackForward(x4
), CallbackForward(x5
));
1615 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1616 typename X3
, typename X4
, typename X5
>
1617 struct Invoker
<1, StorageType
, R(X1
, X2
, X3
, X4
, X5
)> {
1618 typedef R(RunType
)(BindStateBase
*,
1619 typename CallbackParamTraits
<X2
>::ForwardType
,
1620 typename CallbackParamTraits
<X3
>::ForwardType
,
1621 typename CallbackParamTraits
<X4
>::ForwardType
,
1622 typename CallbackParamTraits
<X5
>::ForwardType
);
1624 typedef R(UnboundRunType
)(X2
, X3
, X4
, X5
);
1626 static R
Run(BindStateBase
* base
,
1627 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1628 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1629 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1630 typename CallbackParamTraits
<X5
>::ForwardType x5
) {
1631 StorageType
* storage
= static_cast<StorageType
*>(base
);
1633 // Local references to make debugger stepping easier. If in a debugger,
1634 // you really want to warp ahead and step through the
1635 // InvokeHelper<>::MakeItSo() call below.
1636 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1638 typename
Bound1UnwrapTraits::ForwardType x1
=
1639 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1640 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1641 typename
StorageType::RunnableType
,
1642 void(typename
Bound1UnwrapTraits::ForwardType
,
1643 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1644 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1645 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1646 typename CallbackParamTraits
<X5
>::ForwardType x5
)>
1647 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1648 CallbackForward(x2
), CallbackForward(x3
),
1649 CallbackForward(x4
), CallbackForward(x5
));
1654 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1655 typename X3
, typename X4
, typename X5
>
1656 struct Invoker
<2, StorageType
, R(X1
, X2
, X3
, X4
, X5
)> {
1657 typedef R(RunType
)(BindStateBase
*,
1658 typename CallbackParamTraits
<X3
>::ForwardType
,
1659 typename CallbackParamTraits
<X4
>::ForwardType
,
1660 typename CallbackParamTraits
<X5
>::ForwardType
);
1662 typedef R(UnboundRunType
)(X3
, X4
, X5
);
1664 static R
Run(BindStateBase
* base
,
1665 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1666 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1667 typename CallbackParamTraits
<X5
>::ForwardType x5
) {
1668 StorageType
* storage
= static_cast<StorageType
*>(base
);
1670 // Local references to make debugger stepping easier. If in a debugger,
1671 // you really want to warp ahead and step through the
1672 // InvokeHelper<>::MakeItSo() call below.
1673 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1674 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1676 typename
Bound1UnwrapTraits::ForwardType x1
=
1677 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1678 typename
Bound2UnwrapTraits::ForwardType x2
=
1679 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1680 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1681 typename
StorageType::RunnableType
,
1682 void(typename
Bound1UnwrapTraits::ForwardType
,
1683 typename
Bound2UnwrapTraits::ForwardType
,
1684 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1685 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1686 typename CallbackParamTraits
<X5
>::ForwardType x5
)>
1687 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1688 CallbackForward(x2
), CallbackForward(x3
),
1689 CallbackForward(x4
), CallbackForward(x5
));
1694 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1695 typename X3
, typename X4
, typename X5
>
1696 struct Invoker
<3, StorageType
, R(X1
, X2
, X3
, X4
, X5
)> {
1697 typedef R(RunType
)(BindStateBase
*,
1698 typename CallbackParamTraits
<X4
>::ForwardType
,
1699 typename CallbackParamTraits
<X5
>::ForwardType
);
1701 typedef R(UnboundRunType
)(X4
, X5
);
1703 static R
Run(BindStateBase
* base
,
1704 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1705 typename CallbackParamTraits
<X5
>::ForwardType x5
) {
1706 StorageType
* storage
= static_cast<StorageType
*>(base
);
1708 // Local references to make debugger stepping easier. If in a debugger,
1709 // you really want to warp ahead and step through the
1710 // InvokeHelper<>::MakeItSo() call below.
1711 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1712 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1713 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1715 typename
Bound1UnwrapTraits::ForwardType x1
=
1716 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1717 typename
Bound2UnwrapTraits::ForwardType x2
=
1718 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1719 typename
Bound3UnwrapTraits::ForwardType x3
=
1720 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1721 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1722 typename
StorageType::RunnableType
,
1723 void(typename
Bound1UnwrapTraits::ForwardType
,
1724 typename
Bound2UnwrapTraits::ForwardType
,
1725 typename
Bound3UnwrapTraits::ForwardType
,
1726 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1727 typename CallbackParamTraits
<X5
>::ForwardType x5
)>
1728 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1729 CallbackForward(x2
), CallbackForward(x3
),
1730 CallbackForward(x4
), CallbackForward(x5
));
1735 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1736 typename X3
, typename X4
, typename X5
>
1737 struct Invoker
<4, StorageType
, R(X1
, X2
, X3
, X4
, X5
)> {
1738 typedef R(RunType
)(BindStateBase
*,
1739 typename CallbackParamTraits
<X5
>::ForwardType
);
1741 typedef R(UnboundRunType
)(X5
);
1743 static R
Run(BindStateBase
* base
,
1744 typename CallbackParamTraits
<X5
>::ForwardType x5
) {
1745 StorageType
* storage
= static_cast<StorageType
*>(base
);
1747 // Local references to make debugger stepping easier. If in a debugger,
1748 // you really want to warp ahead and step through the
1749 // InvokeHelper<>::MakeItSo() call below.
1750 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1751 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1752 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1753 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
1755 typename
Bound1UnwrapTraits::ForwardType x1
=
1756 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1757 typename
Bound2UnwrapTraits::ForwardType x2
=
1758 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1759 typename
Bound3UnwrapTraits::ForwardType x3
=
1760 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1761 typename
Bound4UnwrapTraits::ForwardType x4
=
1762 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
1763 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1764 typename
StorageType::RunnableType
,
1765 void(typename
Bound1UnwrapTraits::ForwardType
,
1766 typename
Bound2UnwrapTraits::ForwardType
,
1767 typename
Bound3UnwrapTraits::ForwardType
,
1768 typename
Bound4UnwrapTraits::ForwardType
,
1769 typename CallbackParamTraits
<X5
>::ForwardType x5
)>
1770 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1771 CallbackForward(x2
), CallbackForward(x3
),
1772 CallbackForward(x4
), CallbackForward(x5
));
1777 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1778 typename X3
, typename X4
, typename X5
>
1779 struct Invoker
<5, StorageType
, R(X1
, X2
, X3
, X4
, X5
)> {
1780 typedef R(RunType
)(BindStateBase
*);
1782 typedef R(UnboundRunType
)();
1784 static R
Run(BindStateBase
* base
) {
1785 StorageType
* storage
= static_cast<StorageType
*>(base
);
1787 // Local references to make debugger stepping easier. If in a debugger,
1788 // you really want to warp ahead and step through the
1789 // InvokeHelper<>::MakeItSo() call below.
1790 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1791 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1792 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1793 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
1794 typedef typename
StorageType::Bound5UnwrapTraits Bound5UnwrapTraits
;
1796 typename
Bound1UnwrapTraits::ForwardType x1
=
1797 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1798 typename
Bound2UnwrapTraits::ForwardType x2
=
1799 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1800 typename
Bound3UnwrapTraits::ForwardType x3
=
1801 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1802 typename
Bound4UnwrapTraits::ForwardType x4
=
1803 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
1804 typename
Bound5UnwrapTraits::ForwardType x5
=
1805 Bound5UnwrapTraits::Unwrap(storage
->p5_
);
1806 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1807 typename
StorageType::RunnableType
,
1808 void(typename
Bound1UnwrapTraits::ForwardType
,
1809 typename
Bound2UnwrapTraits::ForwardType
,
1810 typename
Bound3UnwrapTraits::ForwardType
,
1811 typename
Bound4UnwrapTraits::ForwardType
,
1812 typename
Bound5UnwrapTraits::ForwardType
)>
1813 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1814 CallbackForward(x2
), CallbackForward(x3
),
1815 CallbackForward(x4
), CallbackForward(x5
));
1820 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1821 typename X3
, typename X4
, typename X5
, typename X6
>
1822 struct Invoker
<0, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
1823 typedef R(RunType
)(BindStateBase
*,
1824 typename CallbackParamTraits
<X1
>::ForwardType
,
1825 typename CallbackParamTraits
<X2
>::ForwardType
,
1826 typename CallbackParamTraits
<X3
>::ForwardType
,
1827 typename CallbackParamTraits
<X4
>::ForwardType
,
1828 typename CallbackParamTraits
<X5
>::ForwardType
,
1829 typename CallbackParamTraits
<X6
>::ForwardType
);
1831 typedef R(UnboundRunType
)(X1
, X2
, X3
, X4
, X5
, X6
);
1833 static R
Run(BindStateBase
* base
,
1834 typename CallbackParamTraits
<X1
>::ForwardType x1
,
1835 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1836 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1837 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1838 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1839 typename CallbackParamTraits
<X6
>::ForwardType x6
) {
1840 StorageType
* storage
= static_cast<StorageType
*>(base
);
1842 // Local references to make debugger stepping easier. If in a debugger,
1843 // you really want to warp ahead and step through the
1844 // InvokeHelper<>::MakeItSo() call below.
1846 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1847 typename
StorageType::RunnableType
,
1848 void(typename CallbackParamTraits
<X1
>::ForwardType x1
,
1849 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1850 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1851 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1852 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1853 typename CallbackParamTraits
<X6
>::ForwardType x6
)>
1854 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1855 CallbackForward(x2
), CallbackForward(x3
),
1856 CallbackForward(x4
), CallbackForward(x5
),
1857 CallbackForward(x6
));
1862 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1863 typename X3
, typename X4
, typename X5
, typename X6
>
1864 struct Invoker
<1, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
1865 typedef R(RunType
)(BindStateBase
*,
1866 typename CallbackParamTraits
<X2
>::ForwardType
,
1867 typename CallbackParamTraits
<X3
>::ForwardType
,
1868 typename CallbackParamTraits
<X4
>::ForwardType
,
1869 typename CallbackParamTraits
<X5
>::ForwardType
,
1870 typename CallbackParamTraits
<X6
>::ForwardType
);
1872 typedef R(UnboundRunType
)(X2
, X3
, X4
, X5
, X6
);
1874 static R
Run(BindStateBase
* base
,
1875 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1876 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1877 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1878 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1879 typename CallbackParamTraits
<X6
>::ForwardType x6
) {
1880 StorageType
* storage
= static_cast<StorageType
*>(base
);
1882 // Local references to make debugger stepping easier. If in a debugger,
1883 // you really want to warp ahead and step through the
1884 // InvokeHelper<>::MakeItSo() call below.
1885 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1887 typename
Bound1UnwrapTraits::ForwardType x1
=
1888 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1889 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1890 typename
StorageType::RunnableType
,
1891 void(typename
Bound1UnwrapTraits::ForwardType
,
1892 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1893 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1894 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1895 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1896 typename CallbackParamTraits
<X6
>::ForwardType x6
)>
1897 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1898 CallbackForward(x2
), CallbackForward(x3
),
1899 CallbackForward(x4
), CallbackForward(x5
),
1900 CallbackForward(x6
));
1905 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1906 typename X3
, typename X4
, typename X5
, typename X6
>
1907 struct Invoker
<2, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
1908 typedef R(RunType
)(BindStateBase
*,
1909 typename CallbackParamTraits
<X3
>::ForwardType
,
1910 typename CallbackParamTraits
<X4
>::ForwardType
,
1911 typename CallbackParamTraits
<X5
>::ForwardType
,
1912 typename CallbackParamTraits
<X6
>::ForwardType
);
1914 typedef R(UnboundRunType
)(X3
, X4
, X5
, X6
);
1916 static R
Run(BindStateBase
* base
,
1917 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1918 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1919 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1920 typename CallbackParamTraits
<X6
>::ForwardType x6
) {
1921 StorageType
* storage
= static_cast<StorageType
*>(base
);
1923 // Local references to make debugger stepping easier. If in a debugger,
1924 // you really want to warp ahead and step through the
1925 // InvokeHelper<>::MakeItSo() call below.
1926 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1927 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1929 typename
Bound1UnwrapTraits::ForwardType x1
=
1930 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1931 typename
Bound2UnwrapTraits::ForwardType x2
=
1932 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1933 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1934 typename
StorageType::RunnableType
,
1935 void(typename
Bound1UnwrapTraits::ForwardType
,
1936 typename
Bound2UnwrapTraits::ForwardType
,
1937 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1938 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1939 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1940 typename CallbackParamTraits
<X6
>::ForwardType x6
)>
1941 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1942 CallbackForward(x2
), CallbackForward(x3
),
1943 CallbackForward(x4
), CallbackForward(x5
),
1944 CallbackForward(x6
));
1949 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1950 typename X3
, typename X4
, typename X5
, typename X6
>
1951 struct Invoker
<3, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
1952 typedef R(RunType
)(BindStateBase
*,
1953 typename CallbackParamTraits
<X4
>::ForwardType
,
1954 typename CallbackParamTraits
<X5
>::ForwardType
,
1955 typename CallbackParamTraits
<X6
>::ForwardType
);
1957 typedef R(UnboundRunType
)(X4
, X5
, X6
);
1959 static R
Run(BindStateBase
* base
,
1960 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1961 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1962 typename CallbackParamTraits
<X6
>::ForwardType x6
) {
1963 StorageType
* storage
= static_cast<StorageType
*>(base
);
1965 // Local references to make debugger stepping easier. If in a debugger,
1966 // you really want to warp ahead and step through the
1967 // InvokeHelper<>::MakeItSo() call below.
1968 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1969 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1970 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1972 typename
Bound1UnwrapTraits::ForwardType x1
=
1973 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1974 typename
Bound2UnwrapTraits::ForwardType x2
=
1975 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1976 typename
Bound3UnwrapTraits::ForwardType x3
=
1977 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1978 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1979 typename
StorageType::RunnableType
,
1980 void(typename
Bound1UnwrapTraits::ForwardType
,
1981 typename
Bound2UnwrapTraits::ForwardType
,
1982 typename
Bound3UnwrapTraits::ForwardType
,
1983 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1984 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1985 typename CallbackParamTraits
<X6
>::ForwardType x6
)>
1986 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1987 CallbackForward(x2
), CallbackForward(x3
),
1988 CallbackForward(x4
), CallbackForward(x5
),
1989 CallbackForward(x6
));
1994 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1995 typename X3
, typename X4
, typename X5
, typename X6
>
1996 struct Invoker
<4, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
1997 typedef R(RunType
)(BindStateBase
*,
1998 typename CallbackParamTraits
<X5
>::ForwardType
,
1999 typename CallbackParamTraits
<X6
>::ForwardType
);
2001 typedef R(UnboundRunType
)(X5
, X6
);
2003 static R
Run(BindStateBase
* base
,
2004 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2005 typename CallbackParamTraits
<X6
>::ForwardType x6
) {
2006 StorageType
* storage
= static_cast<StorageType
*>(base
);
2008 // Local references to make debugger stepping easier. If in a debugger,
2009 // you really want to warp ahead and step through the
2010 // InvokeHelper<>::MakeItSo() call below.
2011 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2012 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2013 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2014 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2016 typename
Bound1UnwrapTraits::ForwardType x1
=
2017 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2018 typename
Bound2UnwrapTraits::ForwardType x2
=
2019 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2020 typename
Bound3UnwrapTraits::ForwardType x3
=
2021 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2022 typename
Bound4UnwrapTraits::ForwardType x4
=
2023 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2024 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2025 typename
StorageType::RunnableType
,
2026 void(typename
Bound1UnwrapTraits::ForwardType
,
2027 typename
Bound2UnwrapTraits::ForwardType
,
2028 typename
Bound3UnwrapTraits::ForwardType
,
2029 typename
Bound4UnwrapTraits::ForwardType
,
2030 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2031 typename CallbackParamTraits
<X6
>::ForwardType x6
)>
2032 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2033 CallbackForward(x2
), CallbackForward(x3
),
2034 CallbackForward(x4
), CallbackForward(x5
),
2035 CallbackForward(x6
));
2040 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2041 typename X3
, typename X4
, typename X5
, typename X6
>
2042 struct Invoker
<5, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
2043 typedef R(RunType
)(BindStateBase
*,
2044 typename CallbackParamTraits
<X6
>::ForwardType
);
2046 typedef R(UnboundRunType
)(X6
);
2048 static R
Run(BindStateBase
* base
,
2049 typename CallbackParamTraits
<X6
>::ForwardType x6
) {
2050 StorageType
* storage
= static_cast<StorageType
*>(base
);
2052 // Local references to make debugger stepping easier. If in a debugger,
2053 // you really want to warp ahead and step through the
2054 // InvokeHelper<>::MakeItSo() call below.
2055 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2056 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2057 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2058 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2059 typedef typename
StorageType::Bound5UnwrapTraits Bound5UnwrapTraits
;
2061 typename
Bound1UnwrapTraits::ForwardType x1
=
2062 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2063 typename
Bound2UnwrapTraits::ForwardType x2
=
2064 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2065 typename
Bound3UnwrapTraits::ForwardType x3
=
2066 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2067 typename
Bound4UnwrapTraits::ForwardType x4
=
2068 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2069 typename
Bound5UnwrapTraits::ForwardType x5
=
2070 Bound5UnwrapTraits::Unwrap(storage
->p5_
);
2071 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2072 typename
StorageType::RunnableType
,
2073 void(typename
Bound1UnwrapTraits::ForwardType
,
2074 typename
Bound2UnwrapTraits::ForwardType
,
2075 typename
Bound3UnwrapTraits::ForwardType
,
2076 typename
Bound4UnwrapTraits::ForwardType
,
2077 typename
Bound5UnwrapTraits::ForwardType
,
2078 typename CallbackParamTraits
<X6
>::ForwardType x6
)>
2079 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2080 CallbackForward(x2
), CallbackForward(x3
),
2081 CallbackForward(x4
), CallbackForward(x5
),
2082 CallbackForward(x6
));
2087 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2088 typename X3
, typename X4
, typename X5
, typename X6
>
2089 struct Invoker
<6, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
2090 typedef R(RunType
)(BindStateBase
*);
2092 typedef R(UnboundRunType
)();
2094 static R
Run(BindStateBase
* base
) {
2095 StorageType
* storage
= static_cast<StorageType
*>(base
);
2097 // Local references to make debugger stepping easier. If in a debugger,
2098 // you really want to warp ahead and step through the
2099 // InvokeHelper<>::MakeItSo() call below.
2100 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2101 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2102 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2103 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2104 typedef typename
StorageType::Bound5UnwrapTraits Bound5UnwrapTraits
;
2105 typedef typename
StorageType::Bound6UnwrapTraits Bound6UnwrapTraits
;
2107 typename
Bound1UnwrapTraits::ForwardType x1
=
2108 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2109 typename
Bound2UnwrapTraits::ForwardType x2
=
2110 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2111 typename
Bound3UnwrapTraits::ForwardType x3
=
2112 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2113 typename
Bound4UnwrapTraits::ForwardType x4
=
2114 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2115 typename
Bound5UnwrapTraits::ForwardType x5
=
2116 Bound5UnwrapTraits::Unwrap(storage
->p5_
);
2117 typename
Bound6UnwrapTraits::ForwardType x6
=
2118 Bound6UnwrapTraits::Unwrap(storage
->p6_
);
2119 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2120 typename
StorageType::RunnableType
,
2121 void(typename
Bound1UnwrapTraits::ForwardType
,
2122 typename
Bound2UnwrapTraits::ForwardType
,
2123 typename
Bound3UnwrapTraits::ForwardType
,
2124 typename
Bound4UnwrapTraits::ForwardType
,
2125 typename
Bound5UnwrapTraits::ForwardType
,
2126 typename
Bound6UnwrapTraits::ForwardType
)>
2127 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2128 CallbackForward(x2
), CallbackForward(x3
),
2129 CallbackForward(x4
), CallbackForward(x5
),
2130 CallbackForward(x6
));
2135 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2136 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2137 struct Invoker
<0, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2138 typedef R(RunType
)(BindStateBase
*,
2139 typename CallbackParamTraits
<X1
>::ForwardType
,
2140 typename CallbackParamTraits
<X2
>::ForwardType
,
2141 typename CallbackParamTraits
<X3
>::ForwardType
,
2142 typename CallbackParamTraits
<X4
>::ForwardType
,
2143 typename CallbackParamTraits
<X5
>::ForwardType
,
2144 typename CallbackParamTraits
<X6
>::ForwardType
,
2145 typename CallbackParamTraits
<X7
>::ForwardType
);
2147 typedef R(UnboundRunType
)(X1
, X2
, X3
, X4
, X5
, X6
, X7
);
2149 static R
Run(BindStateBase
* base
,
2150 typename CallbackParamTraits
<X1
>::ForwardType x1
,
2151 typename CallbackParamTraits
<X2
>::ForwardType x2
,
2152 typename CallbackParamTraits
<X3
>::ForwardType x3
,
2153 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2154 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2155 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2156 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2157 StorageType
* storage
= static_cast<StorageType
*>(base
);
2159 // Local references to make debugger stepping easier. If in a debugger,
2160 // you really want to warp ahead and step through the
2161 // InvokeHelper<>::MakeItSo() call below.
2163 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2164 typename
StorageType::RunnableType
,
2165 void(typename CallbackParamTraits
<X1
>::ForwardType x1
,
2166 typename CallbackParamTraits
<X2
>::ForwardType x2
,
2167 typename CallbackParamTraits
<X3
>::ForwardType x3
,
2168 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2169 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2170 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2171 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2172 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2173 CallbackForward(x2
), CallbackForward(x3
),
2174 CallbackForward(x4
), CallbackForward(x5
),
2175 CallbackForward(x6
), CallbackForward(x7
));
2180 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2181 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2182 struct Invoker
<1, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2183 typedef R(RunType
)(BindStateBase
*,
2184 typename CallbackParamTraits
<X2
>::ForwardType
,
2185 typename CallbackParamTraits
<X3
>::ForwardType
,
2186 typename CallbackParamTraits
<X4
>::ForwardType
,
2187 typename CallbackParamTraits
<X5
>::ForwardType
,
2188 typename CallbackParamTraits
<X6
>::ForwardType
,
2189 typename CallbackParamTraits
<X7
>::ForwardType
);
2191 typedef R(UnboundRunType
)(X2
, X3
, X4
, X5
, X6
, X7
);
2193 static R
Run(BindStateBase
* base
,
2194 typename CallbackParamTraits
<X2
>::ForwardType x2
,
2195 typename CallbackParamTraits
<X3
>::ForwardType x3
,
2196 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2197 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2198 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2199 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2200 StorageType
* storage
= static_cast<StorageType
*>(base
);
2202 // Local references to make debugger stepping easier. If in a debugger,
2203 // you really want to warp ahead and step through the
2204 // InvokeHelper<>::MakeItSo() call below.
2205 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2207 typename
Bound1UnwrapTraits::ForwardType x1
=
2208 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2209 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2210 typename
StorageType::RunnableType
,
2211 void(typename
Bound1UnwrapTraits::ForwardType
,
2212 typename CallbackParamTraits
<X2
>::ForwardType x2
,
2213 typename CallbackParamTraits
<X3
>::ForwardType x3
,
2214 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2215 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2216 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2217 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2218 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2219 CallbackForward(x2
), CallbackForward(x3
),
2220 CallbackForward(x4
), CallbackForward(x5
),
2221 CallbackForward(x6
), CallbackForward(x7
));
2226 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2227 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2228 struct Invoker
<2, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2229 typedef R(RunType
)(BindStateBase
*,
2230 typename CallbackParamTraits
<X3
>::ForwardType
,
2231 typename CallbackParamTraits
<X4
>::ForwardType
,
2232 typename CallbackParamTraits
<X5
>::ForwardType
,
2233 typename CallbackParamTraits
<X6
>::ForwardType
,
2234 typename CallbackParamTraits
<X7
>::ForwardType
);
2236 typedef R(UnboundRunType
)(X3
, X4
, X5
, X6
, X7
);
2238 static R
Run(BindStateBase
* base
,
2239 typename CallbackParamTraits
<X3
>::ForwardType x3
,
2240 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2241 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2242 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2243 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2244 StorageType
* storage
= static_cast<StorageType
*>(base
);
2246 // Local references to make debugger stepping easier. If in a debugger,
2247 // you really want to warp ahead and step through the
2248 // InvokeHelper<>::MakeItSo() call below.
2249 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2250 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2252 typename
Bound1UnwrapTraits::ForwardType x1
=
2253 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2254 typename
Bound2UnwrapTraits::ForwardType x2
=
2255 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2256 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2257 typename
StorageType::RunnableType
,
2258 void(typename
Bound1UnwrapTraits::ForwardType
,
2259 typename
Bound2UnwrapTraits::ForwardType
,
2260 typename CallbackParamTraits
<X3
>::ForwardType x3
,
2261 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2262 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2263 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2264 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2265 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2266 CallbackForward(x2
), CallbackForward(x3
),
2267 CallbackForward(x4
), CallbackForward(x5
),
2268 CallbackForward(x6
), CallbackForward(x7
));
2273 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2274 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2275 struct Invoker
<3, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2276 typedef R(RunType
)(BindStateBase
*,
2277 typename CallbackParamTraits
<X4
>::ForwardType
,
2278 typename CallbackParamTraits
<X5
>::ForwardType
,
2279 typename CallbackParamTraits
<X6
>::ForwardType
,
2280 typename CallbackParamTraits
<X7
>::ForwardType
);
2282 typedef R(UnboundRunType
)(X4
, X5
, X6
, X7
);
2284 static R
Run(BindStateBase
* base
,
2285 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2286 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2287 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2288 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2289 StorageType
* storage
= static_cast<StorageType
*>(base
);
2291 // Local references to make debugger stepping easier. If in a debugger,
2292 // you really want to warp ahead and step through the
2293 // InvokeHelper<>::MakeItSo() call below.
2294 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2295 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2296 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2298 typename
Bound1UnwrapTraits::ForwardType x1
=
2299 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2300 typename
Bound2UnwrapTraits::ForwardType x2
=
2301 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2302 typename
Bound3UnwrapTraits::ForwardType x3
=
2303 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2304 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2305 typename
StorageType::RunnableType
,
2306 void(typename
Bound1UnwrapTraits::ForwardType
,
2307 typename
Bound2UnwrapTraits::ForwardType
,
2308 typename
Bound3UnwrapTraits::ForwardType
,
2309 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2310 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2311 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2312 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2313 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2314 CallbackForward(x2
), CallbackForward(x3
),
2315 CallbackForward(x4
), CallbackForward(x5
),
2316 CallbackForward(x6
), CallbackForward(x7
));
2321 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2322 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2323 struct Invoker
<4, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2324 typedef R(RunType
)(BindStateBase
*,
2325 typename CallbackParamTraits
<X5
>::ForwardType
,
2326 typename CallbackParamTraits
<X6
>::ForwardType
,
2327 typename CallbackParamTraits
<X7
>::ForwardType
);
2329 typedef R(UnboundRunType
)(X5
, X6
, X7
);
2331 static R
Run(BindStateBase
* base
,
2332 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2333 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2334 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2335 StorageType
* storage
= static_cast<StorageType
*>(base
);
2337 // Local references to make debugger stepping easier. If in a debugger,
2338 // you really want to warp ahead and step through the
2339 // InvokeHelper<>::MakeItSo() call below.
2340 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2341 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2342 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2343 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2345 typename
Bound1UnwrapTraits::ForwardType x1
=
2346 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2347 typename
Bound2UnwrapTraits::ForwardType x2
=
2348 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2349 typename
Bound3UnwrapTraits::ForwardType x3
=
2350 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2351 typename
Bound4UnwrapTraits::ForwardType x4
=
2352 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2353 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2354 typename
StorageType::RunnableType
,
2355 void(typename
Bound1UnwrapTraits::ForwardType
,
2356 typename
Bound2UnwrapTraits::ForwardType
,
2357 typename
Bound3UnwrapTraits::ForwardType
,
2358 typename
Bound4UnwrapTraits::ForwardType
,
2359 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2360 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2361 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2362 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2363 CallbackForward(x2
), CallbackForward(x3
),
2364 CallbackForward(x4
), CallbackForward(x5
),
2365 CallbackForward(x6
), CallbackForward(x7
));
2370 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2371 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2372 struct Invoker
<5, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2373 typedef R(RunType
)(BindStateBase
*,
2374 typename CallbackParamTraits
<X6
>::ForwardType
,
2375 typename CallbackParamTraits
<X7
>::ForwardType
);
2377 typedef R(UnboundRunType
)(X6
, X7
);
2379 static R
Run(BindStateBase
* base
,
2380 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2381 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2382 StorageType
* storage
= static_cast<StorageType
*>(base
);
2384 // Local references to make debugger stepping easier. If in a debugger,
2385 // you really want to warp ahead and step through the
2386 // InvokeHelper<>::MakeItSo() call below.
2387 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2388 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2389 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2390 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2391 typedef typename
StorageType::Bound5UnwrapTraits Bound5UnwrapTraits
;
2393 typename
Bound1UnwrapTraits::ForwardType x1
=
2394 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2395 typename
Bound2UnwrapTraits::ForwardType x2
=
2396 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2397 typename
Bound3UnwrapTraits::ForwardType x3
=
2398 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2399 typename
Bound4UnwrapTraits::ForwardType x4
=
2400 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2401 typename
Bound5UnwrapTraits::ForwardType x5
=
2402 Bound5UnwrapTraits::Unwrap(storage
->p5_
);
2403 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2404 typename
StorageType::RunnableType
,
2405 void(typename
Bound1UnwrapTraits::ForwardType
,
2406 typename
Bound2UnwrapTraits::ForwardType
,
2407 typename
Bound3UnwrapTraits::ForwardType
,
2408 typename
Bound4UnwrapTraits::ForwardType
,
2409 typename
Bound5UnwrapTraits::ForwardType
,
2410 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2411 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2412 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2413 CallbackForward(x2
), CallbackForward(x3
),
2414 CallbackForward(x4
), CallbackForward(x5
),
2415 CallbackForward(x6
), CallbackForward(x7
));
2420 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2421 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2422 struct Invoker
<6, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2423 typedef R(RunType
)(BindStateBase
*,
2424 typename CallbackParamTraits
<X7
>::ForwardType
);
2426 typedef R(UnboundRunType
)(X7
);
2428 static R
Run(BindStateBase
* base
,
2429 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2430 StorageType
* storage
= static_cast<StorageType
*>(base
);
2432 // Local references to make debugger stepping easier. If in a debugger,
2433 // you really want to warp ahead and step through the
2434 // InvokeHelper<>::MakeItSo() call below.
2435 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2436 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2437 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2438 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2439 typedef typename
StorageType::Bound5UnwrapTraits Bound5UnwrapTraits
;
2440 typedef typename
StorageType::Bound6UnwrapTraits Bound6UnwrapTraits
;
2442 typename
Bound1UnwrapTraits::ForwardType x1
=
2443 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2444 typename
Bound2UnwrapTraits::ForwardType x2
=
2445 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2446 typename
Bound3UnwrapTraits::ForwardType x3
=
2447 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2448 typename
Bound4UnwrapTraits::ForwardType x4
=
2449 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2450 typename
Bound5UnwrapTraits::ForwardType x5
=
2451 Bound5UnwrapTraits::Unwrap(storage
->p5_
);
2452 typename
Bound6UnwrapTraits::ForwardType x6
=
2453 Bound6UnwrapTraits::Unwrap(storage
->p6_
);
2454 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2455 typename
StorageType::RunnableType
,
2456 void(typename
Bound1UnwrapTraits::ForwardType
,
2457 typename
Bound2UnwrapTraits::ForwardType
,
2458 typename
Bound3UnwrapTraits::ForwardType
,
2459 typename
Bound4UnwrapTraits::ForwardType
,
2460 typename
Bound5UnwrapTraits::ForwardType
,
2461 typename
Bound6UnwrapTraits::ForwardType
,
2462 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2463 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2464 CallbackForward(x2
), CallbackForward(x3
),
2465 CallbackForward(x4
), CallbackForward(x5
),
2466 CallbackForward(x6
), CallbackForward(x7
));
2471 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2472 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2473 struct Invoker
<7, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2474 typedef R(RunType
)(BindStateBase
*);
2476 typedef R(UnboundRunType
)();
2478 static R
Run(BindStateBase
* base
) {
2479 StorageType
* storage
= static_cast<StorageType
*>(base
);
2481 // Local references to make debugger stepping easier. If in a debugger,
2482 // you really want to warp ahead and step through the
2483 // InvokeHelper<>::MakeItSo() call below.
2484 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2485 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2486 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2487 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2488 typedef typename
StorageType::Bound5UnwrapTraits Bound5UnwrapTraits
;
2489 typedef typename
StorageType::Bound6UnwrapTraits Bound6UnwrapTraits
;
2490 typedef typename
StorageType::Bound7UnwrapTraits Bound7UnwrapTraits
;
2492 typename
Bound1UnwrapTraits::ForwardType x1
=
2493 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2494 typename
Bound2UnwrapTraits::ForwardType x2
=
2495 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2496 typename
Bound3UnwrapTraits::ForwardType x3
=
2497 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2498 typename
Bound4UnwrapTraits::ForwardType x4
=
2499 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2500 typename
Bound5UnwrapTraits::ForwardType x5
=
2501 Bound5UnwrapTraits::Unwrap(storage
->p5_
);
2502 typename
Bound6UnwrapTraits::ForwardType x6
=
2503 Bound6UnwrapTraits::Unwrap(storage
->p6_
);
2504 typename
Bound7UnwrapTraits::ForwardType x7
=
2505 Bound7UnwrapTraits::Unwrap(storage
->p7_
);
2506 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2507 typename
StorageType::RunnableType
,
2508 void(typename
Bound1UnwrapTraits::ForwardType
,
2509 typename
Bound2UnwrapTraits::ForwardType
,
2510 typename
Bound3UnwrapTraits::ForwardType
,
2511 typename
Bound4UnwrapTraits::ForwardType
,
2512 typename
Bound5UnwrapTraits::ForwardType
,
2513 typename
Bound6UnwrapTraits::ForwardType
,
2514 typename
Bound7UnwrapTraits::ForwardType
)>
2515 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2516 CallbackForward(x2
), CallbackForward(x3
),
2517 CallbackForward(x4
), CallbackForward(x5
),
2518 CallbackForward(x6
), CallbackForward(x7
));
2525 // This stores all the state passed into Bind() and is also where most
2526 // of the template resolution magic occurs.
2528 // Runnable is the functor we are binding arguments to.
2529 // RunType is type of the Run() function that the Invoker<> should use.
2530 // Normally, this is the same as the RunType of the Runnable, but it can
2531 // be different if an adapter like IgnoreResult() has been used.
2533 // BoundArgsType contains the storage type for all the bound arguments by
2534 // (ab)using a function type.
2535 template <typename Runnable
, typename RunType
, typename BoundArgsType
>
2538 template <typename Runnable
, typename RunType
>
2539 struct BindState
<Runnable
, RunType
, void()> : public BindStateBase
{
2540 typedef Runnable RunnableType
;
2541 typedef false_type IsWeakCall
;
2542 typedef Invoker
<0, BindState
, RunType
> InvokerType
;
2543 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2544 explicit BindState(const Runnable
& runnable
)
2545 : runnable_(runnable
) {
2548 virtual ~BindState() { }
2550 RunnableType runnable_
;
2553 template <typename Runnable
, typename RunType
, typename P1
>
2554 struct BindState
<Runnable
, RunType
, void(P1
)> : public BindStateBase
{
2555 typedef Runnable RunnableType
;
2556 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2557 typedef Invoker
<1, BindState
, RunType
> InvokerType
;
2558 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2560 // Convenience typedefs for bound argument types.
2561 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2563 BindState(const Runnable
& runnable
, const P1
& p1
)
2564 : runnable_(runnable
),
2566 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2569 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2570 P1
>::Release(p1_
); }
2572 RunnableType runnable_
;
2576 template <typename Runnable
, typename RunType
, typename P1
, typename P2
>
2577 struct BindState
<Runnable
, RunType
, void(P1
, P2
)> : public BindStateBase
{
2578 typedef Runnable RunnableType
;
2579 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2580 typedef Invoker
<2, BindState
, RunType
> InvokerType
;
2581 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2583 // Convenience typedefs for bound argument types.
2584 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2585 typedef UnwrapTraits
<P2
> Bound2UnwrapTraits
;
2587 BindState(const Runnable
& runnable
, const P1
& p1
, const P2
& p2
)
2588 : runnable_(runnable
),
2591 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2594 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2595 P1
>::Release(p1_
); }
2597 RunnableType runnable_
;
2602 template <typename Runnable
, typename RunType
, typename P1
, typename P2
,
2604 struct BindState
<Runnable
, RunType
, void(P1
, P2
, P3
)> : public BindStateBase
{
2605 typedef Runnable RunnableType
;
2606 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2607 typedef Invoker
<3, BindState
, RunType
> InvokerType
;
2608 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2610 // Convenience typedefs for bound argument types.
2611 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2612 typedef UnwrapTraits
<P2
> Bound2UnwrapTraits
;
2613 typedef UnwrapTraits
<P3
> Bound3UnwrapTraits
;
2615 BindState(const Runnable
& runnable
, const P1
& p1
, const P2
& p2
, const P3
& p3
)
2616 : runnable_(runnable
),
2620 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2623 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2624 P1
>::Release(p1_
); }
2626 RunnableType runnable_
;
2632 template <typename Runnable
, typename RunType
, typename P1
, typename P2
,
2633 typename P3
, typename P4
>
2634 struct BindState
<Runnable
, RunType
, void(P1
, P2
, P3
,
2635 P4
)> : public BindStateBase
{
2636 typedef Runnable RunnableType
;
2637 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2638 typedef Invoker
<4, BindState
, RunType
> InvokerType
;
2639 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2641 // Convenience typedefs for bound argument types.
2642 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2643 typedef UnwrapTraits
<P2
> Bound2UnwrapTraits
;
2644 typedef UnwrapTraits
<P3
> Bound3UnwrapTraits
;
2645 typedef UnwrapTraits
<P4
> Bound4UnwrapTraits
;
2647 BindState(const Runnable
& runnable
, const P1
& p1
, const P2
& p2
, const P3
& p3
,
2649 : runnable_(runnable
),
2654 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2657 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2658 P1
>::Release(p1_
); }
2660 RunnableType runnable_
;
2667 template <typename Runnable
, typename RunType
, typename P1
, typename P2
,
2668 typename P3
, typename P4
, typename P5
>
2669 struct BindState
<Runnable
, RunType
, void(P1
, P2
, P3
, P4
,
2670 P5
)> : public BindStateBase
{
2671 typedef Runnable RunnableType
;
2672 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2673 typedef Invoker
<5, BindState
, RunType
> InvokerType
;
2674 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2676 // Convenience typedefs for bound argument types.
2677 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2678 typedef UnwrapTraits
<P2
> Bound2UnwrapTraits
;
2679 typedef UnwrapTraits
<P3
> Bound3UnwrapTraits
;
2680 typedef UnwrapTraits
<P4
> Bound4UnwrapTraits
;
2681 typedef UnwrapTraits
<P5
> Bound5UnwrapTraits
;
2683 BindState(const Runnable
& runnable
, const P1
& p1
, const P2
& p2
, const P3
& p3
,
2684 const P4
& p4
, const P5
& p5
)
2685 : runnable_(runnable
),
2691 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2694 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2695 P1
>::Release(p1_
); }
2697 RunnableType runnable_
;
2705 template <typename Runnable
, typename RunType
, typename P1
, typename P2
,
2706 typename P3
, typename P4
, typename P5
, typename P6
>
2707 struct BindState
<Runnable
, RunType
, void(P1
, P2
, P3
, P4
, P5
,
2708 P6
)> : public BindStateBase
{
2709 typedef Runnable RunnableType
;
2710 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2711 typedef Invoker
<6, BindState
, RunType
> InvokerType
;
2712 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2714 // Convenience typedefs for bound argument types.
2715 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2716 typedef UnwrapTraits
<P2
> Bound2UnwrapTraits
;
2717 typedef UnwrapTraits
<P3
> Bound3UnwrapTraits
;
2718 typedef UnwrapTraits
<P4
> Bound4UnwrapTraits
;
2719 typedef UnwrapTraits
<P5
> Bound5UnwrapTraits
;
2720 typedef UnwrapTraits
<P6
> Bound6UnwrapTraits
;
2722 BindState(const Runnable
& runnable
, const P1
& p1
, const P2
& p2
, const P3
& p3
,
2723 const P4
& p4
, const P5
& p5
, const P6
& p6
)
2724 : runnable_(runnable
),
2731 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2734 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2735 P1
>::Release(p1_
); }
2737 RunnableType runnable_
;
2746 template <typename Runnable
, typename RunType
, typename P1
, typename P2
,
2747 typename P3
, typename P4
, typename P5
, typename P6
, typename P7
>
2748 struct BindState
<Runnable
, RunType
, void(P1
, P2
, P3
, P4
, P5
, P6
,
2749 P7
)> : public BindStateBase
{
2750 typedef Runnable RunnableType
;
2751 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2752 typedef Invoker
<7, BindState
, RunType
> InvokerType
;
2753 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2755 // Convenience typedefs for bound argument types.
2756 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2757 typedef UnwrapTraits
<P2
> Bound2UnwrapTraits
;
2758 typedef UnwrapTraits
<P3
> Bound3UnwrapTraits
;
2759 typedef UnwrapTraits
<P4
> Bound4UnwrapTraits
;
2760 typedef UnwrapTraits
<P5
> Bound5UnwrapTraits
;
2761 typedef UnwrapTraits
<P6
> Bound6UnwrapTraits
;
2762 typedef UnwrapTraits
<P7
> Bound7UnwrapTraits
;
2764 BindState(const Runnable
& runnable
, const P1
& p1
, const P2
& p2
, const P3
& p3
,
2765 const P4
& p4
, const P5
& p5
, const P6
& p6
, const P7
& p7
)
2766 : runnable_(runnable
),
2774 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2777 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2778 P1
>::Release(p1_
); }
2780 RunnableType runnable_
;
2790 } // namespace internal
2793 #endif // BASE_BIND_INTERNAL_H_