• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 Google Inc. All rights reserved.
2 //
3 // Redistribution and use in source and binary forms, with or without
4 // modification, are permitted provided that the following conditions are
5 // met:
6 //
7 //    * Redistributions of source code must retain the above copyright
8 // notice, this list of conditions and the following disclaimer.
9 //    * Redistributions in binary form must reproduce the above
10 // copyright notice, this list of conditions and the following disclaimer
11 // in the documentation and/or other materials provided with the
12 // distribution.
13 //    * Neither the name of Google Inc. nor the name Chromium Embedded
14 // Framework nor the names of its contributors may be used to endorse
15 // or promote products derived from this software without specific prior
16 // written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 
30 // Do not include this header file directly. Use base/cef_bind.h instead.
31 
32 #ifndef CEF_INCLUDE_BASE_INTERNAL_CEF_BIND_INTERNAL_H_
33 #define CEF_INCLUDE_BASE_INTERNAL_CEF_BIND_INTERNAL_H_
34 
35 #include "include/base/cef_bind_helpers.h"
36 #include "include/base/cef_build.h"
37 #include "include/base/cef_template_util.h"
38 #include "include/base/cef_weak_ptr.h"
39 #include "include/base/internal/cef_callback_internal.h"
40 #include "include/base/internal/cef_raw_scoped_refptr_mismatch_checker.h"
41 
42 #if defined(OS_WIN)
43 #include "include/base/internal/cef_bind_internal_win.h"
44 #endif
45 
46 namespace base {
47 namespace cef_internal {
48 
49 // See base/callback.h for user documentation.
50 //
51 //
52 // CONCEPTS:
53 //  Runnable -- A type (really a type class) that has a single Run() method
54 //              and a RunType typedef that corresponds to the type of Run().
55 //              A Runnable can declare that it should treated like a method
56 //              call by including a typedef named IsMethod.  The value of
57 //              this typedef is NOT inspected, only the existence.  When a
58 //              Runnable declares itself a method, Bind() will enforce special
59 //              refcounting + WeakPtr handling semantics for the first
60 //              parameter which is expected to be an object.
61 //  Functor -- A copyable type representing something that should be called.
62 //             All function pointers, Callback<>, and Runnables are functors
63 //             even if the invocation syntax differs.
64 //  RunType -- A function type (as opposed to function _pointer_ type) for
65 //             a Run() function.  Usually just a convenience typedef.
66 //  (Bound)ArgsType -- A function type that is being (ab)used to store the
67 //                     types of set of arguments.  The "return" type is always
68 //                     void here.  We use this hack so that we do not need
69 //                     a new type name for each arity of type. (eg.,
70 //                     BindState1, BindState2).  This makes forward
71 //                     declarations and friending much much easier.
72 //
73 // Types:
74 //  RunnableAdapter<> -- Wraps the various "function" pointer types into an
75 //                       object that adheres to the Runnable interface.
76 //                       There are |3*ARITY| RunnableAdapter types.
77 //  FunctionTraits<> -- Type traits that unwrap a function signature into a
78 //                      a set of easier to use typedefs.  Used mainly for
79 //                      compile time asserts.
80 //                      There are |ARITY| FunctionTraits types.
81 //  ForceVoidReturn<> -- Helper class for translating function signatures to
82 //                       equivalent forms with a "void" return type.
83 //                    There are |ARITY| ForceVoidReturn types.
84 //  FunctorTraits<> -- Type traits used determine the correct RunType and
85 //                     RunnableType for a Functor.  This is where function
86 //                     signature adapters are applied.
87 //                    There are |ARITY| ForceVoidReturn types.
88 //  MakeRunnable<> -- Takes a Functor and returns an object in the Runnable
89 //                    type class that represents the underlying Functor.
90 //                    There are |O(1)| MakeRunnable types.
91 //  InvokeHelper<> -- Take a Runnable + arguments and actully invokes it.
92 // Handle the differing syntaxes needed for WeakPtr<> support,
93 //                    and for ignoring return values.  This is separate from
94 //                    Invoker to avoid creating multiple version of Invoker<>
95 //                    which grows at O(n^2) with the arity.
96 //                    There are |k*ARITY| InvokeHelper types.
97 //  Invoker<> -- Unwraps the curried parameters and executes the Runnable.
98 //               There are |(ARITY^2 + ARITY)/2| Invoketypes.
99 //  BindState<> -- Stores the curried parameters, and is the main entry point
100 //                 into the Bind() system, doing most of the type resolution.
101 //                 There are ARITY BindState types.
102 
103 // RunnableAdapter<>
104 //
105 // The RunnableAdapter<> templates provide a uniform interface for invoking
106 // a function pointer, method pointer, or const method pointer. The adapter
107 // exposes a Run() method with an appropriate signature. Using this wrapper
108 // allows for writing code that supports all three pointer types without
109 // undue repetition.  Without it, a lot of code would need to be repeated 3
110 // times.
111 //
112 // For method pointers and const method pointers the first argument to Run()
113 // is considered to be the received of the method.  This is similar to STL's
114 // mem_fun().
115 //
116 // This class also exposes a RunType typedef that is the function type of the
117 // Run() function.
118 //
119 // If and only if the wrapper contains a method or const method pointer, an
120 // IsMethod typedef is exposed.  The existence of this typedef (NOT the value)
121 // marks that the wrapper should be considered a method wrapper.
122 
123 template <typename Functor>
124 class RunnableAdapter;
125 
126 // Function: Arity 0.
127 template <typename R>
128 class RunnableAdapter<R (*)()> {
129  public:
130   typedef R(RunType)();
131 
RunnableAdapter(R (* function)())132   explicit RunnableAdapter(R (*function)()) : function_(function) {}
133 
Run()134   R Run() { return function_(); }
135 
136  private:
137   R (*function_)();
138 };
139 
140 // Method: Arity 0.
141 template <typename R, typename T>
142 class RunnableAdapter<R (T::*)()> {
143  public:
144   typedef R(RunType)(T*);
145   typedef true_type IsMethod;
146 
RunnableAdapter(R (T::* method)())147   explicit RunnableAdapter(R (T::*method)()) : method_(method) {}
148 
Run(T * object)149   R Run(T* object) { return (object->*method_)(); }
150 
151  private:
152   R (T::*method_)();
153 };
154 
155 // Const Method: Arity 0.
156 template <typename R, typename T>
157 class RunnableAdapter<R (T::*)() const> {
158  public:
159   typedef R(RunType)(const T*);
160   typedef true_type IsMethod;
161 
RunnableAdapter(R (T::* method)()const)162   explicit RunnableAdapter(R (T::*method)() const) : method_(method) {}
163 
Run(const T * object)164   R Run(const T* object) { return (object->*method_)(); }
165 
166  private:
167   R (T::*method_)() const;
168 };
169 
170 // Function: Arity 1.
171 template <typename R, typename A1>
172 class RunnableAdapter<R (*)(A1)> {
173  public:
174   typedef R(RunType)(A1);
175 
RunnableAdapter(R (* function)(A1))176   explicit RunnableAdapter(R (*function)(A1)) : function_(function) {}
177 
Run(typename CallbackParamTraits<A1>::ForwardType a1)178   R Run(typename CallbackParamTraits<A1>::ForwardType a1) {
179     return function_(CallbackForward(a1));
180   }
181 
182  private:
183   R (*function_)(A1);
184 };
185 
186 // Method: Arity 1.
187 template <typename R, typename T, typename A1>
188 class RunnableAdapter<R (T::*)(A1)> {
189  public:
190   typedef R(RunType)(T*, A1);
191   typedef true_type IsMethod;
192 
RunnableAdapter(R (T::* method)(A1))193   explicit RunnableAdapter(R (T::*method)(A1)) : method_(method) {}
194 
Run(T * object,typename CallbackParamTraits<A1>::ForwardType a1)195   R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1) {
196     return (object->*method_)(CallbackForward(a1));
197   }
198 
199  private:
200   R (T::*method_)(A1);
201 };
202 
203 // Const Method: Arity 1.
204 template <typename R, typename T, typename A1>
205 class RunnableAdapter<R (T::*)(A1) const> {
206  public:
207   typedef R(RunType)(const T*, A1);
208   typedef true_type IsMethod;
209 
RunnableAdapter(R (T::* method)(A1)const)210   explicit RunnableAdapter(R (T::*method)(A1) const) : method_(method) {}
211 
Run(const T * object,typename CallbackParamTraits<A1>::ForwardType a1)212   R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1) {
213     return (object->*method_)(CallbackForward(a1));
214   }
215 
216  private:
217   R (T::*method_)(A1) const;
218 };
219 
220 // Function: Arity 2.
221 template <typename R, typename A1, typename A2>
222 class RunnableAdapter<R (*)(A1, A2)> {
223  public:
224   typedef R(RunType)(A1, A2);
225 
RunnableAdapter(R (* function)(A1,A2))226   explicit RunnableAdapter(R (*function)(A1, A2)) : function_(function) {}
227 
Run(typename CallbackParamTraits<A1>::ForwardType a1,typename CallbackParamTraits<A2>::ForwardType a2)228   R Run(typename CallbackParamTraits<A1>::ForwardType a1,
229         typename CallbackParamTraits<A2>::ForwardType a2) {
230     return function_(CallbackForward(a1), CallbackForward(a2));
231   }
232 
233  private:
234   R (*function_)(A1, A2);
235 };
236 
237 // Method: Arity 2.
238 template <typename R, typename T, typename A1, typename A2>
239 class RunnableAdapter<R (T::*)(A1, A2)> {
240  public:
241   typedef R(RunType)(T*, A1, A2);
242   typedef true_type IsMethod;
243 
RunnableAdapter(R (T::* method)(A1,A2))244   explicit RunnableAdapter(R (T::*method)(A1, A2)) : method_(method) {}
245 
Run(T * object,typename CallbackParamTraits<A1>::ForwardType a1,typename CallbackParamTraits<A2>::ForwardType a2)246   R Run(T* object,
247         typename CallbackParamTraits<A1>::ForwardType a1,
248         typename CallbackParamTraits<A2>::ForwardType a2) {
249     return (object->*method_)(CallbackForward(a1), CallbackForward(a2));
250   }
251 
252  private:
253   R (T::*method_)(A1, A2);
254 };
255 
256 // Const Method: Arity 2.
257 template <typename R, typename T, typename A1, typename A2>
258 class RunnableAdapter<R (T::*)(A1, A2) const> {
259  public:
260   typedef R(RunType)(const T*, A1, A2);
261   typedef true_type IsMethod;
262 
RunnableAdapter(R (T::* method)(A1,A2)const)263   explicit RunnableAdapter(R (T::*method)(A1, A2) const) : method_(method) {}
264 
Run(const T * object,typename CallbackParamTraits<A1>::ForwardType a1,typename CallbackParamTraits<A2>::ForwardType a2)265   R Run(const T* object,
266         typename CallbackParamTraits<A1>::ForwardType a1,
267         typename CallbackParamTraits<A2>::ForwardType a2) {
268     return (object->*method_)(CallbackForward(a1), CallbackForward(a2));
269   }
270 
271  private:
272   R (T::*method_)(A1, A2) const;
273 };
274 
275 // Function: Arity 3.
276 template <typename R, typename A1, typename A2, typename A3>
277 class RunnableAdapter<R (*)(A1, A2, A3)> {
278  public:
279   typedef R(RunType)(A1, A2, A3);
280 
RunnableAdapter(R (* function)(A1,A2,A3))281   explicit RunnableAdapter(R (*function)(A1, A2, A3)) : function_(function) {}
282 
Run(typename CallbackParamTraits<A1>::ForwardType a1,typename CallbackParamTraits<A2>::ForwardType a2,typename CallbackParamTraits<A3>::ForwardType a3)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));
288   }
289 
290  private:
291   R (*function_)(A1, A2, A3);
292 };
293 
294 // Method: Arity 3.
295 template <typename R, typename T, typename A1, typename A2, typename A3>
296 class RunnableAdapter<R (T::*)(A1, A2, A3)> {
297  public:
298   typedef R(RunType)(T*, A1, A2, A3);
299   typedef true_type IsMethod;
300 
RunnableAdapter(R (T::* method)(A1,A2,A3))301   explicit RunnableAdapter(R (T::*method)(A1, A2, A3)) : method_(method) {}
302 
Run(T * object,typename CallbackParamTraits<A1>::ForwardType a1,typename CallbackParamTraits<A2>::ForwardType a2,typename CallbackParamTraits<A3>::ForwardType a3)303   R Run(T* object,
304         typename CallbackParamTraits<A1>::ForwardType a1,
305         typename CallbackParamTraits<A2>::ForwardType a2,
306         typename CallbackParamTraits<A3>::ForwardType a3) {
307     return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
308                               CallbackForward(a3));
309   }
310 
311  private:
312   R (T::*method_)(A1, A2, A3);
313 };
314 
315 // Const Method: Arity 3.
316 template <typename R, typename T, typename A1, typename A2, typename A3>
317 class RunnableAdapter<R (T::*)(A1, A2, A3) const> {
318  public:
319   typedef R(RunType)(const T*, A1, A2, A3);
320   typedef true_type IsMethod;
321 
RunnableAdapter(R (T::* method)(A1,A2,A3)const)322   explicit RunnableAdapter(R (T::*method)(A1, A2, A3) const)
323       : method_(method) {}
324 
Run(const T * object,typename CallbackParamTraits<A1>::ForwardType a1,typename CallbackParamTraits<A2>::ForwardType a2,typename CallbackParamTraits<A3>::ForwardType a3)325   R Run(const T* object,
326         typename CallbackParamTraits<A1>::ForwardType a1,
327         typename CallbackParamTraits<A2>::ForwardType a2,
328         typename CallbackParamTraits<A3>::ForwardType a3) {
329     return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
330                               CallbackForward(a3));
331   }
332 
333  private:
334   R (T::*method_)(A1, A2, A3) const;
335 };
336 
337 // Function: Arity 4.
338 template <typename R, typename A1, typename A2, typename A3, typename A4>
339 class RunnableAdapter<R (*)(A1, A2, A3, A4)> {
340  public:
341   typedef R(RunType)(A1, A2, A3, A4);
342 
RunnableAdapter(R (* function)(A1,A2,A3,A4))343   explicit RunnableAdapter(R (*function)(A1, A2, A3, A4))
344       : function_(function) {}
345 
Run(typename CallbackParamTraits<A1>::ForwardType a1,typename CallbackParamTraits<A2>::ForwardType a2,typename CallbackParamTraits<A3>::ForwardType a3,typename CallbackParamTraits<A4>::ForwardType a4)346   R Run(typename CallbackParamTraits<A1>::ForwardType a1,
347         typename CallbackParamTraits<A2>::ForwardType a2,
348         typename CallbackParamTraits<A3>::ForwardType a3,
349         typename CallbackParamTraits<A4>::ForwardType a4) {
350     return function_(CallbackForward(a1), CallbackForward(a2),
351                      CallbackForward(a3), CallbackForward(a4));
352   }
353 
354  private:
355   R (*function_)(A1, A2, A3, A4);
356 };
357 
358 // Method: Arity 4.
359 template <typename R,
360           typename T,
361           typename A1,
362           typename A2,
363           typename A3,
364           typename A4>
365 class RunnableAdapter<R (T::*)(A1, A2, A3, A4)> {
366  public:
367   typedef R(RunType)(T*, A1, A2, A3, A4);
368   typedef true_type IsMethod;
369 
RunnableAdapter(R (T::* method)(A1,A2,A3,A4))370   explicit RunnableAdapter(R (T::*method)(A1, A2, A3, A4)) : method_(method) {}
371 
Run(T * object,typename CallbackParamTraits<A1>::ForwardType a1,typename CallbackParamTraits<A2>::ForwardType a2,typename CallbackParamTraits<A3>::ForwardType a3,typename CallbackParamTraits<A4>::ForwardType a4)372   R Run(T* object,
373         typename CallbackParamTraits<A1>::ForwardType a1,
374         typename CallbackParamTraits<A2>::ForwardType a2,
375         typename CallbackParamTraits<A3>::ForwardType a3,
376         typename CallbackParamTraits<A4>::ForwardType a4) {
377     return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
378                               CallbackForward(a3), CallbackForward(a4));
379   }
380 
381  private:
382   R (T::*method_)(A1, A2, A3, A4);
383 };
384 
385 // Const Method: Arity 4.
386 template <typename R,
387           typename T,
388           typename A1,
389           typename A2,
390           typename A3,
391           typename A4>
392 class RunnableAdapter<R (T::*)(A1, A2, A3, A4) const> {
393  public:
394   typedef R(RunType)(const T*, A1, A2, A3, A4);
395   typedef true_type IsMethod;
396 
RunnableAdapter(R (T::* method)(A1,A2,A3,A4)const)397   explicit RunnableAdapter(R (T::*method)(A1, A2, A3, A4) const)
398       : method_(method) {}
399 
Run(const T * object,typename CallbackParamTraits<A1>::ForwardType a1,typename CallbackParamTraits<A2>::ForwardType a2,typename CallbackParamTraits<A3>::ForwardType a3,typename CallbackParamTraits<A4>::ForwardType a4)400   R Run(const T* object,
401         typename CallbackParamTraits<A1>::ForwardType a1,
402         typename CallbackParamTraits<A2>::ForwardType a2,
403         typename CallbackParamTraits<A3>::ForwardType a3,
404         typename CallbackParamTraits<A4>::ForwardType a4) {
405     return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
406                               CallbackForward(a3), CallbackForward(a4));
407   }
408 
409  private:
410   R (T::*method_)(A1, A2, A3, A4) const;
411 };
412 
413 // Function: Arity 5.
414 template <typename R,
415           typename A1,
416           typename A2,
417           typename A3,
418           typename A4,
419           typename A5>
420 class RunnableAdapter<R (*)(A1, A2, A3, A4, A5)> {
421  public:
422   typedef R(RunType)(A1, A2, A3, A4, A5);
423 
RunnableAdapter(R (* function)(A1,A2,A3,A4,A5))424   explicit RunnableAdapter(R (*function)(A1, A2, A3, A4, A5))
425       : function_(function) {}
426 
Run(typename CallbackParamTraits<A1>::ForwardType a1,typename CallbackParamTraits<A2>::ForwardType a2,typename CallbackParamTraits<A3>::ForwardType a3,typename CallbackParamTraits<A4>::ForwardType a4,typename CallbackParamTraits<A5>::ForwardType a5)427   R Run(typename CallbackParamTraits<A1>::ForwardType a1,
428         typename CallbackParamTraits<A2>::ForwardType a2,
429         typename CallbackParamTraits<A3>::ForwardType a3,
430         typename CallbackParamTraits<A4>::ForwardType a4,
431         typename CallbackParamTraits<A5>::ForwardType a5) {
432     return function_(CallbackForward(a1), CallbackForward(a2),
433                      CallbackForward(a3), CallbackForward(a4),
434                      CallbackForward(a5));
435   }
436 
437  private:
438   R (*function_)(A1, A2, A3, A4, A5);
439 };
440 
441 // Method: Arity 5.
442 template <typename R,
443           typename T,
444           typename A1,
445           typename A2,
446           typename A3,
447           typename A4,
448           typename A5>
449 class RunnableAdapter<R (T::*)(A1, A2, A3, A4, A5)> {
450  public:
451   typedef R(RunType)(T*, A1, A2, A3, A4, A5);
452   typedef true_type IsMethod;
453 
RunnableAdapter(R (T::* method)(A1,A2,A3,A4,A5))454   explicit RunnableAdapter(R (T::*method)(A1, A2, A3, A4, A5))
455       : method_(method) {}
456 
Run(T * object,typename CallbackParamTraits<A1>::ForwardType a1,typename CallbackParamTraits<A2>::ForwardType a2,typename CallbackParamTraits<A3>::ForwardType a3,typename CallbackParamTraits<A4>::ForwardType a4,typename CallbackParamTraits<A5>::ForwardType a5)457   R Run(T* object,
458         typename CallbackParamTraits<A1>::ForwardType a1,
459         typename CallbackParamTraits<A2>::ForwardType a2,
460         typename CallbackParamTraits<A3>::ForwardType a3,
461         typename CallbackParamTraits<A4>::ForwardType a4,
462         typename CallbackParamTraits<A5>::ForwardType a5) {
463     return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
464                               CallbackForward(a3), CallbackForward(a4),
465                               CallbackForward(a5));
466   }
467 
468  private:
469   R (T::*method_)(A1, A2, A3, A4, A5);
470 };
471 
472 // Const Method: Arity 5.
473 template <typename R,
474           typename T,
475           typename A1,
476           typename A2,
477           typename A3,
478           typename A4,
479           typename A5>
480 class RunnableAdapter<R (T::*)(A1, A2, A3, A4, A5) const> {
481  public:
482   typedef R(RunType)(const T*, A1, A2, A3, A4, A5);
483   typedef true_type IsMethod;
484 
RunnableAdapter(R (T::* method)(A1,A2,A3,A4,A5)const)485   explicit RunnableAdapter(R (T::*method)(A1, A2, A3, A4, A5) const)
486       : method_(method) {}
487 
Run(const T * object,typename CallbackParamTraits<A1>::ForwardType a1,typename CallbackParamTraits<A2>::ForwardType a2,typename CallbackParamTraits<A3>::ForwardType a3,typename CallbackParamTraits<A4>::ForwardType a4,typename CallbackParamTraits<A5>::ForwardType a5)488   R Run(const T* object,
489         typename CallbackParamTraits<A1>::ForwardType a1,
490         typename CallbackParamTraits<A2>::ForwardType a2,
491         typename CallbackParamTraits<A3>::ForwardType a3,
492         typename CallbackParamTraits<A4>::ForwardType a4,
493         typename CallbackParamTraits<A5>::ForwardType a5) {
494     return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
495                               CallbackForward(a3), CallbackForward(a4),
496                               CallbackForward(a5));
497   }
498 
499  private:
500   R (T::*method_)(A1, A2, A3, A4, A5) const;
501 };
502 
503 // Function: Arity 6.
504 template <typename R,
505           typename A1,
506           typename A2,
507           typename A3,
508           typename A4,
509           typename A5,
510           typename A6>
511 class RunnableAdapter<R (*)(A1, A2, A3, A4, A5, A6)> {
512  public:
513   typedef R(RunType)(A1, A2, A3, A4, A5, A6);
514 
RunnableAdapter(R (* function)(A1,A2,A3,A4,A5,A6))515   explicit RunnableAdapter(R (*function)(A1, A2, A3, A4, A5, A6))
516       : function_(function) {}
517 
Run(typename CallbackParamTraits<A1>::ForwardType a1,typename CallbackParamTraits<A2>::ForwardType a2,typename CallbackParamTraits<A3>::ForwardType a3,typename CallbackParamTraits<A4>::ForwardType a4,typename CallbackParamTraits<A5>::ForwardType a5,typename CallbackParamTraits<A6>::ForwardType a6)518   R Run(typename CallbackParamTraits<A1>::ForwardType a1,
519         typename CallbackParamTraits<A2>::ForwardType a2,
520         typename CallbackParamTraits<A3>::ForwardType a3,
521         typename CallbackParamTraits<A4>::ForwardType a4,
522         typename CallbackParamTraits<A5>::ForwardType a5,
523         typename CallbackParamTraits<A6>::ForwardType a6) {
524     return function_(CallbackForward(a1), CallbackForward(a2),
525                      CallbackForward(a3), CallbackForward(a4),
526                      CallbackForward(a5), CallbackForward(a6));
527   }
528 
529  private:
530   R (*function_)(A1, A2, A3, A4, A5, A6);
531 };
532 
533 // Method: Arity 6.
534 template <typename R,
535           typename T,
536           typename A1,
537           typename A2,
538           typename A3,
539           typename A4,
540           typename A5,
541           typename A6>
542 class RunnableAdapter<R (T::*)(A1, A2, A3, A4, A5, A6)> {
543  public:
544   typedef R(RunType)(T*, A1, A2, A3, A4, A5, A6);
545   typedef true_type IsMethod;
546 
RunnableAdapter(R (T::* method)(A1,A2,A3,A4,A5,A6))547   explicit RunnableAdapter(R (T::*method)(A1, A2, A3, A4, A5, A6))
548       : method_(method) {}
549 
Run(T * object,typename CallbackParamTraits<A1>::ForwardType a1,typename CallbackParamTraits<A2>::ForwardType a2,typename CallbackParamTraits<A3>::ForwardType a3,typename CallbackParamTraits<A4>::ForwardType a4,typename CallbackParamTraits<A5>::ForwardType a5,typename CallbackParamTraits<A6>::ForwardType a6)550   R Run(T* object,
551         typename CallbackParamTraits<A1>::ForwardType a1,
552         typename CallbackParamTraits<A2>::ForwardType a2,
553         typename CallbackParamTraits<A3>::ForwardType a3,
554         typename CallbackParamTraits<A4>::ForwardType a4,
555         typename CallbackParamTraits<A5>::ForwardType a5,
556         typename CallbackParamTraits<A6>::ForwardType a6) {
557     return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
558                               CallbackForward(a3), CallbackForward(a4),
559                               CallbackForward(a5), CallbackForward(a6));
560   }
561 
562  private:
563   R (T::*method_)(A1, A2, A3, A4, A5, A6);
564 };
565 
566 // Const Method: Arity 6.
567 template <typename R,
568           typename T,
569           typename A1,
570           typename A2,
571           typename A3,
572           typename A4,
573           typename A5,
574           typename A6>
575 class RunnableAdapter<R (T::*)(A1, A2, A3, A4, A5, A6) const> {
576  public:
577   typedef R(RunType)(const T*, A1, A2, A3, A4, A5, A6);
578   typedef true_type IsMethod;
579 
RunnableAdapter(R (T::* method)(A1,A2,A3,A4,A5,A6)const)580   explicit RunnableAdapter(R (T::*method)(A1, A2, A3, A4, A5, A6) const)
581       : method_(method) {}
582 
Run(const T * object,typename CallbackParamTraits<A1>::ForwardType a1,typename CallbackParamTraits<A2>::ForwardType a2,typename CallbackParamTraits<A3>::ForwardType a3,typename CallbackParamTraits<A4>::ForwardType a4,typename CallbackParamTraits<A5>::ForwardType a5,typename CallbackParamTraits<A6>::ForwardType a6)583   R Run(const T* object,
584         typename CallbackParamTraits<A1>::ForwardType a1,
585         typename CallbackParamTraits<A2>::ForwardType a2,
586         typename CallbackParamTraits<A3>::ForwardType a3,
587         typename CallbackParamTraits<A4>::ForwardType a4,
588         typename CallbackParamTraits<A5>::ForwardType a5,
589         typename CallbackParamTraits<A6>::ForwardType a6) {
590     return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
591                               CallbackForward(a3), CallbackForward(a4),
592                               CallbackForward(a5), CallbackForward(a6));
593   }
594 
595  private:
596   R (T::*method_)(A1, A2, A3, A4, A5, A6) const;
597 };
598 
599 // Function: Arity 7.
600 template <typename R,
601           typename A1,
602           typename A2,
603           typename A3,
604           typename A4,
605           typename A5,
606           typename A6,
607           typename A7>
608 class RunnableAdapter<R (*)(A1, A2, A3, A4, A5, A6, A7)> {
609  public:
610   typedef R(RunType)(A1, A2, A3, A4, A5, A6, A7);
611 
RunnableAdapter(R (* function)(A1,A2,A3,A4,A5,A6,A7))612   explicit RunnableAdapter(R (*function)(A1, A2, A3, A4, A5, A6, A7))
613       : function_(function) {}
614 
Run(typename CallbackParamTraits<A1>::ForwardType a1,typename CallbackParamTraits<A2>::ForwardType a2,typename CallbackParamTraits<A3>::ForwardType a3,typename CallbackParamTraits<A4>::ForwardType a4,typename CallbackParamTraits<A5>::ForwardType a5,typename CallbackParamTraits<A6>::ForwardType a6,typename CallbackParamTraits<A7>::ForwardType a7)615   R Run(typename CallbackParamTraits<A1>::ForwardType a1,
616         typename CallbackParamTraits<A2>::ForwardType a2,
617         typename CallbackParamTraits<A3>::ForwardType a3,
618         typename CallbackParamTraits<A4>::ForwardType a4,
619         typename CallbackParamTraits<A5>::ForwardType a5,
620         typename CallbackParamTraits<A6>::ForwardType a6,
621         typename CallbackParamTraits<A7>::ForwardType a7) {
622     return function_(CallbackForward(a1), CallbackForward(a2),
623                      CallbackForward(a3), CallbackForward(a4),
624                      CallbackForward(a5), CallbackForward(a6),
625                      CallbackForward(a7));
626   }
627 
628  private:
629   R (*function_)(A1, A2, A3, A4, A5, A6, A7);
630 };
631 
632 // Method: Arity 7.
633 template <typename R,
634           typename T,
635           typename A1,
636           typename A2,
637           typename A3,
638           typename A4,
639           typename A5,
640           typename A6,
641           typename A7>
642 class RunnableAdapter<R (T::*)(A1, A2, A3, A4, A5, A6, A7)> {
643  public:
644   typedef R(RunType)(T*, A1, A2, A3, A4, A5, A6, A7);
645   typedef true_type IsMethod;
646 
RunnableAdapter(R (T::* method)(A1,A2,A3,A4,A5,A6,A7))647   explicit RunnableAdapter(R (T::*method)(A1, A2, A3, A4, A5, A6, A7))
648       : method_(method) {}
649 
Run(T * object,typename CallbackParamTraits<A1>::ForwardType a1,typename CallbackParamTraits<A2>::ForwardType a2,typename CallbackParamTraits<A3>::ForwardType a3,typename CallbackParamTraits<A4>::ForwardType a4,typename CallbackParamTraits<A5>::ForwardType a5,typename CallbackParamTraits<A6>::ForwardType a6,typename CallbackParamTraits<A7>::ForwardType a7)650   R Run(T* object,
651         typename CallbackParamTraits<A1>::ForwardType a1,
652         typename CallbackParamTraits<A2>::ForwardType a2,
653         typename CallbackParamTraits<A3>::ForwardType a3,
654         typename CallbackParamTraits<A4>::ForwardType a4,
655         typename CallbackParamTraits<A5>::ForwardType a5,
656         typename CallbackParamTraits<A6>::ForwardType a6,
657         typename CallbackParamTraits<A7>::ForwardType a7) {
658     return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
659                               CallbackForward(a3), CallbackForward(a4),
660                               CallbackForward(a5), CallbackForward(a6),
661                               CallbackForward(a7));
662   }
663 
664  private:
665   R (T::*method_)(A1, A2, A3, A4, A5, A6, A7);
666 };
667 
668 // Const Method: Arity 7.
669 template <typename R,
670           typename T,
671           typename A1,
672           typename A2,
673           typename A3,
674           typename A4,
675           typename A5,
676           typename A6,
677           typename A7>
678 class RunnableAdapter<R (T::*)(A1, A2, A3, A4, A5, A6, A7) const> {
679  public:
680   typedef R(RunType)(const T*, A1, A2, A3, A4, A5, A6, A7);
681   typedef true_type IsMethod;
682 
RunnableAdapter(R (T::* method)(A1,A2,A3,A4,A5,A6,A7)const)683   explicit RunnableAdapter(R (T::*method)(A1, A2, A3, A4, A5, A6, A7) const)
684       : method_(method) {}
685 
Run(const T * object,typename CallbackParamTraits<A1>::ForwardType a1,typename CallbackParamTraits<A2>::ForwardType a2,typename CallbackParamTraits<A3>::ForwardType a3,typename CallbackParamTraits<A4>::ForwardType a4,typename CallbackParamTraits<A5>::ForwardType a5,typename CallbackParamTraits<A6>::ForwardType a6,typename CallbackParamTraits<A7>::ForwardType a7)686   R Run(const T* object,
687         typename CallbackParamTraits<A1>::ForwardType a1,
688         typename CallbackParamTraits<A2>::ForwardType a2,
689         typename CallbackParamTraits<A3>::ForwardType a3,
690         typename CallbackParamTraits<A4>::ForwardType a4,
691         typename CallbackParamTraits<A5>::ForwardType a5,
692         typename CallbackParamTraits<A6>::ForwardType a6,
693         typename CallbackParamTraits<A7>::ForwardType a7) {
694     return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
695                               CallbackForward(a3), CallbackForward(a4),
696                               CallbackForward(a5), CallbackForward(a6),
697                               CallbackForward(a7));
698   }
699 
700  private:
701   R (T::*method_)(A1, A2, A3, A4, A5, A6, A7) const;
702 };
703 
704 // FunctionTraits<>
705 //
706 // Breaks a function signature apart into typedefs for easier introspection.
707 template <typename Sig>
708 struct FunctionTraits;
709 
710 template <typename R>
711 struct FunctionTraits<R()> {
712   typedef R ReturnType;
713 };
714 
715 template <typename R, typename A1>
716 struct FunctionTraits<R(A1)> {
717   typedef R ReturnType;
718   typedef A1 A1Type;
719 };
720 
721 template <typename R, typename A1, typename A2>
722 struct FunctionTraits<R(A1, A2)> {
723   typedef R ReturnType;
724   typedef A1 A1Type;
725   typedef A2 A2Type;
726 };
727 
728 template <typename R, typename A1, typename A2, typename A3>
729 struct FunctionTraits<R(A1, A2, A3)> {
730   typedef R ReturnType;
731   typedef A1 A1Type;
732   typedef A2 A2Type;
733   typedef A3 A3Type;
734 };
735 
736 template <typename R, typename A1, typename A2, typename A3, typename A4>
737 struct FunctionTraits<R(A1, A2, A3, A4)> {
738   typedef R ReturnType;
739   typedef A1 A1Type;
740   typedef A2 A2Type;
741   typedef A3 A3Type;
742   typedef A4 A4Type;
743 };
744 
745 template <typename R,
746           typename A1,
747           typename A2,
748           typename A3,
749           typename A4,
750           typename A5>
751 struct FunctionTraits<R(A1, A2, A3, A4, A5)> {
752   typedef R ReturnType;
753   typedef A1 A1Type;
754   typedef A2 A2Type;
755   typedef A3 A3Type;
756   typedef A4 A4Type;
757   typedef A5 A5Type;
758 };
759 
760 template <typename R,
761           typename A1,
762           typename A2,
763           typename A3,
764           typename A4,
765           typename A5,
766           typename A6>
767 struct FunctionTraits<R(A1, A2, A3, A4, A5, A6)> {
768   typedef R ReturnType;
769   typedef A1 A1Type;
770   typedef A2 A2Type;
771   typedef A3 A3Type;
772   typedef A4 A4Type;
773   typedef A5 A5Type;
774   typedef A6 A6Type;
775 };
776 
777 template <typename R,
778           typename A1,
779           typename A2,
780           typename A3,
781           typename A4,
782           typename A5,
783           typename A6,
784           typename A7>
785 struct FunctionTraits<R(A1, A2, A3, A4, A5, A6, A7)> {
786   typedef R ReturnType;
787   typedef A1 A1Type;
788   typedef A2 A2Type;
789   typedef A3 A3Type;
790   typedef A4 A4Type;
791   typedef A5 A5Type;
792   typedef A6 A6Type;
793   typedef A7 A7Type;
794 };
795 
796 // ForceVoidReturn<>
797 //
798 // Set of templates that support forcing the function return type to void.
799 template <typename Sig>
800 struct ForceVoidReturn;
801 
802 template <typename R>
803 struct ForceVoidReturn<R()> {
804   typedef void(RunType)();
805 };
806 
807 template <typename R, typename A1>
808 struct ForceVoidReturn<R(A1)> {
809   typedef void(RunType)(A1);
810 };
811 
812 template <typename R, typename A1, typename A2>
813 struct ForceVoidReturn<R(A1, A2)> {
814   typedef void(RunType)(A1, A2);
815 };
816 
817 template <typename R, typename A1, typename A2, typename A3>
818 struct ForceVoidReturn<R(A1, A2, A3)> {
819   typedef void(RunType)(A1, A2, A3);
820 };
821 
822 template <typename R, typename A1, typename A2, typename A3, typename A4>
823 struct ForceVoidReturn<R(A1, A2, A3, A4)> {
824   typedef void(RunType)(A1, A2, A3, A4);
825 };
826 
827 template <typename R,
828           typename A1,
829           typename A2,
830           typename A3,
831           typename A4,
832           typename A5>
833 struct ForceVoidReturn<R(A1, A2, A3, A4, A5)> {
834   typedef void(RunType)(A1, A2, A3, A4, A5);
835 };
836 
837 template <typename R,
838           typename A1,
839           typename A2,
840           typename A3,
841           typename A4,
842           typename A5,
843           typename A6>
844 struct ForceVoidReturn<R(A1, A2, A3, A4, A5, A6)> {
845   typedef void(RunType)(A1, A2, A3, A4, A5, A6);
846 };
847 
848 template <typename R,
849           typename A1,
850           typename A2,
851           typename A3,
852           typename A4,
853           typename A5,
854           typename A6,
855           typename A7>
856 struct ForceVoidReturn<R(A1, A2, A3, A4, A5, A6, A7)> {
857   typedef void(RunType)(A1, A2, A3, A4, A5, A6, A7);
858 };
859 
860 // FunctorTraits<>
861 //
862 // See description at top of file.
863 template <typename T>
864 struct FunctorTraits {
865   typedef RunnableAdapter<T> RunnableType;
866   typedef typename RunnableType::RunType RunType;
867 };
868 
869 template <typename T>
870 struct FunctorTraits<IgnoreResultHelper<T>> {
871   typedef typename FunctorTraits<T>::RunnableType RunnableType;
872   typedef
873       typename ForceVoidReturn<typename RunnableType::RunType>::RunType RunType;
874 };
875 
876 template <typename T>
877 struct FunctorTraits<Callback<T>> {
878   typedef Callback<T> RunnableType;
879   typedef typename Callback<T>::RunType RunType;
880 };
881 
882 // MakeRunnable<>
883 //
884 // Converts a passed in functor to a RunnableType using type inference.
885 
886 template <typename T>
887 typename FunctorTraits<T>::RunnableType MakeRunnable(const T& t) {
888   return RunnableAdapter<T>(t);
889 }
890 
891 template <typename T>
892 typename FunctorTraits<T>::RunnableType MakeRunnable(
893     const IgnoreResultHelper<T>& t) {
894   return MakeRunnable(t.functor_);
895 }
896 
897 template <typename T>
898 const typename FunctorTraits<Callback<T>>::RunnableType& MakeRunnable(
899     const Callback<T>& t) {
900   DCHECK(!t.is_null());
901   return t;
902 }
903 
904 // InvokeHelper<>
905 //
906 // There are 3 logical InvokeHelper<> specializations: normal, void-return,
907 // WeakCalls.
908 //
909 // The normal type just calls the underlying runnable.
910 //
911 // We need a InvokeHelper to handle void return types in order to support
912 // IgnoreResult().  Normally, if the Runnable's RunType had a void return,
913 // the template system would just accept "return functor.Run()" ignoring
914 // the fact that a void function is being used with return. This piece of
915 // sugar breaks though when the Runnable's RunType is not void.  Thus, we
916 // need a partial specialization to change the syntax to drop the "return"
917 // from the invocation call.
918 //
919 // WeakCalls similarly need special syntax that is applied to the first
920 // argument to check if they should no-op themselves.
921 template <bool IsWeakCall,
922           typename ReturnType,
923           typename Runnable,
924           typename ArgsType>
925 struct InvokeHelper;
926 
927 template <typename ReturnType, typename Runnable>
928 struct InvokeHelper<false, ReturnType, Runnable, void()> {
929   static ReturnType MakeItSo(Runnable runnable) { return runnable.Run(); }
930 };
931 
932 template <typename Runnable>
933 struct InvokeHelper<false, void, Runnable, void()> {
934   static void MakeItSo(Runnable runnable) { runnable.Run(); }
935 };
936 
937 template <typename ReturnType, typename Runnable, typename A1>
938 struct InvokeHelper<false, ReturnType, Runnable, void(A1)> {
939   static ReturnType MakeItSo(Runnable runnable, A1 a1) {
940     return runnable.Run(CallbackForward(a1));
941   }
942 };
943 
944 template <typename Runnable, typename A1>
945 struct InvokeHelper<false, void, Runnable, void(A1)> {
946   static void MakeItSo(Runnable runnable, A1 a1) {
947     runnable.Run(CallbackForward(a1));
948   }
949 };
950 
951 template <typename Runnable, typename BoundWeakPtr>
952 struct InvokeHelper<true, void, Runnable, void(BoundWeakPtr)> {
953   static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr) {
954     if (!weak_ptr.get()) {
955       return;
956     }
957     runnable.Run(weak_ptr.get());
958   }
959 };
960 
961 template <typename ReturnType, typename Runnable, typename A1, typename A2>
962 struct InvokeHelper<false, ReturnType, Runnable, void(A1, A2)> {
963   static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2) {
964     return runnable.Run(CallbackForward(a1), CallbackForward(a2));
965   }
966 };
967 
968 template <typename Runnable, typename A1, typename A2>
969 struct InvokeHelper<false, void, Runnable, void(A1, A2)> {
970   static void MakeItSo(Runnable runnable, A1 a1, A2 a2) {
971     runnable.Run(CallbackForward(a1), CallbackForward(a2));
972   }
973 };
974 
975 template <typename Runnable, typename BoundWeakPtr, typename A2>
976 struct InvokeHelper<true, void, Runnable, void(BoundWeakPtr, A2)> {
977   static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2) {
978     if (!weak_ptr.get()) {
979       return;
980     }
981     runnable.Run(weak_ptr.get(), CallbackForward(a2));
982   }
983 };
984 
985 template <typename ReturnType,
986           typename Runnable,
987           typename A1,
988           typename A2,
989           typename A3>
990 struct InvokeHelper<false, ReturnType, Runnable, void(A1, A2, A3)> {
991   static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3) {
992     return runnable.Run(CallbackForward(a1), CallbackForward(a2),
993                         CallbackForward(a3));
994   }
995 };
996 
997 template <typename Runnable, typename A1, typename A2, typename A3>
998 struct InvokeHelper<false, void, Runnable, void(A1, A2, A3)> {
999   static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3) {
1000     runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3));
1001   }
1002 };
1003 
1004 template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3>
1005 struct InvokeHelper<true, void, Runnable, void(BoundWeakPtr, A2, A3)> {
1006   static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3) {
1007     if (!weak_ptr.get()) {
1008       return;
1009     }
1010     runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3));
1011   }
1012 };
1013 
1014 template <typename ReturnType,
1015           typename Runnable,
1016           typename A1,
1017           typename A2,
1018           typename A3,
1019           typename A4>
1020 struct InvokeHelper<false, ReturnType, Runnable, void(A1, A2, A3, A4)> {
1021   static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4) {
1022     return runnable.Run(CallbackForward(a1), CallbackForward(a2),
1023                         CallbackForward(a3), CallbackForward(a4));
1024   }
1025 };
1026 
1027 template <typename Runnable, typename A1, typename A2, typename A3, typename A4>
1028 struct InvokeHelper<false, void, Runnable, void(A1, A2, A3, A4)> {
1029   static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4) {
1030     runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
1031                  CallbackForward(a4));
1032   }
1033 };
1034 
1035 template <typename Runnable,
1036           typename BoundWeakPtr,
1037           typename A2,
1038           typename A3,
1039           typename A4>
1040 struct InvokeHelper<true, void, Runnable, void(BoundWeakPtr, A2, A3, A4)> {
1041   static void MakeItSo(Runnable runnable,
1042                        BoundWeakPtr weak_ptr,
1043                        A2 a2,
1044                        A3 a3,
1045                        A4 a4) {
1046     if (!weak_ptr.get()) {
1047       return;
1048     }
1049     runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3),
1050                  CallbackForward(a4));
1051   }
1052 };
1053 
1054 template <typename ReturnType,
1055           typename Runnable,
1056           typename A1,
1057           typename A2,
1058           typename A3,
1059           typename A4,
1060           typename A5>
1061 struct InvokeHelper<false, ReturnType, Runnable, void(A1, A2, A3, A4, A5)> {
1062   static ReturnType MakeItSo(Runnable runnable,
1063                              A1 a1,
1064                              A2 a2,
1065                              A3 a3,
1066                              A4 a4,
1067                              A5 a5) {
1068     return runnable.Run(CallbackForward(a1), CallbackForward(a2),
1069                         CallbackForward(a3), CallbackForward(a4),
1070                         CallbackForward(a5));
1071   }
1072 };
1073 
1074 template <typename Runnable,
1075           typename A1,
1076           typename A2,
1077           typename A3,
1078           typename A4,
1079           typename A5>
1080 struct InvokeHelper<false, void, Runnable, void(A1, A2, A3, A4, A5)> {
1081   static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
1082     runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
1083                  CallbackForward(a4), CallbackForward(a5));
1084   }
1085 };
1086 
1087 template <typename Runnable,
1088           typename BoundWeakPtr,
1089           typename A2,
1090           typename A3,
1091           typename A4,
1092           typename A5>
1093 struct InvokeHelper<true, void, Runnable, void(BoundWeakPtr, A2, A3, A4, A5)> {
1094   static void MakeItSo(Runnable runnable,
1095                        BoundWeakPtr weak_ptr,
1096                        A2 a2,
1097                        A3 a3,
1098                        A4 a4,
1099                        A5 a5) {
1100     if (!weak_ptr.get()) {
1101       return;
1102     }
1103     runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3),
1104                  CallbackForward(a4), CallbackForward(a5));
1105   }
1106 };
1107 
1108 template <typename ReturnType,
1109           typename Runnable,
1110           typename A1,
1111           typename A2,
1112           typename A3,
1113           typename A4,
1114           typename A5,
1115           typename A6>
1116 struct InvokeHelper<false, ReturnType, Runnable, void(A1, A2, A3, A4, A5, A6)> {
1117   static ReturnType
1118   MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
1119     return runnable.Run(CallbackForward(a1), CallbackForward(a2),
1120                         CallbackForward(a3), CallbackForward(a4),
1121                         CallbackForward(a5), CallbackForward(a6));
1122   }
1123 };
1124 
1125 template <typename Runnable,
1126           typename A1,
1127           typename A2,
1128           typename A3,
1129           typename A4,
1130           typename A5,
1131           typename A6>
1132 struct InvokeHelper<false, void, Runnable, void(A1, A2, A3, A4, A5, A6)> {
1133   static void
1134   MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
1135     runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
1136                  CallbackForward(a4), CallbackForward(a5), CallbackForward(a6));
1137   }
1138 };
1139 
1140 template <typename Runnable,
1141           typename BoundWeakPtr,
1142           typename A2,
1143           typename A3,
1144           typename A4,
1145           typename A5,
1146           typename A6>
1147 struct InvokeHelper<true,
1148                     void,
1149                     Runnable,
1150                     void(BoundWeakPtr, A2, A3, A4, A5, A6)> {
1151   static void MakeItSo(Runnable runnable,
1152                        BoundWeakPtr weak_ptr,
1153                        A2 a2,
1154                        A3 a3,
1155                        A4 a4,
1156                        A5 a5,
1157                        A6 a6) {
1158     if (!weak_ptr.get()) {
1159       return;
1160     }
1161     runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3),
1162                  CallbackForward(a4), CallbackForward(a5), CallbackForward(a6));
1163   }
1164 };
1165 
1166 template <typename ReturnType,
1167           typename Runnable,
1168           typename A1,
1169           typename A2,
1170           typename A3,
1171           typename A4,
1172           typename A5,
1173           typename A6,
1174           typename A7>
1175 struct InvokeHelper<false,
1176                     ReturnType,
1177                     Runnable,
1178                     void(A1, A2, A3, A4, A5, A6, A7)> {
1179   static ReturnType
1180   MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) {
1181     return runnable.Run(CallbackForward(a1), CallbackForward(a2),
1182                         CallbackForward(a3), CallbackForward(a4),
1183                         CallbackForward(a5), CallbackForward(a6),
1184                         CallbackForward(a7));
1185   }
1186 };
1187 
1188 template <typename Runnable,
1189           typename A1,
1190           typename A2,
1191           typename A3,
1192           typename A4,
1193           typename A5,
1194           typename A6,
1195           typename A7>
1196 struct InvokeHelper<false, void, Runnable, void(A1, A2, A3, A4, A5, A6, A7)> {
1197   static void
1198   MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) {
1199     runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
1200                  CallbackForward(a4), CallbackForward(a5), CallbackForward(a6),
1201                  CallbackForward(a7));
1202   }
1203 };
1204 
1205 template <typename Runnable,
1206           typename BoundWeakPtr,
1207           typename A2,
1208           typename A3,
1209           typename A4,
1210           typename A5,
1211           typename A6,
1212           typename A7>
1213 struct InvokeHelper<true,
1214                     void,
1215                     Runnable,
1216                     void(BoundWeakPtr, A2, A3, A4, A5, A6, A7)> {
1217   static void MakeItSo(Runnable runnable,
1218                        BoundWeakPtr weak_ptr,
1219                        A2 a2,
1220                        A3 a3,
1221                        A4 a4,
1222                        A5 a5,
1223                        A6 a6,
1224                        A7 a7) {
1225     if (!weak_ptr.get()) {
1226       return;
1227     }
1228     runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3),
1229                  CallbackForward(a4), CallbackForward(a5), CallbackForward(a6),
1230                  CallbackForward(a7));
1231   }
1232 };
1233 
1234 #if !defined(_MSC_VER)
1235 
1236 template <typename ReturnType, typename Runnable, typename ArgsType>
1237 struct InvokeHelper<true, ReturnType, Runnable, ArgsType> {
1238   // WeakCalls are only supported for functions with a void return type.
1239   // Otherwise, the function result would be undefined if the the WeakPtr<>
1240   // is invalidated.
1241   COMPILE_ASSERT(is_void<ReturnType>::value,
1242                  weak_ptrs_can_only_bind_to_methods_without_return_values);
1243 };
1244 
1245 #endif
1246 
1247 // Invoker<>
1248 //
1249 // See description at the top of the file.
1250 template <int NumBound, typename Storage, typename RunType>
1251 struct Invoker;
1252 
1253 // Arity 0 -> 0.
1254 template <typename StorageType, typename R>
1255 struct Invoker<0, StorageType, R()> {
1256   typedef R(RunType)(BindStateBase*);
1257 
1258   typedef R(UnboundRunType)();
1259 
1260   static R Run(BindStateBase* base) {
1261     StorageType* storage = static_cast<StorageType*>(base);
1262 
1263     // Local references to make debugger stepping easier. If in a debugger,
1264     // you really want to warp ahead and step through the
1265     // InvokeHelper<>::MakeItSo() call below.
1266 
1267     return InvokeHelper<StorageType::IsWeakCall::value, R,
1268                         typename StorageType::RunnableType,
1269                         void()>::MakeItSo(storage->runnable_);
1270   }
1271 };
1272 
1273 // Arity 1 -> 1.
1274 template <typename StorageType, typename R, typename X1>
1275 struct Invoker<0, StorageType, R(X1)> {
1276   typedef R(RunType)(BindStateBase*,
1277                      typename CallbackParamTraits<X1>::ForwardType);
1278 
1279   typedef R(UnboundRunType)(X1);
1280 
1281   static R Run(BindStateBase* base,
1282                typename CallbackParamTraits<X1>::ForwardType x1) {
1283     StorageType* storage = static_cast<StorageType*>(base);
1284 
1285     // Local references to make debugger stepping easier. If in a debugger,
1286     // you really want to warp ahead and step through the
1287     // InvokeHelper<>::MakeItSo() call below.
1288 
1289     return InvokeHelper<StorageType::IsWeakCall::value, R,
1290                         typename StorageType::RunnableType,
1291                         void(typename CallbackParamTraits<X1>::ForwardType
1292                                  x1)>::MakeItSo(storage->runnable_,
1293                                                 CallbackForward(x1));
1294   }
1295 };
1296 
1297 // Arity 1 -> 0.
1298 template <typename StorageType, typename R, typename X1>
1299 struct Invoker<1, StorageType, R(X1)> {
1300   typedef R(RunType)(BindStateBase*);
1301 
1302   typedef R(UnboundRunType)();
1303 
1304   static R Run(BindStateBase* base) {
1305     StorageType* storage = static_cast<StorageType*>(base);
1306 
1307     // Local references to make debugger stepping easier. If in a debugger,
1308     // you really want to warp ahead and step through the
1309     // InvokeHelper<>::MakeItSo() call below.
1310     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1311 
1312     typename Bound1UnwrapTraits::ForwardType x1 =
1313         Bound1UnwrapTraits::Unwrap(storage->p1_);
1314     return InvokeHelper<StorageType::IsWeakCall::value, R,
1315                         typename StorageType::RunnableType,
1316                         void(typename Bound1UnwrapTraits::ForwardType)>::
1317         MakeItSo(storage->runnable_, CallbackForward(x1));
1318   }
1319 };
1320 
1321 // Arity 2 -> 2.
1322 template <typename StorageType, typename R, typename X1, typename X2>
1323 struct Invoker<0, StorageType, R(X1, X2)> {
1324   typedef R(RunType)(BindStateBase*,
1325                      typename CallbackParamTraits<X1>::ForwardType,
1326                      typename CallbackParamTraits<X2>::ForwardType);
1327 
1328   typedef R(UnboundRunType)(X1, X2);
1329 
1330   static R Run(BindStateBase* base,
1331                typename CallbackParamTraits<X1>::ForwardType x1,
1332                typename CallbackParamTraits<X2>::ForwardType x2) {
1333     StorageType* storage = static_cast<StorageType*>(base);
1334 
1335     // Local references to make debugger stepping easier. If in a debugger,
1336     // you really want to warp ahead and step through the
1337     // InvokeHelper<>::MakeItSo() call below.
1338 
1339     return InvokeHelper<StorageType::IsWeakCall::value, R,
1340                         typename StorageType::RunnableType,
1341                         void(typename CallbackParamTraits<X1>::ForwardType x1,
1342                              typename CallbackParamTraits<X2>::ForwardType
1343                                  x2)>::MakeItSo(storage->runnable_,
1344                                                 CallbackForward(x1),
1345                                                 CallbackForward(x2));
1346   }
1347 };
1348 
1349 // Arity 2 -> 1.
1350 template <typename StorageType, typename R, typename X1, typename X2>
1351 struct Invoker<1, StorageType, R(X1, X2)> {
1352   typedef R(RunType)(BindStateBase*,
1353                      typename CallbackParamTraits<X2>::ForwardType);
1354 
1355   typedef R(UnboundRunType)(X2);
1356 
1357   static R Run(BindStateBase* base,
1358                typename CallbackParamTraits<X2>::ForwardType x2) {
1359     StorageType* storage = static_cast<StorageType*>(base);
1360 
1361     // Local references to make debugger stepping easier. If in a debugger,
1362     // you really want to warp ahead and step through the
1363     // InvokeHelper<>::MakeItSo() call below.
1364     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1365 
1366     typename Bound1UnwrapTraits::ForwardType x1 =
1367         Bound1UnwrapTraits::Unwrap(storage->p1_);
1368     return InvokeHelper<StorageType::IsWeakCall::value, R,
1369                         typename StorageType::RunnableType,
1370                         void(typename Bound1UnwrapTraits::ForwardType,
1371                              typename CallbackParamTraits<X2>::ForwardType
1372                                  x2)>::MakeItSo(storage->runnable_,
1373                                                 CallbackForward(x1),
1374                                                 CallbackForward(x2));
1375   }
1376 };
1377 
1378 // Arity 2 -> 0.
1379 template <typename StorageType, typename R, typename X1, typename X2>
1380 struct Invoker<2, StorageType, R(X1, X2)> {
1381   typedef R(RunType)(BindStateBase*);
1382 
1383   typedef R(UnboundRunType)();
1384 
1385   static R Run(BindStateBase* base) {
1386     StorageType* storage = static_cast<StorageType*>(base);
1387 
1388     // Local references to make debugger stepping easier. If in a debugger,
1389     // you really want to warp ahead and step through the
1390     // InvokeHelper<>::MakeItSo() call below.
1391     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1392     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1393 
1394     typename Bound1UnwrapTraits::ForwardType x1 =
1395         Bound1UnwrapTraits::Unwrap(storage->p1_);
1396     typename Bound2UnwrapTraits::ForwardType x2 =
1397         Bound2UnwrapTraits::Unwrap(storage->p2_);
1398     return InvokeHelper<StorageType::IsWeakCall::value, R,
1399                         typename StorageType::RunnableType,
1400                         void(typename Bound1UnwrapTraits::ForwardType,
1401                              typename Bound2UnwrapTraits::ForwardType)>::
1402         MakeItSo(storage->runnable_, CallbackForward(x1), CallbackForward(x2));
1403   }
1404 };
1405 
1406 // Arity 3 -> 3.
1407 template <typename StorageType,
1408           typename R,
1409           typename X1,
1410           typename X2,
1411           typename X3>
1412 struct Invoker<0, StorageType, R(X1, X2, X3)> {
1413   typedef R(RunType)(BindStateBase*,
1414                      typename CallbackParamTraits<X1>::ForwardType,
1415                      typename CallbackParamTraits<X2>::ForwardType,
1416                      typename CallbackParamTraits<X3>::ForwardType);
1417 
1418   typedef R(UnboundRunType)(X1, X2, X3);
1419 
1420   static R Run(BindStateBase* base,
1421                typename CallbackParamTraits<X1>::ForwardType x1,
1422                typename CallbackParamTraits<X2>::ForwardType x2,
1423                typename CallbackParamTraits<X3>::ForwardType x3) {
1424     StorageType* storage = static_cast<StorageType*>(base);
1425 
1426     // Local references to make debugger stepping easier. If in a debugger,
1427     // you really want to warp ahead and step through the
1428     // InvokeHelper<>::MakeItSo() call below.
1429 
1430     return InvokeHelper<StorageType::IsWeakCall::value, R,
1431                         typename StorageType::RunnableType,
1432                         void(typename CallbackParamTraits<X1>::ForwardType x1,
1433                              typename CallbackParamTraits<X2>::ForwardType x2,
1434                              typename CallbackParamTraits<X3>::ForwardType
1435                                  x3)>::MakeItSo(storage->runnable_,
1436                                                 CallbackForward(x1),
1437                                                 CallbackForward(x2),
1438                                                 CallbackForward(x3));
1439   }
1440 };
1441 
1442 // Arity 3 -> 2.
1443 template <typename StorageType,
1444           typename R,
1445           typename X1,
1446           typename X2,
1447           typename X3>
1448 struct Invoker<1, StorageType, R(X1, X2, X3)> {
1449   typedef R(RunType)(BindStateBase*,
1450                      typename CallbackParamTraits<X2>::ForwardType,
1451                      typename CallbackParamTraits<X3>::ForwardType);
1452 
1453   typedef R(UnboundRunType)(X2, X3);
1454 
1455   static R Run(BindStateBase* base,
1456                typename CallbackParamTraits<X2>::ForwardType x2,
1457                typename CallbackParamTraits<X3>::ForwardType x3) {
1458     StorageType* storage = static_cast<StorageType*>(base);
1459 
1460     // Local references to make debugger stepping easier. If in a debugger,
1461     // you really want to warp ahead and step through the
1462     // InvokeHelper<>::MakeItSo() call below.
1463     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1464 
1465     typename Bound1UnwrapTraits::ForwardType x1 =
1466         Bound1UnwrapTraits::Unwrap(storage->p1_);
1467     return InvokeHelper<StorageType::IsWeakCall::value, R,
1468                         typename StorageType::RunnableType,
1469                         void(typename Bound1UnwrapTraits::ForwardType,
1470                              typename CallbackParamTraits<X2>::ForwardType x2,
1471                              typename CallbackParamTraits<X3>::ForwardType
1472                                  x3)>::MakeItSo(storage->runnable_,
1473                                                 CallbackForward(x1),
1474                                                 CallbackForward(x2),
1475                                                 CallbackForward(x3));
1476   }
1477 };
1478 
1479 // Arity 3 -> 1.
1480 template <typename StorageType,
1481           typename R,
1482           typename X1,
1483           typename X2,
1484           typename X3>
1485 struct Invoker<2, StorageType, R(X1, X2, X3)> {
1486   typedef R(RunType)(BindStateBase*,
1487                      typename CallbackParamTraits<X3>::ForwardType);
1488 
1489   typedef R(UnboundRunType)(X3);
1490 
1491   static R Run(BindStateBase* base,
1492                typename CallbackParamTraits<X3>::ForwardType x3) {
1493     StorageType* storage = static_cast<StorageType*>(base);
1494 
1495     // Local references to make debugger stepping easier. If in a debugger,
1496     // you really want to warp ahead and step through the
1497     // InvokeHelper<>::MakeItSo() call below.
1498     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1499     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1500 
1501     typename Bound1UnwrapTraits::ForwardType x1 =
1502         Bound1UnwrapTraits::Unwrap(storage->p1_);
1503     typename Bound2UnwrapTraits::ForwardType x2 =
1504         Bound2UnwrapTraits::Unwrap(storage->p2_);
1505     return InvokeHelper<StorageType::IsWeakCall::value, R,
1506                         typename StorageType::RunnableType,
1507                         void(typename Bound1UnwrapTraits::ForwardType,
1508                              typename Bound2UnwrapTraits::ForwardType,
1509                              typename CallbackParamTraits<X3>::ForwardType
1510                                  x3)>::MakeItSo(storage->runnable_,
1511                                                 CallbackForward(x1),
1512                                                 CallbackForward(x2),
1513                                                 CallbackForward(x3));
1514   }
1515 };
1516 
1517 // Arity 3 -> 0.
1518 template <typename StorageType,
1519           typename R,
1520           typename X1,
1521           typename X2,
1522           typename X3>
1523 struct Invoker<3, StorageType, R(X1, X2, X3)> {
1524   typedef R(RunType)(BindStateBase*);
1525 
1526   typedef R(UnboundRunType)();
1527 
1528   static R Run(BindStateBase* base) {
1529     StorageType* storage = static_cast<StorageType*>(base);
1530 
1531     // Local references to make debugger stepping easier. If in a debugger,
1532     // you really want to warp ahead and step through the
1533     // InvokeHelper<>::MakeItSo() call below.
1534     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1535     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1536     typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1537 
1538     typename Bound1UnwrapTraits::ForwardType x1 =
1539         Bound1UnwrapTraits::Unwrap(storage->p1_);
1540     typename Bound2UnwrapTraits::ForwardType x2 =
1541         Bound2UnwrapTraits::Unwrap(storage->p2_);
1542     typename Bound3UnwrapTraits::ForwardType x3 =
1543         Bound3UnwrapTraits::Unwrap(storage->p3_);
1544     return InvokeHelper<StorageType::IsWeakCall::value, R,
1545                         typename StorageType::RunnableType,
1546                         void(typename Bound1UnwrapTraits::ForwardType,
1547                              typename Bound2UnwrapTraits::ForwardType,
1548                              typename Bound3UnwrapTraits::ForwardType)>::
1549         MakeItSo(storage->runnable_, CallbackForward(x1), CallbackForward(x2),
1550                  CallbackForward(x3));
1551   }
1552 };
1553 
1554 // Arity 4 -> 4.
1555 template <typename StorageType,
1556           typename R,
1557           typename X1,
1558           typename X2,
1559           typename X3,
1560           typename X4>
1561 struct Invoker<0, StorageType, R(X1, X2, X3, X4)> {
1562   typedef R(RunType)(BindStateBase*,
1563                      typename CallbackParamTraits<X1>::ForwardType,
1564                      typename CallbackParamTraits<X2>::ForwardType,
1565                      typename CallbackParamTraits<X3>::ForwardType,
1566                      typename CallbackParamTraits<X4>::ForwardType);
1567 
1568   typedef R(UnboundRunType)(X1, X2, X3, X4);
1569 
1570   static R Run(BindStateBase* base,
1571                typename CallbackParamTraits<X1>::ForwardType x1,
1572                typename CallbackParamTraits<X2>::ForwardType x2,
1573                typename CallbackParamTraits<X3>::ForwardType x3,
1574                typename CallbackParamTraits<X4>::ForwardType x4) {
1575     StorageType* storage = static_cast<StorageType*>(base);
1576 
1577     // Local references to make debugger stepping easier. If in a debugger,
1578     // you really want to warp ahead and step through the
1579     // InvokeHelper<>::MakeItSo() call below.
1580 
1581     return InvokeHelper<StorageType::IsWeakCall::value, R,
1582                         typename StorageType::RunnableType,
1583                         void(typename CallbackParamTraits<X1>::ForwardType x1,
1584                              typename CallbackParamTraits<X2>::ForwardType x2,
1585                              typename CallbackParamTraits<X3>::ForwardType x3,
1586                              typename CallbackParamTraits<X4>::ForwardType
1587                                  x4)>::MakeItSo(storage->runnable_,
1588                                                 CallbackForward(x1),
1589                                                 CallbackForward(x2),
1590                                                 CallbackForward(x3),
1591                                                 CallbackForward(x4));
1592   }
1593 };
1594 
1595 // Arity 4 -> 3.
1596 template <typename StorageType,
1597           typename R,
1598           typename X1,
1599           typename X2,
1600           typename X3,
1601           typename X4>
1602 struct Invoker<1, StorageType, R(X1, X2, X3, X4)> {
1603   typedef R(RunType)(BindStateBase*,
1604                      typename CallbackParamTraits<X2>::ForwardType,
1605                      typename CallbackParamTraits<X3>::ForwardType,
1606                      typename CallbackParamTraits<X4>::ForwardType);
1607 
1608   typedef R(UnboundRunType)(X2, X3, X4);
1609 
1610   static R Run(BindStateBase* base,
1611                typename CallbackParamTraits<X2>::ForwardType x2,
1612                typename CallbackParamTraits<X3>::ForwardType x3,
1613                typename CallbackParamTraits<X4>::ForwardType x4) {
1614     StorageType* storage = static_cast<StorageType*>(base);
1615 
1616     // Local references to make debugger stepping easier. If in a debugger,
1617     // you really want to warp ahead and step through the
1618     // InvokeHelper<>::MakeItSo() call below.
1619     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1620 
1621     typename Bound1UnwrapTraits::ForwardType x1 =
1622         Bound1UnwrapTraits::Unwrap(storage->p1_);
1623     return InvokeHelper<StorageType::IsWeakCall::value, R,
1624                         typename StorageType::RunnableType,
1625                         void(typename Bound1UnwrapTraits::ForwardType,
1626                              typename CallbackParamTraits<X2>::ForwardType x2,
1627                              typename CallbackParamTraits<X3>::ForwardType x3,
1628                              typename CallbackParamTraits<X4>::ForwardType
1629                                  x4)>::MakeItSo(storage->runnable_,
1630                                                 CallbackForward(x1),
1631                                                 CallbackForward(x2),
1632                                                 CallbackForward(x3),
1633                                                 CallbackForward(x4));
1634   }
1635 };
1636 
1637 // Arity 4 -> 2.
1638 template <typename StorageType,
1639           typename R,
1640           typename X1,
1641           typename X2,
1642           typename X3,
1643           typename X4>
1644 struct Invoker<2, StorageType, R(X1, X2, X3, X4)> {
1645   typedef R(RunType)(BindStateBase*,
1646                      typename CallbackParamTraits<X3>::ForwardType,
1647                      typename CallbackParamTraits<X4>::ForwardType);
1648 
1649   typedef R(UnboundRunType)(X3, X4);
1650 
1651   static R Run(BindStateBase* base,
1652                typename CallbackParamTraits<X3>::ForwardType x3,
1653                typename CallbackParamTraits<X4>::ForwardType x4) {
1654     StorageType* storage = static_cast<StorageType*>(base);
1655 
1656     // Local references to make debugger stepping easier. If in a debugger,
1657     // you really want to warp ahead and step through the
1658     // InvokeHelper<>::MakeItSo() call below.
1659     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1660     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1661 
1662     typename Bound1UnwrapTraits::ForwardType x1 =
1663         Bound1UnwrapTraits::Unwrap(storage->p1_);
1664     typename Bound2UnwrapTraits::ForwardType x2 =
1665         Bound2UnwrapTraits::Unwrap(storage->p2_);
1666     return InvokeHelper<StorageType::IsWeakCall::value, R,
1667                         typename StorageType::RunnableType,
1668                         void(typename Bound1UnwrapTraits::ForwardType,
1669                              typename Bound2UnwrapTraits::ForwardType,
1670                              typename CallbackParamTraits<X3>::ForwardType x3,
1671                              typename CallbackParamTraits<X4>::ForwardType
1672                                  x4)>::MakeItSo(storage->runnable_,
1673                                                 CallbackForward(x1),
1674                                                 CallbackForward(x2),
1675                                                 CallbackForward(x3),
1676                                                 CallbackForward(x4));
1677   }
1678 };
1679 
1680 // Arity 4 -> 1.
1681 template <typename StorageType,
1682           typename R,
1683           typename X1,
1684           typename X2,
1685           typename X3,
1686           typename X4>
1687 struct Invoker<3, StorageType, R(X1, X2, X3, X4)> {
1688   typedef R(RunType)(BindStateBase*,
1689                      typename CallbackParamTraits<X4>::ForwardType);
1690 
1691   typedef R(UnboundRunType)(X4);
1692 
1693   static R Run(BindStateBase* base,
1694                typename CallbackParamTraits<X4>::ForwardType x4) {
1695     StorageType* storage = static_cast<StorageType*>(base);
1696 
1697     // Local references to make debugger stepping easier. If in a debugger,
1698     // you really want to warp ahead and step through the
1699     // InvokeHelper<>::MakeItSo() call below.
1700     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1701     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1702     typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1703 
1704     typename Bound1UnwrapTraits::ForwardType x1 =
1705         Bound1UnwrapTraits::Unwrap(storage->p1_);
1706     typename Bound2UnwrapTraits::ForwardType x2 =
1707         Bound2UnwrapTraits::Unwrap(storage->p2_);
1708     typename Bound3UnwrapTraits::ForwardType x3 =
1709         Bound3UnwrapTraits::Unwrap(storage->p3_);
1710     return InvokeHelper<StorageType::IsWeakCall::value, R,
1711                         typename StorageType::RunnableType,
1712                         void(typename Bound1UnwrapTraits::ForwardType,
1713                              typename Bound2UnwrapTraits::ForwardType,
1714                              typename Bound3UnwrapTraits::ForwardType,
1715                              typename CallbackParamTraits<X4>::ForwardType
1716                                  x4)>::MakeItSo(storage->runnable_,
1717                                                 CallbackForward(x1),
1718                                                 CallbackForward(x2),
1719                                                 CallbackForward(x3),
1720                                                 CallbackForward(x4));
1721   }
1722 };
1723 
1724 // Arity 4 -> 0.
1725 template <typename StorageType,
1726           typename R,
1727           typename X1,
1728           typename X2,
1729           typename X3,
1730           typename X4>
1731 struct Invoker<4, StorageType, R(X1, X2, X3, X4)> {
1732   typedef R(RunType)(BindStateBase*);
1733 
1734   typedef R(UnboundRunType)();
1735 
1736   static R Run(BindStateBase* base) {
1737     StorageType* storage = static_cast<StorageType*>(base);
1738 
1739     // Local references to make debugger stepping easier. If in a debugger,
1740     // you really want to warp ahead and step through the
1741     // InvokeHelper<>::MakeItSo() call below.
1742     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1743     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1744     typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1745     typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
1746 
1747     typename Bound1UnwrapTraits::ForwardType x1 =
1748         Bound1UnwrapTraits::Unwrap(storage->p1_);
1749     typename Bound2UnwrapTraits::ForwardType x2 =
1750         Bound2UnwrapTraits::Unwrap(storage->p2_);
1751     typename Bound3UnwrapTraits::ForwardType x3 =
1752         Bound3UnwrapTraits::Unwrap(storage->p3_);
1753     typename Bound4UnwrapTraits::ForwardType x4 =
1754         Bound4UnwrapTraits::Unwrap(storage->p4_);
1755     return InvokeHelper<StorageType::IsWeakCall::value, R,
1756                         typename StorageType::RunnableType,
1757                         void(typename Bound1UnwrapTraits::ForwardType,
1758                              typename Bound2UnwrapTraits::ForwardType,
1759                              typename Bound3UnwrapTraits::ForwardType,
1760                              typename Bound4UnwrapTraits::ForwardType)>::
1761         MakeItSo(storage->runnable_, CallbackForward(x1), CallbackForward(x2),
1762                  CallbackForward(x3), CallbackForward(x4));
1763   }
1764 };
1765 
1766 // Arity 5 -> 5.
1767 template <typename StorageType,
1768           typename R,
1769           typename X1,
1770           typename X2,
1771           typename X3,
1772           typename X4,
1773           typename X5>
1774 struct Invoker<0, StorageType, R(X1, X2, X3, X4, X5)> {
1775   typedef R(RunType)(BindStateBase*,
1776                      typename CallbackParamTraits<X1>::ForwardType,
1777                      typename CallbackParamTraits<X2>::ForwardType,
1778                      typename CallbackParamTraits<X3>::ForwardType,
1779                      typename CallbackParamTraits<X4>::ForwardType,
1780                      typename CallbackParamTraits<X5>::ForwardType);
1781 
1782   typedef R(UnboundRunType)(X1, X2, X3, X4, X5);
1783 
1784   static R Run(BindStateBase* base,
1785                typename CallbackParamTraits<X1>::ForwardType x1,
1786                typename CallbackParamTraits<X2>::ForwardType x2,
1787                typename CallbackParamTraits<X3>::ForwardType x3,
1788                typename CallbackParamTraits<X4>::ForwardType x4,
1789                typename CallbackParamTraits<X5>::ForwardType x5) {
1790     StorageType* storage = static_cast<StorageType*>(base);
1791 
1792     // Local references to make debugger stepping easier. If in a debugger,
1793     // you really want to warp ahead and step through the
1794     // InvokeHelper<>::MakeItSo() call below.
1795 
1796     return InvokeHelper<
1797         StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
1798         void(typename CallbackParamTraits<X1>::ForwardType x1,
1799              typename CallbackParamTraits<X2>::ForwardType x2,
1800              typename CallbackParamTraits<X3>::ForwardType x3,
1801              typename CallbackParamTraits<X4>::ForwardType x4,
1802              typename CallbackParamTraits<X5>::ForwardType
1803                  x5)>::MakeItSo(storage->runnable_, CallbackForward(x1),
1804                                 CallbackForward(x2), CallbackForward(x3),
1805                                 CallbackForward(x4), CallbackForward(x5));
1806   }
1807 };
1808 
1809 // Arity 5 -> 4.
1810 template <typename StorageType,
1811           typename R,
1812           typename X1,
1813           typename X2,
1814           typename X3,
1815           typename X4,
1816           typename X5>
1817 struct Invoker<1, StorageType, R(X1, X2, X3, X4, X5)> {
1818   typedef R(RunType)(BindStateBase*,
1819                      typename CallbackParamTraits<X2>::ForwardType,
1820                      typename CallbackParamTraits<X3>::ForwardType,
1821                      typename CallbackParamTraits<X4>::ForwardType,
1822                      typename CallbackParamTraits<X5>::ForwardType);
1823 
1824   typedef R(UnboundRunType)(X2, X3, X4, X5);
1825 
1826   static R Run(BindStateBase* base,
1827                typename CallbackParamTraits<X2>::ForwardType x2,
1828                typename CallbackParamTraits<X3>::ForwardType x3,
1829                typename CallbackParamTraits<X4>::ForwardType x4,
1830                typename CallbackParamTraits<X5>::ForwardType x5) {
1831     StorageType* storage = static_cast<StorageType*>(base);
1832 
1833     // Local references to make debugger stepping easier. If in a debugger,
1834     // you really want to warp ahead and step through the
1835     // InvokeHelper<>::MakeItSo() call below.
1836     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1837 
1838     typename Bound1UnwrapTraits::ForwardType x1 =
1839         Bound1UnwrapTraits::Unwrap(storage->p1_);
1840     return InvokeHelper<
1841         StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
1842         void(typename Bound1UnwrapTraits::ForwardType,
1843              typename CallbackParamTraits<X2>::ForwardType x2,
1844              typename CallbackParamTraits<X3>::ForwardType x3,
1845              typename CallbackParamTraits<X4>::ForwardType x4,
1846              typename CallbackParamTraits<X5>::ForwardType
1847                  x5)>::MakeItSo(storage->runnable_, CallbackForward(x1),
1848                                 CallbackForward(x2), CallbackForward(x3),
1849                                 CallbackForward(x4), CallbackForward(x5));
1850   }
1851 };
1852 
1853 // Arity 5 -> 3.
1854 template <typename StorageType,
1855           typename R,
1856           typename X1,
1857           typename X2,
1858           typename X3,
1859           typename X4,
1860           typename X5>
1861 struct Invoker<2, StorageType, R(X1, X2, X3, X4, X5)> {
1862   typedef R(RunType)(BindStateBase*,
1863                      typename CallbackParamTraits<X3>::ForwardType,
1864                      typename CallbackParamTraits<X4>::ForwardType,
1865                      typename CallbackParamTraits<X5>::ForwardType);
1866 
1867   typedef R(UnboundRunType)(X3, X4, X5);
1868 
1869   static R Run(BindStateBase* base,
1870                typename CallbackParamTraits<X3>::ForwardType x3,
1871                typename CallbackParamTraits<X4>::ForwardType x4,
1872                typename CallbackParamTraits<X5>::ForwardType x5) {
1873     StorageType* storage = static_cast<StorageType*>(base);
1874 
1875     // Local references to make debugger stepping easier. If in a debugger,
1876     // you really want to warp ahead and step through the
1877     // InvokeHelper<>::MakeItSo() call below.
1878     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1879     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1880 
1881     typename Bound1UnwrapTraits::ForwardType x1 =
1882         Bound1UnwrapTraits::Unwrap(storage->p1_);
1883     typename Bound2UnwrapTraits::ForwardType x2 =
1884         Bound2UnwrapTraits::Unwrap(storage->p2_);
1885     return InvokeHelper<
1886         StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
1887         void(typename Bound1UnwrapTraits::ForwardType,
1888              typename Bound2UnwrapTraits::ForwardType,
1889              typename CallbackParamTraits<X3>::ForwardType x3,
1890              typename CallbackParamTraits<X4>::ForwardType x4,
1891              typename CallbackParamTraits<X5>::ForwardType
1892                  x5)>::MakeItSo(storage->runnable_, CallbackForward(x1),
1893                                 CallbackForward(x2), CallbackForward(x3),
1894                                 CallbackForward(x4), CallbackForward(x5));
1895   }
1896 };
1897 
1898 // Arity 5 -> 2.
1899 template <typename StorageType,
1900           typename R,
1901           typename X1,
1902           typename X2,
1903           typename X3,
1904           typename X4,
1905           typename X5>
1906 struct Invoker<3, StorageType, R(X1, X2, X3, X4, X5)> {
1907   typedef R(RunType)(BindStateBase*,
1908                      typename CallbackParamTraits<X4>::ForwardType,
1909                      typename CallbackParamTraits<X5>::ForwardType);
1910 
1911   typedef R(UnboundRunType)(X4, X5);
1912 
1913   static R Run(BindStateBase* base,
1914                typename CallbackParamTraits<X4>::ForwardType x4,
1915                typename CallbackParamTraits<X5>::ForwardType x5) {
1916     StorageType* storage = static_cast<StorageType*>(base);
1917 
1918     // Local references to make debugger stepping easier. If in a debugger,
1919     // you really want to warp ahead and step through the
1920     // InvokeHelper<>::MakeItSo() call below.
1921     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
1922     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
1923     typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
1924 
1925     typename Bound1UnwrapTraits::ForwardType x1 =
1926         Bound1UnwrapTraits::Unwrap(storage->p1_);
1927     typename Bound2UnwrapTraits::ForwardType x2 =
1928         Bound2UnwrapTraits::Unwrap(storage->p2_);
1929     typename Bound3UnwrapTraits::ForwardType x3 =
1930         Bound3UnwrapTraits::Unwrap(storage->p3_);
1931     return InvokeHelper<
1932         StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
1933         void(typename Bound1UnwrapTraits::ForwardType,
1934              typename Bound2UnwrapTraits::ForwardType,
1935              typename Bound3UnwrapTraits::ForwardType,
1936              typename CallbackParamTraits<X4>::ForwardType x4,
1937              typename CallbackParamTraits<X5>::ForwardType
1938                  x5)>::MakeItSo(storage->runnable_, CallbackForward(x1),
1939                                 CallbackForward(x2), CallbackForward(x3),
1940                                 CallbackForward(x4), CallbackForward(x5));
1941   }
1942 };
1943 
1944 // Arity 5 -> 1.
1945 template <typename StorageType,
1946           typename R,
1947           typename X1,
1948           typename X2,
1949           typename X3,
1950           typename X4,
1951           typename X5>
1952 struct Invoker<4, StorageType, R(X1, X2, X3, X4, X5)> {
1953   typedef R(RunType)(BindStateBase*,
1954                      typename CallbackParamTraits<X5>::ForwardType);
1955 
1956   typedef R(UnboundRunType)(X5);
1957 
1958   static R Run(BindStateBase* base,
1959                typename CallbackParamTraits<X5>::ForwardType x5) {
1960     StorageType* storage = static_cast<StorageType*>(base);
1961 
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;
1968     typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
1969 
1970     typename Bound1UnwrapTraits::ForwardType x1 =
1971         Bound1UnwrapTraits::Unwrap(storage->p1_);
1972     typename Bound2UnwrapTraits::ForwardType x2 =
1973         Bound2UnwrapTraits::Unwrap(storage->p2_);
1974     typename Bound3UnwrapTraits::ForwardType x3 =
1975         Bound3UnwrapTraits::Unwrap(storage->p3_);
1976     typename Bound4UnwrapTraits::ForwardType x4 =
1977         Bound4UnwrapTraits::Unwrap(storage->p4_);
1978     return InvokeHelper<
1979         StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
1980         void(typename Bound1UnwrapTraits::ForwardType,
1981              typename Bound2UnwrapTraits::ForwardType,
1982              typename Bound3UnwrapTraits::ForwardType,
1983              typename Bound4UnwrapTraits::ForwardType,
1984              typename CallbackParamTraits<X5>::ForwardType
1985                  x5)>::MakeItSo(storage->runnable_, CallbackForward(x1),
1986                                 CallbackForward(x2), CallbackForward(x3),
1987                                 CallbackForward(x4), CallbackForward(x5));
1988   }
1989 };
1990 
1991 // Arity 5 -> 0.
1992 template <typename StorageType,
1993           typename R,
1994           typename X1,
1995           typename X2,
1996           typename X3,
1997           typename X4,
1998           typename X5>
1999 struct Invoker<5, StorageType, R(X1, X2, X3, X4, X5)> {
2000   typedef R(RunType)(BindStateBase*);
2001 
2002   typedef R(UnboundRunType)();
2003 
2004   static R Run(BindStateBase* base) {
2005     StorageType* storage = static_cast<StorageType*>(base);
2006 
2007     // Local references to make debugger stepping easier. If in a debugger,
2008     // you really want to warp ahead and step through the
2009     // InvokeHelper<>::MakeItSo() call below.
2010     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2011     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
2012     typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
2013     typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
2014     typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
2015 
2016     typename Bound1UnwrapTraits::ForwardType x1 =
2017         Bound1UnwrapTraits::Unwrap(storage->p1_);
2018     typename Bound2UnwrapTraits::ForwardType x2 =
2019         Bound2UnwrapTraits::Unwrap(storage->p2_);
2020     typename Bound3UnwrapTraits::ForwardType x3 =
2021         Bound3UnwrapTraits::Unwrap(storage->p3_);
2022     typename Bound4UnwrapTraits::ForwardType x4 =
2023         Bound4UnwrapTraits::Unwrap(storage->p4_);
2024     typename Bound5UnwrapTraits::ForwardType x5 =
2025         Bound5UnwrapTraits::Unwrap(storage->p5_);
2026     return InvokeHelper<StorageType::IsWeakCall::value, R,
2027                         typename StorageType::RunnableType,
2028                         void(typename Bound1UnwrapTraits::ForwardType,
2029                              typename Bound2UnwrapTraits::ForwardType,
2030                              typename Bound3UnwrapTraits::ForwardType,
2031                              typename Bound4UnwrapTraits::ForwardType,
2032                              typename Bound5UnwrapTraits::ForwardType)>::
2033         MakeItSo(storage->runnable_, CallbackForward(x1), CallbackForward(x2),
2034                  CallbackForward(x3), CallbackForward(x4), CallbackForward(x5));
2035   }
2036 };
2037 
2038 // Arity 6 -> 6.
2039 template <typename StorageType,
2040           typename R,
2041           typename X1,
2042           typename X2,
2043           typename X3,
2044           typename X4,
2045           typename X5,
2046           typename X6>
2047 struct Invoker<0, StorageType, R(X1, X2, X3, X4, X5, X6)> {
2048   typedef R(RunType)(BindStateBase*,
2049                      typename CallbackParamTraits<X1>::ForwardType,
2050                      typename CallbackParamTraits<X2>::ForwardType,
2051                      typename CallbackParamTraits<X3>::ForwardType,
2052                      typename CallbackParamTraits<X4>::ForwardType,
2053                      typename CallbackParamTraits<X5>::ForwardType,
2054                      typename CallbackParamTraits<X6>::ForwardType);
2055 
2056   typedef R(UnboundRunType)(X1, X2, X3, X4, X5, X6);
2057 
2058   static R Run(BindStateBase* base,
2059                typename CallbackParamTraits<X1>::ForwardType x1,
2060                typename CallbackParamTraits<X2>::ForwardType x2,
2061                typename CallbackParamTraits<X3>::ForwardType x3,
2062                typename CallbackParamTraits<X4>::ForwardType x4,
2063                typename CallbackParamTraits<X5>::ForwardType x5,
2064                typename CallbackParamTraits<X6>::ForwardType x6) {
2065     StorageType* storage = static_cast<StorageType*>(base);
2066 
2067     // Local references to make debugger stepping easier. If in a debugger,
2068     // you really want to warp ahead and step through the
2069     // InvokeHelper<>::MakeItSo() call below.
2070 
2071     return InvokeHelper<
2072         StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
2073         void(typename CallbackParamTraits<X1>::ForwardType x1,
2074              typename CallbackParamTraits<X2>::ForwardType x2,
2075              typename CallbackParamTraits<X3>::ForwardType x3,
2076              typename CallbackParamTraits<X4>::ForwardType x4,
2077              typename CallbackParamTraits<X5>::ForwardType x5,
2078              typename CallbackParamTraits<X6>::ForwardType
2079                  x6)>::MakeItSo(storage->runnable_, CallbackForward(x1),
2080                                 CallbackForward(x2), CallbackForward(x3),
2081                                 CallbackForward(x4), CallbackForward(x5),
2082                                 CallbackForward(x6));
2083   }
2084 };
2085 
2086 // Arity 6 -> 5.
2087 template <typename StorageType,
2088           typename R,
2089           typename X1,
2090           typename X2,
2091           typename X3,
2092           typename X4,
2093           typename X5,
2094           typename X6>
2095 struct Invoker<1, StorageType, R(X1, X2, X3, X4, X5, X6)> {
2096   typedef R(RunType)(BindStateBase*,
2097                      typename CallbackParamTraits<X2>::ForwardType,
2098                      typename CallbackParamTraits<X3>::ForwardType,
2099                      typename CallbackParamTraits<X4>::ForwardType,
2100                      typename CallbackParamTraits<X5>::ForwardType,
2101                      typename CallbackParamTraits<X6>::ForwardType);
2102 
2103   typedef R(UnboundRunType)(X2, X3, X4, X5, X6);
2104 
2105   static R Run(BindStateBase* base,
2106                typename CallbackParamTraits<X2>::ForwardType x2,
2107                typename CallbackParamTraits<X3>::ForwardType x3,
2108                typename CallbackParamTraits<X4>::ForwardType x4,
2109                typename CallbackParamTraits<X5>::ForwardType x5,
2110                typename CallbackParamTraits<X6>::ForwardType x6) {
2111     StorageType* storage = static_cast<StorageType*>(base);
2112 
2113     // Local references to make debugger stepping easier. If in a debugger,
2114     // you really want to warp ahead and step through the
2115     // InvokeHelper<>::MakeItSo() call below.
2116     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2117 
2118     typename Bound1UnwrapTraits::ForwardType x1 =
2119         Bound1UnwrapTraits::Unwrap(storage->p1_);
2120     return InvokeHelper<
2121         StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
2122         void(typename Bound1UnwrapTraits::ForwardType,
2123              typename CallbackParamTraits<X2>::ForwardType x2,
2124              typename CallbackParamTraits<X3>::ForwardType x3,
2125              typename CallbackParamTraits<X4>::ForwardType x4,
2126              typename CallbackParamTraits<X5>::ForwardType x5,
2127              typename CallbackParamTraits<X6>::ForwardType
2128                  x6)>::MakeItSo(storage->runnable_, CallbackForward(x1),
2129                                 CallbackForward(x2), CallbackForward(x3),
2130                                 CallbackForward(x4), CallbackForward(x5),
2131                                 CallbackForward(x6));
2132   }
2133 };
2134 
2135 // Arity 6 -> 4.
2136 template <typename StorageType,
2137           typename R,
2138           typename X1,
2139           typename X2,
2140           typename X3,
2141           typename X4,
2142           typename X5,
2143           typename X6>
2144 struct Invoker<2, StorageType, R(X1, X2, X3, X4, X5, X6)> {
2145   typedef R(RunType)(BindStateBase*,
2146                      typename CallbackParamTraits<X3>::ForwardType,
2147                      typename CallbackParamTraits<X4>::ForwardType,
2148                      typename CallbackParamTraits<X5>::ForwardType,
2149                      typename CallbackParamTraits<X6>::ForwardType);
2150 
2151   typedef R(UnboundRunType)(X3, X4, X5, X6);
2152 
2153   static R Run(BindStateBase* base,
2154                typename CallbackParamTraits<X3>::ForwardType x3,
2155                typename CallbackParamTraits<X4>::ForwardType x4,
2156                typename CallbackParamTraits<X5>::ForwardType x5,
2157                typename CallbackParamTraits<X6>::ForwardType x6) {
2158     StorageType* storage = static_cast<StorageType*>(base);
2159 
2160     // Local references to make debugger stepping easier. If in a debugger,
2161     // you really want to warp ahead and step through the
2162     // InvokeHelper<>::MakeItSo() call below.
2163     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2164     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
2165 
2166     typename Bound1UnwrapTraits::ForwardType x1 =
2167         Bound1UnwrapTraits::Unwrap(storage->p1_);
2168     typename Bound2UnwrapTraits::ForwardType x2 =
2169         Bound2UnwrapTraits::Unwrap(storage->p2_);
2170     return InvokeHelper<
2171         StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
2172         void(typename Bound1UnwrapTraits::ForwardType,
2173              typename Bound2UnwrapTraits::ForwardType,
2174              typename CallbackParamTraits<X3>::ForwardType x3,
2175              typename CallbackParamTraits<X4>::ForwardType x4,
2176              typename CallbackParamTraits<X5>::ForwardType x5,
2177              typename CallbackParamTraits<X6>::ForwardType
2178                  x6)>::MakeItSo(storage->runnable_, CallbackForward(x1),
2179                                 CallbackForward(x2), CallbackForward(x3),
2180                                 CallbackForward(x4), CallbackForward(x5),
2181                                 CallbackForward(x6));
2182   }
2183 };
2184 
2185 // Arity 6 -> 3.
2186 template <typename StorageType,
2187           typename R,
2188           typename X1,
2189           typename X2,
2190           typename X3,
2191           typename X4,
2192           typename X5,
2193           typename X6>
2194 struct Invoker<3, StorageType, R(X1, X2, X3, X4, X5, X6)> {
2195   typedef R(RunType)(BindStateBase*,
2196                      typename CallbackParamTraits<X4>::ForwardType,
2197                      typename CallbackParamTraits<X5>::ForwardType,
2198                      typename CallbackParamTraits<X6>::ForwardType);
2199 
2200   typedef R(UnboundRunType)(X4, X5, X6);
2201 
2202   static R Run(BindStateBase* base,
2203                typename CallbackParamTraits<X4>::ForwardType x4,
2204                typename CallbackParamTraits<X5>::ForwardType x5,
2205                typename CallbackParamTraits<X6>::ForwardType x6) {
2206     StorageType* storage = static_cast<StorageType*>(base);
2207 
2208     // Local references to make debugger stepping easier. If in a debugger,
2209     // you really want to warp ahead and step through the
2210     // InvokeHelper<>::MakeItSo() call below.
2211     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2212     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
2213     typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
2214 
2215     typename Bound1UnwrapTraits::ForwardType x1 =
2216         Bound1UnwrapTraits::Unwrap(storage->p1_);
2217     typename Bound2UnwrapTraits::ForwardType x2 =
2218         Bound2UnwrapTraits::Unwrap(storage->p2_);
2219     typename Bound3UnwrapTraits::ForwardType x3 =
2220         Bound3UnwrapTraits::Unwrap(storage->p3_);
2221     return InvokeHelper<
2222         StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
2223         void(typename Bound1UnwrapTraits::ForwardType,
2224              typename Bound2UnwrapTraits::ForwardType,
2225              typename Bound3UnwrapTraits::ForwardType,
2226              typename CallbackParamTraits<X4>::ForwardType x4,
2227              typename CallbackParamTraits<X5>::ForwardType x5,
2228              typename CallbackParamTraits<X6>::ForwardType
2229                  x6)>::MakeItSo(storage->runnable_, CallbackForward(x1),
2230                                 CallbackForward(x2), CallbackForward(x3),
2231                                 CallbackForward(x4), CallbackForward(x5),
2232                                 CallbackForward(x6));
2233   }
2234 };
2235 
2236 // Arity 6 -> 2.
2237 template <typename StorageType,
2238           typename R,
2239           typename X1,
2240           typename X2,
2241           typename X3,
2242           typename X4,
2243           typename X5,
2244           typename X6>
2245 struct Invoker<4, StorageType, R(X1, X2, X3, X4, X5, X6)> {
2246   typedef R(RunType)(BindStateBase*,
2247                      typename CallbackParamTraits<X5>::ForwardType,
2248                      typename CallbackParamTraits<X6>::ForwardType);
2249 
2250   typedef R(UnboundRunType)(X5, X6);
2251 
2252   static R Run(BindStateBase* base,
2253                typename CallbackParamTraits<X5>::ForwardType x5,
2254                typename CallbackParamTraits<X6>::ForwardType x6) {
2255     StorageType* storage = static_cast<StorageType*>(base);
2256 
2257     // Local references to make debugger stepping easier. If in a debugger,
2258     // you really want to warp ahead and step through the
2259     // InvokeHelper<>::MakeItSo() call below.
2260     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2261     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
2262     typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
2263     typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
2264 
2265     typename Bound1UnwrapTraits::ForwardType x1 =
2266         Bound1UnwrapTraits::Unwrap(storage->p1_);
2267     typename Bound2UnwrapTraits::ForwardType x2 =
2268         Bound2UnwrapTraits::Unwrap(storage->p2_);
2269     typename Bound3UnwrapTraits::ForwardType x3 =
2270         Bound3UnwrapTraits::Unwrap(storage->p3_);
2271     typename Bound4UnwrapTraits::ForwardType x4 =
2272         Bound4UnwrapTraits::Unwrap(storage->p4_);
2273     return InvokeHelper<
2274         StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
2275         void(typename Bound1UnwrapTraits::ForwardType,
2276              typename Bound2UnwrapTraits::ForwardType,
2277              typename Bound3UnwrapTraits::ForwardType,
2278              typename Bound4UnwrapTraits::ForwardType,
2279              typename CallbackParamTraits<X5>::ForwardType x5,
2280              typename CallbackParamTraits<X6>::ForwardType
2281                  x6)>::MakeItSo(storage->runnable_, CallbackForward(x1),
2282                                 CallbackForward(x2), CallbackForward(x3),
2283                                 CallbackForward(x4), CallbackForward(x5),
2284                                 CallbackForward(x6));
2285   }
2286 };
2287 
2288 // Arity 6 -> 1.
2289 template <typename StorageType,
2290           typename R,
2291           typename X1,
2292           typename X2,
2293           typename X3,
2294           typename X4,
2295           typename X5,
2296           typename X6>
2297 struct Invoker<5, StorageType, R(X1, X2, X3, X4, X5, X6)> {
2298   typedef R(RunType)(BindStateBase*,
2299                      typename CallbackParamTraits<X6>::ForwardType);
2300 
2301   typedef R(UnboundRunType)(X6);
2302 
2303   static R Run(BindStateBase* base,
2304                typename CallbackParamTraits<X6>::ForwardType x6) {
2305     StorageType* storage = static_cast<StorageType*>(base);
2306 
2307     // Local references to make debugger stepping easier. If in a debugger,
2308     // you really want to warp ahead and step through the
2309     // InvokeHelper<>::MakeItSo() call below.
2310     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2311     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
2312     typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
2313     typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
2314     typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
2315 
2316     typename Bound1UnwrapTraits::ForwardType x1 =
2317         Bound1UnwrapTraits::Unwrap(storage->p1_);
2318     typename Bound2UnwrapTraits::ForwardType x2 =
2319         Bound2UnwrapTraits::Unwrap(storage->p2_);
2320     typename Bound3UnwrapTraits::ForwardType x3 =
2321         Bound3UnwrapTraits::Unwrap(storage->p3_);
2322     typename Bound4UnwrapTraits::ForwardType x4 =
2323         Bound4UnwrapTraits::Unwrap(storage->p4_);
2324     typename Bound5UnwrapTraits::ForwardType x5 =
2325         Bound5UnwrapTraits::Unwrap(storage->p5_);
2326     return InvokeHelper<
2327         StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
2328         void(typename Bound1UnwrapTraits::ForwardType,
2329              typename Bound2UnwrapTraits::ForwardType,
2330              typename Bound3UnwrapTraits::ForwardType,
2331              typename Bound4UnwrapTraits::ForwardType,
2332              typename Bound5UnwrapTraits::ForwardType,
2333              typename CallbackParamTraits<X6>::ForwardType
2334                  x6)>::MakeItSo(storage->runnable_, CallbackForward(x1),
2335                                 CallbackForward(x2), CallbackForward(x3),
2336                                 CallbackForward(x4), CallbackForward(x5),
2337                                 CallbackForward(x6));
2338   }
2339 };
2340 
2341 // Arity 6 -> 0.
2342 template <typename StorageType,
2343           typename R,
2344           typename X1,
2345           typename X2,
2346           typename X3,
2347           typename X4,
2348           typename X5,
2349           typename X6>
2350 struct Invoker<6, StorageType, R(X1, X2, X3, X4, X5, X6)> {
2351   typedef R(RunType)(BindStateBase*);
2352 
2353   typedef R(UnboundRunType)();
2354 
2355   static R Run(BindStateBase* base) {
2356     StorageType* storage = static_cast<StorageType*>(base);
2357 
2358     // Local references to make debugger stepping easier. If in a debugger,
2359     // you really want to warp ahead and step through the
2360     // InvokeHelper<>::MakeItSo() call below.
2361     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2362     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
2363     typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
2364     typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
2365     typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
2366     typedef typename StorageType::Bound6UnwrapTraits Bound6UnwrapTraits;
2367 
2368     typename Bound1UnwrapTraits::ForwardType x1 =
2369         Bound1UnwrapTraits::Unwrap(storage->p1_);
2370     typename Bound2UnwrapTraits::ForwardType x2 =
2371         Bound2UnwrapTraits::Unwrap(storage->p2_);
2372     typename Bound3UnwrapTraits::ForwardType x3 =
2373         Bound3UnwrapTraits::Unwrap(storage->p3_);
2374     typename Bound4UnwrapTraits::ForwardType x4 =
2375         Bound4UnwrapTraits::Unwrap(storage->p4_);
2376     typename Bound5UnwrapTraits::ForwardType x5 =
2377         Bound5UnwrapTraits::Unwrap(storage->p5_);
2378     typename Bound6UnwrapTraits::ForwardType x6 =
2379         Bound6UnwrapTraits::Unwrap(storage->p6_);
2380     return InvokeHelper<StorageType::IsWeakCall::value, R,
2381                         typename StorageType::RunnableType,
2382                         void(typename Bound1UnwrapTraits::ForwardType,
2383                              typename Bound2UnwrapTraits::ForwardType,
2384                              typename Bound3UnwrapTraits::ForwardType,
2385                              typename Bound4UnwrapTraits::ForwardType,
2386                              typename Bound5UnwrapTraits::ForwardType,
2387                              typename Bound6UnwrapTraits::ForwardType)>::
2388         MakeItSo(storage->runnable_, CallbackForward(x1), CallbackForward(x2),
2389                  CallbackForward(x3), CallbackForward(x4), CallbackForward(x5),
2390                  CallbackForward(x6));
2391   }
2392 };
2393 
2394 // Arity 7 -> 7.
2395 template <typename StorageType,
2396           typename R,
2397           typename X1,
2398           typename X2,
2399           typename X3,
2400           typename X4,
2401           typename X5,
2402           typename X6,
2403           typename X7>
2404 struct Invoker<0, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
2405   typedef R(RunType)(BindStateBase*,
2406                      typename CallbackParamTraits<X1>::ForwardType,
2407                      typename CallbackParamTraits<X2>::ForwardType,
2408                      typename CallbackParamTraits<X3>::ForwardType,
2409                      typename CallbackParamTraits<X4>::ForwardType,
2410                      typename CallbackParamTraits<X5>::ForwardType,
2411                      typename CallbackParamTraits<X6>::ForwardType,
2412                      typename CallbackParamTraits<X7>::ForwardType);
2413 
2414   typedef R(UnboundRunType)(X1, X2, X3, X4, X5, X6, X7);
2415 
2416   static R Run(BindStateBase* base,
2417                typename CallbackParamTraits<X1>::ForwardType x1,
2418                typename CallbackParamTraits<X2>::ForwardType x2,
2419                typename CallbackParamTraits<X3>::ForwardType x3,
2420                typename CallbackParamTraits<X4>::ForwardType x4,
2421                typename CallbackParamTraits<X5>::ForwardType x5,
2422                typename CallbackParamTraits<X6>::ForwardType x6,
2423                typename CallbackParamTraits<X7>::ForwardType x7) {
2424     StorageType* storage = static_cast<StorageType*>(base);
2425 
2426     // Local references to make debugger stepping easier. If in a debugger,
2427     // you really want to warp ahead and step through the
2428     // InvokeHelper<>::MakeItSo() call below.
2429 
2430     return InvokeHelper<
2431         StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
2432         void(typename CallbackParamTraits<X1>::ForwardType x1,
2433              typename CallbackParamTraits<X2>::ForwardType x2,
2434              typename CallbackParamTraits<X3>::ForwardType x3,
2435              typename CallbackParamTraits<X4>::ForwardType x4,
2436              typename CallbackParamTraits<X5>::ForwardType x5,
2437              typename CallbackParamTraits<X6>::ForwardType x6,
2438              typename CallbackParamTraits<X7>::ForwardType
2439                  x7)>::MakeItSo(storage->runnable_, CallbackForward(x1),
2440                                 CallbackForward(x2), CallbackForward(x3),
2441                                 CallbackForward(x4), CallbackForward(x5),
2442                                 CallbackForward(x6), CallbackForward(x7));
2443   }
2444 };
2445 
2446 // Arity 7 -> 6.
2447 template <typename StorageType,
2448           typename R,
2449           typename X1,
2450           typename X2,
2451           typename X3,
2452           typename X4,
2453           typename X5,
2454           typename X6,
2455           typename X7>
2456 struct Invoker<1, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
2457   typedef R(RunType)(BindStateBase*,
2458                      typename CallbackParamTraits<X2>::ForwardType,
2459                      typename CallbackParamTraits<X3>::ForwardType,
2460                      typename CallbackParamTraits<X4>::ForwardType,
2461                      typename CallbackParamTraits<X5>::ForwardType,
2462                      typename CallbackParamTraits<X6>::ForwardType,
2463                      typename CallbackParamTraits<X7>::ForwardType);
2464 
2465   typedef R(UnboundRunType)(X2, X3, X4, X5, X6, X7);
2466 
2467   static R Run(BindStateBase* base,
2468                typename CallbackParamTraits<X2>::ForwardType x2,
2469                typename CallbackParamTraits<X3>::ForwardType x3,
2470                typename CallbackParamTraits<X4>::ForwardType x4,
2471                typename CallbackParamTraits<X5>::ForwardType x5,
2472                typename CallbackParamTraits<X6>::ForwardType x6,
2473                typename CallbackParamTraits<X7>::ForwardType x7) {
2474     StorageType* storage = static_cast<StorageType*>(base);
2475 
2476     // Local references to make debugger stepping easier. If in a debugger,
2477     // you really want to warp ahead and step through the
2478     // InvokeHelper<>::MakeItSo() call below.
2479     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2480 
2481     typename Bound1UnwrapTraits::ForwardType x1 =
2482         Bound1UnwrapTraits::Unwrap(storage->p1_);
2483     return InvokeHelper<
2484         StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
2485         void(typename Bound1UnwrapTraits::ForwardType,
2486              typename CallbackParamTraits<X2>::ForwardType x2,
2487              typename CallbackParamTraits<X3>::ForwardType x3,
2488              typename CallbackParamTraits<X4>::ForwardType x4,
2489              typename CallbackParamTraits<X5>::ForwardType x5,
2490              typename CallbackParamTraits<X6>::ForwardType x6,
2491              typename CallbackParamTraits<X7>::ForwardType
2492                  x7)>::MakeItSo(storage->runnable_, CallbackForward(x1),
2493                                 CallbackForward(x2), CallbackForward(x3),
2494                                 CallbackForward(x4), CallbackForward(x5),
2495                                 CallbackForward(x6), CallbackForward(x7));
2496   }
2497 };
2498 
2499 // Arity 7 -> 5.
2500 template <typename StorageType,
2501           typename R,
2502           typename X1,
2503           typename X2,
2504           typename X3,
2505           typename X4,
2506           typename X5,
2507           typename X6,
2508           typename X7>
2509 struct Invoker<2, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
2510   typedef R(RunType)(BindStateBase*,
2511                      typename CallbackParamTraits<X3>::ForwardType,
2512                      typename CallbackParamTraits<X4>::ForwardType,
2513                      typename CallbackParamTraits<X5>::ForwardType,
2514                      typename CallbackParamTraits<X6>::ForwardType,
2515                      typename CallbackParamTraits<X7>::ForwardType);
2516 
2517   typedef R(UnboundRunType)(X3, X4, X5, X6, X7);
2518 
2519   static R Run(BindStateBase* base,
2520                typename CallbackParamTraits<X3>::ForwardType x3,
2521                typename CallbackParamTraits<X4>::ForwardType x4,
2522                typename CallbackParamTraits<X5>::ForwardType x5,
2523                typename CallbackParamTraits<X6>::ForwardType x6,
2524                typename CallbackParamTraits<X7>::ForwardType x7) {
2525     StorageType* storage = static_cast<StorageType*>(base);
2526 
2527     // Local references to make debugger stepping easier. If in a debugger,
2528     // you really want to warp ahead and step through the
2529     // InvokeHelper<>::MakeItSo() call below.
2530     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2531     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
2532 
2533     typename Bound1UnwrapTraits::ForwardType x1 =
2534         Bound1UnwrapTraits::Unwrap(storage->p1_);
2535     typename Bound2UnwrapTraits::ForwardType x2 =
2536         Bound2UnwrapTraits::Unwrap(storage->p2_);
2537     return InvokeHelper<
2538         StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
2539         void(typename Bound1UnwrapTraits::ForwardType,
2540              typename Bound2UnwrapTraits::ForwardType,
2541              typename CallbackParamTraits<X3>::ForwardType x3,
2542              typename CallbackParamTraits<X4>::ForwardType x4,
2543              typename CallbackParamTraits<X5>::ForwardType x5,
2544              typename CallbackParamTraits<X6>::ForwardType x6,
2545              typename CallbackParamTraits<X7>::ForwardType
2546                  x7)>::MakeItSo(storage->runnable_, CallbackForward(x1),
2547                                 CallbackForward(x2), CallbackForward(x3),
2548                                 CallbackForward(x4), CallbackForward(x5),
2549                                 CallbackForward(x6), CallbackForward(x7));
2550   }
2551 };
2552 
2553 // Arity 7 -> 4.
2554 template <typename StorageType,
2555           typename R,
2556           typename X1,
2557           typename X2,
2558           typename X3,
2559           typename X4,
2560           typename X5,
2561           typename X6,
2562           typename X7>
2563 struct Invoker<3, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
2564   typedef R(RunType)(BindStateBase*,
2565                      typename CallbackParamTraits<X4>::ForwardType,
2566                      typename CallbackParamTraits<X5>::ForwardType,
2567                      typename CallbackParamTraits<X6>::ForwardType,
2568                      typename CallbackParamTraits<X7>::ForwardType);
2569 
2570   typedef R(UnboundRunType)(X4, X5, X6, X7);
2571 
2572   static R Run(BindStateBase* base,
2573                typename CallbackParamTraits<X4>::ForwardType x4,
2574                typename CallbackParamTraits<X5>::ForwardType x5,
2575                typename CallbackParamTraits<X6>::ForwardType x6,
2576                typename CallbackParamTraits<X7>::ForwardType x7) {
2577     StorageType* storage = static_cast<StorageType*>(base);
2578 
2579     // Local references to make debugger stepping easier. If in a debugger,
2580     // you really want to warp ahead and step through the
2581     // InvokeHelper<>::MakeItSo() call below.
2582     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2583     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
2584     typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
2585 
2586     typename Bound1UnwrapTraits::ForwardType x1 =
2587         Bound1UnwrapTraits::Unwrap(storage->p1_);
2588     typename Bound2UnwrapTraits::ForwardType x2 =
2589         Bound2UnwrapTraits::Unwrap(storage->p2_);
2590     typename Bound3UnwrapTraits::ForwardType x3 =
2591         Bound3UnwrapTraits::Unwrap(storage->p3_);
2592     return InvokeHelper<
2593         StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
2594         void(typename Bound1UnwrapTraits::ForwardType,
2595              typename Bound2UnwrapTraits::ForwardType,
2596              typename Bound3UnwrapTraits::ForwardType,
2597              typename CallbackParamTraits<X4>::ForwardType x4,
2598              typename CallbackParamTraits<X5>::ForwardType x5,
2599              typename CallbackParamTraits<X6>::ForwardType x6,
2600              typename CallbackParamTraits<X7>::ForwardType
2601                  x7)>::MakeItSo(storage->runnable_, CallbackForward(x1),
2602                                 CallbackForward(x2), CallbackForward(x3),
2603                                 CallbackForward(x4), CallbackForward(x5),
2604                                 CallbackForward(x6), CallbackForward(x7));
2605   }
2606 };
2607 
2608 // Arity 7 -> 3.
2609 template <typename StorageType,
2610           typename R,
2611           typename X1,
2612           typename X2,
2613           typename X3,
2614           typename X4,
2615           typename X5,
2616           typename X6,
2617           typename X7>
2618 struct Invoker<4, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
2619   typedef R(RunType)(BindStateBase*,
2620                      typename CallbackParamTraits<X5>::ForwardType,
2621                      typename CallbackParamTraits<X6>::ForwardType,
2622                      typename CallbackParamTraits<X7>::ForwardType);
2623 
2624   typedef R(UnboundRunType)(X5, X6, X7);
2625 
2626   static R Run(BindStateBase* base,
2627                typename CallbackParamTraits<X5>::ForwardType x5,
2628                typename CallbackParamTraits<X6>::ForwardType x6,
2629                typename CallbackParamTraits<X7>::ForwardType x7) {
2630     StorageType* storage = static_cast<StorageType*>(base);
2631 
2632     // Local references to make debugger stepping easier. If in a debugger,
2633     // you really want to warp ahead and step through the
2634     // InvokeHelper<>::MakeItSo() call below.
2635     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2636     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
2637     typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
2638     typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
2639 
2640     typename Bound1UnwrapTraits::ForwardType x1 =
2641         Bound1UnwrapTraits::Unwrap(storage->p1_);
2642     typename Bound2UnwrapTraits::ForwardType x2 =
2643         Bound2UnwrapTraits::Unwrap(storage->p2_);
2644     typename Bound3UnwrapTraits::ForwardType x3 =
2645         Bound3UnwrapTraits::Unwrap(storage->p3_);
2646     typename Bound4UnwrapTraits::ForwardType x4 =
2647         Bound4UnwrapTraits::Unwrap(storage->p4_);
2648     return InvokeHelper<
2649         StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
2650         void(typename Bound1UnwrapTraits::ForwardType,
2651              typename Bound2UnwrapTraits::ForwardType,
2652              typename Bound3UnwrapTraits::ForwardType,
2653              typename Bound4UnwrapTraits::ForwardType,
2654              typename CallbackParamTraits<X5>::ForwardType x5,
2655              typename CallbackParamTraits<X6>::ForwardType x6,
2656              typename CallbackParamTraits<X7>::ForwardType
2657                  x7)>::MakeItSo(storage->runnable_, CallbackForward(x1),
2658                                 CallbackForward(x2), CallbackForward(x3),
2659                                 CallbackForward(x4), CallbackForward(x5),
2660                                 CallbackForward(x6), CallbackForward(x7));
2661   }
2662 };
2663 
2664 // Arity 7 -> 2.
2665 template <typename StorageType,
2666           typename R,
2667           typename X1,
2668           typename X2,
2669           typename X3,
2670           typename X4,
2671           typename X5,
2672           typename X6,
2673           typename X7>
2674 struct Invoker<5, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
2675   typedef R(RunType)(BindStateBase*,
2676                      typename CallbackParamTraits<X6>::ForwardType,
2677                      typename CallbackParamTraits<X7>::ForwardType);
2678 
2679   typedef R(UnboundRunType)(X6, X7);
2680 
2681   static R Run(BindStateBase* base,
2682                typename CallbackParamTraits<X6>::ForwardType x6,
2683                typename CallbackParamTraits<X7>::ForwardType x7) {
2684     StorageType* storage = static_cast<StorageType*>(base);
2685 
2686     // Local references to make debugger stepping easier. If in a debugger,
2687     // you really want to warp ahead and step through the
2688     // InvokeHelper<>::MakeItSo() call below.
2689     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2690     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
2691     typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
2692     typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
2693     typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
2694 
2695     typename Bound1UnwrapTraits::ForwardType x1 =
2696         Bound1UnwrapTraits::Unwrap(storage->p1_);
2697     typename Bound2UnwrapTraits::ForwardType x2 =
2698         Bound2UnwrapTraits::Unwrap(storage->p2_);
2699     typename Bound3UnwrapTraits::ForwardType x3 =
2700         Bound3UnwrapTraits::Unwrap(storage->p3_);
2701     typename Bound4UnwrapTraits::ForwardType x4 =
2702         Bound4UnwrapTraits::Unwrap(storage->p4_);
2703     typename Bound5UnwrapTraits::ForwardType x5 =
2704         Bound5UnwrapTraits::Unwrap(storage->p5_);
2705     return InvokeHelper<
2706         StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
2707         void(typename Bound1UnwrapTraits::ForwardType,
2708              typename Bound2UnwrapTraits::ForwardType,
2709              typename Bound3UnwrapTraits::ForwardType,
2710              typename Bound4UnwrapTraits::ForwardType,
2711              typename Bound5UnwrapTraits::ForwardType,
2712              typename CallbackParamTraits<X6>::ForwardType x6,
2713              typename CallbackParamTraits<X7>::ForwardType
2714                  x7)>::MakeItSo(storage->runnable_, CallbackForward(x1),
2715                                 CallbackForward(x2), CallbackForward(x3),
2716                                 CallbackForward(x4), CallbackForward(x5),
2717                                 CallbackForward(x6), CallbackForward(x7));
2718   }
2719 };
2720 
2721 // Arity 7 -> 1.
2722 template <typename StorageType,
2723           typename R,
2724           typename X1,
2725           typename X2,
2726           typename X3,
2727           typename X4,
2728           typename X5,
2729           typename X6,
2730           typename X7>
2731 struct Invoker<6, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
2732   typedef R(RunType)(BindStateBase*,
2733                      typename CallbackParamTraits<X7>::ForwardType);
2734 
2735   typedef R(UnboundRunType)(X7);
2736 
2737   static R Run(BindStateBase* base,
2738                typename CallbackParamTraits<X7>::ForwardType x7) {
2739     StorageType* storage = static_cast<StorageType*>(base);
2740 
2741     // Local references to make debugger stepping easier. If in a debugger,
2742     // you really want to warp ahead and step through the
2743     // InvokeHelper<>::MakeItSo() call below.
2744     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2745     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
2746     typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
2747     typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
2748     typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
2749     typedef typename StorageType::Bound6UnwrapTraits Bound6UnwrapTraits;
2750 
2751     typename Bound1UnwrapTraits::ForwardType x1 =
2752         Bound1UnwrapTraits::Unwrap(storage->p1_);
2753     typename Bound2UnwrapTraits::ForwardType x2 =
2754         Bound2UnwrapTraits::Unwrap(storage->p2_);
2755     typename Bound3UnwrapTraits::ForwardType x3 =
2756         Bound3UnwrapTraits::Unwrap(storage->p3_);
2757     typename Bound4UnwrapTraits::ForwardType x4 =
2758         Bound4UnwrapTraits::Unwrap(storage->p4_);
2759     typename Bound5UnwrapTraits::ForwardType x5 =
2760         Bound5UnwrapTraits::Unwrap(storage->p5_);
2761     typename Bound6UnwrapTraits::ForwardType x6 =
2762         Bound6UnwrapTraits::Unwrap(storage->p6_);
2763     return InvokeHelper<
2764         StorageType::IsWeakCall::value, R, typename StorageType::RunnableType,
2765         void(typename Bound1UnwrapTraits::ForwardType,
2766              typename Bound2UnwrapTraits::ForwardType,
2767              typename Bound3UnwrapTraits::ForwardType,
2768              typename Bound4UnwrapTraits::ForwardType,
2769              typename Bound5UnwrapTraits::ForwardType,
2770              typename Bound6UnwrapTraits::ForwardType,
2771              typename CallbackParamTraits<X7>::ForwardType
2772                  x7)>::MakeItSo(storage->runnable_, CallbackForward(x1),
2773                                 CallbackForward(x2), CallbackForward(x3),
2774                                 CallbackForward(x4), CallbackForward(x5),
2775                                 CallbackForward(x6), CallbackForward(x7));
2776   }
2777 };
2778 
2779 // Arity 7 -> 0.
2780 template <typename StorageType,
2781           typename R,
2782           typename X1,
2783           typename X2,
2784           typename X3,
2785           typename X4,
2786           typename X5,
2787           typename X6,
2788           typename X7>
2789 struct Invoker<7, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
2790   typedef R(RunType)(BindStateBase*);
2791 
2792   typedef R(UnboundRunType)();
2793 
2794   static R Run(BindStateBase* base) {
2795     StorageType* storage = static_cast<StorageType*>(base);
2796 
2797     // Local references to make debugger stepping easier. If in a debugger,
2798     // you really want to warp ahead and step through the
2799     // InvokeHelper<>::MakeItSo() call below.
2800     typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2801     typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
2802     typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
2803     typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
2804     typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
2805     typedef typename StorageType::Bound6UnwrapTraits Bound6UnwrapTraits;
2806     typedef typename StorageType::Bound7UnwrapTraits Bound7UnwrapTraits;
2807 
2808     typename Bound1UnwrapTraits::ForwardType x1 =
2809         Bound1UnwrapTraits::Unwrap(storage->p1_);
2810     typename Bound2UnwrapTraits::ForwardType x2 =
2811         Bound2UnwrapTraits::Unwrap(storage->p2_);
2812     typename Bound3UnwrapTraits::ForwardType x3 =
2813         Bound3UnwrapTraits::Unwrap(storage->p3_);
2814     typename Bound4UnwrapTraits::ForwardType x4 =
2815         Bound4UnwrapTraits::Unwrap(storage->p4_);
2816     typename Bound5UnwrapTraits::ForwardType x5 =
2817         Bound5UnwrapTraits::Unwrap(storage->p5_);
2818     typename Bound6UnwrapTraits::ForwardType x6 =
2819         Bound6UnwrapTraits::Unwrap(storage->p6_);
2820     typename Bound7UnwrapTraits::ForwardType x7 =
2821         Bound7UnwrapTraits::Unwrap(storage->p7_);
2822     return InvokeHelper<StorageType::IsWeakCall::value, R,
2823                         typename StorageType::RunnableType,
2824                         void(typename Bound1UnwrapTraits::ForwardType,
2825                              typename Bound2UnwrapTraits::ForwardType,
2826                              typename Bound3UnwrapTraits::ForwardType,
2827                              typename Bound4UnwrapTraits::ForwardType,
2828                              typename Bound5UnwrapTraits::ForwardType,
2829                              typename Bound6UnwrapTraits::ForwardType,
2830                              typename Bound7UnwrapTraits::ForwardType)>::
2831         MakeItSo(storage->runnable_, CallbackForward(x1), CallbackForward(x2),
2832                  CallbackForward(x3), CallbackForward(x4), CallbackForward(x5),
2833                  CallbackForward(x6), CallbackForward(x7));
2834   }
2835 };
2836 
2837 // BindState<>
2838 //
2839 // This stores all the state passed into Bind() and is also where most
2840 // of the template resolution magic occurs.
2841 //
2842 // Runnable is the functor we are binding arguments to.
2843 // RunType is type of the Run() function that the Invoker<> should use.
2844 // Normally, this is the same as the RunType of the Runnable, but it can
2845 // be different if an adapter like IgnoreResult() has been used.
2846 //
2847 // BoundArgsType contains the storage type for all the bound arguments by
2848 // (ab)using a function type.
2849 template <typename Runnable, typename RunType, typename BoundArgsType>
2850 struct BindState;
2851 
2852 template <typename Runnable, typename RunType>
2853 struct BindState<Runnable, RunType, void()> : public BindStateBase {
2854   typedef Runnable RunnableType;
2855   typedef false_type IsWeakCall;
2856   typedef Invoker<0, BindState, RunType> InvokerType;
2857   typedef typename InvokerType::UnboundRunType UnboundRunType;
2858   explicit BindState(const Runnable& runnable)
2859       : BindStateBase(&Destroy), runnable_(runnable) {}
2860 
2861   ~BindState() {}
2862 
2863   static void Destroy(BindStateBase* self) {
2864     delete static_cast<BindState*>(self);
2865   }
2866 
2867   RunnableType runnable_;
2868 };
2869 
2870 template <typename Runnable, typename RunType, typename P1>
2871 struct BindState<Runnable, RunType, void(P1)> : public BindStateBase {
2872   typedef Runnable RunnableType;
2873   typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
2874   typedef Invoker<1, BindState, RunType> InvokerType;
2875   typedef typename InvokerType::UnboundRunType UnboundRunType;
2876 
2877   // Convenience typedefs for bound argument types.
2878   typedef UnwrapTraits<P1> Bound1UnwrapTraits;
2879 
2880   BindState(const Runnable& runnable, const P1& p1)
2881       : BindStateBase(&Destroy), runnable_(runnable), p1_(p1) {
2882     MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
2883   }
2884 
2885   ~BindState() {
2886     MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::Release(p1_);
2887   }
2888 
2889   static void Destroy(BindStateBase* self) {
2890     delete static_cast<BindState*>(self);
2891   }
2892 
2893   RunnableType runnable_;
2894   P1 p1_;
2895 };
2896 
2897 template <typename Runnable, typename RunType, typename P1, typename P2>
2898 struct BindState<Runnable, RunType, void(P1, P2)> : public BindStateBase {
2899   typedef Runnable RunnableType;
2900   typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
2901   typedef Invoker<2, BindState, RunType> InvokerType;
2902   typedef typename InvokerType::UnboundRunType UnboundRunType;
2903 
2904   // Convenience typedefs for bound argument types.
2905   typedef UnwrapTraits<P1> Bound1UnwrapTraits;
2906   typedef UnwrapTraits<P2> Bound2UnwrapTraits;
2907 
2908   BindState(const Runnable& runnable, const P1& p1, const P2& p2)
2909       : BindStateBase(&Destroy), runnable_(runnable), p1_(p1), p2_(p2) {
2910     MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
2911   }
2912 
2913   ~BindState() {
2914     MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::Release(p1_);
2915   }
2916 
2917   static void Destroy(BindStateBase* self) {
2918     delete static_cast<BindState*>(self);
2919   }
2920 
2921   RunnableType runnable_;
2922   P1 p1_;
2923   P2 p2_;
2924 };
2925 
2926 template <typename Runnable,
2927           typename RunType,
2928           typename P1,
2929           typename P2,
2930           typename P3>
2931 struct BindState<Runnable, RunType, void(P1, P2, P3)> : public BindStateBase {
2932   typedef Runnable RunnableType;
2933   typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
2934   typedef Invoker<3, BindState, RunType> InvokerType;
2935   typedef typename InvokerType::UnboundRunType UnboundRunType;
2936 
2937   // Convenience typedefs for bound argument types.
2938   typedef UnwrapTraits<P1> Bound1UnwrapTraits;
2939   typedef UnwrapTraits<P2> Bound2UnwrapTraits;
2940   typedef UnwrapTraits<P3> Bound3UnwrapTraits;
2941 
2942   BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3)
2943       : BindStateBase(&Destroy),
2944         runnable_(runnable),
2945         p1_(p1),
2946         p2_(p2),
2947         p3_(p3) {
2948     MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
2949   }
2950 
2951   ~BindState() {
2952     MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::Release(p1_);
2953   }
2954 
2955   static void Destroy(BindStateBase* self) {
2956     delete static_cast<BindState*>(self);
2957   }
2958 
2959   RunnableType runnable_;
2960   P1 p1_;
2961   P2 p2_;
2962   P3 p3_;
2963 };
2964 
2965 template <typename Runnable,
2966           typename RunType,
2967           typename P1,
2968           typename P2,
2969           typename P3,
2970           typename P4>
2971 struct BindState<Runnable, RunType, void(P1, P2, P3, P4)>
2972     : public BindStateBase {
2973   typedef Runnable RunnableType;
2974   typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
2975   typedef Invoker<4, BindState, RunType> InvokerType;
2976   typedef typename InvokerType::UnboundRunType UnboundRunType;
2977 
2978   // Convenience typedefs for bound argument types.
2979   typedef UnwrapTraits<P1> Bound1UnwrapTraits;
2980   typedef UnwrapTraits<P2> Bound2UnwrapTraits;
2981   typedef UnwrapTraits<P3> Bound3UnwrapTraits;
2982   typedef UnwrapTraits<P4> Bound4UnwrapTraits;
2983 
2984   BindState(const Runnable& runnable,
2985             const P1& p1,
2986             const P2& p2,
2987             const P3& p3,
2988             const P4& p4)
2989       : BindStateBase(&Destroy),
2990         runnable_(runnable),
2991         p1_(p1),
2992         p2_(p2),
2993         p3_(p3),
2994         p4_(p4) {
2995     MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
2996   }
2997 
2998   ~BindState() {
2999     MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::Release(p1_);
3000   }
3001 
3002   static void Destroy(BindStateBase* self) {
3003     delete static_cast<BindState*>(self);
3004   }
3005 
3006   RunnableType runnable_;
3007   P1 p1_;
3008   P2 p2_;
3009   P3 p3_;
3010   P4 p4_;
3011 };
3012 
3013 template <typename Runnable,
3014           typename RunType,
3015           typename P1,
3016           typename P2,
3017           typename P3,
3018           typename P4,
3019           typename P5>
3020 struct BindState<Runnable, RunType, void(P1, P2, P3, P4, P5)>
3021     : public BindStateBase {
3022   typedef Runnable RunnableType;
3023   typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
3024   typedef Invoker<5, BindState, RunType> InvokerType;
3025   typedef typename InvokerType::UnboundRunType UnboundRunType;
3026 
3027   // Convenience typedefs for bound argument types.
3028   typedef UnwrapTraits<P1> Bound1UnwrapTraits;
3029   typedef UnwrapTraits<P2> Bound2UnwrapTraits;
3030   typedef UnwrapTraits<P3> Bound3UnwrapTraits;
3031   typedef UnwrapTraits<P4> Bound4UnwrapTraits;
3032   typedef UnwrapTraits<P5> Bound5UnwrapTraits;
3033 
3034   BindState(const Runnable& runnable,
3035             const P1& p1,
3036             const P2& p2,
3037             const P3& p3,
3038             const P4& p4,
3039             const P5& p5)
3040       : BindStateBase(&Destroy),
3041         runnable_(runnable),
3042         p1_(p1),
3043         p2_(p2),
3044         p3_(p3),
3045         p4_(p4),
3046         p5_(p5) {
3047     MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
3048   }
3049 
3050   ~BindState() {
3051     MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::Release(p1_);
3052   }
3053 
3054   static void Destroy(BindStateBase* self) {
3055     delete static_cast<BindState*>(self);
3056   }
3057 
3058   RunnableType runnable_;
3059   P1 p1_;
3060   P2 p2_;
3061   P3 p3_;
3062   P4 p4_;
3063   P5 p5_;
3064 };
3065 
3066 template <typename Runnable,
3067           typename RunType,
3068           typename P1,
3069           typename P2,
3070           typename P3,
3071           typename P4,
3072           typename P5,
3073           typename P6>
3074 struct BindState<Runnable, RunType, void(P1, P2, P3, P4, P5, P6)>
3075     : public BindStateBase {
3076   typedef Runnable RunnableType;
3077   typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
3078   typedef Invoker<6, BindState, RunType> InvokerType;
3079   typedef typename InvokerType::UnboundRunType UnboundRunType;
3080 
3081   // Convenience typedefs for bound argument types.
3082   typedef UnwrapTraits<P1> Bound1UnwrapTraits;
3083   typedef UnwrapTraits<P2> Bound2UnwrapTraits;
3084   typedef UnwrapTraits<P3> Bound3UnwrapTraits;
3085   typedef UnwrapTraits<P4> Bound4UnwrapTraits;
3086   typedef UnwrapTraits<P5> Bound5UnwrapTraits;
3087   typedef UnwrapTraits<P6> Bound6UnwrapTraits;
3088 
3089   BindState(const Runnable& runnable,
3090             const P1& p1,
3091             const P2& p2,
3092             const P3& p3,
3093             const P4& p4,
3094             const P5& p5,
3095             const P6& p6)
3096       : BindStateBase(&Destroy),
3097         runnable_(runnable),
3098         p1_(p1),
3099         p2_(p2),
3100         p3_(p3),
3101         p4_(p4),
3102         p5_(p5),
3103         p6_(p6) {
3104     MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
3105   }
3106 
3107   ~BindState() {
3108     MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::Release(p1_);
3109   }
3110 
3111   static void Destroy(BindStateBase* self) {
3112     delete static_cast<BindState*>(self);
3113   }
3114 
3115   RunnableType runnable_;
3116   P1 p1_;
3117   P2 p2_;
3118   P3 p3_;
3119   P4 p4_;
3120   P5 p5_;
3121   P6 p6_;
3122 };
3123 
3124 template <typename Runnable,
3125           typename RunType,
3126           typename P1,
3127           typename P2,
3128           typename P3,
3129           typename P4,
3130           typename P5,
3131           typename P6,
3132           typename P7>
3133 struct BindState<Runnable, RunType, void(P1, P2, P3, P4, P5, P6, P7)>
3134     : public BindStateBase {
3135   typedef Runnable RunnableType;
3136   typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
3137   typedef Invoker<7, BindState, RunType> InvokerType;
3138   typedef typename InvokerType::UnboundRunType UnboundRunType;
3139 
3140   // Convenience typedefs for bound argument types.
3141   typedef UnwrapTraits<P1> Bound1UnwrapTraits;
3142   typedef UnwrapTraits<P2> Bound2UnwrapTraits;
3143   typedef UnwrapTraits<P3> Bound3UnwrapTraits;
3144   typedef UnwrapTraits<P4> Bound4UnwrapTraits;
3145   typedef UnwrapTraits<P5> Bound5UnwrapTraits;
3146   typedef UnwrapTraits<P6> Bound6UnwrapTraits;
3147   typedef UnwrapTraits<P7> Bound7UnwrapTraits;
3148 
3149   BindState(const Runnable& runnable,
3150             const P1& p1,
3151             const P2& p2,
3152             const P3& p3,
3153             const P4& p4,
3154             const P5& p5,
3155             const P6& p6,
3156             const P7& p7)
3157       : BindStateBase(&Destroy),
3158         runnable_(runnable),
3159         p1_(p1),
3160         p2_(p2),
3161         p3_(p3),
3162         p4_(p4),
3163         p5_(p5),
3164         p6_(p6),
3165         p7_(p7) {
3166     MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
3167   }
3168 
3169   ~BindState() {
3170     MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::Release(p1_);
3171   }
3172 
3173   static void Destroy(BindStateBase* self) {
3174     delete static_cast<BindState*>(self);
3175   }
3176 
3177   RunnableType runnable_;
3178   P1 p1_;
3179   P2 p2_;
3180   P3 p3_;
3181   P4 p4_;
3182   P5 p5_;
3183   P6 p6_;
3184   P7 p7_;
3185 };
3186 
3187 }  // namespace cef_internal
3188 }  // namespace base
3189 
3190 #endif  // CEF_INCLUDE_BASE_INTERNAL_CEF_BIND_INTERNAL_H_
3191