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_
14 #include "base/bind_helpers.h"
15 #include "base/callback_internal.h"
16 #include "base/memory/raw_scoped_refptr_mismatch_checker.h"
17 #include "base/memory/weak_ptr.h"
18 #include "base/template_util.h"
19 #include "build/build_config.h"
22 #include "base/bind_internal_win.h"
29 // Runnable -- A type (really a type class) that has a single Run() method
30 // and a RunType typedef that corresponds to the type of Run().
31 // A Runnable can declare that it should treated like a method
32 // call by including a typedef named IsMethod. The value of
33 // this typedef is NOT inspected, only the existence. When a
34 // Runnable declares itself a method, Bind() will enforce special
35 // refcounting + WeakPtr handling semantics for the first
36 // parameter which is expected to be an object.
37 // Functor -- A copyable type representing something that should be called.
38 // All function pointers, Callback<>, and Runnables are functors
39 // even if the invocation syntax differs.
40 // RunType -- A function type (as opposed to function _pointer_ type) for
41 // a Run() function. Usually just a convenience typedef.
42 // (Bound)ArgsType -- A function type that is being (ab)used to store the
43 // types of set of arguments. The "return" type is always
44 // void here. We use this hack so that we do not need
45 // a new type name for each arity of type. (eg.,
46 // BindState1, BindState2). This makes forward
47 // declarations and friending much much easier.
50 // RunnableAdapter<> -- Wraps the various "function" pointer types into an
51 // object that adheres to the Runnable interface.
52 // There are |3*ARITY| RunnableAdapter types.
53 // FunctionTraits<> -- Type traits that unwrap a function signature into a
54 // a set of easier to use typedefs. Used mainly for
55 // compile time asserts.
56 // There are |ARITY| FunctionTraits types.
57 // ForceVoidReturn<> -- Helper class for translating function signatures to
58 // equivalent forms with a "void" return type.
59 // There are |ARITY| ForceVoidReturn types.
60 // FunctorTraits<> -- Type traits used determine the correct RunType and
61 // RunnableType for a Functor. This is where function
62 // signature adapters are applied.
63 // There are |ARITY| ForceVoidReturn types.
64 // MakeRunnable<> -- Takes a Functor and returns an object in the Runnable
65 // type class that represents the underlying Functor.
66 // There are |O(1)| MakeRunnable types.
67 // InvokeHelper<> -- Take a Runnable + arguments and actully invokes it.
68 // Handle the differing syntaxes needed for WeakPtr<> support,
69 // and for ignoring return values. This is separate from
70 // Invoker to avoid creating multiple version of Invoker<>
71 // which grows at O(n^2) with the arity.
72 // There are |k*ARITY| InvokeHelper types.
73 // Invoker<> -- Unwraps the curried parameters and executes the Runnable.
74 // There are |(ARITY^2 + ARITY)/2| Invoketypes.
75 // BindState<> -- Stores the curried parameters, and is the main entry point
76 // into the Bind() system, doing most of the type resolution.
77 // There are ARITY BindState types.
81 // The RunnableAdapter<> templates provide a uniform interface for invoking
82 // a function pointer, method pointer, or const method pointer. The adapter
83 // exposes a Run() method with an appropriate signature. Using this wrapper
84 // allows for writing code that supports all three pointer types without
85 // undue repetition. Without it, a lot of code would need to be repeated 3
88 // For method pointers and const method pointers the first argument to Run()
89 // is considered to be the received of the method. This is similar to STL's
92 // This class also exposes a RunType typedef that is the function type of the
95 // If and only if the wrapper contains a method or const method pointer, an
96 // IsMethod typedef is exposed. The existence of this typedef (NOT the value)
97 // marks that the wrapper should be considered a method wrapper.
99 template <typename Functor
>
100 class RunnableAdapter
;
102 // Function: Arity 0.
103 template <typename R
>
104 class RunnableAdapter
<R(*)()> {
106 typedef R (RunType
)();
108 explicit RunnableAdapter(R(*function
)())
109 : function_(function
) {
121 template <typename R
, typename T
>
122 class RunnableAdapter
<R(T::*)()> {
124 typedef R (RunType
)(T
*);
125 typedef true_type IsMethod
;
127 explicit RunnableAdapter(R(T::*method
)())
132 return (object
->*method_
)();
139 // Const Method: Arity 0.
140 template <typename R
, typename T
>
141 class RunnableAdapter
<R(T::*)() const> {
143 typedef R (RunType
)(const T
*);
144 typedef true_type IsMethod
;
146 explicit RunnableAdapter(R(T::*method
)() const)
150 R
Run(const T
* object
) {
151 return (object
->*method_
)();
155 R (T::*method_
)() const;
158 // Function: Arity 1.
159 template <typename R
, typename A1
>
160 class RunnableAdapter
<R(*)(A1
)> {
162 typedef R (RunType
)(A1
);
164 explicit RunnableAdapter(R(*function
)(A1
))
165 : function_(function
) {
168 R
Run(typename CallbackParamTraits
<A1
>::ForwardType a1
) {
169 return function_(CallbackForward(a1
));
177 template <typename R
, typename T
, typename A1
>
178 class RunnableAdapter
<R(T::*)(A1
)> {
180 typedef R (RunType
)(T
*, A1
);
181 typedef true_type IsMethod
;
183 explicit RunnableAdapter(R(T::*method
)(A1
))
187 R
Run(T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
) {
188 return (object
->*method_
)(CallbackForward(a1
));
195 // Const Method: Arity 1.
196 template <typename R
, typename T
, typename A1
>
197 class RunnableAdapter
<R(T::*)(A1
) const> {
199 typedef R (RunType
)(const T
*, A1
);
200 typedef true_type IsMethod
;
202 explicit RunnableAdapter(R(T::*method
)(A1
) const)
206 R
Run(const T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
) {
207 return (object
->*method_
)(CallbackForward(a1
));
211 R (T::*method_
)(A1
) const;
214 // Function: Arity 2.
215 template <typename R
, typename A1
, typename A2
>
216 class RunnableAdapter
<R(*)(A1
, A2
)> {
218 typedef R (RunType
)(A1
, A2
);
220 explicit RunnableAdapter(R(*function
)(A1
, A2
))
221 : function_(function
) {
224 R
Run(typename CallbackParamTraits
<A1
>::ForwardType a1
,
225 typename CallbackParamTraits
<A2
>::ForwardType a2
) {
226 return function_(CallbackForward(a1
), CallbackForward(a2
));
230 R (*function_
)(A1
, A2
);
234 template <typename R
, typename T
, typename A1
, typename A2
>
235 class RunnableAdapter
<R(T::*)(A1
, A2
)> {
237 typedef R (RunType
)(T
*, A1
, A2
);
238 typedef true_type IsMethod
;
240 explicit RunnableAdapter(R(T::*method
)(A1
, A2
))
244 R
Run(T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
245 typename CallbackParamTraits
<A2
>::ForwardType a2
) {
246 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
));
250 R (T::*method_
)(A1
, A2
);
253 // Const Method: Arity 2.
254 template <typename R
, typename T
, typename A1
, typename A2
>
255 class RunnableAdapter
<R(T::*)(A1
, A2
) const> {
257 typedef R (RunType
)(const T
*, A1
, A2
);
258 typedef true_type IsMethod
;
260 explicit RunnableAdapter(R(T::*method
)(A1
, A2
) const)
264 R
Run(const T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
265 typename CallbackParamTraits
<A2
>::ForwardType a2
) {
266 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
));
270 R (T::*method_
)(A1
, A2
) const;
273 // Function: Arity 3.
274 template <typename R
, typename A1
, typename A2
, typename A3
>
275 class RunnableAdapter
<R(*)(A1
, A2
, A3
)> {
277 typedef R (RunType
)(A1
, A2
, A3
);
279 explicit RunnableAdapter(R(*function
)(A1
, A2
, A3
))
280 : function_(function
) {
283 R
Run(typename CallbackParamTraits
<A1
>::ForwardType a1
,
284 typename CallbackParamTraits
<A2
>::ForwardType a2
,
285 typename CallbackParamTraits
<A3
>::ForwardType a3
) {
286 return function_(CallbackForward(a1
), CallbackForward(a2
),
287 CallbackForward(a3
));
291 R (*function_
)(A1
, A2
, A3
);
295 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
>
296 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
)> {
298 typedef R (RunType
)(T
*, A1
, A2
, A3
);
299 typedef true_type IsMethod
;
301 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
))
305 R
Run(T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
306 typename CallbackParamTraits
<A2
>::ForwardType a2
,
307 typename CallbackParamTraits
<A3
>::ForwardType a3
) {
308 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
309 CallbackForward(a3
));
313 R (T::*method_
)(A1
, A2
, A3
);
316 // Const Method: Arity 3.
317 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
>
318 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
) const> {
320 typedef R (RunType
)(const T
*, A1
, A2
, A3
);
321 typedef true_type IsMethod
;
323 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
) const)
327 R
Run(const T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
328 typename CallbackParamTraits
<A2
>::ForwardType a2
,
329 typename CallbackParamTraits
<A3
>::ForwardType a3
) {
330 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
331 CallbackForward(a3
));
335 R (T::*method_
)(A1
, A2
, A3
) const;
338 // Function: Arity 4.
339 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
>
340 class RunnableAdapter
<R(*)(A1
, A2
, A3
, A4
)> {
342 typedef R (RunType
)(A1
, A2
, A3
, A4
);
344 explicit RunnableAdapter(R(*function
)(A1
, A2
, A3
, A4
))
345 : function_(function
) {
348 R
Run(typename CallbackParamTraits
<A1
>::ForwardType a1
,
349 typename CallbackParamTraits
<A2
>::ForwardType a2
,
350 typename CallbackParamTraits
<A3
>::ForwardType a3
,
351 typename CallbackParamTraits
<A4
>::ForwardType a4
) {
352 return function_(CallbackForward(a1
), CallbackForward(a2
),
353 CallbackForward(a3
), CallbackForward(a4
));
357 R (*function_
)(A1
, A2
, A3
, A4
);
361 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
,
363 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
, A4
)> {
365 typedef R (RunType
)(T
*, A1
, A2
, A3
, A4
);
366 typedef true_type IsMethod
;
368 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
, A4
))
372 R
Run(T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
373 typename CallbackParamTraits
<A2
>::ForwardType a2
,
374 typename CallbackParamTraits
<A3
>::ForwardType a3
,
375 typename CallbackParamTraits
<A4
>::ForwardType a4
) {
376 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
377 CallbackForward(a3
), CallbackForward(a4
));
381 R (T::*method_
)(A1
, A2
, A3
, A4
);
384 // Const Method: Arity 4.
385 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
,
387 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
, A4
) const> {
389 typedef R (RunType
)(const T
*, A1
, A2
, A3
, A4
);
390 typedef true_type IsMethod
;
392 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
, A4
) const)
396 R
Run(const T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
397 typename CallbackParamTraits
<A2
>::ForwardType a2
,
398 typename CallbackParamTraits
<A3
>::ForwardType a3
,
399 typename CallbackParamTraits
<A4
>::ForwardType a4
) {
400 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
401 CallbackForward(a3
), CallbackForward(a4
));
405 R (T::*method_
)(A1
, A2
, A3
, A4
) const;
408 // Function: Arity 5.
409 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
411 class RunnableAdapter
<R(*)(A1
, A2
, A3
, A4
, A5
)> {
413 typedef R (RunType
)(A1
, A2
, A3
, A4
, A5
);
415 explicit RunnableAdapter(R(*function
)(A1
, A2
, A3
, A4
, A5
))
416 : function_(function
) {
419 R
Run(typename CallbackParamTraits
<A1
>::ForwardType a1
,
420 typename CallbackParamTraits
<A2
>::ForwardType a2
,
421 typename CallbackParamTraits
<A3
>::ForwardType a3
,
422 typename CallbackParamTraits
<A4
>::ForwardType a4
,
423 typename CallbackParamTraits
<A5
>::ForwardType a5
) {
424 return function_(CallbackForward(a1
), CallbackForward(a2
),
425 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
));
429 R (*function_
)(A1
, A2
, A3
, A4
, A5
);
433 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
,
434 typename A4
, typename A5
>
435 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
, A4
, A5
)> {
437 typedef R (RunType
)(T
*, A1
, A2
, A3
, A4
, A5
);
438 typedef true_type IsMethod
;
440 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
, A4
, A5
))
444 R
Run(T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
445 typename CallbackParamTraits
<A2
>::ForwardType a2
,
446 typename CallbackParamTraits
<A3
>::ForwardType a3
,
447 typename CallbackParamTraits
<A4
>::ForwardType a4
,
448 typename CallbackParamTraits
<A5
>::ForwardType a5
) {
449 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
450 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
));
454 R (T::*method_
)(A1
, A2
, A3
, A4
, A5
);
457 // Const Method: Arity 5.
458 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
,
459 typename A4
, typename A5
>
460 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
, A4
, A5
) const> {
462 typedef R (RunType
)(const T
*, A1
, A2
, A3
, A4
, A5
);
463 typedef true_type IsMethod
;
465 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
, A4
, A5
) const)
469 R
Run(const T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
470 typename CallbackParamTraits
<A2
>::ForwardType a2
,
471 typename CallbackParamTraits
<A3
>::ForwardType a3
,
472 typename CallbackParamTraits
<A4
>::ForwardType a4
,
473 typename CallbackParamTraits
<A5
>::ForwardType a5
) {
474 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
475 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
));
479 R (T::*method_
)(A1
, A2
, A3
, A4
, A5
) const;
482 // Function: Arity 6.
483 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
484 typename A5
, typename A6
>
485 class RunnableAdapter
<R(*)(A1
, A2
, A3
, A4
, A5
, A6
)> {
487 typedef R (RunType
)(A1
, A2
, A3
, A4
, A5
, A6
);
489 explicit RunnableAdapter(R(*function
)(A1
, A2
, A3
, A4
, A5
, A6
))
490 : function_(function
) {
493 R
Run(typename CallbackParamTraits
<A1
>::ForwardType a1
,
494 typename CallbackParamTraits
<A2
>::ForwardType a2
,
495 typename CallbackParamTraits
<A3
>::ForwardType a3
,
496 typename CallbackParamTraits
<A4
>::ForwardType a4
,
497 typename CallbackParamTraits
<A5
>::ForwardType a5
,
498 typename CallbackParamTraits
<A6
>::ForwardType a6
) {
499 return function_(CallbackForward(a1
), CallbackForward(a2
),
500 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
),
501 CallbackForward(a6
));
505 R (*function_
)(A1
, A2
, A3
, A4
, A5
, A6
);
509 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
,
510 typename A4
, typename A5
, typename A6
>
511 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
, A4
, A5
, A6
)> {
513 typedef R (RunType
)(T
*, A1
, A2
, A3
, A4
, A5
, A6
);
514 typedef true_type IsMethod
;
516 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
, A4
, A5
, A6
))
520 R
Run(T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
521 typename CallbackParamTraits
<A2
>::ForwardType a2
,
522 typename CallbackParamTraits
<A3
>::ForwardType a3
,
523 typename CallbackParamTraits
<A4
>::ForwardType a4
,
524 typename CallbackParamTraits
<A5
>::ForwardType a5
,
525 typename CallbackParamTraits
<A6
>::ForwardType a6
) {
526 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
527 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
),
528 CallbackForward(a6
));
532 R (T::*method_
)(A1
, A2
, A3
, A4
, A5
, A6
);
535 // Const Method: Arity 6.
536 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
,
537 typename A4
, typename A5
, typename A6
>
538 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
, A4
, A5
, A6
) const> {
540 typedef R (RunType
)(const T
*, A1
, A2
, A3
, A4
, A5
, A6
);
541 typedef true_type IsMethod
;
543 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
, A4
, A5
, A6
) const)
547 R
Run(const T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
548 typename CallbackParamTraits
<A2
>::ForwardType a2
,
549 typename CallbackParamTraits
<A3
>::ForwardType a3
,
550 typename CallbackParamTraits
<A4
>::ForwardType a4
,
551 typename CallbackParamTraits
<A5
>::ForwardType a5
,
552 typename CallbackParamTraits
<A6
>::ForwardType a6
) {
553 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
554 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
),
555 CallbackForward(a6
));
559 R (T::*method_
)(A1
, A2
, A3
, A4
, A5
, A6
) const;
562 // Function: Arity 7.
563 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
564 typename A5
, typename A6
, typename A7
>
565 class RunnableAdapter
<R(*)(A1
, A2
, A3
, A4
, A5
, A6
, A7
)> {
567 typedef R (RunType
)(A1
, A2
, A3
, A4
, A5
, A6
, A7
);
569 explicit RunnableAdapter(R(*function
)(A1
, A2
, A3
, A4
, A5
, A6
, A7
))
570 : function_(function
) {
573 R
Run(typename CallbackParamTraits
<A1
>::ForwardType a1
,
574 typename CallbackParamTraits
<A2
>::ForwardType a2
,
575 typename CallbackParamTraits
<A3
>::ForwardType a3
,
576 typename CallbackParamTraits
<A4
>::ForwardType a4
,
577 typename CallbackParamTraits
<A5
>::ForwardType a5
,
578 typename CallbackParamTraits
<A6
>::ForwardType a6
,
579 typename CallbackParamTraits
<A7
>::ForwardType a7
) {
580 return function_(CallbackForward(a1
), CallbackForward(a2
),
581 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
),
582 CallbackForward(a6
), CallbackForward(a7
));
586 R (*function_
)(A1
, A2
, A3
, A4
, A5
, A6
, A7
);
590 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
,
591 typename A4
, typename A5
, typename A6
, typename A7
>
592 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
, A4
, A5
, A6
, A7
)> {
594 typedef R (RunType
)(T
*, A1
, A2
, A3
, A4
, A5
, A6
, A7
);
595 typedef true_type IsMethod
;
597 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
, A4
, A5
, A6
, A7
))
601 R
Run(T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
602 typename CallbackParamTraits
<A2
>::ForwardType a2
,
603 typename CallbackParamTraits
<A3
>::ForwardType a3
,
604 typename CallbackParamTraits
<A4
>::ForwardType a4
,
605 typename CallbackParamTraits
<A5
>::ForwardType a5
,
606 typename CallbackParamTraits
<A6
>::ForwardType a6
,
607 typename CallbackParamTraits
<A7
>::ForwardType a7
) {
608 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
609 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
),
610 CallbackForward(a6
), CallbackForward(a7
));
614 R (T::*method_
)(A1
, A2
, A3
, A4
, A5
, A6
, A7
);
617 // Const Method: Arity 7.
618 template <typename R
, typename T
, typename A1
, typename A2
, typename A3
,
619 typename A4
, typename A5
, typename A6
, typename A7
>
620 class RunnableAdapter
<R(T::*)(A1
, A2
, A3
, A4
, A5
, A6
, A7
) const> {
622 typedef R (RunType
)(const T
*, A1
, A2
, A3
, A4
, A5
, A6
, A7
);
623 typedef true_type IsMethod
;
625 explicit RunnableAdapter(R(T::*method
)(A1
, A2
, A3
, A4
, A5
, A6
, A7
) const)
629 R
Run(const T
* object
, typename CallbackParamTraits
<A1
>::ForwardType a1
,
630 typename CallbackParamTraits
<A2
>::ForwardType a2
,
631 typename CallbackParamTraits
<A3
>::ForwardType a3
,
632 typename CallbackParamTraits
<A4
>::ForwardType a4
,
633 typename CallbackParamTraits
<A5
>::ForwardType a5
,
634 typename CallbackParamTraits
<A6
>::ForwardType a6
,
635 typename CallbackParamTraits
<A7
>::ForwardType a7
) {
636 return (object
->*method_
)(CallbackForward(a1
), CallbackForward(a2
),
637 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
),
638 CallbackForward(a6
), CallbackForward(a7
));
642 R (T::*method_
)(A1
, A2
, A3
, A4
, A5
, A6
, A7
) const;
648 // Breaks a function signature apart into typedefs for easier introspection.
649 template <typename Sig
>
650 struct FunctionTraits
;
652 template <typename R
>
653 struct FunctionTraits
<R()> {
654 typedef R ReturnType
;
657 template <typename R
, typename A1
>
658 struct FunctionTraits
<R(A1
)> {
659 typedef R ReturnType
;
663 template <typename R
, typename A1
, typename A2
>
664 struct FunctionTraits
<R(A1
, A2
)> {
665 typedef R ReturnType
;
670 template <typename R
, typename A1
, typename A2
, typename A3
>
671 struct FunctionTraits
<R(A1
, A2
, A3
)> {
672 typedef R ReturnType
;
678 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
>
679 struct FunctionTraits
<R(A1
, A2
, A3
, A4
)> {
680 typedef R ReturnType
;
687 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
689 struct FunctionTraits
<R(A1
, A2
, A3
, A4
, A5
)> {
690 typedef R ReturnType
;
698 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
699 typename A5
, typename A6
>
700 struct FunctionTraits
<R(A1
, A2
, A3
, A4
, A5
, A6
)> {
701 typedef R ReturnType
;
710 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
711 typename A5
, typename A6
, typename A7
>
712 struct FunctionTraits
<R(A1
, A2
, A3
, A4
, A5
, A6
, A7
)> {
713 typedef R ReturnType
;
726 // Set of templates that support forcing the function return type to void.
727 template <typename Sig
>
728 struct ForceVoidReturn
;
730 template <typename R
>
731 struct ForceVoidReturn
<R()> {
732 typedef void(RunType
)();
735 template <typename R
, typename A1
>
736 struct ForceVoidReturn
<R(A1
)> {
737 typedef void(RunType
)(A1
);
740 template <typename R
, typename A1
, typename A2
>
741 struct ForceVoidReturn
<R(A1
, A2
)> {
742 typedef void(RunType
)(A1
, A2
);
745 template <typename R
, typename A1
, typename A2
, typename A3
>
746 struct ForceVoidReturn
<R(A1
, A2
, A3
)> {
747 typedef void(RunType
)(A1
, A2
, A3
);
750 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
>
751 struct ForceVoidReturn
<R(A1
, A2
, A3
, A4
)> {
752 typedef void(RunType
)(A1
, A2
, A3
, A4
);
755 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
757 struct ForceVoidReturn
<R(A1
, A2
, A3
, A4
, A5
)> {
758 typedef void(RunType
)(A1
, A2
, A3
, A4
, A5
);
761 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
762 typename A5
, typename A6
>
763 struct ForceVoidReturn
<R(A1
, A2
, A3
, A4
, A5
, A6
)> {
764 typedef void(RunType
)(A1
, A2
, A3
, A4
, A5
, A6
);
767 template <typename R
, typename A1
, typename A2
, typename A3
, typename A4
,
768 typename A5
, typename A6
, typename A7
>
769 struct ForceVoidReturn
<R(A1
, A2
, A3
, A4
, A5
, A6
, A7
)> {
770 typedef void(RunType
)(A1
, A2
, A3
, A4
, A5
, A6
, A7
);
776 // See description at top of file.
777 template <typename T
>
778 struct FunctorTraits
{
779 typedef RunnableAdapter
<T
> RunnableType
;
780 typedef typename
RunnableType::RunType RunType
;
783 template <typename T
>
784 struct FunctorTraits
<IgnoreResultHelper
<T
> > {
785 typedef typename FunctorTraits
<T
>::RunnableType RunnableType
;
786 typedef typename ForceVoidReturn
<
787 typename
RunnableType::RunType
>::RunType RunType
;
790 template <typename T
>
791 struct FunctorTraits
<Callback
<T
> > {
792 typedef Callback
<T
> RunnableType
;
793 typedef typename Callback
<T
>::RunType RunType
;
799 // Converts a passed in functor to a RunnableType using type inference.
801 template <typename T
>
802 typename FunctorTraits
<T
>::RunnableType
MakeRunnable(const T
& t
) {
803 return RunnableAdapter
<T
>(t
);
806 template <typename T
>
807 typename FunctorTraits
<T
>::RunnableType
808 MakeRunnable(const IgnoreResultHelper
<T
>& t
) {
809 return MakeRunnable(t
.functor_
);
812 template <typename T
>
813 const typename FunctorTraits
<Callback
<T
> >::RunnableType
&
814 MakeRunnable(const Callback
<T
>& t
) {
821 // There are 3 logical InvokeHelper<> specializations: normal, void-return,
824 // The normal type just calls the underlying runnable.
826 // We need a InvokeHelper to handle void return types in order to support
827 // IgnoreResult(). Normally, if the Runnable's RunType had a void return,
828 // the template system would just accept "return functor.Run()" ignoring
829 // the fact that a void function is being used with return. This piece of
830 // sugar breaks though when the Runnable's RunType is not void. Thus, we
831 // need a partial specialization to change the syntax to drop the "return"
832 // from the invocation call.
834 // WeakCalls similarly need special syntax that is applied to the first
835 // argument to check if they should no-op themselves.
836 template <bool IsWeakCall
, typename ReturnType
, typename Runnable
,
840 template <typename ReturnType
, typename Runnable
>
841 struct InvokeHelper
<false, ReturnType
, Runnable
,
843 static ReturnType
MakeItSo(Runnable runnable
) {
844 return runnable
.Run();
848 template <typename Runnable
>
849 struct InvokeHelper
<false, void, Runnable
,
851 static void MakeItSo(Runnable runnable
) {
856 template <typename ReturnType
, typename Runnable
,typename A1
>
857 struct InvokeHelper
<false, ReturnType
, Runnable
,
859 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
) {
860 return runnable
.Run(CallbackForward(a1
));
864 template <typename Runnable
,typename A1
>
865 struct InvokeHelper
<false, void, Runnable
,
867 static void MakeItSo(Runnable runnable
, A1 a1
) {
868 runnable
.Run(CallbackForward(a1
));
872 template <typename Runnable
, typename A1
>
873 struct InvokeHelper
<true, void, Runnable
,
875 static void MakeItSo(Runnable runnable
, A1 a1
) {
880 runnable
.Run(CallbackForward(a1
));
884 template <typename ReturnType
, typename Runnable
,typename A1
, typename A2
>
885 struct InvokeHelper
<false, ReturnType
, Runnable
,
887 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
, A2 a2
) {
888 return runnable
.Run(CallbackForward(a1
), CallbackForward(a2
));
892 template <typename Runnable
,typename A1
, typename A2
>
893 struct InvokeHelper
<false, void, Runnable
,
895 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
) {
896 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
));
900 template <typename Runnable
, typename A1
, typename A2
>
901 struct InvokeHelper
<true, void, Runnable
,
903 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
) {
908 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
));
912 template <typename ReturnType
, typename Runnable
,typename A1
, typename A2
,
914 struct InvokeHelper
<false, ReturnType
, Runnable
,
916 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
) {
917 return runnable
.Run(CallbackForward(a1
), CallbackForward(a2
),
918 CallbackForward(a3
));
922 template <typename Runnable
,typename A1
, typename A2
, typename A3
>
923 struct InvokeHelper
<false, void, Runnable
,
925 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
) {
926 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
));
930 template <typename Runnable
, typename A1
, typename A2
, typename A3
>
931 struct InvokeHelper
<true, void, Runnable
,
933 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
) {
938 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
));
942 template <typename ReturnType
, typename Runnable
,typename A1
, typename A2
,
943 typename A3
, typename A4
>
944 struct InvokeHelper
<false, ReturnType
, Runnable
,
945 void(A1
, A2
, A3
, A4
)> {
946 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
) {
947 return runnable
.Run(CallbackForward(a1
), CallbackForward(a2
),
948 CallbackForward(a3
), CallbackForward(a4
));
952 template <typename Runnable
,typename A1
, typename A2
, typename A3
, typename A4
>
953 struct InvokeHelper
<false, void, Runnable
,
954 void(A1
, A2
, A3
, A4
)> {
955 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
) {
956 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
957 CallbackForward(a4
));
961 template <typename Runnable
, typename A1
, typename A2
, typename A3
, typename A4
>
962 struct InvokeHelper
<true, void, Runnable
,
963 void(A1
, A2
, A3
, A4
)> {
964 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
) {
969 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
970 CallbackForward(a4
));
974 template <typename ReturnType
, typename Runnable
,typename A1
, typename A2
,
975 typename A3
, typename A4
, typename A5
>
976 struct InvokeHelper
<false, ReturnType
, Runnable
,
977 void(A1
, A2
, A3
, A4
, A5
)> {
978 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
,
980 return runnable
.Run(CallbackForward(a1
), CallbackForward(a2
),
981 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
));
985 template <typename Runnable
,typename A1
, typename A2
, typename A3
, typename A4
,
987 struct InvokeHelper
<false, void, Runnable
,
988 void(A1
, A2
, A3
, A4
, A5
)> {
989 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
, A5 a5
) {
990 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
991 CallbackForward(a4
), CallbackForward(a5
));
995 template <typename Runnable
, typename A1
, typename A2
, typename A3
,
996 typename A4
, typename A5
>
997 struct InvokeHelper
<true, void, Runnable
,
998 void(A1
, A2
, A3
, A4
, A5
)> {
999 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
, A5 a5
) {
1004 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
1005 CallbackForward(a4
), CallbackForward(a5
));
1009 template <typename ReturnType
, typename Runnable
,typename A1
, typename A2
,
1010 typename A3
, typename A4
, typename A5
, typename A6
>
1011 struct InvokeHelper
<false, ReturnType
, Runnable
,
1012 void(A1
, A2
, A3
, A4
, A5
, A6
)> {
1013 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
,
1015 return runnable
.Run(CallbackForward(a1
), CallbackForward(a2
),
1016 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
),
1017 CallbackForward(a6
));
1021 template <typename Runnable
,typename A1
, typename A2
, typename A3
, typename A4
,
1022 typename A5
, typename A6
>
1023 struct InvokeHelper
<false, void, Runnable
,
1024 void(A1
, A2
, A3
, A4
, A5
, A6
)> {
1025 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
, A5 a5
,
1027 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
1028 CallbackForward(a4
), CallbackForward(a5
), CallbackForward(a6
));
1032 template <typename Runnable
, typename A1
, typename A2
, typename A3
,
1033 typename A4
, typename A5
, typename A6
>
1034 struct InvokeHelper
<true, void, Runnable
,
1035 void(A1
, A2
, A3
, A4
, A5
, A6
)> {
1036 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
, A5 a5
,
1042 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
1043 CallbackForward(a4
), CallbackForward(a5
), CallbackForward(a6
));
1047 template <typename ReturnType
, typename Runnable
,typename A1
, typename A2
,
1048 typename A3
, typename A4
, typename A5
, typename A6
, typename A7
>
1049 struct InvokeHelper
<false, ReturnType
, Runnable
,
1050 void(A1
, A2
, A3
, A4
, A5
, A6
, A7
)> {
1051 static ReturnType
MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
,
1052 A5 a5
, A6 a6
, A7 a7
) {
1053 return runnable
.Run(CallbackForward(a1
), CallbackForward(a2
),
1054 CallbackForward(a3
), CallbackForward(a4
), CallbackForward(a5
),
1055 CallbackForward(a6
), CallbackForward(a7
));
1059 template <typename Runnable
,typename A1
, typename A2
, typename A3
, typename A4
,
1060 typename A5
, typename A6
, typename A7
>
1061 struct InvokeHelper
<false, void, Runnable
,
1062 void(A1
, A2
, A3
, A4
, A5
, A6
, A7
)> {
1063 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
, A5 a5
,
1065 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
1066 CallbackForward(a4
), CallbackForward(a5
), CallbackForward(a6
),
1067 CallbackForward(a7
));
1071 template <typename Runnable
, typename A1
, typename A2
, typename A3
,
1072 typename A4
, typename A5
, typename A6
, typename A7
>
1073 struct InvokeHelper
<true, void, Runnable
,
1074 void(A1
, A2
, A3
, A4
, A5
, A6
, A7
)> {
1075 static void MakeItSo(Runnable runnable
, A1 a1
, A2 a2
, A3 a3
, A4 a4
, A5 a5
,
1081 runnable
.Run(CallbackForward(a1
), CallbackForward(a2
), CallbackForward(a3
),
1082 CallbackForward(a4
), CallbackForward(a5
), CallbackForward(a6
),
1083 CallbackForward(a7
));
1087 #if !defined(_MSC_VER)
1089 template <typename ReturnType
, typename Runnable
, typename ArgsType
>
1090 struct InvokeHelper
<true, ReturnType
, Runnable
, ArgsType
> {
1091 // WeakCalls are only supported for functions with a void return type.
1092 // Otherwise, the function result would be undefined if the the WeakPtr<>
1094 COMPILE_ASSERT(is_void
<ReturnType
>::value
,
1095 weak_ptrs_can_only_bind_to_methods_without_return_values
);
1102 // See description at the top of the file.
1103 template <int NumBound
, typename Storage
, typename RunType
>
1107 template <typename StorageType
, typename R
>
1108 struct Invoker
<0, StorageType
, R()> {
1109 typedef R(RunType
)(BindStateBase
*);
1111 typedef R(UnboundRunType
)();
1113 static R
Run(BindStateBase
* base
) {
1114 StorageType
* storage
= static_cast<StorageType
*>(base
);
1116 // Local references to make debugger stepping easier. If in a debugger,
1117 // you really want to warp ahead and step through the
1118 // InvokeHelper<>::MakeItSo() call below.
1120 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1121 typename
StorageType::RunnableType
,
1123 ::MakeItSo(storage
->runnable_
);
1128 template <typename StorageType
, typename R
,typename X1
>
1129 struct Invoker
<0, StorageType
, R(X1
)> {
1130 typedef R(RunType
)(BindStateBase
*,
1131 typename CallbackParamTraits
<X1
>::ForwardType
);
1133 typedef R(UnboundRunType
)(X1
);
1135 static R
Run(BindStateBase
* base
,
1136 typename CallbackParamTraits
<X1
>::ForwardType x1
) {
1137 StorageType
* storage
= static_cast<StorageType
*>(base
);
1139 // Local references to make debugger stepping easier. If in a debugger,
1140 // you really want to warp ahead and step through the
1141 // InvokeHelper<>::MakeItSo() call below.
1143 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1144 typename
StorageType::RunnableType
,
1145 void(typename CallbackParamTraits
<X1
>::ForwardType x1
)>
1146 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
));
1151 template <typename StorageType
, typename R
,typename X1
>
1152 struct Invoker
<1, StorageType
, R(X1
)> {
1153 typedef R(RunType
)(BindStateBase
*);
1155 typedef R(UnboundRunType
)();
1157 static R
Run(BindStateBase
* base
) {
1158 StorageType
* storage
= static_cast<StorageType
*>(base
);
1160 // Local references to make debugger stepping easier. If in a debugger,
1161 // you really want to warp ahead and step through the
1162 // InvokeHelper<>::MakeItSo() call below.
1163 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1165 typename
Bound1UnwrapTraits::ForwardType x1
=
1166 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1167 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1168 typename
StorageType::RunnableType
,
1169 void(typename
Bound1UnwrapTraits::ForwardType
)>
1170 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
));
1175 template <typename StorageType
, typename R
,typename X1
, typename X2
>
1176 struct Invoker
<0, StorageType
, R(X1
, X2
)> {
1177 typedef R(RunType
)(BindStateBase
*,
1178 typename CallbackParamTraits
<X1
>::ForwardType
,
1179 typename CallbackParamTraits
<X2
>::ForwardType
);
1181 typedef R(UnboundRunType
)(X1
, X2
);
1183 static R
Run(BindStateBase
* base
,
1184 typename CallbackParamTraits
<X1
>::ForwardType x1
,
1185 typename CallbackParamTraits
<X2
>::ForwardType x2
) {
1186 StorageType
* storage
= static_cast<StorageType
*>(base
);
1188 // Local references to make debugger stepping easier. If in a debugger,
1189 // you really want to warp ahead and step through the
1190 // InvokeHelper<>::MakeItSo() call below.
1192 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1193 typename
StorageType::RunnableType
,
1194 void(typename CallbackParamTraits
<X1
>::ForwardType x1
,
1195 typename CallbackParamTraits
<X2
>::ForwardType x2
)>
1196 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1197 CallbackForward(x2
));
1202 template <typename StorageType
, typename R
,typename X1
, typename X2
>
1203 struct Invoker
<1, StorageType
, R(X1
, X2
)> {
1204 typedef R(RunType
)(BindStateBase
*,
1205 typename CallbackParamTraits
<X2
>::ForwardType
);
1207 typedef R(UnboundRunType
)(X2
);
1209 static R
Run(BindStateBase
* base
,
1210 typename CallbackParamTraits
<X2
>::ForwardType x2
) {
1211 StorageType
* storage
= static_cast<StorageType
*>(base
);
1213 // Local references to make debugger stepping easier. If in a debugger,
1214 // you really want to warp ahead and step through the
1215 // InvokeHelper<>::MakeItSo() call below.
1216 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1218 typename
Bound1UnwrapTraits::ForwardType x1
=
1219 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1220 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1221 typename
StorageType::RunnableType
,
1222 void(typename
Bound1UnwrapTraits::ForwardType
,
1223 typename CallbackParamTraits
<X2
>::ForwardType x2
)>
1224 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1225 CallbackForward(x2
));
1230 template <typename StorageType
, typename R
,typename X1
, typename X2
>
1231 struct Invoker
<2, StorageType
, R(X1
, X2
)> {
1232 typedef R(RunType
)(BindStateBase
*);
1234 typedef R(UnboundRunType
)();
1236 static R
Run(BindStateBase
* base
) {
1237 StorageType
* storage
= static_cast<StorageType
*>(base
);
1239 // Local references to make debugger stepping easier. If in a debugger,
1240 // you really want to warp ahead and step through the
1241 // InvokeHelper<>::MakeItSo() call below.
1242 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1243 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1245 typename
Bound1UnwrapTraits::ForwardType x1
=
1246 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1247 typename
Bound2UnwrapTraits::ForwardType x2
=
1248 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1249 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1250 typename
StorageType::RunnableType
,
1251 void(typename
Bound1UnwrapTraits::ForwardType
,
1252 typename
Bound2UnwrapTraits::ForwardType
)>
1253 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1254 CallbackForward(x2
));
1259 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1261 struct Invoker
<0, StorageType
, R(X1
, X2
, X3
)> {
1262 typedef R(RunType
)(BindStateBase
*,
1263 typename CallbackParamTraits
<X1
>::ForwardType
,
1264 typename CallbackParamTraits
<X2
>::ForwardType
,
1265 typename CallbackParamTraits
<X3
>::ForwardType
);
1267 typedef R(UnboundRunType
)(X1
, X2
, X3
);
1269 static R
Run(BindStateBase
* base
,
1270 typename CallbackParamTraits
<X1
>::ForwardType x1
,
1271 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1272 typename CallbackParamTraits
<X3
>::ForwardType x3
) {
1273 StorageType
* storage
= static_cast<StorageType
*>(base
);
1275 // Local references to make debugger stepping easier. If in a debugger,
1276 // you really want to warp ahead and step through the
1277 // InvokeHelper<>::MakeItSo() call below.
1279 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1280 typename
StorageType::RunnableType
,
1281 void(typename CallbackParamTraits
<X1
>::ForwardType x1
,
1282 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1283 typename CallbackParamTraits
<X3
>::ForwardType x3
)>
1284 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1285 CallbackForward(x2
), CallbackForward(x3
));
1290 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1292 struct Invoker
<1, StorageType
, R(X1
, X2
, X3
)> {
1293 typedef R(RunType
)(BindStateBase
*,
1294 typename CallbackParamTraits
<X2
>::ForwardType
,
1295 typename CallbackParamTraits
<X3
>::ForwardType
);
1297 typedef R(UnboundRunType
)(X2
, X3
);
1299 static R
Run(BindStateBase
* base
,
1300 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1301 typename CallbackParamTraits
<X3
>::ForwardType x3
) {
1302 StorageType
* storage
= static_cast<StorageType
*>(base
);
1304 // Local references to make debugger stepping easier. If in a debugger,
1305 // you really want to warp ahead and step through the
1306 // InvokeHelper<>::MakeItSo() call below.
1307 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1309 typename
Bound1UnwrapTraits::ForwardType x1
=
1310 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1311 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1312 typename
StorageType::RunnableType
,
1313 void(typename
Bound1UnwrapTraits::ForwardType
,
1314 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1315 typename CallbackParamTraits
<X3
>::ForwardType x3
)>
1316 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1317 CallbackForward(x2
), CallbackForward(x3
));
1322 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1324 struct Invoker
<2, StorageType
, R(X1
, X2
, X3
)> {
1325 typedef R(RunType
)(BindStateBase
*,
1326 typename CallbackParamTraits
<X3
>::ForwardType
);
1328 typedef R(UnboundRunType
)(X3
);
1330 static R
Run(BindStateBase
* base
,
1331 typename CallbackParamTraits
<X3
>::ForwardType x3
) {
1332 StorageType
* storage
= static_cast<StorageType
*>(base
);
1334 // Local references to make debugger stepping easier. If in a debugger,
1335 // you really want to warp ahead and step through the
1336 // InvokeHelper<>::MakeItSo() call below.
1337 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1338 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1340 typename
Bound1UnwrapTraits::ForwardType x1
=
1341 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1342 typename
Bound2UnwrapTraits::ForwardType x2
=
1343 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1344 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1345 typename
StorageType::RunnableType
,
1346 void(typename
Bound1UnwrapTraits::ForwardType
,
1347 typename
Bound2UnwrapTraits::ForwardType
,
1348 typename CallbackParamTraits
<X3
>::ForwardType x3
)>
1349 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1350 CallbackForward(x2
), CallbackForward(x3
));
1355 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1357 struct Invoker
<3, StorageType
, R(X1
, X2
, X3
)> {
1358 typedef R(RunType
)(BindStateBase
*);
1360 typedef R(UnboundRunType
)();
1362 static R
Run(BindStateBase
* base
) {
1363 StorageType
* storage
= static_cast<StorageType
*>(base
);
1365 // Local references to make debugger stepping easier. If in a debugger,
1366 // you really want to warp ahead and step through the
1367 // InvokeHelper<>::MakeItSo() call below.
1368 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1369 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1370 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1372 typename
Bound1UnwrapTraits::ForwardType x1
=
1373 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1374 typename
Bound2UnwrapTraits::ForwardType x2
=
1375 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1376 typename
Bound3UnwrapTraits::ForwardType x3
=
1377 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1378 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1379 typename
StorageType::RunnableType
,
1380 void(typename
Bound1UnwrapTraits::ForwardType
,
1381 typename
Bound2UnwrapTraits::ForwardType
,
1382 typename
Bound3UnwrapTraits::ForwardType
)>
1383 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1384 CallbackForward(x2
), CallbackForward(x3
));
1389 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1390 typename X3
, typename X4
>
1391 struct Invoker
<0, StorageType
, R(X1
, X2
, X3
, X4
)> {
1392 typedef R(RunType
)(BindStateBase
*,
1393 typename CallbackParamTraits
<X1
>::ForwardType
,
1394 typename CallbackParamTraits
<X2
>::ForwardType
,
1395 typename CallbackParamTraits
<X3
>::ForwardType
,
1396 typename CallbackParamTraits
<X4
>::ForwardType
);
1398 typedef R(UnboundRunType
)(X1
, X2
, X3
, X4
);
1400 static R
Run(BindStateBase
* base
,
1401 typename CallbackParamTraits
<X1
>::ForwardType x1
,
1402 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1403 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1404 typename CallbackParamTraits
<X4
>::ForwardType x4
) {
1405 StorageType
* storage
= static_cast<StorageType
*>(base
);
1407 // Local references to make debugger stepping easier. If in a debugger,
1408 // you really want to warp ahead and step through the
1409 // InvokeHelper<>::MakeItSo() call below.
1411 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1412 typename
StorageType::RunnableType
,
1413 void(typename CallbackParamTraits
<X1
>::ForwardType x1
,
1414 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1415 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1416 typename CallbackParamTraits
<X4
>::ForwardType x4
)>
1417 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1418 CallbackForward(x2
), CallbackForward(x3
),
1419 CallbackForward(x4
));
1424 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1425 typename X3
, typename X4
>
1426 struct Invoker
<1, StorageType
, R(X1
, X2
, X3
, X4
)> {
1427 typedef R(RunType
)(BindStateBase
*,
1428 typename CallbackParamTraits
<X2
>::ForwardType
,
1429 typename CallbackParamTraits
<X3
>::ForwardType
,
1430 typename CallbackParamTraits
<X4
>::ForwardType
);
1432 typedef R(UnboundRunType
)(X2
, X3
, X4
);
1434 static R
Run(BindStateBase
* base
,
1435 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1436 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1437 typename CallbackParamTraits
<X4
>::ForwardType x4
) {
1438 StorageType
* storage
= static_cast<StorageType
*>(base
);
1440 // Local references to make debugger stepping easier. If in a debugger,
1441 // you really want to warp ahead and step through the
1442 // InvokeHelper<>::MakeItSo() call below.
1443 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1445 typename
Bound1UnwrapTraits::ForwardType x1
=
1446 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1447 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1448 typename
StorageType::RunnableType
,
1449 void(typename
Bound1UnwrapTraits::ForwardType
,
1450 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1451 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1452 typename CallbackParamTraits
<X4
>::ForwardType x4
)>
1453 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1454 CallbackForward(x2
), CallbackForward(x3
),
1455 CallbackForward(x4
));
1460 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1461 typename X3
, typename X4
>
1462 struct Invoker
<2, StorageType
, R(X1
, X2
, X3
, X4
)> {
1463 typedef R(RunType
)(BindStateBase
*,
1464 typename CallbackParamTraits
<X3
>::ForwardType
,
1465 typename CallbackParamTraits
<X4
>::ForwardType
);
1467 typedef R(UnboundRunType
)(X3
, X4
);
1469 static R
Run(BindStateBase
* base
,
1470 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1471 typename CallbackParamTraits
<X4
>::ForwardType x4
) {
1472 StorageType
* storage
= static_cast<StorageType
*>(base
);
1474 // Local references to make debugger stepping easier. If in a debugger,
1475 // you really want to warp ahead and step through the
1476 // InvokeHelper<>::MakeItSo() call below.
1477 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1478 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1480 typename
Bound1UnwrapTraits::ForwardType x1
=
1481 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1482 typename
Bound2UnwrapTraits::ForwardType x2
=
1483 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1484 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1485 typename
StorageType::RunnableType
,
1486 void(typename
Bound1UnwrapTraits::ForwardType
,
1487 typename
Bound2UnwrapTraits::ForwardType
,
1488 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1489 typename CallbackParamTraits
<X4
>::ForwardType x4
)>
1490 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1491 CallbackForward(x2
), CallbackForward(x3
),
1492 CallbackForward(x4
));
1497 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1498 typename X3
, typename X4
>
1499 struct Invoker
<3, StorageType
, R(X1
, X2
, X3
, X4
)> {
1500 typedef R(RunType
)(BindStateBase
*,
1501 typename CallbackParamTraits
<X4
>::ForwardType
);
1503 typedef R(UnboundRunType
)(X4
);
1505 static R
Run(BindStateBase
* base
,
1506 typename CallbackParamTraits
<X4
>::ForwardType x4
) {
1507 StorageType
* storage
= static_cast<StorageType
*>(base
);
1509 // Local references to make debugger stepping easier. If in a debugger,
1510 // you really want to warp ahead and step through the
1511 // InvokeHelper<>::MakeItSo() call below.
1512 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1513 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1514 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1516 typename
Bound1UnwrapTraits::ForwardType x1
=
1517 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1518 typename
Bound2UnwrapTraits::ForwardType x2
=
1519 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1520 typename
Bound3UnwrapTraits::ForwardType x3
=
1521 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1522 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1523 typename
StorageType::RunnableType
,
1524 void(typename
Bound1UnwrapTraits::ForwardType
,
1525 typename
Bound2UnwrapTraits::ForwardType
,
1526 typename
Bound3UnwrapTraits::ForwardType
,
1527 typename CallbackParamTraits
<X4
>::ForwardType x4
)>
1528 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1529 CallbackForward(x2
), CallbackForward(x3
),
1530 CallbackForward(x4
));
1535 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1536 typename X3
, typename X4
>
1537 struct Invoker
<4, StorageType
, R(X1
, X2
, X3
, X4
)> {
1538 typedef R(RunType
)(BindStateBase
*);
1540 typedef R(UnboundRunType
)();
1542 static R
Run(BindStateBase
* base
) {
1543 StorageType
* storage
= static_cast<StorageType
*>(base
);
1545 // Local references to make debugger stepping easier. If in a debugger,
1546 // you really want to warp ahead and step through the
1547 // InvokeHelper<>::MakeItSo() call below.
1548 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1549 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1550 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1551 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
1553 typename
Bound1UnwrapTraits::ForwardType x1
=
1554 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1555 typename
Bound2UnwrapTraits::ForwardType x2
=
1556 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1557 typename
Bound3UnwrapTraits::ForwardType x3
=
1558 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1559 typename
Bound4UnwrapTraits::ForwardType x4
=
1560 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
1561 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1562 typename
StorageType::RunnableType
,
1563 void(typename
Bound1UnwrapTraits::ForwardType
,
1564 typename
Bound2UnwrapTraits::ForwardType
,
1565 typename
Bound3UnwrapTraits::ForwardType
,
1566 typename
Bound4UnwrapTraits::ForwardType
)>
1567 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1568 CallbackForward(x2
), CallbackForward(x3
),
1569 CallbackForward(x4
));
1574 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1575 typename X3
, typename X4
, typename X5
>
1576 struct Invoker
<0, StorageType
, R(X1
, X2
, X3
, X4
, X5
)> {
1577 typedef R(RunType
)(BindStateBase
*,
1578 typename CallbackParamTraits
<X1
>::ForwardType
,
1579 typename CallbackParamTraits
<X2
>::ForwardType
,
1580 typename CallbackParamTraits
<X3
>::ForwardType
,
1581 typename CallbackParamTraits
<X4
>::ForwardType
,
1582 typename CallbackParamTraits
<X5
>::ForwardType
);
1584 typedef R(UnboundRunType
)(X1
, X2
, X3
, X4
, X5
);
1586 static R
Run(BindStateBase
* base
,
1587 typename CallbackParamTraits
<X1
>::ForwardType x1
,
1588 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1589 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1590 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1591 typename CallbackParamTraits
<X5
>::ForwardType x5
) {
1592 StorageType
* storage
= static_cast<StorageType
*>(base
);
1594 // Local references to make debugger stepping easier. If in a debugger,
1595 // you really want to warp ahead and step through the
1596 // InvokeHelper<>::MakeItSo() call below.
1598 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1599 typename
StorageType::RunnableType
,
1600 void(typename CallbackParamTraits
<X1
>::ForwardType x1
,
1601 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1602 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1603 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1604 typename CallbackParamTraits
<X5
>::ForwardType x5
)>
1605 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1606 CallbackForward(x2
), CallbackForward(x3
),
1607 CallbackForward(x4
), CallbackForward(x5
));
1612 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1613 typename X3
, typename X4
, typename X5
>
1614 struct Invoker
<1, StorageType
, R(X1
, X2
, X3
, X4
, X5
)> {
1615 typedef R(RunType
)(BindStateBase
*,
1616 typename CallbackParamTraits
<X2
>::ForwardType
,
1617 typename CallbackParamTraits
<X3
>::ForwardType
,
1618 typename CallbackParamTraits
<X4
>::ForwardType
,
1619 typename CallbackParamTraits
<X5
>::ForwardType
);
1621 typedef R(UnboundRunType
)(X2
, X3
, X4
, X5
);
1623 static R
Run(BindStateBase
* base
,
1624 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1625 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1626 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1627 typename CallbackParamTraits
<X5
>::ForwardType x5
) {
1628 StorageType
* storage
= static_cast<StorageType
*>(base
);
1630 // Local references to make debugger stepping easier. If in a debugger,
1631 // you really want to warp ahead and step through the
1632 // InvokeHelper<>::MakeItSo() call below.
1633 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1635 typename
Bound1UnwrapTraits::ForwardType x1
=
1636 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1637 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1638 typename
StorageType::RunnableType
,
1639 void(typename
Bound1UnwrapTraits::ForwardType
,
1640 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1641 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1642 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1643 typename CallbackParamTraits
<X5
>::ForwardType x5
)>
1644 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1645 CallbackForward(x2
), CallbackForward(x3
),
1646 CallbackForward(x4
), CallbackForward(x5
));
1651 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1652 typename X3
, typename X4
, typename X5
>
1653 struct Invoker
<2, StorageType
, R(X1
, X2
, X3
, X4
, X5
)> {
1654 typedef R(RunType
)(BindStateBase
*,
1655 typename CallbackParamTraits
<X3
>::ForwardType
,
1656 typename CallbackParamTraits
<X4
>::ForwardType
,
1657 typename CallbackParamTraits
<X5
>::ForwardType
);
1659 typedef R(UnboundRunType
)(X3
, X4
, X5
);
1661 static R
Run(BindStateBase
* base
,
1662 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1663 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1664 typename CallbackParamTraits
<X5
>::ForwardType x5
) {
1665 StorageType
* storage
= static_cast<StorageType
*>(base
);
1667 // Local references to make debugger stepping easier. If in a debugger,
1668 // you really want to warp ahead and step through the
1669 // InvokeHelper<>::MakeItSo() call below.
1670 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1671 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1673 typename
Bound1UnwrapTraits::ForwardType x1
=
1674 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1675 typename
Bound2UnwrapTraits::ForwardType x2
=
1676 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1677 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1678 typename
StorageType::RunnableType
,
1679 void(typename
Bound1UnwrapTraits::ForwardType
,
1680 typename
Bound2UnwrapTraits::ForwardType
,
1681 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1682 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1683 typename CallbackParamTraits
<X5
>::ForwardType x5
)>
1684 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1685 CallbackForward(x2
), CallbackForward(x3
),
1686 CallbackForward(x4
), CallbackForward(x5
));
1691 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1692 typename X3
, typename X4
, typename X5
>
1693 struct Invoker
<3, StorageType
, R(X1
, X2
, X3
, X4
, X5
)> {
1694 typedef R(RunType
)(BindStateBase
*,
1695 typename CallbackParamTraits
<X4
>::ForwardType
,
1696 typename CallbackParamTraits
<X5
>::ForwardType
);
1698 typedef R(UnboundRunType
)(X4
, X5
);
1700 static R
Run(BindStateBase
* base
,
1701 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1702 typename CallbackParamTraits
<X5
>::ForwardType x5
) {
1703 StorageType
* storage
= static_cast<StorageType
*>(base
);
1705 // Local references to make debugger stepping easier. If in a debugger,
1706 // you really want to warp ahead and step through the
1707 // InvokeHelper<>::MakeItSo() call below.
1708 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1709 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1710 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1712 typename
Bound1UnwrapTraits::ForwardType x1
=
1713 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1714 typename
Bound2UnwrapTraits::ForwardType x2
=
1715 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1716 typename
Bound3UnwrapTraits::ForwardType x3
=
1717 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1718 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1719 typename
StorageType::RunnableType
,
1720 void(typename
Bound1UnwrapTraits::ForwardType
,
1721 typename
Bound2UnwrapTraits::ForwardType
,
1722 typename
Bound3UnwrapTraits::ForwardType
,
1723 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1724 typename CallbackParamTraits
<X5
>::ForwardType x5
)>
1725 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1726 CallbackForward(x2
), CallbackForward(x3
),
1727 CallbackForward(x4
), CallbackForward(x5
));
1732 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1733 typename X3
, typename X4
, typename X5
>
1734 struct Invoker
<4, StorageType
, R(X1
, X2
, X3
, X4
, X5
)> {
1735 typedef R(RunType
)(BindStateBase
*,
1736 typename CallbackParamTraits
<X5
>::ForwardType
);
1738 typedef R(UnboundRunType
)(X5
);
1740 static R
Run(BindStateBase
* base
,
1741 typename CallbackParamTraits
<X5
>::ForwardType x5
) {
1742 StorageType
* storage
= static_cast<StorageType
*>(base
);
1744 // Local references to make debugger stepping easier. If in a debugger,
1745 // you really want to warp ahead and step through the
1746 // InvokeHelper<>::MakeItSo() call below.
1747 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1748 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1749 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1750 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
1752 typename
Bound1UnwrapTraits::ForwardType x1
=
1753 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1754 typename
Bound2UnwrapTraits::ForwardType x2
=
1755 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1756 typename
Bound3UnwrapTraits::ForwardType x3
=
1757 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1758 typename
Bound4UnwrapTraits::ForwardType x4
=
1759 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
1760 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1761 typename
StorageType::RunnableType
,
1762 void(typename
Bound1UnwrapTraits::ForwardType
,
1763 typename
Bound2UnwrapTraits::ForwardType
,
1764 typename
Bound3UnwrapTraits::ForwardType
,
1765 typename
Bound4UnwrapTraits::ForwardType
,
1766 typename CallbackParamTraits
<X5
>::ForwardType x5
)>
1767 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1768 CallbackForward(x2
), CallbackForward(x3
),
1769 CallbackForward(x4
), CallbackForward(x5
));
1774 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1775 typename X3
, typename X4
, typename X5
>
1776 struct Invoker
<5, StorageType
, R(X1
, X2
, X3
, X4
, X5
)> {
1777 typedef R(RunType
)(BindStateBase
*);
1779 typedef R(UnboundRunType
)();
1781 static R
Run(BindStateBase
* base
) {
1782 StorageType
* storage
= static_cast<StorageType
*>(base
);
1784 // Local references to make debugger stepping easier. If in a debugger,
1785 // you really want to warp ahead and step through the
1786 // InvokeHelper<>::MakeItSo() call below.
1787 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1788 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1789 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1790 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
1791 typedef typename
StorageType::Bound5UnwrapTraits Bound5UnwrapTraits
;
1793 typename
Bound1UnwrapTraits::ForwardType x1
=
1794 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1795 typename
Bound2UnwrapTraits::ForwardType x2
=
1796 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1797 typename
Bound3UnwrapTraits::ForwardType x3
=
1798 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1799 typename
Bound4UnwrapTraits::ForwardType x4
=
1800 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
1801 typename
Bound5UnwrapTraits::ForwardType x5
=
1802 Bound5UnwrapTraits::Unwrap(storage
->p5_
);
1803 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1804 typename
StorageType::RunnableType
,
1805 void(typename
Bound1UnwrapTraits::ForwardType
,
1806 typename
Bound2UnwrapTraits::ForwardType
,
1807 typename
Bound3UnwrapTraits::ForwardType
,
1808 typename
Bound4UnwrapTraits::ForwardType
,
1809 typename
Bound5UnwrapTraits::ForwardType
)>
1810 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1811 CallbackForward(x2
), CallbackForward(x3
),
1812 CallbackForward(x4
), CallbackForward(x5
));
1817 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1818 typename X3
, typename X4
, typename X5
, typename X6
>
1819 struct Invoker
<0, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
1820 typedef R(RunType
)(BindStateBase
*,
1821 typename CallbackParamTraits
<X1
>::ForwardType
,
1822 typename CallbackParamTraits
<X2
>::ForwardType
,
1823 typename CallbackParamTraits
<X3
>::ForwardType
,
1824 typename CallbackParamTraits
<X4
>::ForwardType
,
1825 typename CallbackParamTraits
<X5
>::ForwardType
,
1826 typename CallbackParamTraits
<X6
>::ForwardType
);
1828 typedef R(UnboundRunType
)(X1
, X2
, X3
, X4
, X5
, X6
);
1830 static R
Run(BindStateBase
* base
,
1831 typename CallbackParamTraits
<X1
>::ForwardType x1
,
1832 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1833 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1834 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1835 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1836 typename CallbackParamTraits
<X6
>::ForwardType x6
) {
1837 StorageType
* storage
= static_cast<StorageType
*>(base
);
1839 // Local references to make debugger stepping easier. If in a debugger,
1840 // you really want to warp ahead and step through the
1841 // InvokeHelper<>::MakeItSo() call below.
1843 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1844 typename
StorageType::RunnableType
,
1845 void(typename CallbackParamTraits
<X1
>::ForwardType x1
,
1846 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1847 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1848 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1849 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1850 typename CallbackParamTraits
<X6
>::ForwardType x6
)>
1851 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1852 CallbackForward(x2
), CallbackForward(x3
),
1853 CallbackForward(x4
), CallbackForward(x5
),
1854 CallbackForward(x6
));
1859 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1860 typename X3
, typename X4
, typename X5
, typename X6
>
1861 struct Invoker
<1, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
1862 typedef R(RunType
)(BindStateBase
*,
1863 typename CallbackParamTraits
<X2
>::ForwardType
,
1864 typename CallbackParamTraits
<X3
>::ForwardType
,
1865 typename CallbackParamTraits
<X4
>::ForwardType
,
1866 typename CallbackParamTraits
<X5
>::ForwardType
,
1867 typename CallbackParamTraits
<X6
>::ForwardType
);
1869 typedef R(UnboundRunType
)(X2
, X3
, X4
, X5
, X6
);
1871 static R
Run(BindStateBase
* base
,
1872 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1873 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1874 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1875 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1876 typename CallbackParamTraits
<X6
>::ForwardType x6
) {
1877 StorageType
* storage
= static_cast<StorageType
*>(base
);
1879 // Local references to make debugger stepping easier. If in a debugger,
1880 // you really want to warp ahead and step through the
1881 // InvokeHelper<>::MakeItSo() call below.
1882 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1884 typename
Bound1UnwrapTraits::ForwardType x1
=
1885 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1886 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1887 typename
StorageType::RunnableType
,
1888 void(typename
Bound1UnwrapTraits::ForwardType
,
1889 typename CallbackParamTraits
<X2
>::ForwardType x2
,
1890 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1891 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1892 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1893 typename CallbackParamTraits
<X6
>::ForwardType x6
)>
1894 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1895 CallbackForward(x2
), CallbackForward(x3
),
1896 CallbackForward(x4
), CallbackForward(x5
),
1897 CallbackForward(x6
));
1902 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1903 typename X3
, typename X4
, typename X5
, typename X6
>
1904 struct Invoker
<2, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
1905 typedef R(RunType
)(BindStateBase
*,
1906 typename CallbackParamTraits
<X3
>::ForwardType
,
1907 typename CallbackParamTraits
<X4
>::ForwardType
,
1908 typename CallbackParamTraits
<X5
>::ForwardType
,
1909 typename CallbackParamTraits
<X6
>::ForwardType
);
1911 typedef R(UnboundRunType
)(X3
, X4
, X5
, X6
);
1913 static R
Run(BindStateBase
* base
,
1914 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1915 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1916 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1917 typename CallbackParamTraits
<X6
>::ForwardType x6
) {
1918 StorageType
* storage
= static_cast<StorageType
*>(base
);
1920 // Local references to make debugger stepping easier. If in a debugger,
1921 // you really want to warp ahead and step through the
1922 // InvokeHelper<>::MakeItSo() call below.
1923 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1924 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1926 typename
Bound1UnwrapTraits::ForwardType x1
=
1927 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1928 typename
Bound2UnwrapTraits::ForwardType x2
=
1929 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1930 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1931 typename
StorageType::RunnableType
,
1932 void(typename
Bound1UnwrapTraits::ForwardType
,
1933 typename
Bound2UnwrapTraits::ForwardType
,
1934 typename CallbackParamTraits
<X3
>::ForwardType x3
,
1935 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1936 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1937 typename CallbackParamTraits
<X6
>::ForwardType x6
)>
1938 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1939 CallbackForward(x2
), CallbackForward(x3
),
1940 CallbackForward(x4
), CallbackForward(x5
),
1941 CallbackForward(x6
));
1946 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1947 typename X3
, typename X4
, typename X5
, typename X6
>
1948 struct Invoker
<3, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
1949 typedef R(RunType
)(BindStateBase
*,
1950 typename CallbackParamTraits
<X4
>::ForwardType
,
1951 typename CallbackParamTraits
<X5
>::ForwardType
,
1952 typename CallbackParamTraits
<X6
>::ForwardType
);
1954 typedef R(UnboundRunType
)(X4
, X5
, X6
);
1956 static R
Run(BindStateBase
* base
,
1957 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1958 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1959 typename CallbackParamTraits
<X6
>::ForwardType x6
) {
1960 StorageType
* storage
= static_cast<StorageType
*>(base
);
1962 // Local references to make debugger stepping easier. If in a debugger,
1963 // you really want to warp ahead and step through the
1964 // InvokeHelper<>::MakeItSo() call below.
1965 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
1966 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
1967 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
1969 typename
Bound1UnwrapTraits::ForwardType x1
=
1970 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
1971 typename
Bound2UnwrapTraits::ForwardType x2
=
1972 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
1973 typename
Bound3UnwrapTraits::ForwardType x3
=
1974 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
1975 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
1976 typename
StorageType::RunnableType
,
1977 void(typename
Bound1UnwrapTraits::ForwardType
,
1978 typename
Bound2UnwrapTraits::ForwardType
,
1979 typename
Bound3UnwrapTraits::ForwardType
,
1980 typename CallbackParamTraits
<X4
>::ForwardType x4
,
1981 typename CallbackParamTraits
<X5
>::ForwardType x5
,
1982 typename CallbackParamTraits
<X6
>::ForwardType x6
)>
1983 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
1984 CallbackForward(x2
), CallbackForward(x3
),
1985 CallbackForward(x4
), CallbackForward(x5
),
1986 CallbackForward(x6
));
1991 template <typename StorageType
, typename R
,typename X1
, typename X2
,
1992 typename X3
, typename X4
, typename X5
, typename X6
>
1993 struct Invoker
<4, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
1994 typedef R(RunType
)(BindStateBase
*,
1995 typename CallbackParamTraits
<X5
>::ForwardType
,
1996 typename CallbackParamTraits
<X6
>::ForwardType
);
1998 typedef R(UnboundRunType
)(X5
, X6
);
2000 static R
Run(BindStateBase
* base
,
2001 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2002 typename CallbackParamTraits
<X6
>::ForwardType x6
) {
2003 StorageType
* storage
= static_cast<StorageType
*>(base
);
2005 // Local references to make debugger stepping easier. If in a debugger,
2006 // you really want to warp ahead and step through the
2007 // InvokeHelper<>::MakeItSo() call below.
2008 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2009 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2010 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2011 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2013 typename
Bound1UnwrapTraits::ForwardType x1
=
2014 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2015 typename
Bound2UnwrapTraits::ForwardType x2
=
2016 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2017 typename
Bound3UnwrapTraits::ForwardType x3
=
2018 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2019 typename
Bound4UnwrapTraits::ForwardType x4
=
2020 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2021 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2022 typename
StorageType::RunnableType
,
2023 void(typename
Bound1UnwrapTraits::ForwardType
,
2024 typename
Bound2UnwrapTraits::ForwardType
,
2025 typename
Bound3UnwrapTraits::ForwardType
,
2026 typename
Bound4UnwrapTraits::ForwardType
,
2027 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2028 typename CallbackParamTraits
<X6
>::ForwardType x6
)>
2029 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2030 CallbackForward(x2
), CallbackForward(x3
),
2031 CallbackForward(x4
), CallbackForward(x5
),
2032 CallbackForward(x6
));
2037 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2038 typename X3
, typename X4
, typename X5
, typename X6
>
2039 struct Invoker
<5, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
2040 typedef R(RunType
)(BindStateBase
*,
2041 typename CallbackParamTraits
<X6
>::ForwardType
);
2043 typedef R(UnboundRunType
)(X6
);
2045 static R
Run(BindStateBase
* base
,
2046 typename CallbackParamTraits
<X6
>::ForwardType x6
) {
2047 StorageType
* storage
= static_cast<StorageType
*>(base
);
2049 // Local references to make debugger stepping easier. If in a debugger,
2050 // you really want to warp ahead and step through the
2051 // InvokeHelper<>::MakeItSo() call below.
2052 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2053 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2054 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2055 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2056 typedef typename
StorageType::Bound5UnwrapTraits Bound5UnwrapTraits
;
2058 typename
Bound1UnwrapTraits::ForwardType x1
=
2059 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2060 typename
Bound2UnwrapTraits::ForwardType x2
=
2061 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2062 typename
Bound3UnwrapTraits::ForwardType x3
=
2063 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2064 typename
Bound4UnwrapTraits::ForwardType x4
=
2065 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2066 typename
Bound5UnwrapTraits::ForwardType x5
=
2067 Bound5UnwrapTraits::Unwrap(storage
->p5_
);
2068 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2069 typename
StorageType::RunnableType
,
2070 void(typename
Bound1UnwrapTraits::ForwardType
,
2071 typename
Bound2UnwrapTraits::ForwardType
,
2072 typename
Bound3UnwrapTraits::ForwardType
,
2073 typename
Bound4UnwrapTraits::ForwardType
,
2074 typename
Bound5UnwrapTraits::ForwardType
,
2075 typename CallbackParamTraits
<X6
>::ForwardType x6
)>
2076 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2077 CallbackForward(x2
), CallbackForward(x3
),
2078 CallbackForward(x4
), CallbackForward(x5
),
2079 CallbackForward(x6
));
2084 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2085 typename X3
, typename X4
, typename X5
, typename X6
>
2086 struct Invoker
<6, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
)> {
2087 typedef R(RunType
)(BindStateBase
*);
2089 typedef R(UnboundRunType
)();
2091 static R
Run(BindStateBase
* base
) {
2092 StorageType
* storage
= static_cast<StorageType
*>(base
);
2094 // Local references to make debugger stepping easier. If in a debugger,
2095 // you really want to warp ahead and step through the
2096 // InvokeHelper<>::MakeItSo() call below.
2097 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2098 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2099 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2100 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2101 typedef typename
StorageType::Bound5UnwrapTraits Bound5UnwrapTraits
;
2102 typedef typename
StorageType::Bound6UnwrapTraits Bound6UnwrapTraits
;
2104 typename
Bound1UnwrapTraits::ForwardType x1
=
2105 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2106 typename
Bound2UnwrapTraits::ForwardType x2
=
2107 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2108 typename
Bound3UnwrapTraits::ForwardType x3
=
2109 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2110 typename
Bound4UnwrapTraits::ForwardType x4
=
2111 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2112 typename
Bound5UnwrapTraits::ForwardType x5
=
2113 Bound5UnwrapTraits::Unwrap(storage
->p5_
);
2114 typename
Bound6UnwrapTraits::ForwardType x6
=
2115 Bound6UnwrapTraits::Unwrap(storage
->p6_
);
2116 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2117 typename
StorageType::RunnableType
,
2118 void(typename
Bound1UnwrapTraits::ForwardType
,
2119 typename
Bound2UnwrapTraits::ForwardType
,
2120 typename
Bound3UnwrapTraits::ForwardType
,
2121 typename
Bound4UnwrapTraits::ForwardType
,
2122 typename
Bound5UnwrapTraits::ForwardType
,
2123 typename
Bound6UnwrapTraits::ForwardType
)>
2124 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2125 CallbackForward(x2
), CallbackForward(x3
),
2126 CallbackForward(x4
), CallbackForward(x5
),
2127 CallbackForward(x6
));
2132 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2133 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2134 struct Invoker
<0, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2135 typedef R(RunType
)(BindStateBase
*,
2136 typename CallbackParamTraits
<X1
>::ForwardType
,
2137 typename CallbackParamTraits
<X2
>::ForwardType
,
2138 typename CallbackParamTraits
<X3
>::ForwardType
,
2139 typename CallbackParamTraits
<X4
>::ForwardType
,
2140 typename CallbackParamTraits
<X5
>::ForwardType
,
2141 typename CallbackParamTraits
<X6
>::ForwardType
,
2142 typename CallbackParamTraits
<X7
>::ForwardType
);
2144 typedef R(UnboundRunType
)(X1
, X2
, X3
, X4
, X5
, X6
, X7
);
2146 static R
Run(BindStateBase
* base
,
2147 typename CallbackParamTraits
<X1
>::ForwardType x1
,
2148 typename CallbackParamTraits
<X2
>::ForwardType x2
,
2149 typename CallbackParamTraits
<X3
>::ForwardType x3
,
2150 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2151 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2152 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2153 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2154 StorageType
* storage
= static_cast<StorageType
*>(base
);
2156 // Local references to make debugger stepping easier. If in a debugger,
2157 // you really want to warp ahead and step through the
2158 // InvokeHelper<>::MakeItSo() call below.
2160 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2161 typename
StorageType::RunnableType
,
2162 void(typename CallbackParamTraits
<X1
>::ForwardType x1
,
2163 typename CallbackParamTraits
<X2
>::ForwardType x2
,
2164 typename CallbackParamTraits
<X3
>::ForwardType x3
,
2165 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2166 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2167 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2168 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2169 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2170 CallbackForward(x2
), CallbackForward(x3
),
2171 CallbackForward(x4
), CallbackForward(x5
),
2172 CallbackForward(x6
), CallbackForward(x7
));
2177 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2178 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2179 struct Invoker
<1, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2180 typedef R(RunType
)(BindStateBase
*,
2181 typename CallbackParamTraits
<X2
>::ForwardType
,
2182 typename CallbackParamTraits
<X3
>::ForwardType
,
2183 typename CallbackParamTraits
<X4
>::ForwardType
,
2184 typename CallbackParamTraits
<X5
>::ForwardType
,
2185 typename CallbackParamTraits
<X6
>::ForwardType
,
2186 typename CallbackParamTraits
<X7
>::ForwardType
);
2188 typedef R(UnboundRunType
)(X2
, X3
, X4
, X5
, X6
, X7
);
2190 static R
Run(BindStateBase
* base
,
2191 typename CallbackParamTraits
<X2
>::ForwardType x2
,
2192 typename CallbackParamTraits
<X3
>::ForwardType x3
,
2193 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2194 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2195 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2196 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2197 StorageType
* storage
= static_cast<StorageType
*>(base
);
2199 // Local references to make debugger stepping easier. If in a debugger,
2200 // you really want to warp ahead and step through the
2201 // InvokeHelper<>::MakeItSo() call below.
2202 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2204 typename
Bound1UnwrapTraits::ForwardType x1
=
2205 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2206 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2207 typename
StorageType::RunnableType
,
2208 void(typename
Bound1UnwrapTraits::ForwardType
,
2209 typename CallbackParamTraits
<X2
>::ForwardType x2
,
2210 typename CallbackParamTraits
<X3
>::ForwardType x3
,
2211 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2212 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2213 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2214 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2215 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2216 CallbackForward(x2
), CallbackForward(x3
),
2217 CallbackForward(x4
), CallbackForward(x5
),
2218 CallbackForward(x6
), CallbackForward(x7
));
2223 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2224 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2225 struct Invoker
<2, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2226 typedef R(RunType
)(BindStateBase
*,
2227 typename CallbackParamTraits
<X3
>::ForwardType
,
2228 typename CallbackParamTraits
<X4
>::ForwardType
,
2229 typename CallbackParamTraits
<X5
>::ForwardType
,
2230 typename CallbackParamTraits
<X6
>::ForwardType
,
2231 typename CallbackParamTraits
<X7
>::ForwardType
);
2233 typedef R(UnboundRunType
)(X3
, X4
, X5
, X6
, X7
);
2235 static R
Run(BindStateBase
* base
,
2236 typename CallbackParamTraits
<X3
>::ForwardType x3
,
2237 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2238 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2239 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2240 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2241 StorageType
* storage
= static_cast<StorageType
*>(base
);
2243 // Local references to make debugger stepping easier. If in a debugger,
2244 // you really want to warp ahead and step through the
2245 // InvokeHelper<>::MakeItSo() call below.
2246 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2247 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2249 typename
Bound1UnwrapTraits::ForwardType x1
=
2250 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2251 typename
Bound2UnwrapTraits::ForwardType x2
=
2252 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2253 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2254 typename
StorageType::RunnableType
,
2255 void(typename
Bound1UnwrapTraits::ForwardType
,
2256 typename
Bound2UnwrapTraits::ForwardType
,
2257 typename CallbackParamTraits
<X3
>::ForwardType x3
,
2258 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2259 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2260 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2261 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2262 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2263 CallbackForward(x2
), CallbackForward(x3
),
2264 CallbackForward(x4
), CallbackForward(x5
),
2265 CallbackForward(x6
), CallbackForward(x7
));
2270 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2271 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2272 struct Invoker
<3, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2273 typedef R(RunType
)(BindStateBase
*,
2274 typename CallbackParamTraits
<X4
>::ForwardType
,
2275 typename CallbackParamTraits
<X5
>::ForwardType
,
2276 typename CallbackParamTraits
<X6
>::ForwardType
,
2277 typename CallbackParamTraits
<X7
>::ForwardType
);
2279 typedef R(UnboundRunType
)(X4
, X5
, X6
, X7
);
2281 static R
Run(BindStateBase
* base
,
2282 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2283 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2284 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2285 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2286 StorageType
* storage
= static_cast<StorageType
*>(base
);
2288 // Local references to make debugger stepping easier. If in a debugger,
2289 // you really want to warp ahead and step through the
2290 // InvokeHelper<>::MakeItSo() call below.
2291 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2292 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2293 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2295 typename
Bound1UnwrapTraits::ForwardType x1
=
2296 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2297 typename
Bound2UnwrapTraits::ForwardType x2
=
2298 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2299 typename
Bound3UnwrapTraits::ForwardType x3
=
2300 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2301 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2302 typename
StorageType::RunnableType
,
2303 void(typename
Bound1UnwrapTraits::ForwardType
,
2304 typename
Bound2UnwrapTraits::ForwardType
,
2305 typename
Bound3UnwrapTraits::ForwardType
,
2306 typename CallbackParamTraits
<X4
>::ForwardType x4
,
2307 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2308 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2309 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2310 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2311 CallbackForward(x2
), CallbackForward(x3
),
2312 CallbackForward(x4
), CallbackForward(x5
),
2313 CallbackForward(x6
), CallbackForward(x7
));
2318 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2319 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2320 struct Invoker
<4, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2321 typedef R(RunType
)(BindStateBase
*,
2322 typename CallbackParamTraits
<X5
>::ForwardType
,
2323 typename CallbackParamTraits
<X6
>::ForwardType
,
2324 typename CallbackParamTraits
<X7
>::ForwardType
);
2326 typedef R(UnboundRunType
)(X5
, X6
, X7
);
2328 static R
Run(BindStateBase
* base
,
2329 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2330 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2331 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2332 StorageType
* storage
= static_cast<StorageType
*>(base
);
2334 // Local references to make debugger stepping easier. If in a debugger,
2335 // you really want to warp ahead and step through the
2336 // InvokeHelper<>::MakeItSo() call below.
2337 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2338 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2339 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2340 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2342 typename
Bound1UnwrapTraits::ForwardType x1
=
2343 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2344 typename
Bound2UnwrapTraits::ForwardType x2
=
2345 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2346 typename
Bound3UnwrapTraits::ForwardType x3
=
2347 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2348 typename
Bound4UnwrapTraits::ForwardType x4
=
2349 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2350 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2351 typename
StorageType::RunnableType
,
2352 void(typename
Bound1UnwrapTraits::ForwardType
,
2353 typename
Bound2UnwrapTraits::ForwardType
,
2354 typename
Bound3UnwrapTraits::ForwardType
,
2355 typename
Bound4UnwrapTraits::ForwardType
,
2356 typename CallbackParamTraits
<X5
>::ForwardType x5
,
2357 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2358 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2359 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2360 CallbackForward(x2
), CallbackForward(x3
),
2361 CallbackForward(x4
), CallbackForward(x5
),
2362 CallbackForward(x6
), CallbackForward(x7
));
2367 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2368 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2369 struct Invoker
<5, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2370 typedef R(RunType
)(BindStateBase
*,
2371 typename CallbackParamTraits
<X6
>::ForwardType
,
2372 typename CallbackParamTraits
<X7
>::ForwardType
);
2374 typedef R(UnboundRunType
)(X6
, X7
);
2376 static R
Run(BindStateBase
* base
,
2377 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2378 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2379 StorageType
* storage
= static_cast<StorageType
*>(base
);
2381 // Local references to make debugger stepping easier. If in a debugger,
2382 // you really want to warp ahead and step through the
2383 // InvokeHelper<>::MakeItSo() call below.
2384 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2385 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2386 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2387 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2388 typedef typename
StorageType::Bound5UnwrapTraits Bound5UnwrapTraits
;
2390 typename
Bound1UnwrapTraits::ForwardType x1
=
2391 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2392 typename
Bound2UnwrapTraits::ForwardType x2
=
2393 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2394 typename
Bound3UnwrapTraits::ForwardType x3
=
2395 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2396 typename
Bound4UnwrapTraits::ForwardType x4
=
2397 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2398 typename
Bound5UnwrapTraits::ForwardType x5
=
2399 Bound5UnwrapTraits::Unwrap(storage
->p5_
);
2400 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2401 typename
StorageType::RunnableType
,
2402 void(typename
Bound1UnwrapTraits::ForwardType
,
2403 typename
Bound2UnwrapTraits::ForwardType
,
2404 typename
Bound3UnwrapTraits::ForwardType
,
2405 typename
Bound4UnwrapTraits::ForwardType
,
2406 typename
Bound5UnwrapTraits::ForwardType
,
2407 typename CallbackParamTraits
<X6
>::ForwardType x6
,
2408 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2409 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2410 CallbackForward(x2
), CallbackForward(x3
),
2411 CallbackForward(x4
), CallbackForward(x5
),
2412 CallbackForward(x6
), CallbackForward(x7
));
2417 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2418 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2419 struct Invoker
<6, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2420 typedef R(RunType
)(BindStateBase
*,
2421 typename CallbackParamTraits
<X7
>::ForwardType
);
2423 typedef R(UnboundRunType
)(X7
);
2425 static R
Run(BindStateBase
* base
,
2426 typename CallbackParamTraits
<X7
>::ForwardType x7
) {
2427 StorageType
* storage
= static_cast<StorageType
*>(base
);
2429 // Local references to make debugger stepping easier. If in a debugger,
2430 // you really want to warp ahead and step through the
2431 // InvokeHelper<>::MakeItSo() call below.
2432 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2433 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2434 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2435 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2436 typedef typename
StorageType::Bound5UnwrapTraits Bound5UnwrapTraits
;
2437 typedef typename
StorageType::Bound6UnwrapTraits Bound6UnwrapTraits
;
2439 typename
Bound1UnwrapTraits::ForwardType x1
=
2440 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2441 typename
Bound2UnwrapTraits::ForwardType x2
=
2442 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2443 typename
Bound3UnwrapTraits::ForwardType x3
=
2444 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2445 typename
Bound4UnwrapTraits::ForwardType x4
=
2446 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2447 typename
Bound5UnwrapTraits::ForwardType x5
=
2448 Bound5UnwrapTraits::Unwrap(storage
->p5_
);
2449 typename
Bound6UnwrapTraits::ForwardType x6
=
2450 Bound6UnwrapTraits::Unwrap(storage
->p6_
);
2451 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2452 typename
StorageType::RunnableType
,
2453 void(typename
Bound1UnwrapTraits::ForwardType
,
2454 typename
Bound2UnwrapTraits::ForwardType
,
2455 typename
Bound3UnwrapTraits::ForwardType
,
2456 typename
Bound4UnwrapTraits::ForwardType
,
2457 typename
Bound5UnwrapTraits::ForwardType
,
2458 typename
Bound6UnwrapTraits::ForwardType
,
2459 typename CallbackParamTraits
<X7
>::ForwardType x7
)>
2460 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2461 CallbackForward(x2
), CallbackForward(x3
),
2462 CallbackForward(x4
), CallbackForward(x5
),
2463 CallbackForward(x6
), CallbackForward(x7
));
2468 template <typename StorageType
, typename R
,typename X1
, typename X2
,
2469 typename X3
, typename X4
, typename X5
, typename X6
, typename X7
>
2470 struct Invoker
<7, StorageType
, R(X1
, X2
, X3
, X4
, X5
, X6
, X7
)> {
2471 typedef R(RunType
)(BindStateBase
*);
2473 typedef R(UnboundRunType
)();
2475 static R
Run(BindStateBase
* base
) {
2476 StorageType
* storage
= static_cast<StorageType
*>(base
);
2478 // Local references to make debugger stepping easier. If in a debugger,
2479 // you really want to warp ahead and step through the
2480 // InvokeHelper<>::MakeItSo() call below.
2481 typedef typename
StorageType::Bound1UnwrapTraits Bound1UnwrapTraits
;
2482 typedef typename
StorageType::Bound2UnwrapTraits Bound2UnwrapTraits
;
2483 typedef typename
StorageType::Bound3UnwrapTraits Bound3UnwrapTraits
;
2484 typedef typename
StorageType::Bound4UnwrapTraits Bound4UnwrapTraits
;
2485 typedef typename
StorageType::Bound5UnwrapTraits Bound5UnwrapTraits
;
2486 typedef typename
StorageType::Bound6UnwrapTraits Bound6UnwrapTraits
;
2487 typedef typename
StorageType::Bound7UnwrapTraits Bound7UnwrapTraits
;
2489 typename
Bound1UnwrapTraits::ForwardType x1
=
2490 Bound1UnwrapTraits::Unwrap(storage
->p1_
);
2491 typename
Bound2UnwrapTraits::ForwardType x2
=
2492 Bound2UnwrapTraits::Unwrap(storage
->p2_
);
2493 typename
Bound3UnwrapTraits::ForwardType x3
=
2494 Bound3UnwrapTraits::Unwrap(storage
->p3_
);
2495 typename
Bound4UnwrapTraits::ForwardType x4
=
2496 Bound4UnwrapTraits::Unwrap(storage
->p4_
);
2497 typename
Bound5UnwrapTraits::ForwardType x5
=
2498 Bound5UnwrapTraits::Unwrap(storage
->p5_
);
2499 typename
Bound6UnwrapTraits::ForwardType x6
=
2500 Bound6UnwrapTraits::Unwrap(storage
->p6_
);
2501 typename
Bound7UnwrapTraits::ForwardType x7
=
2502 Bound7UnwrapTraits::Unwrap(storage
->p7_
);
2503 return InvokeHelper
<StorageType::IsWeakCall::value
, R
,
2504 typename
StorageType::RunnableType
,
2505 void(typename
Bound1UnwrapTraits::ForwardType
,
2506 typename
Bound2UnwrapTraits::ForwardType
,
2507 typename
Bound3UnwrapTraits::ForwardType
,
2508 typename
Bound4UnwrapTraits::ForwardType
,
2509 typename
Bound5UnwrapTraits::ForwardType
,
2510 typename
Bound6UnwrapTraits::ForwardType
,
2511 typename
Bound7UnwrapTraits::ForwardType
)>
2512 ::MakeItSo(storage
->runnable_
, CallbackForward(x1
),
2513 CallbackForward(x2
), CallbackForward(x3
),
2514 CallbackForward(x4
), CallbackForward(x5
),
2515 CallbackForward(x6
), CallbackForward(x7
));
2522 // This stores all the state passed into Bind() and is also where most
2523 // of the template resolution magic occurs.
2525 // Runnable is the functor we are binding arguments to.
2526 // RunType is type of the Run() function that the Invoker<> should use.
2527 // Normally, this is the same as the RunType of the Runnable, but it can
2528 // be different if an adapter like IgnoreResult() has been used.
2530 // BoundArgsType contains the storage type for all the bound arguments by
2531 // (ab)using a function type.
2532 template <typename Runnable
, typename RunType
, typename BoundArgsType
>
2535 template <typename Runnable
, typename RunType
>
2536 struct BindState
<Runnable
, RunType
, void()> : public BindStateBase
{
2537 typedef Runnable RunnableType
;
2538 typedef false_type IsWeakCall
;
2539 typedef Invoker
<0, BindState
, RunType
> InvokerType
;
2540 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2541 explicit BindState(const Runnable
& runnable
)
2542 : runnable_(runnable
) {
2545 virtual ~BindState() { }
2547 RunnableType runnable_
;
2550 template <typename Runnable
, typename RunType
, typename P1
>
2551 struct BindState
<Runnable
, RunType
, void(P1
)> : public BindStateBase
{
2552 typedef Runnable RunnableType
;
2553 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2554 typedef Invoker
<1, BindState
, RunType
> InvokerType
;
2555 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2557 // Convenience typedefs for bound argument types.
2558 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2560 BindState(const Runnable
& runnable
, const P1
& p1
)
2561 : runnable_(runnable
),
2563 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2566 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2567 P1
>::Release(p1_
); }
2569 RunnableType runnable_
;
2573 template <typename Runnable
, typename RunType
, typename P1
, typename P2
>
2574 struct BindState
<Runnable
, RunType
, void(P1
, P2
)> : public BindStateBase
{
2575 typedef Runnable RunnableType
;
2576 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2577 typedef Invoker
<2, BindState
, RunType
> InvokerType
;
2578 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2580 // Convenience typedefs for bound argument types.
2581 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2582 typedef UnwrapTraits
<P2
> Bound2UnwrapTraits
;
2584 BindState(const Runnable
& runnable
, const P1
& p1
, const P2
& p2
)
2585 : runnable_(runnable
),
2588 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2591 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2592 P1
>::Release(p1_
); }
2594 RunnableType runnable_
;
2599 template <typename Runnable
, typename RunType
, typename P1
, typename P2
,
2601 struct BindState
<Runnable
, RunType
, void(P1
, P2
, P3
)> : public BindStateBase
{
2602 typedef Runnable RunnableType
;
2603 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2604 typedef Invoker
<3, BindState
, RunType
> InvokerType
;
2605 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2607 // Convenience typedefs for bound argument types.
2608 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2609 typedef UnwrapTraits
<P2
> Bound2UnwrapTraits
;
2610 typedef UnwrapTraits
<P3
> Bound3UnwrapTraits
;
2612 BindState(const Runnable
& runnable
, const P1
& p1
, const P2
& p2
, const P3
& p3
)
2613 : runnable_(runnable
),
2617 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2620 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2621 P1
>::Release(p1_
); }
2623 RunnableType runnable_
;
2629 template <typename Runnable
, typename RunType
, typename P1
, typename P2
,
2630 typename P3
, typename P4
>
2631 struct BindState
<Runnable
, RunType
, void(P1
, P2
, P3
,
2632 P4
)> : public BindStateBase
{
2633 typedef Runnable RunnableType
;
2634 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2635 typedef Invoker
<4, BindState
, RunType
> InvokerType
;
2636 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2638 // Convenience typedefs for bound argument types.
2639 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2640 typedef UnwrapTraits
<P2
> Bound2UnwrapTraits
;
2641 typedef UnwrapTraits
<P3
> Bound3UnwrapTraits
;
2642 typedef UnwrapTraits
<P4
> Bound4UnwrapTraits
;
2644 BindState(const Runnable
& runnable
, const P1
& p1
, const P2
& p2
, const P3
& p3
,
2646 : runnable_(runnable
),
2651 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2654 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2655 P1
>::Release(p1_
); }
2657 RunnableType runnable_
;
2664 template <typename Runnable
, typename RunType
, typename P1
, typename P2
,
2665 typename P3
, typename P4
, typename P5
>
2666 struct BindState
<Runnable
, RunType
, void(P1
, P2
, P3
, P4
,
2667 P5
)> : public BindStateBase
{
2668 typedef Runnable RunnableType
;
2669 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2670 typedef Invoker
<5, BindState
, RunType
> InvokerType
;
2671 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2673 // Convenience typedefs for bound argument types.
2674 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2675 typedef UnwrapTraits
<P2
> Bound2UnwrapTraits
;
2676 typedef UnwrapTraits
<P3
> Bound3UnwrapTraits
;
2677 typedef UnwrapTraits
<P4
> Bound4UnwrapTraits
;
2678 typedef UnwrapTraits
<P5
> Bound5UnwrapTraits
;
2680 BindState(const Runnable
& runnable
, const P1
& p1
, const P2
& p2
, const P3
& p3
,
2681 const P4
& p4
, const P5
& p5
)
2682 : runnable_(runnable
),
2688 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2691 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2692 P1
>::Release(p1_
); }
2694 RunnableType runnable_
;
2702 template <typename Runnable
, typename RunType
, typename P1
, typename P2
,
2703 typename P3
, typename P4
, typename P5
, typename P6
>
2704 struct BindState
<Runnable
, RunType
, void(P1
, P2
, P3
, P4
, P5
,
2705 P6
)> : public BindStateBase
{
2706 typedef Runnable RunnableType
;
2707 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2708 typedef Invoker
<6, BindState
, RunType
> InvokerType
;
2709 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2711 // Convenience typedefs for bound argument types.
2712 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2713 typedef UnwrapTraits
<P2
> Bound2UnwrapTraits
;
2714 typedef UnwrapTraits
<P3
> Bound3UnwrapTraits
;
2715 typedef UnwrapTraits
<P4
> Bound4UnwrapTraits
;
2716 typedef UnwrapTraits
<P5
> Bound5UnwrapTraits
;
2717 typedef UnwrapTraits
<P6
> Bound6UnwrapTraits
;
2719 BindState(const Runnable
& runnable
, const P1
& p1
, const P2
& p2
, const P3
& p3
,
2720 const P4
& p4
, const P5
& p5
, const P6
& p6
)
2721 : runnable_(runnable
),
2728 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2731 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2732 P1
>::Release(p1_
); }
2734 RunnableType runnable_
;
2743 template <typename Runnable
, typename RunType
, typename P1
, typename P2
,
2744 typename P3
, typename P4
, typename P5
, typename P6
, typename P7
>
2745 struct BindState
<Runnable
, RunType
, void(P1
, P2
, P3
, P4
, P5
, P6
,
2746 P7
)> : public BindStateBase
{
2747 typedef Runnable RunnableType
;
2748 typedef IsWeakMethod
<HasIsMethodTag
<Runnable
>::value
, P1
> IsWeakCall
;
2749 typedef Invoker
<7, BindState
, RunType
> InvokerType
;
2750 typedef typename
InvokerType::UnboundRunType UnboundRunType
;
2752 // Convenience typedefs for bound argument types.
2753 typedef UnwrapTraits
<P1
> Bound1UnwrapTraits
;
2754 typedef UnwrapTraits
<P2
> Bound2UnwrapTraits
;
2755 typedef UnwrapTraits
<P3
> Bound3UnwrapTraits
;
2756 typedef UnwrapTraits
<P4
> Bound4UnwrapTraits
;
2757 typedef UnwrapTraits
<P5
> Bound5UnwrapTraits
;
2758 typedef UnwrapTraits
<P6
> Bound6UnwrapTraits
;
2759 typedef UnwrapTraits
<P7
> Bound7UnwrapTraits
;
2761 BindState(const Runnable
& runnable
, const P1
& p1
, const P2
& p2
, const P3
& p3
,
2762 const P4
& p4
, const P5
& p5
, const P6
& p6
, const P7
& p7
)
2763 : runnable_(runnable
),
2771 MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
, P1
>::AddRef(p1_
);
2774 virtual ~BindState() { MaybeRefcount
<HasIsMethodTag
<Runnable
>::value
,
2775 P1
>::Release(p1_
); }
2777 RunnableType runnable_
;
2787 } // namespace internal
2790 #endif // BASE_BIND_INTERNAL_H_