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
) {
823 // There are 3 logical InvokeHelper<> specializations: normal, void-return,
826 // The normal type just calls the underlying runnable.
828 // We need a InvokeHelper to handle void return types in order to support
829 // IgnoreResult(). Normally, if the Runnable's RunType had a void return,
830 // the template system would just accept "return functor.Run()" ignoring
831 // the fact that a void function is being used with return. This piece of
832 // sugar breaks though when the Runnable's RunType is not void. Thus, we
833 // need a partial specialization to change the syntax to drop the "return"
834 // from the invocation call.
836 // WeakCalls similarly need special syntax that is applied to the first
837 // argument to check if they should no-op themselves.
838 template <bool IsWeakCall
, typename ReturnType
, typename Runnable
,
842 template <typename ReturnType
, typename Runnable
>
843 struct InvokeHelper
<false, ReturnType
, Runnable
,
845 static ReturnType
MakeItSo(Runnable runnable
) {
846 return runnable
.Run();
850 template <typename Runnable
>
851 struct InvokeHelper
<false, void, Runnable
,
853 static void MakeItSo(Runnable runnable
) {
858 template <typename ReturnType
, typename Runnable
,typename A1
>
859 struct InvokeHelper
<false, ReturnType
, Runnable
,
861 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
) {
862 return runnable
.Run(CallbackForward(a1
));
866 template <typename Runnable
,typename A1
>
867 struct InvokeHelper
<false, void, Runnable
,
869 static void MakeItSo(Runnable runnable
, A1 a1
) {
870 runnable
.Run(CallbackForward(a1
));
874 template <typename Runnable
, typename A1
>
875 struct InvokeHelper
<true, void, Runnable
,
877 static void MakeItSo(Runnable runnable
, A1 a1
) {
882 runnable
.Run(CallbackForward(a1
));
886 template <typename ReturnType
, typename Runnable
,typename A1
, typename A2
>
887 struct InvokeHelper
<false, ReturnType
, Runnable
,
889 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
, A2 a2
) {
890 return runnable
.Run(CallbackForward(a1
), CallbackForward(a2
));
894 template <typename Runnable
,typename A1
, typename A2
>
895 struct InvokeHelper
<false, void, Runnable
,
897 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
) {
898 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
));
902 template <typename Runnable
, typename A1
, typename A2
>
903 struct InvokeHelper
<true, void, Runnable
,
905 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
) {
910 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
));
914 template <typename ReturnType
, typename Runnable
,typename A1
, typename A2
,
916 struct InvokeHelper
<false, ReturnType
, Runnable
,
918 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
) {
919 return runnable
.Run(CallbackForward(a1
), CallbackForward(a2
),
920 CallbackForward(a3
));
924 template <typename Runnable
,typename A1
, typename A2
, typename A3
>
925 struct InvokeHelper
<false, void, Runnable
,
927 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
) {
928 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
));
932 template <typename Runnable
, typename A1
, typename A2
, typename A3
>
933 struct InvokeHelper
<true, void, Runnable
,
935 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
) {
940 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
));
944 template <typename ReturnType
, typename Runnable
,typename A1
, typename A2
,
945 typename A3
, typename A4
>
946 struct InvokeHelper
<false, ReturnType
, Runnable
,
947 void(A1
, A2
, A3
, A4
)> {
948 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
) {
949 return runnable
.Run(CallbackForward(a1
), CallbackForward(a2
),
950 CallbackForward(a3
), CallbackForward(a4
));
954 template <typename Runnable
,typename A1
, typename A2
, typename A3
, typename A4
>
955 struct InvokeHelper
<false, void, Runnable
,
956 void(A1
, A2
, A3
, A4
)> {
957 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
) {
958 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
959 CallbackForward(a4
));
963 template <typename Runnable
, typename A1
, typename A2
, typename A3
, typename A4
>
964 struct InvokeHelper
<true, void, Runnable
,
965 void(A1
, A2
, A3
, A4
)> {
966 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
) {
971 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
972 CallbackForward(a4
));
976 template <typename ReturnType
, typename Runnable
,typename A1
, typename A2
,
977 typename A3
, typename A4
, typename A5
>
978 struct InvokeHelper
<false, ReturnType
, Runnable
,
979 void(A1
, A2
, A3
, A4
, A5
)> {
980 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
,
982 return runnable
.Run(CallbackForward(a1
), CallbackForward(a2
),
983 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
));
987 template <typename Runnable
,typename A1
, typename A2
, typename A3
, typename A4
,
989 struct InvokeHelper
<false, void, Runnable
,
990 void(A1
, A2
, A3
, A4
, A5
)> {
991 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
, A5 a5
) {
992 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
993 CallbackForward(a4
), CallbackForward(a5
));
997 template <typename Runnable
, typename A1
, typename A2
, typename A3
,
998 typename A4
, typename A5
>
999 struct InvokeHelper
<true, void, Runnable
,
1000 void(A1
, A2
, A3
, A4
, A5
)> {
1001 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
, A5 a5
) {
1006 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
1007 CallbackForward(a4
), CallbackForward(a5
));
1011 template <typename ReturnType
, typename Runnable
,typename A1
, typename A2
,
1012 typename A3
, typename A4
, typename A5
, typename A6
>
1013 struct InvokeHelper
<false, ReturnType
, Runnable
,
1014 void(A1
, A2
, A3
, A4
, A5
, A6
)> {
1015 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
,
1017 return runnable
.Run(CallbackForward(a1
), CallbackForward(a2
),
1018 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
),
1019 CallbackForward(a6
));
1023 template <typename Runnable
,typename A1
, typename A2
, typename A3
, typename A4
,
1024 typename A5
, typename A6
>
1025 struct InvokeHelper
<false, void, Runnable
,
1026 void(A1
, A2
, A3
, A4
, A5
, A6
)> {
1027 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
, A5 a5
,
1029 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
1030 CallbackForward(a4
), CallbackForward(a5
), CallbackForward(a6
));
1034 template <typename Runnable
, typename A1
, typename A2
, typename A3
,
1035 typename A4
, typename A5
, typename A6
>
1036 struct InvokeHelper
<true, void, Runnable
,
1037 void(A1
, A2
, A3
, A4
, A5
, A6
)> {
1038 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
, A5 a5
,
1044 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
1045 CallbackForward(a4
), CallbackForward(a5
), CallbackForward(a6
));
1049 template <typename ReturnType
, typename Runnable
,typename A1
, typename A2
,
1050 typename A3
, typename A4
, typename A5
, typename A6
, typename A7
>
1051 struct InvokeHelper
<false, ReturnType
, Runnable
,
1052 void(A1
, A2
, A3
, A4
, A5
, A6
, A7
)> {
1053 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
,
1054 A5 a5
, A6 a6
, A7 a7
) {
1055 return runnable
.Run(CallbackForward(a1
), CallbackForward(a2
),
1056 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
),
1057 CallbackForward(a6
), CallbackForward(a7
));
1061 template <typename Runnable
,typename A1
, typename A2
, typename A3
, typename A4
,
1062 typename A5
, typename A6
, typename A7
>
1063 struct InvokeHelper
<false, void, Runnable
,
1064 void(A1
, A2
, A3
, A4
, A5
, A6
, A7
)> {
1065 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
, A5 a5
,
1067 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
1068 CallbackForward(a4
), CallbackForward(a5
), CallbackForward(a6
),
1069 CallbackForward(a7
));
1073 template <typename Runnable
, typename A1
, typename A2
, typename A3
,
1074 typename A4
, typename A5
, typename A6
, typename A7
>
1075 struct InvokeHelper
<true, void, Runnable
,
1076 void(A1
, A2
, A3
, A4
, A5
, A6
, A7
)> {
1077 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
, A5 a5
,
1083 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
1084 CallbackForward(a4
), CallbackForward(a5
), CallbackForward(a6
),
1085 CallbackForward(a7
));
1089 #if !defined(_MSC_VER)
1091 template <typename ReturnType
, typename Runnable
, typename ArgsType
>
1092 struct InvokeHelper
<true, ReturnType
, Runnable
, ArgsType
> {
1093 // WeakCalls are only supported for functions with a void return type.
1094 // Otherwise, the function result would be undefined if the the WeakPtr<>
1096 COMPILE_ASSERT(is_void
<ReturnType
>::value
,
1097 weak_ptrs_can_only_bind_to_methods_without_return_values
);
1104 // See description at the top of the file.
1105 template <int NumBound
, typename Storage
, typename RunType
>
1109 template <typename StorageType
, typename R
>
1110 struct Invoker
<0, StorageType
, R()> {
1111 typedef R(RunType
)(BindStateBase
*);
1113 typedef R(UnboundRunType
)();
1115 static R
Run(BindStateBase
* base
) {
1116 StorageType
* storage
= static_cast<StorageType
*>(base
);
1118 // Local references to make debugger stepping easier. If in a debugger,
1119 // you really want to warp ahead and step through the
1120 // InvokeHelper<>::MakeItSo() call below.
1122 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1123 typename
StorageType::RunnableType
,
1125 ::MakeItSo(storage
->runnable_
);
1130 template <typename StorageType
, typename R
,typename X1
>
1131 struct Invoker
<0, StorageType
, R(X1
)> {
1132 typedef R(RunType
)(BindStateBase
*,
1133 typename CallbackParamTraits
<X1
>::ForwardType
);
1135 typedef R(UnboundRunType
)(X1
);
1137 static R
Run(BindStateBase
* base
,
1138 typename CallbackParamTraits
<X1
>::ForwardType x1
) {
1139 StorageType
* storage
= static_cast<StorageType
*>(base
);
1141 // Local references to make debugger stepping easier. If in a debugger,
1142 // you really want to warp ahead and step through the
1143 // InvokeHelper<>::MakeItSo() call below.
1145 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1146 typename
StorageType::RunnableType
,
1147 void(typename CallbackParamTraits
<X1
>::ForwardType x1
)>
1148 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
));
1153 template <typename StorageType
, typename R
,typename X1
>
1154 struct Invoker
<1, StorageType
, R(X1
)> {
1155 typedef R(RunType
)(BindStateBase
*);
1157 typedef R(UnboundRunType
)();
1159 static R
Run(BindStateBase
* base
) {
1160 StorageType
* storage
= static_cast<StorageType
*>(base
);
1162 // Local references to make debugger stepping easier. If in a debugger,
1163 // you really want to warp ahead and step through the
1164 // InvokeHelper<>::MakeItSo() call below.
1165 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1167 typename
Bound1UnwrapTraits::ForwardType x1
=
1168 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1169 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1170 typename
StorageType::RunnableType
,
1171 void(typename
Bound1UnwrapTraits::ForwardType
)>
1172 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
));
1177 template <typename StorageType
, typename R
,typename X1
, typename X2
>
1178 struct Invoker
<0, StorageType
, R(X1
, X2
)> {
1179 typedef R(RunType
)(BindStateBase
*,
1180 typename CallbackParamTraits
<X1
>::ForwardType
,
1181 typename CallbackParamTraits
<X2
>::ForwardType
);
1183 typedef R(UnboundRunType
)(X1
, X2
);
1185 static R
Run(BindStateBase
* base
,
1186 typename CallbackParamTraits
<X1
>::ForwardType x1
,
1187 typename CallbackParamTraits
<X2
>::ForwardType x2
) {
1188 StorageType
* storage
= static_cast<StorageType
*>(base
);
1190 // Local references to make debugger stepping easier. If in a debugger,
1191 // you really want to warp ahead and step through the
1192 // InvokeHelper<>::MakeItSo() call below.
1194 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1195 typename
StorageType::RunnableType
,
1196 void(typename CallbackParamTraits
<X1
>::ForwardType x1
,
1197 typename CallbackParamTraits
<X2
>::ForwardType x2
)>
1198 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1199 CallbackForward(x2
));
1204 template <typename StorageType
, typename R
,typename X1
, typename X2
>
1205 struct Invoker
<1, StorageType
, R(X1
, X2
)> {
1206 typedef R(RunType
)(BindStateBase
*,
1207 typename CallbackParamTraits
<X2
>::ForwardType
);
1209 typedef R(UnboundRunType
)(X2
);
1211 static R
Run(BindStateBase
* base
,
1212 typename CallbackParamTraits
<X2
>::ForwardType x2
) {
1213 StorageType
* storage
= static_cast<StorageType
*>(base
);
1215 // Local references to make debugger stepping easier. If in a debugger,
1216 // you really want to warp ahead and step through the
1217 // InvokeHelper<>::MakeItSo() call below.
1218 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1220 typename
Bound1UnwrapTraits::ForwardType x1
=
1221 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1222 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1223 typename
StorageType::RunnableType
,
1224 void(typename
Bound1UnwrapTraits::ForwardType
,
1225 typename CallbackParamTraits
<X2
>::ForwardType x2
)>
1226 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1227 CallbackForward(x2
));
1232 template <typename StorageType
, typename R
,typename X1
, typename X2
>
1233 struct Invoker
<2, StorageType
, R(X1
, X2
)> {
1234 typedef R(RunType
)(BindStateBase
*);
1236 typedef R(UnboundRunType
)();
1238 static R
Run(BindStateBase
* base
) {
1239 StorageType
* storage
= static_cast<StorageType
*>(base
);
1241 // Local references to make debugger stepping easier. If in a debugger,
1242 // you really want to warp ahead and step through the
1243 // InvokeHelper<>::MakeItSo() call below.
1244 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1245 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1247 typename
Bound1UnwrapTraits::ForwardType x1
=
1248 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1249 typename
Bound2UnwrapTraits::ForwardType x2
=
1250 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1251 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1252 typename
StorageType::RunnableType
,
1253 void(typename
Bound1UnwrapTraits::ForwardType
,
1254 typename
Bound2UnwrapTraits::ForwardType
)>
1255 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1256 CallbackForward(x2
));
1261 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1263 struct Invoker
<0, StorageType
, R(X1
, X2
, X3
)> {
1264 typedef R(RunType
)(BindStateBase
*,
1265 typename CallbackParamTraits
<X1
>::ForwardType
,
1266 typename CallbackParamTraits
<X2
>::ForwardType
,
1267 typename CallbackParamTraits
<X3
>::ForwardType
);
1269 typedef R(UnboundRunType
)(X1
, X2
, X3
);
1271 static R
Run(BindStateBase
* base
,
1272 typename CallbackParamTraits
<X1
>::ForwardType x1
,
1273 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1274 typename CallbackParamTraits
<X3
>::ForwardType x3
) {
1275 StorageType
* storage
= static_cast<StorageType
*>(base
);
1277 // Local references to make debugger stepping easier. If in a debugger,
1278 // you really want to warp ahead and step through the
1279 // InvokeHelper<>::MakeItSo() call below.
1281 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1282 typename
StorageType::RunnableType
,
1283 void(typename CallbackParamTraits
<X1
>::ForwardType x1
,
1284 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1285 typename CallbackParamTraits
<X3
>::ForwardType x3
)>
1286 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1287 CallbackForward(x2
), CallbackForward(x3
));
1292 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1294 struct Invoker
<1, StorageType
, R(X1
, X2
, X3
)> {
1295 typedef R(RunType
)(BindStateBase
*,
1296 typename CallbackParamTraits
<X2
>::ForwardType
,
1297 typename CallbackParamTraits
<X3
>::ForwardType
);
1299 typedef R(UnboundRunType
)(X2
, X3
);
1301 static R
Run(BindStateBase
* base
,
1302 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1303 typename CallbackParamTraits
<X3
>::ForwardType x3
) {
1304 StorageType
* storage
= static_cast<StorageType
*>(base
);
1306 // Local references to make debugger stepping easier. If in a debugger,
1307 // you really want to warp ahead and step through the
1308 // InvokeHelper<>::MakeItSo() call below.
1309 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1311 typename
Bound1UnwrapTraits::ForwardType x1
=
1312 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1313 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1314 typename
StorageType::RunnableType
,
1315 void(typename
Bound1UnwrapTraits::ForwardType
,
1316 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1317 typename CallbackParamTraits
<X3
>::ForwardType x3
)>
1318 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1319 CallbackForward(x2
), CallbackForward(x3
));
1324 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1326 struct Invoker
<2, StorageType
, R(X1
, X2
, X3
)> {
1327 typedef R(RunType
)(BindStateBase
*,
1328 typename CallbackParamTraits
<X3
>::ForwardType
);
1330 typedef R(UnboundRunType
)(X3
);
1332 static R
Run(BindStateBase
* base
,
1333 typename CallbackParamTraits
<X3
>::ForwardType x3
) {
1334 StorageType
* storage
= static_cast<StorageType
*>(base
);
1336 // Local references to make debugger stepping easier. If in a debugger,
1337 // you really want to warp ahead and step through the
1338 // InvokeHelper<>::MakeItSo() call below.
1339 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1340 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1342 typename
Bound1UnwrapTraits::ForwardType x1
=
1343 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1344 typename
Bound2UnwrapTraits::ForwardType x2
=
1345 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1346 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1347 typename
StorageType::RunnableType
,
1348 void(typename
Bound1UnwrapTraits::ForwardType
,
1349 typename
Bound2UnwrapTraits::ForwardType
,
1350 typename CallbackParamTraits
<X3
>::ForwardType x3
)>
1351 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1352 CallbackForward(x2
), CallbackForward(x3
));
1357 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1359 struct Invoker
<3, StorageType
, R(X1
, X2
, X3
)> {
1360 typedef R(RunType
)(BindStateBase
*);
1362 typedef R(UnboundRunType
)();
1364 static R
Run(BindStateBase
* base
) {
1365 StorageType
* storage
= static_cast<StorageType
*>(base
);
1367 // Local references to make debugger stepping easier. If in a debugger,
1368 // you really want to warp ahead and step through the
1369 // InvokeHelper<>::MakeItSo() call below.
1370 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1371 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1372 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1374 typename
Bound1UnwrapTraits::ForwardType x1
=
1375 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1376 typename
Bound2UnwrapTraits::ForwardType x2
=
1377 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1378 typename
Bound3UnwrapTraits::ForwardType x3
=
1379 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1380 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1381 typename
StorageType::RunnableType
,
1382 void(typename
Bound1UnwrapTraits::ForwardType
,
1383 typename
Bound2UnwrapTraits::ForwardType
,
1384 typename
Bound3UnwrapTraits::ForwardType
)>
1385 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1386 CallbackForward(x2
), CallbackForward(x3
));
1391 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1392 typename X3
, typename X4
>
1393 struct Invoker
<0, StorageType
, R(X1
, X2
, X3
, X4
)> {
1394 typedef R(RunType
)(BindStateBase
*,
1395 typename CallbackParamTraits
<X1
>::ForwardType
,
1396 typename CallbackParamTraits
<X2
>::ForwardType
,
1397 typename CallbackParamTraits
<X3
>::ForwardType
,
1398 typename CallbackParamTraits
<X4
>::ForwardType
);
1400 typedef R(UnboundRunType
)(X1
, X2
, X3
, X4
);
1402 static R
Run(BindStateBase
* base
,
1403 typename CallbackParamTraits
<X1
>::ForwardType x1
,
1404 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1405 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1406 typename CallbackParamTraits
<X4
>::ForwardType x4
) {
1407 StorageType
* storage
= static_cast<StorageType
*>(base
);
1409 // Local references to make debugger stepping easier. If in a debugger,
1410 // you really want to warp ahead and step through the
1411 // InvokeHelper<>::MakeItSo() call below.
1413 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1414 typename
StorageType::RunnableType
,
1415 void(typename CallbackParamTraits
<X1
>::ForwardType x1
,
1416 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1417 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1418 typename CallbackParamTraits
<X4
>::ForwardType x4
)>
1419 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1420 CallbackForward(x2
), CallbackForward(x3
),
1421 CallbackForward(x4
));
1426 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1427 typename X3
, typename X4
>
1428 struct Invoker
<1, StorageType
, R(X1
, X2
, X3
, X4
)> {
1429 typedef R(RunType
)(BindStateBase
*,
1430 typename CallbackParamTraits
<X2
>::ForwardType
,
1431 typename CallbackParamTraits
<X3
>::ForwardType
,
1432 typename CallbackParamTraits
<X4
>::ForwardType
);
1434 typedef R(UnboundRunType
)(X2
, X3
, X4
);
1436 static R
Run(BindStateBase
* base
,
1437 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1438 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1439 typename CallbackParamTraits
<X4
>::ForwardType x4
) {
1440 StorageType
* storage
= static_cast<StorageType
*>(base
);
1442 // Local references to make debugger stepping easier. If in a debugger,
1443 // you really want to warp ahead and step through the
1444 // InvokeHelper<>::MakeItSo() call below.
1445 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1447 typename
Bound1UnwrapTraits::ForwardType x1
=
1448 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1449 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1450 typename
StorageType::RunnableType
,
1451 void(typename
Bound1UnwrapTraits::ForwardType
,
1452 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1453 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1454 typename CallbackParamTraits
<X4
>::ForwardType x4
)>
1455 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1456 CallbackForward(x2
), CallbackForward(x3
),
1457 CallbackForward(x4
));
1462 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1463 typename X3
, typename X4
>
1464 struct Invoker
<2, StorageType
, R(X1
, X2
, X3
, X4
)> {
1465 typedef R(RunType
)(BindStateBase
*,
1466 typename CallbackParamTraits
<X3
>::ForwardType
,
1467 typename CallbackParamTraits
<X4
>::ForwardType
);
1469 typedef R(UnboundRunType
)(X3
, X4
);
1471 static R
Run(BindStateBase
* base
,
1472 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1473 typename CallbackParamTraits
<X4
>::ForwardType x4
) {
1474 StorageType
* storage
= static_cast<StorageType
*>(base
);
1476 // Local references to make debugger stepping easier. If in a debugger,
1477 // you really want to warp ahead and step through the
1478 // InvokeHelper<>::MakeItSo() call below.
1479 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1480 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1482 typename
Bound1UnwrapTraits::ForwardType x1
=
1483 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1484 typename
Bound2UnwrapTraits::ForwardType x2
=
1485 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1486 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1487 typename
StorageType::RunnableType
,
1488 void(typename
Bound1UnwrapTraits::ForwardType
,
1489 typename
Bound2UnwrapTraits::ForwardType
,
1490 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1491 typename CallbackParamTraits
<X4
>::ForwardType x4
)>
1492 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1493 CallbackForward(x2
), CallbackForward(x3
),
1494 CallbackForward(x4
));
1499 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1500 typename X3
, typename X4
>
1501 struct Invoker
<3, StorageType
, R(X1
, X2
, X3
, X4
)> {
1502 typedef R(RunType
)(BindStateBase
*,
1503 typename CallbackParamTraits
<X4
>::ForwardType
);
1505 typedef R(UnboundRunType
)(X4
);
1507 static R
Run(BindStateBase
* base
,
1508 typename CallbackParamTraits
<X4
>::ForwardType x4
) {
1509 StorageType
* storage
= static_cast<StorageType
*>(base
);
1511 // Local references to make debugger stepping easier. If in a debugger,
1512 // you really want to warp ahead and step through the
1513 // InvokeHelper<>::MakeItSo() call below.
1514 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1515 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1516 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1518 typename
Bound1UnwrapTraits::ForwardType x1
=
1519 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1520 typename
Bound2UnwrapTraits::ForwardType x2
=
1521 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1522 typename
Bound3UnwrapTraits::ForwardType x3
=
1523 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1524 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1525 typename
StorageType::RunnableType
,
1526 void(typename
Bound1UnwrapTraits::ForwardType
,
1527 typename
Bound2UnwrapTraits::ForwardType
,
1528 typename
Bound3UnwrapTraits::ForwardType
,
1529 typename CallbackParamTraits
<X4
>::ForwardType x4
)>
1530 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1531 CallbackForward(x2
), CallbackForward(x3
),
1532 CallbackForward(x4
));
1537 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1538 typename X3
, typename X4
>
1539 struct Invoker
<4, StorageType
, R(X1
, X2
, X3
, X4
)> {
1540 typedef R(RunType
)(BindStateBase
*);
1542 typedef R(UnboundRunType
)();
1544 static R
Run(BindStateBase
* base
) {
1545 StorageType
* storage
= static_cast<StorageType
*>(base
);
1547 // Local references to make debugger stepping easier. If in a debugger,
1548 // you really want to warp ahead and step through the
1549 // InvokeHelper<>::MakeItSo() call below.
1550 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1551 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1552 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1553 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
1555 typename
Bound1UnwrapTraits::ForwardType x1
=
1556 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1557 typename
Bound2UnwrapTraits::ForwardType x2
=
1558 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1559 typename
Bound3UnwrapTraits::ForwardType x3
=
1560 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1561 typename
Bound4UnwrapTraits::ForwardType x4
=
1562 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
1563 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1564 typename
StorageType::RunnableType
,
1565 void(typename
Bound1UnwrapTraits::ForwardType
,
1566 typename
Bound2UnwrapTraits::ForwardType
,
1567 typename
Bound3UnwrapTraits::ForwardType
,
1568 typename
Bound4UnwrapTraits::ForwardType
)>
1569 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1570 CallbackForward(x2
), CallbackForward(x3
),
1571 CallbackForward(x4
));
1576 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1577 typename X3
, typename X4
, typename X5
>
1578 struct Invoker
<0, StorageType
, R(X1
, X2
, X3
, X4
, X5
)> {
1579 typedef R(RunType
)(BindStateBase
*,
1580 typename CallbackParamTraits
<X1
>::ForwardType
,
1581 typename CallbackParamTraits
<X2
>::ForwardType
,
1582 typename CallbackParamTraits
<X3
>::ForwardType
,
1583 typename CallbackParamTraits
<X4
>::ForwardType
,
1584 typename CallbackParamTraits
<X5
>::ForwardType
);
1586 typedef R(UnboundRunType
)(X1
, X2
, X3
, X4
, X5
);
1588 static R
Run(BindStateBase
* base
,
1589 typename CallbackParamTraits
<X1
>::ForwardType x1
,
1590 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1591 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1592 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1593 typename CallbackParamTraits
<X5
>::ForwardType x5
) {
1594 StorageType
* storage
= static_cast<StorageType
*>(base
);
1596 // Local references to make debugger stepping easier. If in a debugger,
1597 // you really want to warp ahead and step through the
1598 // InvokeHelper<>::MakeItSo() call below.
1600 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1601 typename
StorageType::RunnableType
,
1602 void(typename CallbackParamTraits
<X1
>::ForwardType x1
,
1603 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1604 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1605 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1606 typename CallbackParamTraits
<X5
>::ForwardType x5
)>
1607 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1608 CallbackForward(x2
), CallbackForward(x3
),
1609 CallbackForward(x4
), CallbackForward(x5
));
1614 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1615 typename X3
, typename X4
, typename X5
>
1616 struct Invoker
<1, StorageType
, R(X1
, X2
, X3
, X4
, X5
)> {
1617 typedef R(RunType
)(BindStateBase
*,
1618 typename CallbackParamTraits
<X2
>::ForwardType
,
1619 typename CallbackParamTraits
<X3
>::ForwardType
,
1620 typename CallbackParamTraits
<X4
>::ForwardType
,
1621 typename CallbackParamTraits
<X5
>::ForwardType
);
1623 typedef R(UnboundRunType
)(X2
, X3
, X4
, X5
);
1625 static R
Run(BindStateBase
* base
,
1626 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1627 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1628 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1629 typename CallbackParamTraits
<X5
>::ForwardType x5
) {
1630 StorageType
* storage
= static_cast<StorageType
*>(base
);
1632 // Local references to make debugger stepping easier. If in a debugger,
1633 // you really want to warp ahead and step through the
1634 // InvokeHelper<>::MakeItSo() call below.
1635 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1637 typename
Bound1UnwrapTraits::ForwardType x1
=
1638 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1639 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1640 typename
StorageType::RunnableType
,
1641 void(typename
Bound1UnwrapTraits::ForwardType
,
1642 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1643 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1644 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1645 typename CallbackParamTraits
<X5
>::ForwardType x5
)>
1646 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1647 CallbackForward(x2
), CallbackForward(x3
),
1648 CallbackForward(x4
), CallbackForward(x5
));
1653 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1654 typename X3
, typename X4
, typename X5
>
1655 struct Invoker
<2, StorageType
, R(X1
, X2
, X3
, X4
, X5
)> {
1656 typedef R(RunType
)(BindStateBase
*,
1657 typename CallbackParamTraits
<X3
>::ForwardType
,
1658 typename CallbackParamTraits
<X4
>::ForwardType
,
1659 typename CallbackParamTraits
<X5
>::ForwardType
);
1661 typedef R(UnboundRunType
)(X3
, X4
, X5
);
1663 static R
Run(BindStateBase
* base
,
1664 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1665 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1666 typename CallbackParamTraits
<X5
>::ForwardType x5
) {
1667 StorageType
* storage
= static_cast<StorageType
*>(base
);
1669 // Local references to make debugger stepping easier. If in a debugger,
1670 // you really want to warp ahead and step through the
1671 // InvokeHelper<>::MakeItSo() call below.
1672 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1673 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1675 typename
Bound1UnwrapTraits::ForwardType x1
=
1676 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1677 typename
Bound2UnwrapTraits::ForwardType x2
=
1678 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1679 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1680 typename
StorageType::RunnableType
,
1681 void(typename
Bound1UnwrapTraits::ForwardType
,
1682 typename
Bound2UnwrapTraits::ForwardType
,
1683 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1684 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1685 typename CallbackParamTraits
<X5
>::ForwardType x5
)>
1686 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1687 CallbackForward(x2
), CallbackForward(x3
),
1688 CallbackForward(x4
), CallbackForward(x5
));
1693 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1694 typename X3
, typename X4
, typename X5
>
1695 struct Invoker
<3, StorageType
, R(X1
, X2
, X3
, X4
, X5
)> {
1696 typedef R(RunType
)(BindStateBase
*,
1697 typename CallbackParamTraits
<X4
>::ForwardType
,
1698 typename CallbackParamTraits
<X5
>::ForwardType
);
1700 typedef R(UnboundRunType
)(X4
, X5
);
1702 static R
Run(BindStateBase
* base
,
1703 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1704 typename CallbackParamTraits
<X5
>::ForwardType x5
) {
1705 StorageType
* storage
= static_cast<StorageType
*>(base
);
1707 // Local references to make debugger stepping easier. If in a debugger,
1708 // you really want to warp ahead and step through the
1709 // InvokeHelper<>::MakeItSo() call below.
1710 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1711 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1712 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1714 typename
Bound1UnwrapTraits::ForwardType x1
=
1715 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1716 typename
Bound2UnwrapTraits::ForwardType x2
=
1717 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1718 typename
Bound3UnwrapTraits::ForwardType x3
=
1719 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1720 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1721 typename
StorageType::RunnableType
,
1722 void(typename
Bound1UnwrapTraits::ForwardType
,
1723 typename
Bound2UnwrapTraits::ForwardType
,
1724 typename
Bound3UnwrapTraits::ForwardType
,
1725 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1726 typename CallbackParamTraits
<X5
>::ForwardType x5
)>
1727 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1728 CallbackForward(x2
), CallbackForward(x3
),
1729 CallbackForward(x4
), CallbackForward(x5
));
1734 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1735 typename X3
, typename X4
, typename X5
>
1736 struct Invoker
<4, StorageType
, R(X1
, X2
, X3
, X4
, X5
)> {
1737 typedef R(RunType
)(BindStateBase
*,
1738 typename CallbackParamTraits
<X5
>::ForwardType
);
1740 typedef R(UnboundRunType
)(X5
);
1742 static R
Run(BindStateBase
* base
,
1743 typename CallbackParamTraits
<X5
>::ForwardType x5
) {
1744 StorageType
* storage
= static_cast<StorageType
*>(base
);
1746 // Local references to make debugger stepping easier. If in a debugger,
1747 // you really want to warp ahead and step through the
1748 // InvokeHelper<>::MakeItSo() call below.
1749 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1750 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1751 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1752 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
1754 typename
Bound1UnwrapTraits::ForwardType x1
=
1755 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1756 typename
Bound2UnwrapTraits::ForwardType x2
=
1757 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1758 typename
Bound3UnwrapTraits::ForwardType x3
=
1759 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1760 typename
Bound4UnwrapTraits::ForwardType x4
=
1761 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
1762 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1763 typename
StorageType::RunnableType
,
1764 void(typename
Bound1UnwrapTraits::ForwardType
,
1765 typename
Bound2UnwrapTraits::ForwardType
,
1766 typename
Bound3UnwrapTraits::ForwardType
,
1767 typename
Bound4UnwrapTraits::ForwardType
,
1768 typename CallbackParamTraits
<X5
>::ForwardType x5
)>
1769 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1770 CallbackForward(x2
), CallbackForward(x3
),
1771 CallbackForward(x4
), CallbackForward(x5
));
1776 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1777 typename X3
, typename X4
, typename X5
>
1778 struct Invoker
<5, StorageType
, R(X1
, X2
, X3
, X4
, X5
)> {
1779 typedef R(RunType
)(BindStateBase
*);
1781 typedef R(UnboundRunType
)();
1783 static R
Run(BindStateBase
* base
) {
1784 StorageType
* storage
= static_cast<StorageType
*>(base
);
1786 // Local references to make debugger stepping easier. If in a debugger,
1787 // you really want to warp ahead and step through the
1788 // InvokeHelper<>::MakeItSo() call below.
1789 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1790 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1791 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1792 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
1793 typedef typename
StorageType::Bound5UnwrapTraits Bound5UnwrapTraits
;
1795 typename
Bound1UnwrapTraits::ForwardType x1
=
1796 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1797 typename
Bound2UnwrapTraits::ForwardType x2
=
1798 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1799 typename
Bound3UnwrapTraits::ForwardType x3
=
1800 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1801 typename
Bound4UnwrapTraits::ForwardType x4
=
1802 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
1803 typename
Bound5UnwrapTraits::ForwardType x5
=
1804 Bound5UnwrapTraits::Unwrap(storage
->p5_
);
1805 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1806 typename
StorageType::RunnableType
,
1807 void(typename
Bound1UnwrapTraits::ForwardType
,
1808 typename
Bound2UnwrapTraits::ForwardType
,
1809 typename
Bound3UnwrapTraits::ForwardType
,
1810 typename
Bound4UnwrapTraits::ForwardType
,
1811 typename
Bound5UnwrapTraits::ForwardType
)>
1812 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1813 CallbackForward(x2
), CallbackForward(x3
),
1814 CallbackForward(x4
), CallbackForward(x5
));
1819 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1820 typename X3
, typename X4
, typename X5
, typename X6
>
1821 struct Invoker
<0, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
1822 typedef R(RunType
)(BindStateBase
*,
1823 typename CallbackParamTraits
<X1
>::ForwardType
,
1824 typename CallbackParamTraits
<X2
>::ForwardType
,
1825 typename CallbackParamTraits
<X3
>::ForwardType
,
1826 typename CallbackParamTraits
<X4
>::ForwardType
,
1827 typename CallbackParamTraits
<X5
>::ForwardType
,
1828 typename CallbackParamTraits
<X6
>::ForwardType
);
1830 typedef R(UnboundRunType
)(X1
, X2
, X3
, X4
, X5
, X6
);
1832 static R
Run(BindStateBase
* base
,
1833 typename CallbackParamTraits
<X1
>::ForwardType x1
,
1834 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1835 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1836 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1837 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1838 typename CallbackParamTraits
<X6
>::ForwardType x6
) {
1839 StorageType
* storage
= static_cast<StorageType
*>(base
);
1841 // Local references to make debugger stepping easier. If in a debugger,
1842 // you really want to warp ahead and step through the
1843 // InvokeHelper<>::MakeItSo() call below.
1845 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1846 typename
StorageType::RunnableType
,
1847 void(typename CallbackParamTraits
<X1
>::ForwardType x1
,
1848 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1849 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1850 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1851 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1852 typename CallbackParamTraits
<X6
>::ForwardType x6
)>
1853 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1854 CallbackForward(x2
), CallbackForward(x3
),
1855 CallbackForward(x4
), CallbackForward(x5
),
1856 CallbackForward(x6
));
1861 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1862 typename X3
, typename X4
, typename X5
, typename X6
>
1863 struct Invoker
<1, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
1864 typedef R(RunType
)(BindStateBase
*,
1865 typename CallbackParamTraits
<X2
>::ForwardType
,
1866 typename CallbackParamTraits
<X3
>::ForwardType
,
1867 typename CallbackParamTraits
<X4
>::ForwardType
,
1868 typename CallbackParamTraits
<X5
>::ForwardType
,
1869 typename CallbackParamTraits
<X6
>::ForwardType
);
1871 typedef R(UnboundRunType
)(X2
, X3
, X4
, X5
, X6
);
1873 static R
Run(BindStateBase
* base
,
1874 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1875 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1876 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1877 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1878 typename CallbackParamTraits
<X6
>::ForwardType x6
) {
1879 StorageType
* storage
= static_cast<StorageType
*>(base
);
1881 // Local references to make debugger stepping easier. If in a debugger,
1882 // you really want to warp ahead and step through the
1883 // InvokeHelper<>::MakeItSo() call below.
1884 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1886 typename
Bound1UnwrapTraits::ForwardType x1
=
1887 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1888 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1889 typename
StorageType::RunnableType
,
1890 void(typename
Bound1UnwrapTraits::ForwardType
,
1891 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1892 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1893 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1894 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1895 typename CallbackParamTraits
<X6
>::ForwardType x6
)>
1896 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1897 CallbackForward(x2
), CallbackForward(x3
),
1898 CallbackForward(x4
), CallbackForward(x5
),
1899 CallbackForward(x6
));
1904 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1905 typename X3
, typename X4
, typename X5
, typename X6
>
1906 struct Invoker
<2, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
1907 typedef R(RunType
)(BindStateBase
*,
1908 typename CallbackParamTraits
<X3
>::ForwardType
,
1909 typename CallbackParamTraits
<X4
>::ForwardType
,
1910 typename CallbackParamTraits
<X5
>::ForwardType
,
1911 typename CallbackParamTraits
<X6
>::ForwardType
);
1913 typedef R(UnboundRunType
)(X3
, X4
, X5
, X6
);
1915 static R
Run(BindStateBase
* base
,
1916 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1917 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1918 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1919 typename CallbackParamTraits
<X6
>::ForwardType x6
) {
1920 StorageType
* storage
= static_cast<StorageType
*>(base
);
1922 // Local references to make debugger stepping easier. If in a debugger,
1923 // you really want to warp ahead and step through the
1924 // InvokeHelper<>::MakeItSo() call below.
1925 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1926 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1928 typename
Bound1UnwrapTraits::ForwardType x1
=
1929 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1930 typename
Bound2UnwrapTraits::ForwardType x2
=
1931 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1932 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1933 typename
StorageType::RunnableType
,
1934 void(typename
Bound1UnwrapTraits::ForwardType
,
1935 typename
Bound2UnwrapTraits::ForwardType
,
1936 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1937 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1938 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1939 typename CallbackParamTraits
<X6
>::ForwardType x6
)>
1940 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1941 CallbackForward(x2
), CallbackForward(x3
),
1942 CallbackForward(x4
), CallbackForward(x5
),
1943 CallbackForward(x6
));
1948 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1949 typename X3
, typename X4
, typename X5
, typename X6
>
1950 struct Invoker
<3, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
1951 typedef R(RunType
)(BindStateBase
*,
1952 typename CallbackParamTraits
<X4
>::ForwardType
,
1953 typename CallbackParamTraits
<X5
>::ForwardType
,
1954 typename CallbackParamTraits
<X6
>::ForwardType
);
1956 typedef R(UnboundRunType
)(X4
, X5
, X6
);
1958 static R
Run(BindStateBase
* base
,
1959 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1960 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1961 typename CallbackParamTraits
<X6
>::ForwardType x6
) {
1962 StorageType
* storage
= static_cast<StorageType
*>(base
);
1964 // Local references to make debugger stepping easier. If in a debugger,
1965 // you really want to warp ahead and step through the
1966 // InvokeHelper<>::MakeItSo() call below.
1967 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1968 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1969 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1971 typename
Bound1UnwrapTraits::ForwardType x1
=
1972 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1973 typename
Bound2UnwrapTraits::ForwardType x2
=
1974 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1975 typename
Bound3UnwrapTraits::ForwardType x3
=
1976 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1977 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1978 typename
StorageType::RunnableType
,
1979 void(typename
Bound1UnwrapTraits::ForwardType
,
1980 typename
Bound2UnwrapTraits::ForwardType
,
1981 typename
Bound3UnwrapTraits::ForwardType
,
1982 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1983 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1984 typename CallbackParamTraits
<X6
>::ForwardType x6
)>
1985 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1986 CallbackForward(x2
), CallbackForward(x3
),
1987 CallbackForward(x4
), CallbackForward(x5
),
1988 CallbackForward(x6
));
1993 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1994 typename X3
, typename X4
, typename X5
, typename X6
>
1995 struct Invoker
<4, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
1996 typedef R(RunType
)(BindStateBase
*,
1997 typename CallbackParamTraits
<X5
>::ForwardType
,
1998 typename CallbackParamTraits
<X6
>::ForwardType
);
2000 typedef R(UnboundRunType
)(X5
, X6
);
2002 static R
Run(BindStateBase
* base
,
2003 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2004 typename CallbackParamTraits
<X6
>::ForwardType x6
) {
2005 StorageType
* storage
= static_cast<StorageType
*>(base
);
2007 // Local references to make debugger stepping easier. If in a debugger,
2008 // you really want to warp ahead and step through the
2009 // InvokeHelper<>::MakeItSo() call below.
2010 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2011 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2012 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2013 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2015 typename
Bound1UnwrapTraits::ForwardType x1
=
2016 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2017 typename
Bound2UnwrapTraits::ForwardType x2
=
2018 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2019 typename
Bound3UnwrapTraits::ForwardType x3
=
2020 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2021 typename
Bound4UnwrapTraits::ForwardType x4
=
2022 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2023 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2024 typename
StorageType::RunnableType
,
2025 void(typename
Bound1UnwrapTraits::ForwardType
,
2026 typename
Bound2UnwrapTraits::ForwardType
,
2027 typename
Bound3UnwrapTraits::ForwardType
,
2028 typename
Bound4UnwrapTraits::ForwardType
,
2029 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2030 typename CallbackParamTraits
<X6
>::ForwardType x6
)>
2031 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2032 CallbackForward(x2
), CallbackForward(x3
),
2033 CallbackForward(x4
), CallbackForward(x5
),
2034 CallbackForward(x6
));
2039 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2040 typename X3
, typename X4
, typename X5
, typename X6
>
2041 struct Invoker
<5, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
2042 typedef R(RunType
)(BindStateBase
*,
2043 typename CallbackParamTraits
<X6
>::ForwardType
);
2045 typedef R(UnboundRunType
)(X6
);
2047 static R
Run(BindStateBase
* base
,
2048 typename CallbackParamTraits
<X6
>::ForwardType x6
) {
2049 StorageType
* storage
= static_cast<StorageType
*>(base
);
2051 // Local references to make debugger stepping easier. If in a debugger,
2052 // you really want to warp ahead and step through the
2053 // InvokeHelper<>::MakeItSo() call below.
2054 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2055 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2056 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2057 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2058 typedef typename
StorageType::Bound5UnwrapTraits Bound5UnwrapTraits
;
2060 typename
Bound1UnwrapTraits::ForwardType x1
=
2061 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2062 typename
Bound2UnwrapTraits::ForwardType x2
=
2063 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2064 typename
Bound3UnwrapTraits::ForwardType x3
=
2065 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2066 typename
Bound4UnwrapTraits::ForwardType x4
=
2067 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2068 typename
Bound5UnwrapTraits::ForwardType x5
=
2069 Bound5UnwrapTraits::Unwrap(storage
->p5_
);
2070 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2071 typename
StorageType::RunnableType
,
2072 void(typename
Bound1UnwrapTraits::ForwardType
,
2073 typename
Bound2UnwrapTraits::ForwardType
,
2074 typename
Bound3UnwrapTraits::ForwardType
,
2075 typename
Bound4UnwrapTraits::ForwardType
,
2076 typename
Bound5UnwrapTraits::ForwardType
,
2077 typename CallbackParamTraits
<X6
>::ForwardType x6
)>
2078 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2079 CallbackForward(x2
), CallbackForward(x3
),
2080 CallbackForward(x4
), CallbackForward(x5
),
2081 CallbackForward(x6
));
2086 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2087 typename X3
, typename X4
, typename X5
, typename X6
>
2088 struct Invoker
<6, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
2089 typedef R(RunType
)(BindStateBase
*);
2091 typedef R(UnboundRunType
)();
2093 static R
Run(BindStateBase
* base
) {
2094 StorageType
* storage
= static_cast<StorageType
*>(base
);
2096 // Local references to make debugger stepping easier. If in a debugger,
2097 // you really want to warp ahead and step through the
2098 // InvokeHelper<>::MakeItSo() call below.
2099 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2100 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2101 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2102 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2103 typedef typename
StorageType::Bound5UnwrapTraits Bound5UnwrapTraits
;
2104 typedef typename
StorageType::Bound6UnwrapTraits Bound6UnwrapTraits
;
2106 typename
Bound1UnwrapTraits::ForwardType x1
=
2107 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2108 typename
Bound2UnwrapTraits::ForwardType x2
=
2109 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2110 typename
Bound3UnwrapTraits::ForwardType x3
=
2111 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2112 typename
Bound4UnwrapTraits::ForwardType x4
=
2113 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2114 typename
Bound5UnwrapTraits::ForwardType x5
=
2115 Bound5UnwrapTraits::Unwrap(storage
->p5_
);
2116 typename
Bound6UnwrapTraits::ForwardType x6
=
2117 Bound6UnwrapTraits::Unwrap(storage
->p6_
);
2118 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2119 typename
StorageType::RunnableType
,
2120 void(typename
Bound1UnwrapTraits::ForwardType
,
2121 typename
Bound2UnwrapTraits::ForwardType
,
2122 typename
Bound3UnwrapTraits::ForwardType
,
2123 typename
Bound4UnwrapTraits::ForwardType
,
2124 typename
Bound5UnwrapTraits::ForwardType
,
2125 typename
Bound6UnwrapTraits::ForwardType
)>
2126 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2127 CallbackForward(x2
), CallbackForward(x3
),
2128 CallbackForward(x4
), CallbackForward(x5
),
2129 CallbackForward(x6
));
2134 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2135 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2136 struct Invoker
<0, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2137 typedef R(RunType
)(BindStateBase
*,
2138 typename CallbackParamTraits
<X1
>::ForwardType
,
2139 typename CallbackParamTraits
<X2
>::ForwardType
,
2140 typename CallbackParamTraits
<X3
>::ForwardType
,
2141 typename CallbackParamTraits
<X4
>::ForwardType
,
2142 typename CallbackParamTraits
<X5
>::ForwardType
,
2143 typename CallbackParamTraits
<X6
>::ForwardType
,
2144 typename CallbackParamTraits
<X7
>::ForwardType
);
2146 typedef R(UnboundRunType
)(X1
, X2
, X3
, X4
, X5
, X6
, X7
);
2148 static R
Run(BindStateBase
* base
,
2149 typename CallbackParamTraits
<X1
>::ForwardType x1
,
2150 typename CallbackParamTraits
<X2
>::ForwardType x2
,
2151 typename CallbackParamTraits
<X3
>::ForwardType x3
,
2152 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2153 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2154 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2155 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2156 StorageType
* storage
= static_cast<StorageType
*>(base
);
2158 // Local references to make debugger stepping easier. If in a debugger,
2159 // you really want to warp ahead and step through the
2160 // InvokeHelper<>::MakeItSo() call below.
2162 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2163 typename
StorageType::RunnableType
,
2164 void(typename CallbackParamTraits
<X1
>::ForwardType x1
,
2165 typename CallbackParamTraits
<X2
>::ForwardType x2
,
2166 typename CallbackParamTraits
<X3
>::ForwardType x3
,
2167 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2168 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2169 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2170 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2171 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2172 CallbackForward(x2
), CallbackForward(x3
),
2173 CallbackForward(x4
), CallbackForward(x5
),
2174 CallbackForward(x6
), CallbackForward(x7
));
2179 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2180 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2181 struct Invoker
<1, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2182 typedef R(RunType
)(BindStateBase
*,
2183 typename CallbackParamTraits
<X2
>::ForwardType
,
2184 typename CallbackParamTraits
<X3
>::ForwardType
,
2185 typename CallbackParamTraits
<X4
>::ForwardType
,
2186 typename CallbackParamTraits
<X5
>::ForwardType
,
2187 typename CallbackParamTraits
<X6
>::ForwardType
,
2188 typename CallbackParamTraits
<X7
>::ForwardType
);
2190 typedef R(UnboundRunType
)(X2
, X3
, X4
, X5
, X6
, X7
);
2192 static R
Run(BindStateBase
* base
,
2193 typename CallbackParamTraits
<X2
>::ForwardType x2
,
2194 typename CallbackParamTraits
<X3
>::ForwardType x3
,
2195 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2196 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2197 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2198 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2199 StorageType
* storage
= static_cast<StorageType
*>(base
);
2201 // Local references to make debugger stepping easier. If in a debugger,
2202 // you really want to warp ahead and step through the
2203 // InvokeHelper<>::MakeItSo() call below.
2204 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2206 typename
Bound1UnwrapTraits::ForwardType x1
=
2207 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2208 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2209 typename
StorageType::RunnableType
,
2210 void(typename
Bound1UnwrapTraits::ForwardType
,
2211 typename CallbackParamTraits
<X2
>::ForwardType x2
,
2212 typename CallbackParamTraits
<X3
>::ForwardType x3
,
2213 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2214 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2215 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2216 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2217 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2218 CallbackForward(x2
), CallbackForward(x3
),
2219 CallbackForward(x4
), CallbackForward(x5
),
2220 CallbackForward(x6
), CallbackForward(x7
));
2225 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2226 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2227 struct Invoker
<2, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2228 typedef R(RunType
)(BindStateBase
*,
2229 typename CallbackParamTraits
<X3
>::ForwardType
,
2230 typename CallbackParamTraits
<X4
>::ForwardType
,
2231 typename CallbackParamTraits
<X5
>::ForwardType
,
2232 typename CallbackParamTraits
<X6
>::ForwardType
,
2233 typename CallbackParamTraits
<X7
>::ForwardType
);
2235 typedef R(UnboundRunType
)(X3
, X4
, X5
, X6
, X7
);
2237 static R
Run(BindStateBase
* base
,
2238 typename CallbackParamTraits
<X3
>::ForwardType x3
,
2239 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2240 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2241 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2242 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2243 StorageType
* storage
= static_cast<StorageType
*>(base
);
2245 // Local references to make debugger stepping easier. If in a debugger,
2246 // you really want to warp ahead and step through the
2247 // InvokeHelper<>::MakeItSo() call below.
2248 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2249 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2251 typename
Bound1UnwrapTraits::ForwardType x1
=
2252 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2253 typename
Bound2UnwrapTraits::ForwardType x2
=
2254 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2255 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2256 typename
StorageType::RunnableType
,
2257 void(typename
Bound1UnwrapTraits::ForwardType
,
2258 typename
Bound2UnwrapTraits::ForwardType
,
2259 typename CallbackParamTraits
<X3
>::ForwardType x3
,
2260 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2261 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2262 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2263 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2264 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2265 CallbackForward(x2
), CallbackForward(x3
),
2266 CallbackForward(x4
), CallbackForward(x5
),
2267 CallbackForward(x6
), CallbackForward(x7
));
2272 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2273 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2274 struct Invoker
<3, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2275 typedef R(RunType
)(BindStateBase
*,
2276 typename CallbackParamTraits
<X4
>::ForwardType
,
2277 typename CallbackParamTraits
<X5
>::ForwardType
,
2278 typename CallbackParamTraits
<X6
>::ForwardType
,
2279 typename CallbackParamTraits
<X7
>::ForwardType
);
2281 typedef R(UnboundRunType
)(X4
, X5
, X6
, X7
);
2283 static R
Run(BindStateBase
* base
,
2284 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2285 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2286 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2287 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2288 StorageType
* storage
= static_cast<StorageType
*>(base
);
2290 // Local references to make debugger stepping easier. If in a debugger,
2291 // you really want to warp ahead and step through the
2292 // InvokeHelper<>::MakeItSo() call below.
2293 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2294 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2295 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2297 typename
Bound1UnwrapTraits::ForwardType x1
=
2298 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2299 typename
Bound2UnwrapTraits::ForwardType x2
=
2300 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2301 typename
Bound3UnwrapTraits::ForwardType x3
=
2302 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2303 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2304 typename
StorageType::RunnableType
,
2305 void(typename
Bound1UnwrapTraits::ForwardType
,
2306 typename
Bound2UnwrapTraits::ForwardType
,
2307 typename
Bound3UnwrapTraits::ForwardType
,
2308 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2309 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2310 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2311 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2312 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2313 CallbackForward(x2
), CallbackForward(x3
),
2314 CallbackForward(x4
), CallbackForward(x5
),
2315 CallbackForward(x6
), CallbackForward(x7
));
2320 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2321 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2322 struct Invoker
<4, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2323 typedef R(RunType
)(BindStateBase
*,
2324 typename CallbackParamTraits
<X5
>::ForwardType
,
2325 typename CallbackParamTraits
<X6
>::ForwardType
,
2326 typename CallbackParamTraits
<X7
>::ForwardType
);
2328 typedef R(UnboundRunType
)(X5
, X6
, X7
);
2330 static R
Run(BindStateBase
* base
,
2331 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2332 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2333 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2334 StorageType
* storage
= static_cast<StorageType
*>(base
);
2336 // Local references to make debugger stepping easier. If in a debugger,
2337 // you really want to warp ahead and step through the
2338 // InvokeHelper<>::MakeItSo() call below.
2339 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2340 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2341 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2342 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2344 typename
Bound1UnwrapTraits::ForwardType x1
=
2345 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2346 typename
Bound2UnwrapTraits::ForwardType x2
=
2347 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2348 typename
Bound3UnwrapTraits::ForwardType x3
=
2349 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2350 typename
Bound4UnwrapTraits::ForwardType x4
=
2351 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2352 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2353 typename
StorageType::RunnableType
,
2354 void(typename
Bound1UnwrapTraits::ForwardType
,
2355 typename
Bound2UnwrapTraits::ForwardType
,
2356 typename
Bound3UnwrapTraits::ForwardType
,
2357 typename
Bound4UnwrapTraits::ForwardType
,
2358 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2359 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2360 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2361 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2362 CallbackForward(x2
), CallbackForward(x3
),
2363 CallbackForward(x4
), CallbackForward(x5
),
2364 CallbackForward(x6
), CallbackForward(x7
));
2369 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2370 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2371 struct Invoker
<5, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2372 typedef R(RunType
)(BindStateBase
*,
2373 typename CallbackParamTraits
<X6
>::ForwardType
,
2374 typename CallbackParamTraits
<X7
>::ForwardType
);
2376 typedef R(UnboundRunType
)(X6
, X7
);
2378 static R
Run(BindStateBase
* base
,
2379 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2380 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2381 StorageType
* storage
= static_cast<StorageType
*>(base
);
2383 // Local references to make debugger stepping easier. If in a debugger,
2384 // you really want to warp ahead and step through the
2385 // InvokeHelper<>::MakeItSo() call below.
2386 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2387 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2388 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2389 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2390 typedef typename
StorageType::Bound5UnwrapTraits Bound5UnwrapTraits
;
2392 typename
Bound1UnwrapTraits::ForwardType x1
=
2393 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2394 typename
Bound2UnwrapTraits::ForwardType x2
=
2395 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2396 typename
Bound3UnwrapTraits::ForwardType x3
=
2397 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2398 typename
Bound4UnwrapTraits::ForwardType x4
=
2399 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2400 typename
Bound5UnwrapTraits::ForwardType x5
=
2401 Bound5UnwrapTraits::Unwrap(storage
->p5_
);
2402 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2403 typename
StorageType::RunnableType
,
2404 void(typename
Bound1UnwrapTraits::ForwardType
,
2405 typename
Bound2UnwrapTraits::ForwardType
,
2406 typename
Bound3UnwrapTraits::ForwardType
,
2407 typename
Bound4UnwrapTraits::ForwardType
,
2408 typename
Bound5UnwrapTraits::ForwardType
,
2409 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2410 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2411 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2412 CallbackForward(x2
), CallbackForward(x3
),
2413 CallbackForward(x4
), CallbackForward(x5
),
2414 CallbackForward(x6
), CallbackForward(x7
));
2419 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2420 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2421 struct Invoker
<6, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2422 typedef R(RunType
)(BindStateBase
*,
2423 typename CallbackParamTraits
<X7
>::ForwardType
);
2425 typedef R(UnboundRunType
)(X7
);
2427 static R
Run(BindStateBase
* base
,
2428 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2429 StorageType
* storage
= static_cast<StorageType
*>(base
);
2431 // Local references to make debugger stepping easier. If in a debugger,
2432 // you really want to warp ahead and step through the
2433 // InvokeHelper<>::MakeItSo() call below.
2434 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2435 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2436 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2437 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2438 typedef typename
StorageType::Bound5UnwrapTraits Bound5UnwrapTraits
;
2439 typedef typename
StorageType::Bound6UnwrapTraits Bound6UnwrapTraits
;
2441 typename
Bound1UnwrapTraits::ForwardType x1
=
2442 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2443 typename
Bound2UnwrapTraits::ForwardType x2
=
2444 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2445 typename
Bound3UnwrapTraits::ForwardType x3
=
2446 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2447 typename
Bound4UnwrapTraits::ForwardType x4
=
2448 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2449 typename
Bound5UnwrapTraits::ForwardType x5
=
2450 Bound5UnwrapTraits::Unwrap(storage
->p5_
);
2451 typename
Bound6UnwrapTraits::ForwardType x6
=
2452 Bound6UnwrapTraits::Unwrap(storage
->p6_
);
2453 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2454 typename
StorageType::RunnableType
,
2455 void(typename
Bound1UnwrapTraits::ForwardType
,
2456 typename
Bound2UnwrapTraits::ForwardType
,
2457 typename
Bound3UnwrapTraits::ForwardType
,
2458 typename
Bound4UnwrapTraits::ForwardType
,
2459 typename
Bound5UnwrapTraits::ForwardType
,
2460 typename
Bound6UnwrapTraits::ForwardType
,
2461 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2462 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2463 CallbackForward(x2
), CallbackForward(x3
),
2464 CallbackForward(x4
), CallbackForward(x5
),
2465 CallbackForward(x6
), CallbackForward(x7
));
2470 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2471 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2472 struct Invoker
<7, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2473 typedef R(RunType
)(BindStateBase
*);
2475 typedef R(UnboundRunType
)();
2477 static R
Run(BindStateBase
* base
) {
2478 StorageType
* storage
= static_cast<StorageType
*>(base
);
2480 // Local references to make debugger stepping easier. If in a debugger,
2481 // you really want to warp ahead and step through the
2482 // InvokeHelper<>::MakeItSo() call below.
2483 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2484 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2485 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2486 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2487 typedef typename
StorageType::Bound5UnwrapTraits Bound5UnwrapTraits
;
2488 typedef typename
StorageType::Bound6UnwrapTraits Bound6UnwrapTraits
;
2489 typedef typename
StorageType::Bound7UnwrapTraits Bound7UnwrapTraits
;
2491 typename
Bound1UnwrapTraits::ForwardType x1
=
2492 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2493 typename
Bound2UnwrapTraits::ForwardType x2
=
2494 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2495 typename
Bound3UnwrapTraits::ForwardType x3
=
2496 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2497 typename
Bound4UnwrapTraits::ForwardType x4
=
2498 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2499 typename
Bound5UnwrapTraits::ForwardType x5
=
2500 Bound5UnwrapTraits::Unwrap(storage
->p5_
);
2501 typename
Bound6UnwrapTraits::ForwardType x6
=
2502 Bound6UnwrapTraits::Unwrap(storage
->p6_
);
2503 typename
Bound7UnwrapTraits::ForwardType x7
=
2504 Bound7UnwrapTraits::Unwrap(storage
->p7_
);
2505 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2506 typename
StorageType::RunnableType
,
2507 void(typename
Bound1UnwrapTraits::ForwardType
,
2508 typename
Bound2UnwrapTraits::ForwardType
,
2509 typename
Bound3UnwrapTraits::ForwardType
,
2510 typename
Bound4UnwrapTraits::ForwardType
,
2511 typename
Bound5UnwrapTraits::ForwardType
,
2512 typename
Bound6UnwrapTraits::ForwardType
,
2513 typename
Bound7UnwrapTraits::ForwardType
)>
2514 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2515 CallbackForward(x2
), CallbackForward(x3
),
2516 CallbackForward(x4
), CallbackForward(x5
),
2517 CallbackForward(x6
), CallbackForward(x7
));
2524 // This stores all the state passed into Bind() and is also where most
2525 // of the template resolution magic occurs.
2527 // Runnable is the functor we are binding arguments to.
2528 // RunType is type of the Run() function that the Invoker<> should use.
2529 // Normally, this is the same as the RunType of the Runnable, but it can
2530 // be different if an adapter like IgnoreResult() has been used.
2532 // BoundArgsType contains the storage type for all the bound arguments by
2533 // (ab)using a function type.
2534 template <typename Runnable
, typename RunType
, typename BoundArgsType
>
2537 template <typename Runnable
, typename RunType
>
2538 struct BindState
<Runnable
, RunType
, void()> : public BindStateBase
{
2539 typedef Runnable RunnableType
;
2540 typedef false_type IsWeakCall
;
2541 typedef Invoker
<0, BindState
, RunType
> InvokerType
;
2542 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2543 explicit BindState(const Runnable
& runnable
)
2544 : runnable_(runnable
) {
2547 virtual ~BindState() { }
2549 RunnableType runnable_
;
2552 template <typename Runnable
, typename RunType
, typename P1
>
2553 struct BindState
<Runnable
, RunType
, void(P1
)> : public BindStateBase
{
2554 typedef Runnable RunnableType
;
2555 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2556 typedef Invoker
<1, BindState
, RunType
> InvokerType
;
2557 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2559 // Convenience typedefs for bound argument types.
2560 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2562 BindState(const Runnable
& runnable
, const P1
& p1
)
2563 : runnable_(runnable
),
2565 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2568 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2569 P1
>::Release(p1_
); }
2571 RunnableType runnable_
;
2575 template <typename Runnable
, typename RunType
, typename P1
, typename P2
>
2576 struct BindState
<Runnable
, RunType
, void(P1
, P2
)> : public BindStateBase
{
2577 typedef Runnable RunnableType
;
2578 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2579 typedef Invoker
<2, BindState
, RunType
> InvokerType
;
2580 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2582 // Convenience typedefs for bound argument types.
2583 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2584 typedef UnwrapTraits
<P2
> Bound2UnwrapTraits
;
2586 BindState(const Runnable
& runnable
, const P1
& p1
, const P2
& p2
)
2587 : runnable_(runnable
),
2590 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2593 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2594 P1
>::Release(p1_
); }
2596 RunnableType runnable_
;
2601 template <typename Runnable
, typename RunType
, typename P1
, typename P2
,
2603 struct BindState
<Runnable
, RunType
, void(P1
, P2
, P3
)> : public BindStateBase
{
2604 typedef Runnable RunnableType
;
2605 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2606 typedef Invoker
<3, BindState
, RunType
> InvokerType
;
2607 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2609 // Convenience typedefs for bound argument types.
2610 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2611 typedef UnwrapTraits
<P2
> Bound2UnwrapTraits
;
2612 typedef UnwrapTraits
<P3
> Bound3UnwrapTraits
;
2614 BindState(const Runnable
& runnable
, const P1
& p1
, const P2
& p2
, const P3
& p3
)
2615 : runnable_(runnable
),
2619 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2622 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2623 P1
>::Release(p1_
); }
2625 RunnableType runnable_
;
2631 template <typename Runnable
, typename RunType
, typename P1
, typename P2
,
2632 typename P3
, typename P4
>
2633 struct BindState
<Runnable
, RunType
, void(P1
, P2
, P3
,
2634 P4
)> : public BindStateBase
{
2635 typedef Runnable RunnableType
;
2636 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2637 typedef Invoker
<4, BindState
, RunType
> InvokerType
;
2638 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2640 // Convenience typedefs for bound argument types.
2641 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2642 typedef UnwrapTraits
<P2
> Bound2UnwrapTraits
;
2643 typedef UnwrapTraits
<P3
> Bound3UnwrapTraits
;
2644 typedef UnwrapTraits
<P4
> Bound4UnwrapTraits
;
2646 BindState(const Runnable
& runnable
, const P1
& p1
, const P2
& p2
, const P3
& p3
,
2648 : runnable_(runnable
),
2653 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2656 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2657 P1
>::Release(p1_
); }
2659 RunnableType runnable_
;
2666 template <typename Runnable
, typename RunType
, typename P1
, typename P2
,
2667 typename P3
, typename P4
, typename P5
>
2668 struct BindState
<Runnable
, RunType
, void(P1
, P2
, P3
, P4
,
2669 P5
)> : public BindStateBase
{
2670 typedef Runnable RunnableType
;
2671 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2672 typedef Invoker
<5, BindState
, RunType
> InvokerType
;
2673 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2675 // Convenience typedefs for bound argument types.
2676 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2677 typedef UnwrapTraits
<P2
> Bound2UnwrapTraits
;
2678 typedef UnwrapTraits
<P3
> Bound3UnwrapTraits
;
2679 typedef UnwrapTraits
<P4
> Bound4UnwrapTraits
;
2680 typedef UnwrapTraits
<P5
> Bound5UnwrapTraits
;
2682 BindState(const Runnable
& runnable
, const P1
& p1
, const P2
& p2
, const P3
& p3
,
2683 const P4
& p4
, const P5
& p5
)
2684 : runnable_(runnable
),
2690 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2693 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2694 P1
>::Release(p1_
); }
2696 RunnableType runnable_
;
2704 template <typename Runnable
, typename RunType
, typename P1
, typename P2
,
2705 typename P3
, typename P4
, typename P5
, typename P6
>
2706 struct BindState
<Runnable
, RunType
, void(P1
, P2
, P3
, P4
, P5
,
2707 P6
)> : public BindStateBase
{
2708 typedef Runnable RunnableType
;
2709 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2710 typedef Invoker
<6, BindState
, RunType
> InvokerType
;
2711 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2713 // Convenience typedefs for bound argument types.
2714 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2715 typedef UnwrapTraits
<P2
> Bound2UnwrapTraits
;
2716 typedef UnwrapTraits
<P3
> Bound3UnwrapTraits
;
2717 typedef UnwrapTraits
<P4
> Bound4UnwrapTraits
;
2718 typedef UnwrapTraits
<P5
> Bound5UnwrapTraits
;
2719 typedef UnwrapTraits
<P6
> Bound6UnwrapTraits
;
2721 BindState(const Runnable
& runnable
, const P1
& p1
, const P2
& p2
, const P3
& p3
,
2722 const P4
& p4
, const P5
& p5
, const P6
& p6
)
2723 : runnable_(runnable
),
2730 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2733 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2734 P1
>::Release(p1_
); }
2736 RunnableType runnable_
;
2745 template <typename Runnable
, typename RunType
, typename P1
, typename P2
,
2746 typename P3
, typename P4
, typename P5
, typename P6
, typename P7
>
2747 struct BindState
<Runnable
, RunType
, void(P1
, P2
, P3
, P4
, P5
, P6
,
2748 P7
)> : public BindStateBase
{
2749 typedef Runnable RunnableType
;
2750 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2751 typedef Invoker
<7, BindState
, RunType
> InvokerType
;
2752 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2754 // Convenience typedefs for bound argument types.
2755 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2756 typedef UnwrapTraits
<P2
> Bound2UnwrapTraits
;
2757 typedef UnwrapTraits
<P3
> Bound3UnwrapTraits
;
2758 typedef UnwrapTraits
<P4
> Bound4UnwrapTraits
;
2759 typedef UnwrapTraits
<P5
> Bound5UnwrapTraits
;
2760 typedef UnwrapTraits
<P6
> Bound6UnwrapTraits
;
2761 typedef UnwrapTraits
<P7
> Bound7UnwrapTraits
;
2763 BindState(const Runnable
& runnable
, const P1
& p1
, const P2
& p2
, const P3
& p3
,
2764 const P4
& p4
, const P5
& p5
, const P6
& p6
, const P7
& p7
)
2765 : runnable_(runnable
),
2773 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2776 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2777 P1
>::Release(p1_
); }
2779 RunnableType runnable_
;
2789 } // namespace internal
2792 #endif // BASE_BIND_INTERNAL_H_