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