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