Revert of [telemetry] Fix decorator hack for benchmark_smoke_unittest. (patchset...
[chromium-blink-merge.git] / base / bind_internal.h
blob2142797053e48de1551963b0986b034cf44d07f5
1 // This file was GENERATED by command:
2 // pump.py bind_internal.h.pump
3 // DO NOT EDIT BY HAND!!!
6 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
7 // Use of this source code is governed by a BSD-style license that can be
8 // found in the LICENSE file.
10 #ifndef BASE_BIND_INTERNAL_H_
11 #define BASE_BIND_INTERNAL_H_
13 #include "base/bind_helpers.h"
14 #include "base/callback_internal.h"
15 #include "base/memory/raw_scoped_refptr_mismatch_checker.h"
16 #include "base/memory/weak_ptr.h"
17 #include "base/template_util.h"
18 #include "build/build_config.h"
20 #if defined(OS_WIN)
21 #include "base/bind_internal_win.h"
22 #endif
24 namespace base {
25 namespace internal {
27 // See base/callback.h for user documentation.
30 // CONCEPTS:
31 // Runnable -- A type (really a type class) that has a single Run() method
32 // and a RunType typedef that corresponds to the type of Run().
33 // A Runnable can declare that it should treated like a method
34 // call by including a typedef named IsMethod. The value of
35 // this typedef is NOT inspected, only the existence. When a
36 // Runnable declares itself a method, Bind() will enforce special
37 // refcounting + WeakPtr handling semantics for the first
38 // parameter which is expected to be an object.
39 // Functor -- A copyable type representing something that should be called.
40 // All function pointers, Callback<>, and Runnables are functors
41 // even if the invocation syntax differs.
42 // RunType -- A function type (as opposed to function _pointer_ type) for
43 // a Run() function. Usually just a convenience typedef.
44 // (Bound)ArgsType -- A function type that is being (ab)used to store the
45 // types of set of arguments. The "return" type is always
46 // void here. We use this hack so that we do not need
47 // a new type name for each arity of type. (eg.,
48 // BindState1, BindState2). This makes forward
49 // declarations and friending much much easier.
51 // Types:
52 // RunnableAdapter<> -- Wraps the various "function" pointer types into an
53 // object that adheres to the Runnable interface.
54 // FunctionTraits<> -- Type traits that unwrap a function signature into a
55 // a set of easier to use typedefs. Used mainly for
56 // compile time asserts.
57 // There are |ARITY| FunctionTraits types.
58 // ForceVoidReturn<> -- Helper class for translating function signatures to
59 // equivalent forms with a "void" return type.
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 // MakeRunnable<> -- Takes a Functor and returns an object in the Runnable
64 // type class that represents the underlying Functor.
65 // There are |O(1)| MakeRunnable types.
66 // InvokeHelper<> -- Take a Runnable + arguments and actully invokes it.
67 // Handle the differing syntaxes needed for WeakPtr<> support,
68 // and for ignoring return values. This is separate from
69 // Invoker to avoid creating multiple version of Invoker<>
70 // which grows at O(n^2) with the arity.
71 // Invoker<> -- Unwraps the curried parameters and executes the Runnable.
72 // There are |(ARITY^2 + ARITY)/2| Invoketypes.
73 // BindState<> -- Stores the curried parameters, and is the main entry point
74 // into the Bind() system, doing most of the type resolution.
75 // There are ARITY BindState types.
77 // RunnableAdapter<>
79 // The RunnableAdapter<> templates provide a uniform interface for invoking
80 // a function pointer, method pointer, or const method pointer. The adapter
81 // exposes a Run() method with an appropriate signature. Using this wrapper
82 // allows for writing code that supports all three pointer types without
83 // undue repetition. Without it, a lot of code would need to be repeated 3
84 // times.
86 // For method pointers and const method pointers the first argument to Run()
87 // is considered to be the received of the method. This is similar to STL's
88 // mem_fun().
90 // This class also exposes a RunType typedef that is the function type of the
91 // Run() function.
93 // If and only if the wrapper contains a method or const method pointer, an
94 // IsMethod typedef is exposed. The existence of this typedef (NOT the value)
95 // marks that the wrapper should be considered a method wrapper.
97 template <typename Functor>
98 class RunnableAdapter;
100 // Function.
101 template <typename R, typename... Args>
102 class RunnableAdapter<R(*)(Args...)> {
103 public:
104 typedef R (RunType)(Args...);
106 explicit RunnableAdapter(R(*function)(Args...))
107 : function_(function) {
110 R Run(typename CallbackParamTraits<Args>::ForwardType... args) {
111 return function_(CallbackForward(args)...);
114 private:
115 R (*function_)(Args...);
118 // Method.
119 template <typename R, typename T, typename... Args>
120 class RunnableAdapter<R(T::*)(Args...)> {
121 public:
122 typedef R (RunType)(T*, Args...);
123 typedef true_type IsMethod;
125 explicit RunnableAdapter(R(T::*method)(Args...))
126 : method_(method) {
129 R Run(T* object, typename CallbackParamTraits<Args>::ForwardType... args) {
130 return (object->*method_)(CallbackForward(args)...);
133 private:
134 R (T::*method_)(Args...);
137 // Const Method.
138 template <typename R, typename T, typename... Args>
139 class RunnableAdapter<R(T::*)(Args...) const> {
140 public:
141 typedef R (RunType)(const T*, Args...);
142 typedef true_type IsMethod;
144 explicit RunnableAdapter(R(T::*method)(Args...) const)
145 : method_(method) {
148 R Run(const T* object,
149 typename CallbackParamTraits<Args>::ForwardType... args) {
150 return (object->*method_)(CallbackForward(args)...);
153 private:
154 R (T::*method_)(Args...) const;
157 // TODO(tzik): Remove FunctionTraits after we finish removing bind.pump.
158 // FunctionTraits<>
160 // Breaks a function signature apart into typedefs for easier introspection.
161 template <typename Sig>
162 struct FunctionTraits;
164 template <typename R>
165 struct FunctionTraits<R()> {
166 typedef R ReturnType;
169 template <typename R, typename A1>
170 struct FunctionTraits<R(A1)> {
171 typedef R ReturnType;
172 typedef A1 A1Type;
175 template <typename R, typename A1, typename A2>
176 struct FunctionTraits<R(A1, A2)> {
177 typedef R ReturnType;
178 typedef A1 A1Type;
179 typedef A2 A2Type;
182 template <typename R, typename A1, typename A2, typename A3>
183 struct FunctionTraits<R(A1, A2, A3)> {
184 typedef R ReturnType;
185 typedef A1 A1Type;
186 typedef A2 A2Type;
187 typedef A3 A3Type;
190 template <typename R, typename A1, typename A2, typename A3, typename A4>
191 struct FunctionTraits<R(A1, A2, A3, A4)> {
192 typedef R ReturnType;
193 typedef A1 A1Type;
194 typedef A2 A2Type;
195 typedef A3 A3Type;
196 typedef A4 A4Type;
199 template <typename R, typename A1, typename A2, typename A3, typename A4,
200 typename A5>
201 struct FunctionTraits<R(A1, A2, A3, A4, A5)> {
202 typedef R ReturnType;
203 typedef A1 A1Type;
204 typedef A2 A2Type;
205 typedef A3 A3Type;
206 typedef A4 A4Type;
207 typedef A5 A5Type;
210 template <typename R, typename A1, typename A2, typename A3, typename A4,
211 typename A5, typename A6>
212 struct FunctionTraits<R(A1, A2, A3, A4, A5, A6)> {
213 typedef R ReturnType;
214 typedef A1 A1Type;
215 typedef A2 A2Type;
216 typedef A3 A3Type;
217 typedef A4 A4Type;
218 typedef A5 A5Type;
219 typedef A6 A6Type;
222 template <typename R, typename A1, typename A2, typename A3, typename A4,
223 typename A5, typename A6, typename A7>
224 struct FunctionTraits<R(A1, A2, A3, A4, A5, A6, A7)> {
225 typedef R ReturnType;
226 typedef A1 A1Type;
227 typedef A2 A2Type;
228 typedef A3 A3Type;
229 typedef A4 A4Type;
230 typedef A5 A5Type;
231 typedef A6 A6Type;
232 typedef A7 A7Type;
236 // ForceVoidReturn<>
238 // Set of templates that support forcing the function return type to void.
239 template <typename Sig>
240 struct ForceVoidReturn;
242 template <typename R, typename... Args>
243 struct ForceVoidReturn<R(Args...)> {
244 typedef void(RunType)(Args...);
248 // FunctorTraits<>
250 // See description at top of file.
251 template <typename T>
252 struct FunctorTraits {
253 typedef RunnableAdapter<T> RunnableType;
254 typedef typename RunnableType::RunType RunType;
257 template <typename T>
258 struct FunctorTraits<IgnoreResultHelper<T> > {
259 typedef typename FunctorTraits<T>::RunnableType RunnableType;
260 typedef typename ForceVoidReturn<
261 typename RunnableType::RunType>::RunType RunType;
264 template <typename T>
265 struct FunctorTraits<Callback<T> > {
266 typedef Callback<T> RunnableType;
267 typedef typename Callback<T>::RunType RunType;
271 // MakeRunnable<>
273 // Converts a passed in functor to a RunnableType using type inference.
275 template <typename T>
276 typename FunctorTraits<T>::RunnableType MakeRunnable(const T& t) {
277 return RunnableAdapter<T>(t);
280 template <typename T>
281 typename FunctorTraits<T>::RunnableType
282 MakeRunnable(const IgnoreResultHelper<T>& t) {
283 return MakeRunnable(t.functor_);
286 template <typename T>
287 const typename FunctorTraits<Callback<T> >::RunnableType&
288 MakeRunnable(const Callback<T>& t) {
289 DCHECK(!t.is_null());
290 return t;
294 // InvokeHelper<>
296 // There are 3 logical InvokeHelper<> specializations: normal, void-return,
297 // WeakCalls.
299 // The normal type just calls the underlying runnable.
301 // We need a InvokeHelper to handle void return types in order to support
302 // IgnoreResult(). Normally, if the Runnable's RunType had a void return,
303 // the template system would just accept "return functor.Run()" ignoring
304 // the fact that a void function is being used with return. This piece of
305 // sugar breaks though when the Runnable's RunType is not void. Thus, we
306 // need a partial specialization to change the syntax to drop the "return"
307 // from the invocation call.
309 // WeakCalls similarly need special syntax that is applied to the first
310 // argument to check if they should no-op themselves.
311 template <bool IsWeakCall, typename ReturnType, typename Runnable,
312 typename ArgsType>
313 struct InvokeHelper;
315 template <typename ReturnType, typename Runnable, typename... Args>
316 struct InvokeHelper<false, ReturnType, Runnable,
317 void(Args...)> {
318 static ReturnType MakeItSo(Runnable runnable, Args... args) {
319 return runnable.Run(CallbackForward(args)...);
323 template <typename Runnable, typename... Args>
324 struct InvokeHelper<false, void, Runnable, void(Args...)> {
325 static void MakeItSo(Runnable runnable, Args... args) {
326 runnable.Run(CallbackForward(args)...);
330 template <typename Runnable, typename BoundWeakPtr, typename... Args>
331 struct InvokeHelper<true, void, Runnable, void(BoundWeakPtr, Args...)> {
332 static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, Args... args) {
333 if (!weak_ptr.get()) {
334 return;
336 runnable.Run(weak_ptr.get(), CallbackForward(args)...);
340 #if !defined(_MSC_VER)
342 template <typename ReturnType, typename Runnable, typename ArgsType>
343 struct InvokeHelper<true, ReturnType, Runnable, ArgsType> {
344 // WeakCalls are only supported for functions with a void return type.
345 // Otherwise, the function result would be undefined if the the WeakPtr<>
346 // is invalidated.
347 COMPILE_ASSERT(is_void<ReturnType>::value,
348 weak_ptrs_can_only_bind_to_methods_without_return_values);
351 #endif
353 // Invoker<>
355 // See description at the top of the file.
356 template <int NumBound, typename Storage, typename RunType>
357 struct Invoker;
359 // Arity 0 -> 0.
360 template <typename StorageType, typename R>
361 struct Invoker<0, StorageType, R()> {
362 typedef R(RunType)(BindStateBase*);
364 typedef R(UnboundRunType)();
366 static R Run(BindStateBase* base) {
367 StorageType* storage = static_cast<StorageType*>(base);
369 // Local references to make debugger stepping easier. If in a debugger,
370 // you really want to warp ahead and step through the
371 // InvokeHelper<>::MakeItSo() call below.
373 return InvokeHelper<StorageType::IsWeakCall::value, R,
374 typename StorageType::RunnableType,
375 void()>
376 ::MakeItSo(storage->runnable_);
380 // Arity 1 -> 1.
381 template <typename StorageType, typename R,typename X1>
382 struct Invoker<0, StorageType, R(X1)> {
383 typedef R(RunType)(BindStateBase*,
384 typename CallbackParamTraits<X1>::ForwardType);
386 typedef R(UnboundRunType)(X1);
388 static R Run(BindStateBase* base,
389 typename CallbackParamTraits<X1>::ForwardType x1) {
390 StorageType* storage = static_cast<StorageType*>(base);
392 // Local references to make debugger stepping easier. If in a debugger,
393 // you really want to warp ahead and step through the
394 // InvokeHelper<>::MakeItSo() call below.
396 return InvokeHelper<StorageType::IsWeakCall::value, R,
397 typename StorageType::RunnableType,
398 void(typename CallbackParamTraits<X1>::ForwardType x1)>
399 ::MakeItSo(storage->runnable_, CallbackForward(x1));
403 // Arity 1 -> 0.
404 template <typename StorageType, typename R,typename X1>
405 struct Invoker<1, StorageType, R(X1)> {
406 typedef R(RunType)(BindStateBase*);
408 typedef R(UnboundRunType)();
410 static R Run(BindStateBase* base) {
411 StorageType* storage = static_cast<StorageType*>(base);
413 // Local references to make debugger stepping easier. If in a debugger,
414 // you really want to warp ahead and step through the
415 // InvokeHelper<>::MakeItSo() call below.
416 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
418 typename Bound1UnwrapTraits::ForwardType x1 =
419 Bound1UnwrapTraits::Unwrap(storage->p1_);
420 return InvokeHelper<StorageType::IsWeakCall::value, R,
421 typename StorageType::RunnableType,
422 void(typename Bound1UnwrapTraits::ForwardType)>
423 ::MakeItSo(storage->runnable_, CallbackForward(x1));
427 // Arity 2 -> 2.
428 template <typename StorageType, typename R,typename X1, typename X2>
429 struct Invoker<0, StorageType, R(X1, X2)> {
430 typedef R(RunType)(BindStateBase*,
431 typename CallbackParamTraits<X1>::ForwardType,
432 typename CallbackParamTraits<X2>::ForwardType);
434 typedef R(UnboundRunType)(X1, X2);
436 static R Run(BindStateBase* base,
437 typename CallbackParamTraits<X1>::ForwardType x1,
438 typename CallbackParamTraits<X2>::ForwardType x2) {
439 StorageType* storage = static_cast<StorageType*>(base);
441 // Local references to make debugger stepping easier. If in a debugger,
442 // you really want to warp ahead and step through the
443 // InvokeHelper<>::MakeItSo() call below.
445 return InvokeHelper<StorageType::IsWeakCall::value, R,
446 typename StorageType::RunnableType,
447 void(typename CallbackParamTraits<X1>::ForwardType x1,
448 typename CallbackParamTraits<X2>::ForwardType x2)>
449 ::MakeItSo(storage->runnable_, CallbackForward(x1),
450 CallbackForward(x2));
454 // Arity 2 -> 1.
455 template <typename StorageType, typename R,typename X1, typename X2>
456 struct Invoker<1, StorageType, R(X1, X2)> {
457 typedef R(RunType)(BindStateBase*,
458 typename CallbackParamTraits<X2>::ForwardType);
460 typedef R(UnboundRunType)(X2);
462 static R Run(BindStateBase* base,
463 typename CallbackParamTraits<X2>::ForwardType x2) {
464 StorageType* storage = static_cast<StorageType*>(base);
466 // Local references to make debugger stepping easier. If in a debugger,
467 // you really want to warp ahead and step through the
468 // InvokeHelper<>::MakeItSo() call below.
469 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
471 typename Bound1UnwrapTraits::ForwardType x1 =
472 Bound1UnwrapTraits::Unwrap(storage->p1_);
473 return InvokeHelper<StorageType::IsWeakCall::value, R,
474 typename StorageType::RunnableType,
475 void(typename Bound1UnwrapTraits::ForwardType,
476 typename CallbackParamTraits<X2>::ForwardType x2)>
477 ::MakeItSo(storage->runnable_, CallbackForward(x1),
478 CallbackForward(x2));
482 // Arity 2 -> 0.
483 template <typename StorageType, typename R,typename X1, typename X2>
484 struct Invoker<2, StorageType, R(X1, X2)> {
485 typedef R(RunType)(BindStateBase*);
487 typedef R(UnboundRunType)();
489 static R Run(BindStateBase* base) {
490 StorageType* storage = static_cast<StorageType*>(base);
492 // Local references to make debugger stepping easier. If in a debugger,
493 // you really want to warp ahead and step through the
494 // InvokeHelper<>::MakeItSo() call below.
495 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
496 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
498 typename Bound1UnwrapTraits::ForwardType x1 =
499 Bound1UnwrapTraits::Unwrap(storage->p1_);
500 typename Bound2UnwrapTraits::ForwardType x2 =
501 Bound2UnwrapTraits::Unwrap(storage->p2_);
502 return InvokeHelper<StorageType::IsWeakCall::value, R,
503 typename StorageType::RunnableType,
504 void(typename Bound1UnwrapTraits::ForwardType,
505 typename Bound2UnwrapTraits::ForwardType)>
506 ::MakeItSo(storage->runnable_, CallbackForward(x1),
507 CallbackForward(x2));
511 // Arity 3 -> 3.
512 template <typename StorageType, typename R,typename X1, typename X2,
513 typename X3>
514 struct Invoker<0, StorageType, R(X1, X2, X3)> {
515 typedef R(RunType)(BindStateBase*,
516 typename CallbackParamTraits<X1>::ForwardType,
517 typename CallbackParamTraits<X2>::ForwardType,
518 typename CallbackParamTraits<X3>::ForwardType);
520 typedef R(UnboundRunType)(X1, X2, X3);
522 static R Run(BindStateBase* base,
523 typename CallbackParamTraits<X1>::ForwardType x1,
524 typename CallbackParamTraits<X2>::ForwardType x2,
525 typename CallbackParamTraits<X3>::ForwardType x3) {
526 StorageType* storage = static_cast<StorageType*>(base);
528 // Local references to make debugger stepping easier. If in a debugger,
529 // you really want to warp ahead and step through the
530 // InvokeHelper<>::MakeItSo() call below.
532 return InvokeHelper<StorageType::IsWeakCall::value, R,
533 typename StorageType::RunnableType,
534 void(typename CallbackParamTraits<X1>::ForwardType x1,
535 typename CallbackParamTraits<X2>::ForwardType x2,
536 typename CallbackParamTraits<X3>::ForwardType x3)>
537 ::MakeItSo(storage->runnable_, CallbackForward(x1),
538 CallbackForward(x2), CallbackForward(x3));
542 // Arity 3 -> 2.
543 template <typename StorageType, typename R,typename X1, typename X2,
544 typename X3>
545 struct Invoker<1, StorageType, R(X1, X2, X3)> {
546 typedef R(RunType)(BindStateBase*,
547 typename CallbackParamTraits<X2>::ForwardType,
548 typename CallbackParamTraits<X3>::ForwardType);
550 typedef R(UnboundRunType)(X2, X3);
552 static R Run(BindStateBase* base,
553 typename CallbackParamTraits<X2>::ForwardType x2,
554 typename CallbackParamTraits<X3>::ForwardType x3) {
555 StorageType* storage = static_cast<StorageType*>(base);
557 // Local references to make debugger stepping easier. If in a debugger,
558 // you really want to warp ahead and step through the
559 // InvokeHelper<>::MakeItSo() call below.
560 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
562 typename Bound1UnwrapTraits::ForwardType x1 =
563 Bound1UnwrapTraits::Unwrap(storage->p1_);
564 return InvokeHelper<StorageType::IsWeakCall::value, R,
565 typename StorageType::RunnableType,
566 void(typename Bound1UnwrapTraits::ForwardType,
567 typename CallbackParamTraits<X2>::ForwardType x2,
568 typename CallbackParamTraits<X3>::ForwardType x3)>
569 ::MakeItSo(storage->runnable_, CallbackForward(x1),
570 CallbackForward(x2), CallbackForward(x3));
574 // Arity 3 -> 1.
575 template <typename StorageType, typename R,typename X1, typename X2,
576 typename X3>
577 struct Invoker<2, StorageType, R(X1, X2, X3)> {
578 typedef R(RunType)(BindStateBase*,
579 typename CallbackParamTraits<X3>::ForwardType);
581 typedef R(UnboundRunType)(X3);
583 static R Run(BindStateBase* base,
584 typename CallbackParamTraits<X3>::ForwardType x3) {
585 StorageType* storage = static_cast<StorageType*>(base);
587 // Local references to make debugger stepping easier. If in a debugger,
588 // you really want to warp ahead and step through the
589 // InvokeHelper<>::MakeItSo() call below.
590 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
591 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
593 typename Bound1UnwrapTraits::ForwardType x1 =
594 Bound1UnwrapTraits::Unwrap(storage->p1_);
595 typename Bound2UnwrapTraits::ForwardType x2 =
596 Bound2UnwrapTraits::Unwrap(storage->p2_);
597 return InvokeHelper<StorageType::IsWeakCall::value, R,
598 typename StorageType::RunnableType,
599 void(typename Bound1UnwrapTraits::ForwardType,
600 typename Bound2UnwrapTraits::ForwardType,
601 typename CallbackParamTraits<X3>::ForwardType x3)>
602 ::MakeItSo(storage->runnable_, CallbackForward(x1),
603 CallbackForward(x2), CallbackForward(x3));
607 // Arity 3 -> 0.
608 template <typename StorageType, typename R,typename X1, typename X2,
609 typename X3>
610 struct Invoker<3, StorageType, R(X1, X2, X3)> {
611 typedef R(RunType)(BindStateBase*);
613 typedef R(UnboundRunType)();
615 static R Run(BindStateBase* base) {
616 StorageType* storage = static_cast<StorageType*>(base);
618 // Local references to make debugger stepping easier. If in a debugger,
619 // you really want to warp ahead and step through the
620 // InvokeHelper<>::MakeItSo() call below.
621 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
622 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
623 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
625 typename Bound1UnwrapTraits::ForwardType x1 =
626 Bound1UnwrapTraits::Unwrap(storage->p1_);
627 typename Bound2UnwrapTraits::ForwardType x2 =
628 Bound2UnwrapTraits::Unwrap(storage->p2_);
629 typename Bound3UnwrapTraits::ForwardType x3 =
630 Bound3UnwrapTraits::Unwrap(storage->p3_);
631 return InvokeHelper<StorageType::IsWeakCall::value, R,
632 typename StorageType::RunnableType,
633 void(typename Bound1UnwrapTraits::ForwardType,
634 typename Bound2UnwrapTraits::ForwardType,
635 typename Bound3UnwrapTraits::ForwardType)>
636 ::MakeItSo(storage->runnable_, CallbackForward(x1),
637 CallbackForward(x2), CallbackForward(x3));
641 // Arity 4 -> 4.
642 template <typename StorageType, typename R,typename X1, typename X2,
643 typename X3, typename X4>
644 struct Invoker<0, StorageType, R(X1, X2, X3, X4)> {
645 typedef R(RunType)(BindStateBase*,
646 typename CallbackParamTraits<X1>::ForwardType,
647 typename CallbackParamTraits<X2>::ForwardType,
648 typename CallbackParamTraits<X3>::ForwardType,
649 typename CallbackParamTraits<X4>::ForwardType);
651 typedef R(UnboundRunType)(X1, X2, X3, X4);
653 static R Run(BindStateBase* base,
654 typename CallbackParamTraits<X1>::ForwardType x1,
655 typename CallbackParamTraits<X2>::ForwardType x2,
656 typename CallbackParamTraits<X3>::ForwardType x3,
657 typename CallbackParamTraits<X4>::ForwardType x4) {
658 StorageType* storage = static_cast<StorageType*>(base);
660 // Local references to make debugger stepping easier. If in a debugger,
661 // you really want to warp ahead and step through the
662 // InvokeHelper<>::MakeItSo() call below.
664 return InvokeHelper<StorageType::IsWeakCall::value, R,
665 typename StorageType::RunnableType,
666 void(typename CallbackParamTraits<X1>::ForwardType x1,
667 typename CallbackParamTraits<X2>::ForwardType x2,
668 typename CallbackParamTraits<X3>::ForwardType x3,
669 typename CallbackParamTraits<X4>::ForwardType x4)>
670 ::MakeItSo(storage->runnable_, CallbackForward(x1),
671 CallbackForward(x2), CallbackForward(x3),
672 CallbackForward(x4));
676 // Arity 4 -> 3.
677 template <typename StorageType, typename R,typename X1, typename X2,
678 typename X3, typename X4>
679 struct Invoker<1, StorageType, R(X1, X2, X3, X4)> {
680 typedef R(RunType)(BindStateBase*,
681 typename CallbackParamTraits<X2>::ForwardType,
682 typename CallbackParamTraits<X3>::ForwardType,
683 typename CallbackParamTraits<X4>::ForwardType);
685 typedef R(UnboundRunType)(X2, X3, X4);
687 static R Run(BindStateBase* base,
688 typename CallbackParamTraits<X2>::ForwardType x2,
689 typename CallbackParamTraits<X3>::ForwardType x3,
690 typename CallbackParamTraits<X4>::ForwardType x4) {
691 StorageType* storage = static_cast<StorageType*>(base);
693 // Local references to make debugger stepping easier. If in a debugger,
694 // you really want to warp ahead and step through the
695 // InvokeHelper<>::MakeItSo() call below.
696 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
698 typename Bound1UnwrapTraits::ForwardType x1 =
699 Bound1UnwrapTraits::Unwrap(storage->p1_);
700 return InvokeHelper<StorageType::IsWeakCall::value, R,
701 typename StorageType::RunnableType,
702 void(typename Bound1UnwrapTraits::ForwardType,
703 typename CallbackParamTraits<X2>::ForwardType x2,
704 typename CallbackParamTraits<X3>::ForwardType x3,
705 typename CallbackParamTraits<X4>::ForwardType x4)>
706 ::MakeItSo(storage->runnable_, CallbackForward(x1),
707 CallbackForward(x2), CallbackForward(x3),
708 CallbackForward(x4));
712 // Arity 4 -> 2.
713 template <typename StorageType, typename R,typename X1, typename X2,
714 typename X3, typename X4>
715 struct Invoker<2, StorageType, R(X1, X2, X3, X4)> {
716 typedef R(RunType)(BindStateBase*,
717 typename CallbackParamTraits<X3>::ForwardType,
718 typename CallbackParamTraits<X4>::ForwardType);
720 typedef R(UnboundRunType)(X3, X4);
722 static R Run(BindStateBase* base,
723 typename CallbackParamTraits<X3>::ForwardType x3,
724 typename CallbackParamTraits<X4>::ForwardType x4) {
725 StorageType* storage = static_cast<StorageType*>(base);
727 // Local references to make debugger stepping easier. If in a debugger,
728 // you really want to warp ahead and step through the
729 // InvokeHelper<>::MakeItSo() call below.
730 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
731 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
733 typename Bound1UnwrapTraits::ForwardType x1 =
734 Bound1UnwrapTraits::Unwrap(storage->p1_);
735 typename Bound2UnwrapTraits::ForwardType x2 =
736 Bound2UnwrapTraits::Unwrap(storage->p2_);
737 return InvokeHelper<StorageType::IsWeakCall::value, R,
738 typename StorageType::RunnableType,
739 void(typename Bound1UnwrapTraits::ForwardType,
740 typename Bound2UnwrapTraits::ForwardType,
741 typename CallbackParamTraits<X3>::ForwardType x3,
742 typename CallbackParamTraits<X4>::ForwardType x4)>
743 ::MakeItSo(storage->runnable_, CallbackForward(x1),
744 CallbackForward(x2), CallbackForward(x3),
745 CallbackForward(x4));
749 // Arity 4 -> 1.
750 template <typename StorageType, typename R,typename X1, typename X2,
751 typename X3, typename X4>
752 struct Invoker<3, StorageType, R(X1, X2, X3, X4)> {
753 typedef R(RunType)(BindStateBase*,
754 typename CallbackParamTraits<X4>::ForwardType);
756 typedef R(UnboundRunType)(X4);
758 static R Run(BindStateBase* base,
759 typename CallbackParamTraits<X4>::ForwardType x4) {
760 StorageType* storage = static_cast<StorageType*>(base);
762 // Local references to make debugger stepping easier. If in a debugger,
763 // you really want to warp ahead and step through the
764 // InvokeHelper<>::MakeItSo() call below.
765 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
766 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
767 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
769 typename Bound1UnwrapTraits::ForwardType x1 =
770 Bound1UnwrapTraits::Unwrap(storage->p1_);
771 typename Bound2UnwrapTraits::ForwardType x2 =
772 Bound2UnwrapTraits::Unwrap(storage->p2_);
773 typename Bound3UnwrapTraits::ForwardType x3 =
774 Bound3UnwrapTraits::Unwrap(storage->p3_);
775 return InvokeHelper<StorageType::IsWeakCall::value, R,
776 typename StorageType::RunnableType,
777 void(typename Bound1UnwrapTraits::ForwardType,
778 typename Bound2UnwrapTraits::ForwardType,
779 typename Bound3UnwrapTraits::ForwardType,
780 typename CallbackParamTraits<X4>::ForwardType x4)>
781 ::MakeItSo(storage->runnable_, CallbackForward(x1),
782 CallbackForward(x2), CallbackForward(x3),
783 CallbackForward(x4));
787 // Arity 4 -> 0.
788 template <typename StorageType, typename R,typename X1, typename X2,
789 typename X3, typename X4>
790 struct Invoker<4, StorageType, R(X1, X2, X3, X4)> {
791 typedef R(RunType)(BindStateBase*);
793 typedef R(UnboundRunType)();
795 static R Run(BindStateBase* base) {
796 StorageType* storage = static_cast<StorageType*>(base);
798 // Local references to make debugger stepping easier. If in a debugger,
799 // you really want to warp ahead and step through the
800 // InvokeHelper<>::MakeItSo() call below.
801 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
802 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
803 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
804 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
806 typename Bound1UnwrapTraits::ForwardType x1 =
807 Bound1UnwrapTraits::Unwrap(storage->p1_);
808 typename Bound2UnwrapTraits::ForwardType x2 =
809 Bound2UnwrapTraits::Unwrap(storage->p2_);
810 typename Bound3UnwrapTraits::ForwardType x3 =
811 Bound3UnwrapTraits::Unwrap(storage->p3_);
812 typename Bound4UnwrapTraits::ForwardType x4 =
813 Bound4UnwrapTraits::Unwrap(storage->p4_);
814 return InvokeHelper<StorageType::IsWeakCall::value, R,
815 typename StorageType::RunnableType,
816 void(typename Bound1UnwrapTraits::ForwardType,
817 typename Bound2UnwrapTraits::ForwardType,
818 typename Bound3UnwrapTraits::ForwardType,
819 typename Bound4UnwrapTraits::ForwardType)>
820 ::MakeItSo(storage->runnable_, CallbackForward(x1),
821 CallbackForward(x2), CallbackForward(x3),
822 CallbackForward(x4));
826 // Arity 5 -> 5.
827 template <typename StorageType, typename R,typename X1, typename X2,
828 typename X3, typename X4, typename X5>
829 struct Invoker<0, StorageType, R(X1, X2, X3, X4, X5)> {
830 typedef R(RunType)(BindStateBase*,
831 typename CallbackParamTraits<X1>::ForwardType,
832 typename CallbackParamTraits<X2>::ForwardType,
833 typename CallbackParamTraits<X3>::ForwardType,
834 typename CallbackParamTraits<X4>::ForwardType,
835 typename CallbackParamTraits<X5>::ForwardType);
837 typedef R(UnboundRunType)(X1, X2, X3, X4, X5);
839 static R Run(BindStateBase* base,
840 typename CallbackParamTraits<X1>::ForwardType x1,
841 typename CallbackParamTraits<X2>::ForwardType x2,
842 typename CallbackParamTraits<X3>::ForwardType x3,
843 typename CallbackParamTraits<X4>::ForwardType x4,
844 typename CallbackParamTraits<X5>::ForwardType x5) {
845 StorageType* storage = static_cast<StorageType*>(base);
847 // Local references to make debugger stepping easier. If in a debugger,
848 // you really want to warp ahead and step through the
849 // InvokeHelper<>::MakeItSo() call below.
851 return InvokeHelper<StorageType::IsWeakCall::value, R,
852 typename StorageType::RunnableType,
853 void(typename CallbackParamTraits<X1>::ForwardType x1,
854 typename CallbackParamTraits<X2>::ForwardType x2,
855 typename CallbackParamTraits<X3>::ForwardType x3,
856 typename CallbackParamTraits<X4>::ForwardType x4,
857 typename CallbackParamTraits<X5>::ForwardType x5)>
858 ::MakeItSo(storage->runnable_, CallbackForward(x1),
859 CallbackForward(x2), CallbackForward(x3),
860 CallbackForward(x4), CallbackForward(x5));
864 // Arity 5 -> 4.
865 template <typename StorageType, typename R,typename X1, typename X2,
866 typename X3, typename X4, typename X5>
867 struct Invoker<1, StorageType, R(X1, X2, X3, X4, X5)> {
868 typedef R(RunType)(BindStateBase*,
869 typename CallbackParamTraits<X2>::ForwardType,
870 typename CallbackParamTraits<X3>::ForwardType,
871 typename CallbackParamTraits<X4>::ForwardType,
872 typename CallbackParamTraits<X5>::ForwardType);
874 typedef R(UnboundRunType)(X2, X3, X4, X5);
876 static R Run(BindStateBase* base,
877 typename CallbackParamTraits<X2>::ForwardType x2,
878 typename CallbackParamTraits<X3>::ForwardType x3,
879 typename CallbackParamTraits<X4>::ForwardType x4,
880 typename CallbackParamTraits<X5>::ForwardType x5) {
881 StorageType* storage = static_cast<StorageType*>(base);
883 // Local references to make debugger stepping easier. If in a debugger,
884 // you really want to warp ahead and step through the
885 // InvokeHelper<>::MakeItSo() call below.
886 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
888 typename Bound1UnwrapTraits::ForwardType x1 =
889 Bound1UnwrapTraits::Unwrap(storage->p1_);
890 return InvokeHelper<StorageType::IsWeakCall::value, R,
891 typename StorageType::RunnableType,
892 void(typename Bound1UnwrapTraits::ForwardType,
893 typename CallbackParamTraits<X2>::ForwardType x2,
894 typename CallbackParamTraits<X3>::ForwardType x3,
895 typename CallbackParamTraits<X4>::ForwardType x4,
896 typename CallbackParamTraits<X5>::ForwardType x5)>
897 ::MakeItSo(storage->runnable_, CallbackForward(x1),
898 CallbackForward(x2), CallbackForward(x3),
899 CallbackForward(x4), CallbackForward(x5));
903 // Arity 5 -> 3.
904 template <typename StorageType, typename R,typename X1, typename X2,
905 typename X3, typename X4, typename X5>
906 struct Invoker<2, StorageType, R(X1, X2, X3, X4, X5)> {
907 typedef R(RunType)(BindStateBase*,
908 typename CallbackParamTraits<X3>::ForwardType,
909 typename CallbackParamTraits<X4>::ForwardType,
910 typename CallbackParamTraits<X5>::ForwardType);
912 typedef R(UnboundRunType)(X3, X4, X5);
914 static R Run(BindStateBase* base,
915 typename CallbackParamTraits<X3>::ForwardType x3,
916 typename CallbackParamTraits<X4>::ForwardType x4,
917 typename CallbackParamTraits<X5>::ForwardType x5) {
918 StorageType* storage = static_cast<StorageType*>(base);
920 // Local references to make debugger stepping easier. If in a debugger,
921 // you really want to warp ahead and step through the
922 // InvokeHelper<>::MakeItSo() call below.
923 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
924 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
926 typename Bound1UnwrapTraits::ForwardType x1 =
927 Bound1UnwrapTraits::Unwrap(storage->p1_);
928 typename Bound2UnwrapTraits::ForwardType x2 =
929 Bound2UnwrapTraits::Unwrap(storage->p2_);
930 return InvokeHelper<StorageType::IsWeakCall::value, R,
931 typename StorageType::RunnableType,
932 void(typename Bound1UnwrapTraits::ForwardType,
933 typename Bound2UnwrapTraits::ForwardType,
934 typename CallbackParamTraits<X3>::ForwardType x3,
935 typename CallbackParamTraits<X4>::ForwardType x4,
936 typename CallbackParamTraits<X5>::ForwardType x5)>
937 ::MakeItSo(storage->runnable_, CallbackForward(x1),
938 CallbackForward(x2), CallbackForward(x3),
939 CallbackForward(x4), CallbackForward(x5));
943 // Arity 5 -> 2.
944 template <typename StorageType, typename R,typename X1, typename X2,
945 typename X3, typename X4, typename X5>
946 struct Invoker<3, StorageType, R(X1, X2, X3, X4, X5)> {
947 typedef R(RunType)(BindStateBase*,
948 typename CallbackParamTraits<X4>::ForwardType,
949 typename CallbackParamTraits<X5>::ForwardType);
951 typedef R(UnboundRunType)(X4, X5);
953 static R Run(BindStateBase* base,
954 typename CallbackParamTraits<X4>::ForwardType x4,
955 typename CallbackParamTraits<X5>::ForwardType x5) {
956 StorageType* storage = static_cast<StorageType*>(base);
958 // Local references to make debugger stepping easier. If in a debugger,
959 // you really want to warp ahead and step through the
960 // InvokeHelper<>::MakeItSo() call below.
961 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
962 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
963 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
965 typename Bound1UnwrapTraits::ForwardType x1 =
966 Bound1UnwrapTraits::Unwrap(storage->p1_);
967 typename Bound2UnwrapTraits::ForwardType x2 =
968 Bound2UnwrapTraits::Unwrap(storage->p2_);
969 typename Bound3UnwrapTraits::ForwardType x3 =
970 Bound3UnwrapTraits::Unwrap(storage->p3_);
971 return InvokeHelper<StorageType::IsWeakCall::value, R,
972 typename StorageType::RunnableType,
973 void(typename Bound1UnwrapTraits::ForwardType,
974 typename Bound2UnwrapTraits::ForwardType,
975 typename Bound3UnwrapTraits::ForwardType,
976 typename CallbackParamTraits<X4>::ForwardType x4,
977 typename CallbackParamTraits<X5>::ForwardType x5)>
978 ::MakeItSo(storage->runnable_, CallbackForward(x1),
979 CallbackForward(x2), CallbackForward(x3),
980 CallbackForward(x4), CallbackForward(x5));
984 // Arity 5 -> 1.
985 template <typename StorageType, typename R,typename X1, typename X2,
986 typename X3, typename X4, typename X5>
987 struct Invoker<4, StorageType, R(X1, X2, X3, X4, X5)> {
988 typedef R(RunType)(BindStateBase*,
989 typename CallbackParamTraits<X5>::ForwardType);
991 typedef R(UnboundRunType)(X5);
993 static R Run(BindStateBase* base,
994 typename CallbackParamTraits<X5>::ForwardType x5) {
995 StorageType* storage = static_cast<StorageType*>(base);
997 // Local references to make debugger stepping easier. If in a debugger,
998 // you really want to warp ahead and step through the
999 // InvokeHelper<>::MakeItSo() call below.
1000 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1001 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1002 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1003 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
1005 typename Bound1UnwrapTraits::ForwardType x1 =
1006 Bound1UnwrapTraits::Unwrap(storage->p1_);
1007 typename Bound2UnwrapTraits::ForwardType x2 =
1008 Bound2UnwrapTraits::Unwrap(storage->p2_);
1009 typename Bound3UnwrapTraits::ForwardType x3 =
1010 Bound3UnwrapTraits::Unwrap(storage->p3_);
1011 typename Bound4UnwrapTraits::ForwardType x4 =
1012 Bound4UnwrapTraits::Unwrap(storage->p4_);
1013 return InvokeHelper<StorageType::IsWeakCall::value, R,
1014 typename StorageType::RunnableType,
1015 void(typename Bound1UnwrapTraits::ForwardType,
1016 typename Bound2UnwrapTraits::ForwardType,
1017 typename Bound3UnwrapTraits::ForwardType,
1018 typename Bound4UnwrapTraits::ForwardType,
1019 typename CallbackParamTraits<X5>::ForwardType x5)>
1020 ::MakeItSo(storage->runnable_, CallbackForward(x1),
1021 CallbackForward(x2), CallbackForward(x3),
1022 CallbackForward(x4), CallbackForward(x5));
1026 // Arity 5 -> 0.
1027 template <typename StorageType, typename R,typename X1, typename X2,
1028 typename X3, typename X4, typename X5>
1029 struct Invoker<5, StorageType, R(X1, X2, X3, X4, X5)> {
1030 typedef R(RunType)(BindStateBase*);
1032 typedef R(UnboundRunType)();
1034 static R Run(BindStateBase* base) {
1035 StorageType* storage = static_cast<StorageType*>(base);
1037 // Local references to make debugger stepping easier. If in a debugger,
1038 // you really want to warp ahead and step through the
1039 // InvokeHelper<>::MakeItSo() call below.
1040 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1041 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1042 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1043 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
1044 typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
1046 typename Bound1UnwrapTraits::ForwardType x1 =
1047 Bound1UnwrapTraits::Unwrap(storage->p1_);
1048 typename Bound2UnwrapTraits::ForwardType x2 =
1049 Bound2UnwrapTraits::Unwrap(storage->p2_);
1050 typename Bound3UnwrapTraits::ForwardType x3 =
1051 Bound3UnwrapTraits::Unwrap(storage->p3_);
1052 typename Bound4UnwrapTraits::ForwardType x4 =
1053 Bound4UnwrapTraits::Unwrap(storage->p4_);
1054 typename Bound5UnwrapTraits::ForwardType x5 =
1055 Bound5UnwrapTraits::Unwrap(storage->p5_);
1056 return InvokeHelper<StorageType::IsWeakCall::value, R,
1057 typename StorageType::RunnableType,
1058 void(typename Bound1UnwrapTraits::ForwardType,
1059 typename Bound2UnwrapTraits::ForwardType,
1060 typename Bound3UnwrapTraits::ForwardType,
1061 typename Bound4UnwrapTraits::ForwardType,
1062 typename Bound5UnwrapTraits::ForwardType)>
1063 ::MakeItSo(storage->runnable_, CallbackForward(x1),
1064 CallbackForward(x2), CallbackForward(x3),
1065 CallbackForward(x4), CallbackForward(x5));
1069 // Arity 6 -> 6.
1070 template <typename StorageType, typename R,typename X1, typename X2,
1071 typename X3, typename X4, typename X5, typename X6>
1072 struct Invoker<0, StorageType, R(X1, X2, X3, X4, X5, X6)> {
1073 typedef R(RunType)(BindStateBase*,
1074 typename CallbackParamTraits<X1>::ForwardType,
1075 typename CallbackParamTraits<X2>::ForwardType,
1076 typename CallbackParamTraits<X3>::ForwardType,
1077 typename CallbackParamTraits<X4>::ForwardType,
1078 typename CallbackParamTraits<X5>::ForwardType,
1079 typename CallbackParamTraits<X6>::ForwardType);
1081 typedef R(UnboundRunType)(X1, X2, X3, X4, X5, X6);
1083 static R Run(BindStateBase* base,
1084 typename CallbackParamTraits<X1>::ForwardType x1,
1085 typename CallbackParamTraits<X2>::ForwardType x2,
1086 typename CallbackParamTraits<X3>::ForwardType x3,
1087 typename CallbackParamTraits<X4>::ForwardType x4,
1088 typename CallbackParamTraits<X5>::ForwardType x5,
1089 typename CallbackParamTraits<X6>::ForwardType x6) {
1090 StorageType* storage = static_cast<StorageType*>(base);
1092 // Local references to make debugger stepping easier. If in a debugger,
1093 // you really want to warp ahead and step through the
1094 // InvokeHelper<>::MakeItSo() call below.
1096 return InvokeHelper<StorageType::IsWeakCall::value, R,
1097 typename StorageType::RunnableType,
1098 void(typename CallbackParamTraits<X1>::ForwardType x1,
1099 typename CallbackParamTraits<X2>::ForwardType x2,
1100 typename CallbackParamTraits<X3>::ForwardType x3,
1101 typename CallbackParamTraits<X4>::ForwardType x4,
1102 typename CallbackParamTraits<X5>::ForwardType x5,
1103 typename CallbackParamTraits<X6>::ForwardType x6)>
1104 ::MakeItSo(storage->runnable_, CallbackForward(x1),
1105 CallbackForward(x2), CallbackForward(x3),
1106 CallbackForward(x4), CallbackForward(x5),
1107 CallbackForward(x6));
1111 // Arity 6 -> 5.
1112 template <typename StorageType, typename R,typename X1, typename X2,
1113 typename X3, typename X4, typename X5, typename X6>
1114 struct Invoker<1, StorageType, R(X1, X2, X3, X4, X5, X6)> {
1115 typedef R(RunType)(BindStateBase*,
1116 typename CallbackParamTraits<X2>::ForwardType,
1117 typename CallbackParamTraits<X3>::ForwardType,
1118 typename CallbackParamTraits<X4>::ForwardType,
1119 typename CallbackParamTraits<X5>::ForwardType,
1120 typename CallbackParamTraits<X6>::ForwardType);
1122 typedef R(UnboundRunType)(X2, X3, X4, X5, X6);
1124 static R Run(BindStateBase* base,
1125 typename CallbackParamTraits<X2>::ForwardType x2,
1126 typename CallbackParamTraits<X3>::ForwardType x3,
1127 typename CallbackParamTraits<X4>::ForwardType x4,
1128 typename CallbackParamTraits<X5>::ForwardType x5,
1129 typename CallbackParamTraits<X6>::ForwardType x6) {
1130 StorageType* storage = static_cast<StorageType*>(base);
1132 // Local references to make debugger stepping easier. If in a debugger,
1133 // you really want to warp ahead and step through the
1134 // InvokeHelper<>::MakeItSo() call below.
1135 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1137 typename Bound1UnwrapTraits::ForwardType x1 =
1138 Bound1UnwrapTraits::Unwrap(storage->p1_);
1139 return InvokeHelper<StorageType::IsWeakCall::value, R,
1140 typename StorageType::RunnableType,
1141 void(typename Bound1UnwrapTraits::ForwardType,
1142 typename CallbackParamTraits<X2>::ForwardType x2,
1143 typename CallbackParamTraits<X3>::ForwardType x3,
1144 typename CallbackParamTraits<X4>::ForwardType x4,
1145 typename CallbackParamTraits<X5>::ForwardType x5,
1146 typename CallbackParamTraits<X6>::ForwardType x6)>
1147 ::MakeItSo(storage->runnable_, CallbackForward(x1),
1148 CallbackForward(x2), CallbackForward(x3),
1149 CallbackForward(x4), CallbackForward(x5),
1150 CallbackForward(x6));
1154 // Arity 6 -> 4.
1155 template <typename StorageType, typename R,typename X1, typename X2,
1156 typename X3, typename X4, typename X5, typename X6>
1157 struct Invoker<2, StorageType, R(X1, X2, X3, X4, X5, X6)> {
1158 typedef R(RunType)(BindStateBase*,
1159 typename CallbackParamTraits<X3>::ForwardType,
1160 typename CallbackParamTraits<X4>::ForwardType,
1161 typename CallbackParamTraits<X5>::ForwardType,
1162 typename CallbackParamTraits<X6>::ForwardType);
1164 typedef R(UnboundRunType)(X3, X4, X5, X6);
1166 static R Run(BindStateBase* base,
1167 typename CallbackParamTraits<X3>::ForwardType x3,
1168 typename CallbackParamTraits<X4>::ForwardType x4,
1169 typename CallbackParamTraits<X5>::ForwardType x5,
1170 typename CallbackParamTraits<X6>::ForwardType x6) {
1171 StorageType* storage = static_cast<StorageType*>(base);
1173 // Local references to make debugger stepping easier. If in a debugger,
1174 // you really want to warp ahead and step through the
1175 // InvokeHelper<>::MakeItSo() call below.
1176 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1177 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1179 typename Bound1UnwrapTraits::ForwardType x1 =
1180 Bound1UnwrapTraits::Unwrap(storage->p1_);
1181 typename Bound2UnwrapTraits::ForwardType x2 =
1182 Bound2UnwrapTraits::Unwrap(storage->p2_);
1183 return InvokeHelper<StorageType::IsWeakCall::value, R,
1184 typename StorageType::RunnableType,
1185 void(typename Bound1UnwrapTraits::ForwardType,
1186 typename Bound2UnwrapTraits::ForwardType,
1187 typename CallbackParamTraits<X3>::ForwardType x3,
1188 typename CallbackParamTraits<X4>::ForwardType x4,
1189 typename CallbackParamTraits<X5>::ForwardType x5,
1190 typename CallbackParamTraits<X6>::ForwardType x6)>
1191 ::MakeItSo(storage->runnable_, CallbackForward(x1),
1192 CallbackForward(x2), CallbackForward(x3),
1193 CallbackForward(x4), CallbackForward(x5),
1194 CallbackForward(x6));
1198 // Arity 6 -> 3.
1199 template <typename StorageType, typename R,typename X1, typename X2,
1200 typename X3, typename X4, typename X5, typename X6>
1201 struct Invoker<3, StorageType, R(X1, X2, X3, X4, X5, X6)> {
1202 typedef R(RunType)(BindStateBase*,
1203 typename CallbackParamTraits<X4>::ForwardType,
1204 typename CallbackParamTraits<X5>::ForwardType,
1205 typename CallbackParamTraits<X6>::ForwardType);
1207 typedef R(UnboundRunType)(X4, X5, X6);
1209 static R Run(BindStateBase* base,
1210 typename CallbackParamTraits<X4>::ForwardType x4,
1211 typename CallbackParamTraits<X5>::ForwardType x5,
1212 typename CallbackParamTraits<X6>::ForwardType x6) {
1213 StorageType* storage = static_cast<StorageType*>(base);
1215 // Local references to make debugger stepping easier. If in a debugger,
1216 // you really want to warp ahead and step through the
1217 // InvokeHelper<>::MakeItSo() call below.
1218 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1219 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1220 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1222 typename Bound1UnwrapTraits::ForwardType x1 =
1223 Bound1UnwrapTraits::Unwrap(storage->p1_);
1224 typename Bound2UnwrapTraits::ForwardType x2 =
1225 Bound2UnwrapTraits::Unwrap(storage->p2_);
1226 typename Bound3UnwrapTraits::ForwardType x3 =
1227 Bound3UnwrapTraits::Unwrap(storage->p3_);
1228 return InvokeHelper<StorageType::IsWeakCall::value, R,
1229 typename StorageType::RunnableType,
1230 void(typename Bound1UnwrapTraits::ForwardType,
1231 typename Bound2UnwrapTraits::ForwardType,
1232 typename Bound3UnwrapTraits::ForwardType,
1233 typename CallbackParamTraits<X4>::ForwardType x4,
1234 typename CallbackParamTraits<X5>::ForwardType x5,
1235 typename CallbackParamTraits<X6>::ForwardType x6)>
1236 ::MakeItSo(storage->runnable_, CallbackForward(x1),
1237 CallbackForward(x2), CallbackForward(x3),
1238 CallbackForward(x4), CallbackForward(x5),
1239 CallbackForward(x6));
1243 // Arity 6 -> 2.
1244 template <typename StorageType, typename R,typename X1, typename X2,
1245 typename X3, typename X4, typename X5, typename X6>
1246 struct Invoker<4, StorageType, R(X1, X2, X3, X4, X5, X6)> {
1247 typedef R(RunType)(BindStateBase*,
1248 typename CallbackParamTraits<X5>::ForwardType,
1249 typename CallbackParamTraits<X6>::ForwardType);
1251 typedef R(UnboundRunType)(X5, X6);
1253 static R Run(BindStateBase* base,
1254 typename CallbackParamTraits<X5>::ForwardType x5,
1255 typename CallbackParamTraits<X6>::ForwardType x6) {
1256 StorageType* storage = static_cast<StorageType*>(base);
1258 // Local references to make debugger stepping easier. If in a debugger,
1259 // you really want to warp ahead and step through the
1260 // InvokeHelper<>::MakeItSo() call below.
1261 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1262 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1263 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1264 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
1266 typename Bound1UnwrapTraits::ForwardType x1 =
1267 Bound1UnwrapTraits::Unwrap(storage->p1_);
1268 typename Bound2UnwrapTraits::ForwardType x2 =
1269 Bound2UnwrapTraits::Unwrap(storage->p2_);
1270 typename Bound3UnwrapTraits::ForwardType x3 =
1271 Bound3UnwrapTraits::Unwrap(storage->p3_);
1272 typename Bound4UnwrapTraits::ForwardType x4 =
1273 Bound4UnwrapTraits::Unwrap(storage->p4_);
1274 return InvokeHelper<StorageType::IsWeakCall::value, R,
1275 typename StorageType::RunnableType,
1276 void(typename Bound1UnwrapTraits::ForwardType,
1277 typename Bound2UnwrapTraits::ForwardType,
1278 typename Bound3UnwrapTraits::ForwardType,
1279 typename Bound4UnwrapTraits::ForwardType,
1280 typename CallbackParamTraits<X5>::ForwardType x5,
1281 typename CallbackParamTraits<X6>::ForwardType x6)>
1282 ::MakeItSo(storage->runnable_, CallbackForward(x1),
1283 CallbackForward(x2), CallbackForward(x3),
1284 CallbackForward(x4), CallbackForward(x5),
1285 CallbackForward(x6));
1289 // Arity 6 -> 1.
1290 template <typename StorageType, typename R,typename X1, typename X2,
1291 typename X3, typename X4, typename X5, typename X6>
1292 struct Invoker<5, StorageType, R(X1, X2, X3, X4, X5, X6)> {
1293 typedef R(RunType)(BindStateBase*,
1294 typename CallbackParamTraits<X6>::ForwardType);
1296 typedef R(UnboundRunType)(X6);
1298 static R Run(BindStateBase* base,
1299 typename CallbackParamTraits<X6>::ForwardType x6) {
1300 StorageType* storage = static_cast<StorageType*>(base);
1302 // Local references to make debugger stepping easier. If in a debugger,
1303 // you really want to warp ahead and step through the
1304 // InvokeHelper<>::MakeItSo() call below.
1305 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1306 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1307 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1308 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
1309 typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
1311 typename Bound1UnwrapTraits::ForwardType x1 =
1312 Bound1UnwrapTraits::Unwrap(storage->p1_);
1313 typename Bound2UnwrapTraits::ForwardType x2 =
1314 Bound2UnwrapTraits::Unwrap(storage->p2_);
1315 typename Bound3UnwrapTraits::ForwardType x3 =
1316 Bound3UnwrapTraits::Unwrap(storage->p3_);
1317 typename Bound4UnwrapTraits::ForwardType x4 =
1318 Bound4UnwrapTraits::Unwrap(storage->p4_);
1319 typename Bound5UnwrapTraits::ForwardType x5 =
1320 Bound5UnwrapTraits::Unwrap(storage->p5_);
1321 return InvokeHelper<StorageType::IsWeakCall::value, R,
1322 typename StorageType::RunnableType,
1323 void(typename Bound1UnwrapTraits::ForwardType,
1324 typename Bound2UnwrapTraits::ForwardType,
1325 typename Bound3UnwrapTraits::ForwardType,
1326 typename Bound4UnwrapTraits::ForwardType,
1327 typename Bound5UnwrapTraits::ForwardType,
1328 typename CallbackParamTraits<X6>::ForwardType x6)>
1329 ::MakeItSo(storage->runnable_, CallbackForward(x1),
1330 CallbackForward(x2), CallbackForward(x3),
1331 CallbackForward(x4), CallbackForward(x5),
1332 CallbackForward(x6));
1336 // Arity 6 -> 0.
1337 template <typename StorageType, typename R,typename X1, typename X2,
1338 typename X3, typename X4, typename X5, typename X6>
1339 struct Invoker<6, StorageType, R(X1, X2, X3, X4, X5, X6)> {
1340 typedef R(RunType)(BindStateBase*);
1342 typedef R(UnboundRunType)();
1344 static R Run(BindStateBase* base) {
1345 StorageType* storage = static_cast<StorageType*>(base);
1347 // Local references to make debugger stepping easier. If in a debugger,
1348 // you really want to warp ahead and step through the
1349 // InvokeHelper<>::MakeItSo() call below.
1350 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1351 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1352 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1353 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
1354 typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
1355 typedef typename StorageType::Bound6UnwrapTraits Bound6UnwrapTraits;
1357 typename Bound1UnwrapTraits::ForwardType x1 =
1358 Bound1UnwrapTraits::Unwrap(storage->p1_);
1359 typename Bound2UnwrapTraits::ForwardType x2 =
1360 Bound2UnwrapTraits::Unwrap(storage->p2_);
1361 typename Bound3UnwrapTraits::ForwardType x3 =
1362 Bound3UnwrapTraits::Unwrap(storage->p3_);
1363 typename Bound4UnwrapTraits::ForwardType x4 =
1364 Bound4UnwrapTraits::Unwrap(storage->p4_);
1365 typename Bound5UnwrapTraits::ForwardType x5 =
1366 Bound5UnwrapTraits::Unwrap(storage->p5_);
1367 typename Bound6UnwrapTraits::ForwardType x6 =
1368 Bound6UnwrapTraits::Unwrap(storage->p6_);
1369 return InvokeHelper<StorageType::IsWeakCall::value, R,
1370 typename StorageType::RunnableType,
1371 void(typename Bound1UnwrapTraits::ForwardType,
1372 typename Bound2UnwrapTraits::ForwardType,
1373 typename Bound3UnwrapTraits::ForwardType,
1374 typename Bound4UnwrapTraits::ForwardType,
1375 typename Bound5UnwrapTraits::ForwardType,
1376 typename Bound6UnwrapTraits::ForwardType)>
1377 ::MakeItSo(storage->runnable_, CallbackForward(x1),
1378 CallbackForward(x2), CallbackForward(x3),
1379 CallbackForward(x4), CallbackForward(x5),
1380 CallbackForward(x6));
1384 // Arity 7 -> 7.
1385 template <typename StorageType, typename R,typename X1, typename X2,
1386 typename X3, typename X4, typename X5, typename X6, typename X7>
1387 struct Invoker<0, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
1388 typedef R(RunType)(BindStateBase*,
1389 typename CallbackParamTraits<X1>::ForwardType,
1390 typename CallbackParamTraits<X2>::ForwardType,
1391 typename CallbackParamTraits<X3>::ForwardType,
1392 typename CallbackParamTraits<X4>::ForwardType,
1393 typename CallbackParamTraits<X5>::ForwardType,
1394 typename CallbackParamTraits<X6>::ForwardType,
1395 typename CallbackParamTraits<X7>::ForwardType);
1397 typedef R(UnboundRunType)(X1, X2, X3, X4, X5, X6, X7);
1399 static R Run(BindStateBase* base,
1400 typename CallbackParamTraits<X1>::ForwardType x1,
1401 typename CallbackParamTraits<X2>::ForwardType x2,
1402 typename CallbackParamTraits<X3>::ForwardType x3,
1403 typename CallbackParamTraits<X4>::ForwardType x4,
1404 typename CallbackParamTraits<X5>::ForwardType x5,
1405 typename CallbackParamTraits<X6>::ForwardType x6,
1406 typename CallbackParamTraits<X7>::ForwardType x7) {
1407 StorageType* storage = static_cast<StorageType*>(base);
1409 // Local references to make debugger stepping easier. If in a debugger,
1410 // you really want to warp ahead and step through the
1411 // InvokeHelper<>::MakeItSo() call below.
1413 return InvokeHelper<StorageType::IsWeakCall::value, R,
1414 typename StorageType::RunnableType,
1415 void(typename CallbackParamTraits<X1>::ForwardType x1,
1416 typename CallbackParamTraits<X2>::ForwardType x2,
1417 typename CallbackParamTraits<X3>::ForwardType x3,
1418 typename CallbackParamTraits<X4>::ForwardType x4,
1419 typename CallbackParamTraits<X5>::ForwardType x5,
1420 typename CallbackParamTraits<X6>::ForwardType x6,
1421 typename CallbackParamTraits<X7>::ForwardType x7)>
1422 ::MakeItSo(storage->runnable_, CallbackForward(x1),
1423 CallbackForward(x2), CallbackForward(x3),
1424 CallbackForward(x4), CallbackForward(x5),
1425 CallbackForward(x6), CallbackForward(x7));
1429 // Arity 7 -> 6.
1430 template <typename StorageType, typename R,typename X1, typename X2,
1431 typename X3, typename X4, typename X5, typename X6, typename X7>
1432 struct Invoker<1, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
1433 typedef R(RunType)(BindStateBase*,
1434 typename CallbackParamTraits<X2>::ForwardType,
1435 typename CallbackParamTraits<X3>::ForwardType,
1436 typename CallbackParamTraits<X4>::ForwardType,
1437 typename CallbackParamTraits<X5>::ForwardType,
1438 typename CallbackParamTraits<X6>::ForwardType,
1439 typename CallbackParamTraits<X7>::ForwardType);
1441 typedef R(UnboundRunType)(X2, X3, X4, X5, X6, X7);
1443 static R Run(BindStateBase* base,
1444 typename CallbackParamTraits<X2>::ForwardType x2,
1445 typename CallbackParamTraits<X3>::ForwardType x3,
1446 typename CallbackParamTraits<X4>::ForwardType x4,
1447 typename CallbackParamTraits<X5>::ForwardType x5,
1448 typename CallbackParamTraits<X6>::ForwardType x6,
1449 typename CallbackParamTraits<X7>::ForwardType x7) {
1450 StorageType* storage = static_cast<StorageType*>(base);
1452 // Local references to make debugger stepping easier. If in a debugger,
1453 // you really want to warp ahead and step through the
1454 // InvokeHelper<>::MakeItSo() call below.
1455 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1457 typename Bound1UnwrapTraits::ForwardType x1 =
1458 Bound1UnwrapTraits::Unwrap(storage->p1_);
1459 return InvokeHelper<StorageType::IsWeakCall::value, R,
1460 typename StorageType::RunnableType,
1461 void(typename Bound1UnwrapTraits::ForwardType,
1462 typename CallbackParamTraits<X2>::ForwardType x2,
1463 typename CallbackParamTraits<X3>::ForwardType x3,
1464 typename CallbackParamTraits<X4>::ForwardType x4,
1465 typename CallbackParamTraits<X5>::ForwardType x5,
1466 typename CallbackParamTraits<X6>::ForwardType x6,
1467 typename CallbackParamTraits<X7>::ForwardType x7)>
1468 ::MakeItSo(storage->runnable_, CallbackForward(x1),
1469 CallbackForward(x2), CallbackForward(x3),
1470 CallbackForward(x4), CallbackForward(x5),
1471 CallbackForward(x6), CallbackForward(x7));
1475 // Arity 7 -> 5.
1476 template <typename StorageType, typename R,typename X1, typename X2,
1477 typename X3, typename X4, typename X5, typename X6, typename X7>
1478 struct Invoker<2, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
1479 typedef R(RunType)(BindStateBase*,
1480 typename CallbackParamTraits<X3>::ForwardType,
1481 typename CallbackParamTraits<X4>::ForwardType,
1482 typename CallbackParamTraits<X5>::ForwardType,
1483 typename CallbackParamTraits<X6>::ForwardType,
1484 typename CallbackParamTraits<X7>::ForwardType);
1486 typedef R(UnboundRunType)(X3, X4, X5, X6, X7);
1488 static R Run(BindStateBase* base,
1489 typename CallbackParamTraits<X3>::ForwardType x3,
1490 typename CallbackParamTraits<X4>::ForwardType x4,
1491 typename CallbackParamTraits<X5>::ForwardType x5,
1492 typename CallbackParamTraits<X6>::ForwardType x6,
1493 typename CallbackParamTraits<X7>::ForwardType x7) {
1494 StorageType* storage = static_cast<StorageType*>(base);
1496 // Local references to make debugger stepping easier. If in a debugger,
1497 // you really want to warp ahead and step through the
1498 // InvokeHelper<>::MakeItSo() call below.
1499 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1500 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1502 typename Bound1UnwrapTraits::ForwardType x1 =
1503 Bound1UnwrapTraits::Unwrap(storage->p1_);
1504 typename Bound2UnwrapTraits::ForwardType x2 =
1505 Bound2UnwrapTraits::Unwrap(storage->p2_);
1506 return InvokeHelper<StorageType::IsWeakCall::value, R,
1507 typename StorageType::RunnableType,
1508 void(typename Bound1UnwrapTraits::ForwardType,
1509 typename Bound2UnwrapTraits::ForwardType,
1510 typename CallbackParamTraits<X3>::ForwardType x3,
1511 typename CallbackParamTraits<X4>::ForwardType x4,
1512 typename CallbackParamTraits<X5>::ForwardType x5,
1513 typename CallbackParamTraits<X6>::ForwardType x6,
1514 typename CallbackParamTraits<X7>::ForwardType x7)>
1515 ::MakeItSo(storage->runnable_, CallbackForward(x1),
1516 CallbackForward(x2), CallbackForward(x3),
1517 CallbackForward(x4), CallbackForward(x5),
1518 CallbackForward(x6), CallbackForward(x7));
1522 // Arity 7 -> 4.
1523 template <typename StorageType, typename R,typename X1, typename X2,
1524 typename X3, typename X4, typename X5, typename X6, typename X7>
1525 struct Invoker<3, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
1526 typedef R(RunType)(BindStateBase*,
1527 typename CallbackParamTraits<X4>::ForwardType,
1528 typename CallbackParamTraits<X5>::ForwardType,
1529 typename CallbackParamTraits<X6>::ForwardType,
1530 typename CallbackParamTraits<X7>::ForwardType);
1532 typedef R(UnboundRunType)(X4, X5, X6, X7);
1534 static R Run(BindStateBase* base,
1535 typename CallbackParamTraits<X4>::ForwardType x4,
1536 typename CallbackParamTraits<X5>::ForwardType x5,
1537 typename CallbackParamTraits<X6>::ForwardType x6,
1538 typename CallbackParamTraits<X7>::ForwardType x7) {
1539 StorageType* storage = static_cast<StorageType*>(base);
1541 // Local references to make debugger stepping easier. If in a debugger,
1542 // you really want to warp ahead and step through the
1543 // InvokeHelper<>::MakeItSo() call below.
1544 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1545 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1546 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1548 typename Bound1UnwrapTraits::ForwardType x1 =
1549 Bound1UnwrapTraits::Unwrap(storage->p1_);
1550 typename Bound2UnwrapTraits::ForwardType x2 =
1551 Bound2UnwrapTraits::Unwrap(storage->p2_);
1552 typename Bound3UnwrapTraits::ForwardType x3 =
1553 Bound3UnwrapTraits::Unwrap(storage->p3_);
1554 return InvokeHelper<StorageType::IsWeakCall::value, R,
1555 typename StorageType::RunnableType,
1556 void(typename Bound1UnwrapTraits::ForwardType,
1557 typename Bound2UnwrapTraits::ForwardType,
1558 typename Bound3UnwrapTraits::ForwardType,
1559 typename CallbackParamTraits<X4>::ForwardType x4,
1560 typename CallbackParamTraits<X5>::ForwardType x5,
1561 typename CallbackParamTraits<X6>::ForwardType x6,
1562 typename CallbackParamTraits<X7>::ForwardType x7)>
1563 ::MakeItSo(storage->runnable_, CallbackForward(x1),
1564 CallbackForward(x2), CallbackForward(x3),
1565 CallbackForward(x4), CallbackForward(x5),
1566 CallbackForward(x6), CallbackForward(x7));
1570 // Arity 7 -> 3.
1571 template <typename StorageType, typename R,typename X1, typename X2,
1572 typename X3, typename X4, typename X5, typename X6, typename X7>
1573 struct Invoker<4, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
1574 typedef R(RunType)(BindStateBase*,
1575 typename CallbackParamTraits<X5>::ForwardType,
1576 typename CallbackParamTraits<X6>::ForwardType,
1577 typename CallbackParamTraits<X7>::ForwardType);
1579 typedef R(UnboundRunType)(X5, X6, X7);
1581 static R Run(BindStateBase* base,
1582 typename CallbackParamTraits<X5>::ForwardType x5,
1583 typename CallbackParamTraits<X6>::ForwardType x6,
1584 typename CallbackParamTraits<X7>::ForwardType x7) {
1585 StorageType* storage = static_cast<StorageType*>(base);
1587 // Local references to make debugger stepping easier. If in a debugger,
1588 // you really want to warp ahead and step through the
1589 // InvokeHelper<>::MakeItSo() call below.
1590 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1591 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1592 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1593 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
1595 typename Bound1UnwrapTraits::ForwardType x1 =
1596 Bound1UnwrapTraits::Unwrap(storage->p1_);
1597 typename Bound2UnwrapTraits::ForwardType x2 =
1598 Bound2UnwrapTraits::Unwrap(storage->p2_);
1599 typename Bound3UnwrapTraits::ForwardType x3 =
1600 Bound3UnwrapTraits::Unwrap(storage->p3_);
1601 typename Bound4UnwrapTraits::ForwardType x4 =
1602 Bound4UnwrapTraits::Unwrap(storage->p4_);
1603 return InvokeHelper<StorageType::IsWeakCall::value, R,
1604 typename StorageType::RunnableType,
1605 void(typename Bound1UnwrapTraits::ForwardType,
1606 typename Bound2UnwrapTraits::ForwardType,
1607 typename Bound3UnwrapTraits::ForwardType,
1608 typename Bound4UnwrapTraits::ForwardType,
1609 typename CallbackParamTraits<X5>::ForwardType x5,
1610 typename CallbackParamTraits<X6>::ForwardType x6,
1611 typename CallbackParamTraits<X7>::ForwardType x7)>
1612 ::MakeItSo(storage->runnable_, CallbackForward(x1),
1613 CallbackForward(x2), CallbackForward(x3),
1614 CallbackForward(x4), CallbackForward(x5),
1615 CallbackForward(x6), CallbackForward(x7));
1619 // Arity 7 -> 2.
1620 template <typename StorageType, typename R,typename X1, typename X2,
1621 typename X3, typename X4, typename X5, typename X6, typename X7>
1622 struct Invoker<5, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
1623 typedef R(RunType)(BindStateBase*,
1624 typename CallbackParamTraits<X6>::ForwardType,
1625 typename CallbackParamTraits<X7>::ForwardType);
1627 typedef R(UnboundRunType)(X6, X7);
1629 static R Run(BindStateBase* base,
1630 typename CallbackParamTraits<X6>::ForwardType x6,
1631 typename CallbackParamTraits<X7>::ForwardType x7) {
1632 StorageType* storage = static_cast<StorageType*>(base);
1634 // Local references to make debugger stepping easier. If in a debugger,
1635 // you really want to warp ahead and step through the
1636 // InvokeHelper<>::MakeItSo() call below.
1637 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1638 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1639 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1640 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
1641 typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
1643 typename Bound1UnwrapTraits::ForwardType x1 =
1644 Bound1UnwrapTraits::Unwrap(storage->p1_);
1645 typename Bound2UnwrapTraits::ForwardType x2 =
1646 Bound2UnwrapTraits::Unwrap(storage->p2_);
1647 typename Bound3UnwrapTraits::ForwardType x3 =
1648 Bound3UnwrapTraits::Unwrap(storage->p3_);
1649 typename Bound4UnwrapTraits::ForwardType x4 =
1650 Bound4UnwrapTraits::Unwrap(storage->p4_);
1651 typename Bound5UnwrapTraits::ForwardType x5 =
1652 Bound5UnwrapTraits::Unwrap(storage->p5_);
1653 return InvokeHelper<StorageType::IsWeakCall::value, R,
1654 typename StorageType::RunnableType,
1655 void(typename Bound1UnwrapTraits::ForwardType,
1656 typename Bound2UnwrapTraits::ForwardType,
1657 typename Bound3UnwrapTraits::ForwardType,
1658 typename Bound4UnwrapTraits::ForwardType,
1659 typename Bound5UnwrapTraits::ForwardType,
1660 typename CallbackParamTraits<X6>::ForwardType x6,
1661 typename CallbackParamTraits<X7>::ForwardType x7)>
1662 ::MakeItSo(storage->runnable_, CallbackForward(x1),
1663 CallbackForward(x2), CallbackForward(x3),
1664 CallbackForward(x4), CallbackForward(x5),
1665 CallbackForward(x6), CallbackForward(x7));
1669 // Arity 7 -> 1.
1670 template <typename StorageType, typename R,typename X1, typename X2,
1671 typename X3, typename X4, typename X5, typename X6, typename X7>
1672 struct Invoker<6, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
1673 typedef R(RunType)(BindStateBase*,
1674 typename CallbackParamTraits<X7>::ForwardType);
1676 typedef R(UnboundRunType)(X7);
1678 static R Run(BindStateBase* base,
1679 typename CallbackParamTraits<X7>::ForwardType x7) {
1680 StorageType* storage = static_cast<StorageType*>(base);
1682 // Local references to make debugger stepping easier. If in a debugger,
1683 // you really want to warp ahead and step through the
1684 // InvokeHelper<>::MakeItSo() call below.
1685 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1686 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1687 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1688 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
1689 typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
1690 typedef typename StorageType::Bound6UnwrapTraits Bound6UnwrapTraits;
1692 typename Bound1UnwrapTraits::ForwardType x1 =
1693 Bound1UnwrapTraits::Unwrap(storage->p1_);
1694 typename Bound2UnwrapTraits::ForwardType x2 =
1695 Bound2UnwrapTraits::Unwrap(storage->p2_);
1696 typename Bound3UnwrapTraits::ForwardType x3 =
1697 Bound3UnwrapTraits::Unwrap(storage->p3_);
1698 typename Bound4UnwrapTraits::ForwardType x4 =
1699 Bound4UnwrapTraits::Unwrap(storage->p4_);
1700 typename Bound5UnwrapTraits::ForwardType x5 =
1701 Bound5UnwrapTraits::Unwrap(storage->p5_);
1702 typename Bound6UnwrapTraits::ForwardType x6 =
1703 Bound6UnwrapTraits::Unwrap(storage->p6_);
1704 return InvokeHelper<StorageType::IsWeakCall::value, R,
1705 typename StorageType::RunnableType,
1706 void(typename Bound1UnwrapTraits::ForwardType,
1707 typename Bound2UnwrapTraits::ForwardType,
1708 typename Bound3UnwrapTraits::ForwardType,
1709 typename Bound4UnwrapTraits::ForwardType,
1710 typename Bound5UnwrapTraits::ForwardType,
1711 typename Bound6UnwrapTraits::ForwardType,
1712 typename CallbackParamTraits<X7>::ForwardType x7)>
1713 ::MakeItSo(storage->runnable_, CallbackForward(x1),
1714 CallbackForward(x2), CallbackForward(x3),
1715 CallbackForward(x4), CallbackForward(x5),
1716 CallbackForward(x6), CallbackForward(x7));
1720 // Arity 7 -> 0.
1721 template <typename StorageType, typename R,typename X1, typename X2,
1722 typename X3, typename X4, typename X5, typename X6, typename X7>
1723 struct Invoker<7, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
1724 typedef R(RunType)(BindStateBase*);
1726 typedef R(UnboundRunType)();
1728 static R Run(BindStateBase* base) {
1729 StorageType* storage = static_cast<StorageType*>(base);
1731 // Local references to make debugger stepping easier. If in a debugger,
1732 // you really want to warp ahead and step through the
1733 // InvokeHelper<>::MakeItSo() call below.
1734 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1735 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1736 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1737 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
1738 typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
1739 typedef typename StorageType::Bound6UnwrapTraits Bound6UnwrapTraits;
1740 typedef typename StorageType::Bound7UnwrapTraits Bound7UnwrapTraits;
1742 typename Bound1UnwrapTraits::ForwardType x1 =
1743 Bound1UnwrapTraits::Unwrap(storage->p1_);
1744 typename Bound2UnwrapTraits::ForwardType x2 =
1745 Bound2UnwrapTraits::Unwrap(storage->p2_);
1746 typename Bound3UnwrapTraits::ForwardType x3 =
1747 Bound3UnwrapTraits::Unwrap(storage->p3_);
1748 typename Bound4UnwrapTraits::ForwardType x4 =
1749 Bound4UnwrapTraits::Unwrap(storage->p4_);
1750 typename Bound5UnwrapTraits::ForwardType x5 =
1751 Bound5UnwrapTraits::Unwrap(storage->p5_);
1752 typename Bound6UnwrapTraits::ForwardType x6 =
1753 Bound6UnwrapTraits::Unwrap(storage->p6_);
1754 typename Bound7UnwrapTraits::ForwardType x7 =
1755 Bound7UnwrapTraits::Unwrap(storage->p7_);
1756 return InvokeHelper<StorageType::IsWeakCall::value, R,
1757 typename StorageType::RunnableType,
1758 void(typename Bound1UnwrapTraits::ForwardType,
1759 typename Bound2UnwrapTraits::ForwardType,
1760 typename Bound3UnwrapTraits::ForwardType,
1761 typename Bound4UnwrapTraits::ForwardType,
1762 typename Bound5UnwrapTraits::ForwardType,
1763 typename Bound6UnwrapTraits::ForwardType,
1764 typename Bound7UnwrapTraits::ForwardType)>
1765 ::MakeItSo(storage->runnable_, CallbackForward(x1),
1766 CallbackForward(x2), CallbackForward(x3),
1767 CallbackForward(x4), CallbackForward(x5),
1768 CallbackForward(x6), CallbackForward(x7));
1773 // BindState<>
1775 // This stores all the state passed into Bind() and is also where most
1776 // of the template resolution magic occurs.
1778 // Runnable is the functor we are binding arguments to.
1779 // RunType is type of the Run() function that the Invoker<> should use.
1780 // Normally, this is the same as the RunType of the Runnable, but it can
1781 // be different if an adapter like IgnoreResult() has been used.
1783 // BoundArgsType contains the storage type for all the bound arguments by
1784 // (ab)using a function type.
1785 template <typename Runnable, typename RunType, typename BoundArgsType>
1786 struct BindState;
1788 template <typename Runnable, typename RunType>
1789 struct BindState<Runnable, RunType, void()> : public BindStateBase {
1790 typedef Runnable RunnableType;
1791 typedef false_type IsWeakCall;
1792 typedef Invoker<0, BindState, RunType> InvokerType;
1793 typedef typename InvokerType::UnboundRunType UnboundRunType;
1794 explicit BindState(const Runnable& runnable)
1795 : runnable_(runnable) {
1798 virtual ~BindState() { }
1800 RunnableType runnable_;
1803 template <typename Runnable, typename RunType, typename P1>
1804 struct BindState<Runnable, RunType, void(P1)> : public BindStateBase {
1805 typedef Runnable RunnableType;
1806 typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
1807 typedef Invoker<1, BindState, RunType> InvokerType;
1808 typedef typename InvokerType::UnboundRunType UnboundRunType;
1810 // Convenience typedefs for bound argument types.
1811 typedef UnwrapTraits<P1> Bound1UnwrapTraits;
1813 BindState(const Runnable& runnable, const P1& p1)
1814 : runnable_(runnable),
1815 p1_(p1) {
1816 MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
1819 virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
1820 P1>::Release(p1_); }
1822 RunnableType runnable_;
1823 P1 p1_;
1826 template <typename Runnable, typename RunType, typename P1, typename P2>
1827 struct BindState<Runnable, RunType, void(P1, P2)> : public BindStateBase {
1828 typedef Runnable RunnableType;
1829 typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
1830 typedef Invoker<2, BindState, RunType> InvokerType;
1831 typedef typename InvokerType::UnboundRunType UnboundRunType;
1833 // Convenience typedefs for bound argument types.
1834 typedef UnwrapTraits<P1> Bound1UnwrapTraits;
1835 typedef UnwrapTraits<P2> Bound2UnwrapTraits;
1837 BindState(const Runnable& runnable, const P1& p1, const P2& p2)
1838 : runnable_(runnable),
1839 p1_(p1),
1840 p2_(p2) {
1841 MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
1844 virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
1845 P1>::Release(p1_); }
1847 RunnableType runnable_;
1848 P1 p1_;
1849 P2 p2_;
1852 template <typename Runnable, typename RunType, typename P1, typename P2,
1853 typename P3>
1854 struct BindState<Runnable, RunType, void(P1, P2, P3)> : public BindStateBase {
1855 typedef Runnable RunnableType;
1856 typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
1857 typedef Invoker<3, BindState, RunType> InvokerType;
1858 typedef typename InvokerType::UnboundRunType UnboundRunType;
1860 // Convenience typedefs for bound argument types.
1861 typedef UnwrapTraits<P1> Bound1UnwrapTraits;
1862 typedef UnwrapTraits<P2> Bound2UnwrapTraits;
1863 typedef UnwrapTraits<P3> Bound3UnwrapTraits;
1865 BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3)
1866 : runnable_(runnable),
1867 p1_(p1),
1868 p2_(p2),
1869 p3_(p3) {
1870 MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
1873 virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
1874 P1>::Release(p1_); }
1876 RunnableType runnable_;
1877 P1 p1_;
1878 P2 p2_;
1879 P3 p3_;
1882 template <typename Runnable, typename RunType, typename P1, typename P2,
1883 typename P3, typename P4>
1884 struct BindState<Runnable, RunType, void(P1, P2, P3,
1885 P4)> : public BindStateBase {
1886 typedef Runnable RunnableType;
1887 typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
1888 typedef Invoker<4, BindState, RunType> InvokerType;
1889 typedef typename InvokerType::UnboundRunType UnboundRunType;
1891 // Convenience typedefs for bound argument types.
1892 typedef UnwrapTraits<P1> Bound1UnwrapTraits;
1893 typedef UnwrapTraits<P2> Bound2UnwrapTraits;
1894 typedef UnwrapTraits<P3> Bound3UnwrapTraits;
1895 typedef UnwrapTraits<P4> Bound4UnwrapTraits;
1897 BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3,
1898 const P4& p4)
1899 : runnable_(runnable),
1900 p1_(p1),
1901 p2_(p2),
1902 p3_(p3),
1903 p4_(p4) {
1904 MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
1907 virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
1908 P1>::Release(p1_); }
1910 RunnableType runnable_;
1911 P1 p1_;
1912 P2 p2_;
1913 P3 p3_;
1914 P4 p4_;
1917 template <typename Runnable, typename RunType, typename P1, typename P2,
1918 typename P3, typename P4, typename P5>
1919 struct BindState<Runnable, RunType, void(P1, P2, P3, P4,
1920 P5)> : public BindStateBase {
1921 typedef Runnable RunnableType;
1922 typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
1923 typedef Invoker<5, BindState, RunType> InvokerType;
1924 typedef typename InvokerType::UnboundRunType UnboundRunType;
1926 // Convenience typedefs for bound argument types.
1927 typedef UnwrapTraits<P1> Bound1UnwrapTraits;
1928 typedef UnwrapTraits<P2> Bound2UnwrapTraits;
1929 typedef UnwrapTraits<P3> Bound3UnwrapTraits;
1930 typedef UnwrapTraits<P4> Bound4UnwrapTraits;
1931 typedef UnwrapTraits<P5> Bound5UnwrapTraits;
1933 BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3,
1934 const P4& p4, const P5& p5)
1935 : runnable_(runnable),
1936 p1_(p1),
1937 p2_(p2),
1938 p3_(p3),
1939 p4_(p4),
1940 p5_(p5) {
1941 MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
1944 virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
1945 P1>::Release(p1_); }
1947 RunnableType runnable_;
1948 P1 p1_;
1949 P2 p2_;
1950 P3 p3_;
1951 P4 p4_;
1952 P5 p5_;
1955 template <typename Runnable, typename RunType, typename P1, typename P2,
1956 typename P3, typename P4, typename P5, typename P6>
1957 struct BindState<Runnable, RunType, void(P1, P2, P3, P4, P5,
1958 P6)> : public BindStateBase {
1959 typedef Runnable RunnableType;
1960 typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
1961 typedef Invoker<6, BindState, RunType> InvokerType;
1962 typedef typename InvokerType::UnboundRunType UnboundRunType;
1964 // Convenience typedefs for bound argument types.
1965 typedef UnwrapTraits<P1> Bound1UnwrapTraits;
1966 typedef UnwrapTraits<P2> Bound2UnwrapTraits;
1967 typedef UnwrapTraits<P3> Bound3UnwrapTraits;
1968 typedef UnwrapTraits<P4> Bound4UnwrapTraits;
1969 typedef UnwrapTraits<P5> Bound5UnwrapTraits;
1970 typedef UnwrapTraits<P6> Bound6UnwrapTraits;
1972 BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3,
1973 const P4& p4, const P5& p5, const P6& p6)
1974 : runnable_(runnable),
1975 p1_(p1),
1976 p2_(p2),
1977 p3_(p3),
1978 p4_(p4),
1979 p5_(p5),
1980 p6_(p6) {
1981 MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
1984 virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
1985 P1>::Release(p1_); }
1987 RunnableType runnable_;
1988 P1 p1_;
1989 P2 p2_;
1990 P3 p3_;
1991 P4 p4_;
1992 P5 p5_;
1993 P6 p6_;
1996 template <typename Runnable, typename RunType, typename P1, typename P2,
1997 typename P3, typename P4, typename P5, typename P6, typename P7>
1998 struct BindState<Runnable, RunType, void(P1, P2, P3, P4, P5, P6,
1999 P7)> : public BindStateBase {
2000 typedef Runnable RunnableType;
2001 typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
2002 typedef Invoker<7, BindState, RunType> InvokerType;
2003 typedef typename InvokerType::UnboundRunType UnboundRunType;
2005 // Convenience typedefs for bound argument types.
2006 typedef UnwrapTraits<P1> Bound1UnwrapTraits;
2007 typedef UnwrapTraits<P2> Bound2UnwrapTraits;
2008 typedef UnwrapTraits<P3> Bound3UnwrapTraits;
2009 typedef UnwrapTraits<P4> Bound4UnwrapTraits;
2010 typedef UnwrapTraits<P5> Bound5UnwrapTraits;
2011 typedef UnwrapTraits<P6> Bound6UnwrapTraits;
2012 typedef UnwrapTraits<P7> Bound7UnwrapTraits;
2014 BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3,
2015 const P4& p4, const P5& p5, const P6& p6, const P7& p7)
2016 : runnable_(runnable),
2017 p1_(p1),
2018 p2_(p2),
2019 p3_(p3),
2020 p4_(p4),
2021 p5_(p5),
2022 p6_(p6),
2023 p7_(p7) {
2024 MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
2027 virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
2028 P1>::Release(p1_); }
2030 RunnableType runnable_;
2031 P1 p1_;
2032 P2 p2_;
2033 P3 p3_;
2034 P4 p4_;
2035 P5 p5_;
2036 P6 p6_;
2037 P7 p7_;
2040 } // namespace internal
2041 } // namespace base
2043 #endif // BASE_BIND_INTERNAL_H_