15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file was GENERATED by command: 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pump.py bind_internal.h.pump 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DO NOT EDIT BY HAND!!! 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_BIND_INTERNAL_H_ 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_BIND_INTERNAL_H_ 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_internal.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/raw_scoped_refptr_mismatch_checker.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/template_util.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_internal_win.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See base/callback.h for user documentation. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CONCEPTS: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Runnable -- A type (really a type class) that has a single Run() method 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and a RunType typedef that corresponds to the type of Run(). 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A Runnable can declare that it should treated like a method 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// call by including a typedef named IsMethod. The value of 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this typedef is NOT inspected, only the existence. When a 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Runnable declares itself a method, Bind() will enforce special 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// refcounting + WeakPtr handling semantics for the first 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// parameter which is expected to be an object. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Functor -- A copyable type representing something that should be called. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All function pointers, Callback<>, and Runnables are functors 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// even if the invocation syntax differs. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RunType -- A function type (as opposed to function _pointer_ type) for 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a Run() function. Usually just a convenience typedef. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (Bound)ArgsType -- A function type that is being (ab)used to store the 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// types of set of arguments. The "return" type is always 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void here. We use this hack so that we do not need 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a new type name for each arity of type. (eg., 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BindState1, BindState2). This makes forward 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// declarations and friending much much easier. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Types: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RunnableAdapter<> -- Wraps the various "function" pointer types into an 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// object that adheres to the Runnable interface. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are |3*ARITY| RunnableAdapter types. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FunctionTraits<> -- Type traits that unwrap a function signature into a 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a set of easier to use typedefs. Used mainly for 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// compile time asserts. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are |ARITY| FunctionTraits types. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ForceVoidReturn<> -- Helper class for translating function signatures to 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// equivalent forms with a "void" return type. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are |ARITY| ForceVoidReturn types. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FunctorTraits<> -- Type traits used determine the correct RunType and 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RunnableType for a Functor. This is where function 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// signature adapters are applied. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are |ARITY| ForceVoidReturn types. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MakeRunnable<> -- Takes a Functor and returns an object in the Runnable 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// type class that represents the underlying Functor. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are |O(1)| MakeRunnable types. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// InvokeHelper<> -- Take a Runnable + arguments and actully invokes it. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handle the differing syntaxes needed for WeakPtr<> support, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and for ignoring return values. This is separate from 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoker to avoid creating multiple version of Invoker<> 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which grows at O(n^2) with the arity. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are |k*ARITY| InvokeHelper types. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoker<> -- Unwraps the curried parameters and executes the Runnable. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are |(ARITY^2 + ARITY)/2| Invoketypes. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BindState<> -- Stores the curried parameters, and is the main entry point 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// into the Bind() system, doing most of the type resolution. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are ARITY BindState types. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RunnableAdapter<> 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The RunnableAdapter<> templates provide a uniform interface for invoking 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a function pointer, method pointer, or const method pointer. The adapter 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// exposes a Run() method with an appropriate signature. Using this wrapper 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// allows for writing code that supports all three pointer types without 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// undue repetition. Without it, a lot of code would need to be repeated 3 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// times. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For method pointers and const method pointers the first argument to Run() 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is considered to be the received of the method. This is similar to STL's 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// mem_fun(). 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class also exposes a RunType typedef that is the function type of the 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Run() function. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If and only if the wrapper contains a method or const method pointer, an 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IsMethod typedef is exposed. The existence of this typedef (NOT the value) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// marks that the wrapper should be considered a method wrapper. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Functor> 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Function: Arity 0. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R> 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(*)()> { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(*function)()) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : function_(function) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run() { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return function_(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (*function_)(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Method: Arity 0. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename T> 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(T::*)()> { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(T*); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef true_type IsMethod; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(T::*method)()) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : method_(method) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(T* object) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (object->*method_)(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (T::*method_)(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Const Method: Arity 0. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename T> 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(T::*)() const> { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(const T*); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef true_type IsMethod; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(T::*method)() const) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : method_(method) { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(const T* object) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (object->*method_)(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (T::*method_)() const; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Function: Arity 1. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1> 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(*)(A1)> { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(A1); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(*function)(A1)) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : function_(function) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename CallbackParamTraits<A1>::ForwardType a1) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return function_(CallbackForward(a1)); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (*function_)(A1); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Method: Arity 1. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename T, typename A1> 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(T::*)(A1)> { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(T*, A1); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef true_type IsMethod; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(T::*method)(A1)) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : method_(method) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1) { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (object->*method_)(CallbackForward(a1)); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (T::*method_)(A1); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Const Method: Arity 1. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename T, typename A1> 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(T::*)(A1) const> { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(const T*, A1); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef true_type IsMethod; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(T::*method)(A1) const) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : method_(method) { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (object->*method_)(CallbackForward(a1)); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (T::*method_)(A1) const; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Function: Arity 2. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2> 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(*)(A1, A2)> { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(A1, A2); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(*function)(A1, A2)) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : function_(function) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename CallbackParamTraits<A1>::ForwardType a1, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A2>::ForwardType a2) { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return function_(CallbackForward(a1), CallbackForward(a2)); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (*function_)(A1, A2); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Method: Arity 2. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename T, typename A1, typename A2> 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(T::*)(A1, A2)> { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(T*, A1, A2); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef true_type IsMethod; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(T::*method)(A1, A2)) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : method_(method) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A2>::ForwardType a2) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (object->*method_)(CallbackForward(a1), CallbackForward(a2)); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (T::*method_)(A1, A2); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Const Method: Arity 2. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename T, typename A1, typename A2> 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(T::*)(A1, A2) const> { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(const T*, A1, A2); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef true_type IsMethod; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(T::*method)(A1, A2) const) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : method_(method) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A2>::ForwardType a2) { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (object->*method_)(CallbackForward(a1), CallbackForward(a2)); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (T::*method_)(A1, A2) const; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Function: Arity 3. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3> 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(*)(A1, A2, A3)> { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(A1, A2, A3); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(*function)(A1, A2, A3)) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : function_(function) { 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename CallbackParamTraits<A1>::ForwardType a1, 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A2>::ForwardType a2, 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A3>::ForwardType a3) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return function_(CallbackForward(a1), CallbackForward(a2), 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3)); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (*function_)(A1, A2, A3); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Method: Arity 3. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename T, typename A1, typename A2, typename A3> 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(T::*)(A1, A2, A3)> { 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(T*, A1, A2, A3); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef true_type IsMethod; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(T::*method)(A1, A2, A3)) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : method_(method) { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A2>::ForwardType a2, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A3>::ForwardType a3) { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (object->*method_)(CallbackForward(a1), CallbackForward(a2), 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3)); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (T::*method_)(A1, A2, A3); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Const Method: Arity 3. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename T, typename A1, typename A2, typename A3> 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(T::*)(A1, A2, A3) const> { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(const T*, A1, A2, A3); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef true_type IsMethod; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(T::*method)(A1, A2, A3) const) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : method_(method) { 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1, 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A2>::ForwardType a2, 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A3>::ForwardType a3) { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (object->*method_)(CallbackForward(a1), CallbackForward(a2), 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3)); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (T::*method_)(A1, A2, A3) const; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Function: Arity 4. 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4> 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(*)(A1, A2, A3, A4)> { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(A1, A2, A3, A4); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(*function)(A1, A2, A3, A4)) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : function_(function) { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename CallbackParamTraits<A1>::ForwardType a1, 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A2>::ForwardType a2, 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A3>::ForwardType a3, 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A4>::ForwardType a4) { 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return function_(CallbackForward(a1), CallbackForward(a2), 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3), CallbackForward(a4)); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (*function_)(A1, A2, A3, A4); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Method: Arity 4. 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename T, typename A1, typename A2, typename A3, 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A4> 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(T::*)(A1, A2, A3, A4)> { 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(T*, A1, A2, A3, A4); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef true_type IsMethod; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4)) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : method_(method) { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1, 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A2>::ForwardType a2, 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A3>::ForwardType a3, 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A4>::ForwardType a4) { 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (object->*method_)(CallbackForward(a1), CallbackForward(a2), 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3), CallbackForward(a4)); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (T::*method_)(A1, A2, A3, A4); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Const Method: Arity 4. 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename T, typename A1, typename A2, typename A3, 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A4> 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(T::*)(A1, A2, A3, A4) const> { 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(const T*, A1, A2, A3, A4); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef true_type IsMethod; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4) const) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : method_(method) { 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1, 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A2>::ForwardType a2, 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A3>::ForwardType a3, 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A4>::ForwardType a4) { 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (object->*method_)(CallbackForward(a1), CallbackForward(a2), 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3), CallbackForward(a4)); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (T::*method_)(A1, A2, A3, A4) const; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Function: Arity 5. 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4, 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A5> 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(*)(A1, A2, A3, A4, A5)> { 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(A1, A2, A3, A4, A5); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(*function)(A1, A2, A3, A4, A5)) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : function_(function) { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename CallbackParamTraits<A1>::ForwardType a1, 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A2>::ForwardType a2, 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A3>::ForwardType a3, 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A4>::ForwardType a4, 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A5>::ForwardType a5) { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return function_(CallbackForward(a1), CallbackForward(a2), 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3), CallbackForward(a4), CallbackForward(a5)); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (*function_)(A1, A2, A3, A4, A5); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Method: Arity 5. 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename T, typename A1, typename A2, typename A3, 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A4, typename A5> 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5)> { 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(T*, A1, A2, A3, A4, A5); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef true_type IsMethod; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5)) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : method_(method) { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1, 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A2>::ForwardType a2, 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A3>::ForwardType a3, 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A4>::ForwardType a4, 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A5>::ForwardType a5) { 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (object->*method_)(CallbackForward(a1), CallbackForward(a2), 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3), CallbackForward(a4), CallbackForward(a5)); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (T::*method_)(A1, A2, A3, A4, A5); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Const Method: Arity 5. 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename T, typename A1, typename A2, typename A3, 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A4, typename A5> 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5) const> { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(const T*, A1, A2, A3, A4, A5); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef true_type IsMethod; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5) const) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : method_(method) { 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1, 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A2>::ForwardType a2, 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A3>::ForwardType a3, 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A4>::ForwardType a4, 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A5>::ForwardType a5) { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (object->*method_)(CallbackForward(a1), CallbackForward(a2), 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3), CallbackForward(a4), CallbackForward(a5)); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (T::*method_)(A1, A2, A3, A4, A5) const; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Function: Arity 6. 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4, 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A5, typename A6> 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(*)(A1, A2, A3, A4, A5, A6)> { 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(A1, A2, A3, A4, A5, A6); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(*function)(A1, A2, A3, A4, A5, A6)) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : function_(function) { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename CallbackParamTraits<A1>::ForwardType a1, 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A2>::ForwardType a2, 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A3>::ForwardType a3, 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A4>::ForwardType a4, 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A5>::ForwardType a5, 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A6>::ForwardType a6) { 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return function_(CallbackForward(a1), CallbackForward(a2), 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a6)); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (*function_)(A1, A2, A3, A4, A5, A6); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Method: Arity 6. 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename T, typename A1, typename A2, typename A3, 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A4, typename A5, typename A6> 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6)> { 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(T*, A1, A2, A3, A4, A5, A6); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef true_type IsMethod; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6)) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : method_(method) { 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1, 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A2>::ForwardType a2, 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A3>::ForwardType a3, 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A4>::ForwardType a4, 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A5>::ForwardType a5, 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A6>::ForwardType a6) { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (object->*method_)(CallbackForward(a1), CallbackForward(a2), 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a6)); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (T::*method_)(A1, A2, A3, A4, A5, A6); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Const Method: Arity 6. 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename T, typename A1, typename A2, typename A3, 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A4, typename A5, typename A6> 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6) const> { 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(const T*, A1, A2, A3, A4, A5, A6); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef true_type IsMethod; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6) const) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : method_(method) { 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1, 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A2>::ForwardType a2, 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A3>::ForwardType a3, 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A4>::ForwardType a4, 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A5>::ForwardType a5, 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A6>::ForwardType a6) { 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (object->*method_)(CallbackForward(a1), CallbackForward(a2), 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a6)); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (T::*method_)(A1, A2, A3, A4, A5, A6) const; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Function: Arity 7. 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4, 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A5, typename A6, typename A7> 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(*)(A1, A2, A3, A4, A5, A6, A7)> { 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(A1, A2, A3, A4, A5, A6, A7); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(*function)(A1, A2, A3, A4, A5, A6, A7)) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : function_(function) { 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(typename CallbackParamTraits<A1>::ForwardType a1, 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A2>::ForwardType a2, 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A3>::ForwardType a3, 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A4>::ForwardType a4, 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A5>::ForwardType a5, 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A6>::ForwardType a6, 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A7>::ForwardType a7) { 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return function_(CallbackForward(a1), CallbackForward(a2), 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a6), CallbackForward(a7)); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (*function_)(A1, A2, A3, A4, A5, A6, A7); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Method: Arity 7. 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename T, typename A1, typename A2, typename A3, 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A4, typename A5, typename A6, typename A7> 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6, A7)> { 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(T*, A1, A2, A3, A4, A5, A6, A7); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef true_type IsMethod; 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6, A7)) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : method_(method) { 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1, 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A2>::ForwardType a2, 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A3>::ForwardType a3, 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A4>::ForwardType a4, 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A5>::ForwardType a5, 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A6>::ForwardType a6, 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A7>::ForwardType a7) { 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (object->*method_)(CallbackForward(a1), CallbackForward(a2), 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a6), CallbackForward(a7)); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (T::*method_)(A1, A2, A3, A4, A5, A6, A7); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Const Method: Arity 7. 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename T, typename A1, typename A2, typename A3, 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A4, typename A5, typename A6, typename A7> 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6, A7) const> { 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R (RunType)(const T*, A1, A2, A3, A4, A5, A6, A7); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef true_type IsMethod; 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6, A7) const) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : method_(method) { 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1, 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A2>::ForwardType a2, 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A3>::ForwardType a3, 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A4>::ForwardType a4, 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A5>::ForwardType a5, 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A6>::ForwardType a6, 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<A7>::ForwardType a7) { 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (object->*method_)(CallbackForward(a1), CallbackForward(a2), 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a6), CallbackForward(a7)); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) R (T::*method_)(A1, A2, A3, A4, A5, A6, A7) const; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FunctionTraits<> 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Breaks a function signature apart into typedefs for easier introspection. 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Sig> 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FunctionTraits; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R> 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FunctionTraits<R()> { 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R ReturnType; 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1> 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FunctionTraits<R(A1)> { 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R ReturnType; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A1 A1Type; 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2> 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FunctionTraits<R(A1, A2)> { 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R ReturnType; 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A1 A1Type; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A2 A2Type; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3> 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FunctionTraits<R(A1, A2, A3)> { 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R ReturnType; 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A1 A1Type; 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A2 A2Type; 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A3 A3Type; 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4> 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FunctionTraits<R(A1, A2, A3, A4)> { 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R ReturnType; 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A1 A1Type; 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A2 A2Type; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A3 A3Type; 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A4 A4Type; 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4, 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A5> 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FunctionTraits<R(A1, A2, A3, A4, A5)> { 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R ReturnType; 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A1 A1Type; 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A2 A2Type; 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A3 A3Type; 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A4 A4Type; 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A5 A5Type; 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4, 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A5, typename A6> 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FunctionTraits<R(A1, A2, A3, A4, A5, A6)> { 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R ReturnType; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A1 A1Type; 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A2 A2Type; 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A3 A3Type; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A4 A4Type; 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A5 A5Type; 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A6 A6Type; 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4, 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A5, typename A6, typename A7> 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FunctionTraits<R(A1, A2, A3, A4, A5, A6, A7)> { 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R ReturnType; 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A1 A1Type; 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A2 A2Type; 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A3 A3Type; 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A4 A4Type; 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A5 A5Type; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A6 A6Type; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef A7 A7Type; 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ForceVoidReturn<> 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set of templates that support forcing the function return type to void. 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Sig> 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ForceVoidReturn; 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R> 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ForceVoidReturn<R()> { 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef void(RunType)(); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1> 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ForceVoidReturn<R(A1)> { 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef void(RunType)(A1); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2> 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ForceVoidReturn<R(A1, A2)> { 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef void(RunType)(A1, A2); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3> 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ForceVoidReturn<R(A1, A2, A3)> { 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef void(RunType)(A1, A2, A3); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4> 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ForceVoidReturn<R(A1, A2, A3, A4)> { 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef void(RunType)(A1, A2, A3, A4); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4, 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A5> 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ForceVoidReturn<R(A1, A2, A3, A4, A5)> { 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef void(RunType)(A1, A2, A3, A4, A5); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4, 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A5, typename A6> 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ForceVoidReturn<R(A1, A2, A3, A4, A5, A6)> { 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef void(RunType)(A1, A2, A3, A4, A5, A6); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename R, typename A1, typename A2, typename A3, typename A4, 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A5, typename A6, typename A7> 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ForceVoidReturn<R(A1, A2, A3, A4, A5, A6, A7)> { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef void(RunType)(A1, A2, A3, A4, A5, A6, A7); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FunctorTraits<> 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See description at top of file. 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T> 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FunctorTraits { 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef RunnableAdapter<T> RunnableType; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename RunnableType::RunType RunType; 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T> 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FunctorTraits<IgnoreResultHelper<T> > { 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename FunctorTraits<T>::RunnableType RunnableType; 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename ForceVoidReturn< 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename RunnableType::RunType>::RunType RunType; 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T> 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FunctorTraits<Callback<T> > { 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Callback<T> RunnableType; 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename Callback<T>::RunType RunType; 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MakeRunnable<> 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converts a passed in functor to a RunnableType using type inference. 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T> 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typename FunctorTraits<T>::RunnableType MakeRunnable(const T& t) { 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunnableAdapter<T>(t); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T> 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typename FunctorTraits<T>::RunnableType 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MakeRunnable(const IgnoreResultHelper<T>& t) { 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return MakeRunnable(t.functor_); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename T> 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const typename FunctorTraits<Callback<T> >::RunnableType& 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MakeRunnable(const Callback<T>& t) { 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!t.is_null()); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return t; 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// InvokeHelper<> 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are 3 logical InvokeHelper<> specializations: normal, void-return, 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WeakCalls. 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The normal type just calls the underlying runnable. 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We need a InvokeHelper to handle void return types in order to support 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IgnoreResult(). Normally, if the Runnable's RunType had a void return, 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the template system would just accept "return functor.Run()" ignoring 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the fact that a void function is being used with return. This piece of 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sugar breaks though when the Runnable's RunType is not void. Thus, we 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// need a partial specialization to change the syntax to drop the "return" 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from the invocation call. 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WeakCalls similarly need special syntax that is applied to the first 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// argument to check if they should no-op themselves. 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <bool IsWeakCall, typename ReturnType, typename Runnable, 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename ArgsType> 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper; 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename ReturnType, typename Runnable> 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<false, ReturnType, Runnable, 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void()> { 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ReturnType MakeItSo(Runnable runnable) { 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return runnable.Run(); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable> 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<false, void, Runnable, 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void()> { 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void MakeItSo(Runnable runnable) { 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runnable.Run(); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename ReturnType, typename Runnable,typename A1> 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<false, ReturnType, Runnable, 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(A1)> { 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ReturnType MakeItSo(Runnable runnable, A1 a1) { 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return runnable.Run(CallbackForward(a1)); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable,typename A1> 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<false, void, Runnable, 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(A1)> { 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void MakeItSo(Runnable runnable, A1 a1) { 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runnable.Run(CallbackForward(a1)); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <typename Runnable, typename BoundWeakPtr> 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<true, void, Runnable, 877868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void(BoundWeakPtr)> { 878868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr) { 879868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!weak_ptr.get()) { 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 882868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) runnable.Run(weak_ptr.get()); 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename ReturnType, typename Runnable,typename A1, typename A2> 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<false, ReturnType, Runnable, 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(A1, A2)> { 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2) { 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return runnable.Run(CallbackForward(a1), CallbackForward(a2)); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable,typename A1, typename A2> 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<false, void, Runnable, 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(A1, A2)> { 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void MakeItSo(Runnable runnable, A1 a1, A2 a2) { 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runnable.Run(CallbackForward(a1), CallbackForward(a2)); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 902868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <typename Runnable, typename BoundWeakPtr, typename A2> 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<true, void, Runnable, 904868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void(BoundWeakPtr, A2)> { 905868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2) { 906868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!weak_ptr.get()) { 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 909868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) runnable.Run(weak_ptr.get(), CallbackForward(a2)); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename ReturnType, typename Runnable,typename A1, typename A2, 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A3> 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<false, ReturnType, Runnable, 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(A1, A2, A3)> { 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3) { 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return runnable.Run(CallbackForward(a1), CallbackForward(a2), 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3)); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable,typename A1, typename A2, typename A3> 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<false, void, Runnable, 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(A1, A2, A3)> { 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3) { 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3)); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 931868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3> 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<true, void, Runnable, 933868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void(BoundWeakPtr, A2, A3)> { 934868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3) { 935868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!weak_ptr.get()) { 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 938868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3)); 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename ReturnType, typename Runnable,typename A1, typename A2, 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A3, typename A4> 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<false, ReturnType, Runnable, 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(A1, A2, A3, A4)> { 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4) { 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return runnable.Run(CallbackForward(a1), CallbackForward(a2), 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3), CallbackForward(a4)); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable,typename A1, typename A2, typename A3, typename A4> 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<false, void, Runnable, 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(A1, A2, A3, A4)> { 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4) { 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3), 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a4)); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 961868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3, 962868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) typename A4> 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<true, void, Runnable, 964868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void(BoundWeakPtr, A2, A3, A4)> { 965868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3, 966868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) A4 a4) { 967868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!weak_ptr.get()) { 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 970868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3), 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a4)); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename ReturnType, typename Runnable,typename A1, typename A2, 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A3, typename A4, typename A5> 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<false, ReturnType, Runnable, 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(A1, A2, A3, A4, A5)> { 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A5 a5) { 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return runnable.Run(CallbackForward(a1), CallbackForward(a2), 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3), CallbackForward(a4), CallbackForward(a5)); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable,typename A1, typename A2, typename A3, typename A4, 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A5> 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<false, void, Runnable, 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(A1, A2, A3, A4, A5)> { 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3), 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a4), CallbackForward(a5)); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 996868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3, 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A4, typename A5> 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<true, void, Runnable, 999868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void(BoundWeakPtr, A2, A3, A4, A5)> { 1000868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3, 1001868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) A4 a4, A5 a5) { 1002868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!weak_ptr.get()) { 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3), 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a4), CallbackForward(a5)); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename ReturnType, typename Runnable,typename A1, typename A2, 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A3, typename A4, typename A5, typename A6> 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<false, ReturnType, Runnable, 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(A1, A2, A3, A4, A5, A6)> { 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A5 a5, A6 a6) { 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return runnable.Run(CallbackForward(a1), CallbackForward(a2), 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a6)); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable,typename A1, typename A2, typename A3, typename A4, 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A5, typename A6> 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<false, void, Runnable, 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(A1, A2, A3, A4, A5, A6)> { 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A6 a6) { 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3), 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a4), CallbackForward(a5), CallbackForward(a6)); 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1033868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3, 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A4, typename A5, typename A6> 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<true, void, Runnable, 1036868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void(BoundWeakPtr, A2, A3, A4, A5, A6)> { 1037868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3, 1038868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) A4 a4, A5 a5, A6 a6) { 1039868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!weak_ptr.get()) { 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1042868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3), 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a4), CallbackForward(a5), CallbackForward(a6)); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename ReturnType, typename Runnable,typename A1, typename A2, 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A3, typename A4, typename A5, typename A6, typename A7> 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<false, ReturnType, Runnable, 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(A1, A2, A3, A4, A5, A6, A7)> { 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A5 a5, A6 a6, A7 a7) { 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return runnable.Run(CallbackForward(a1), CallbackForward(a2), 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a6), CallbackForward(a7)); 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable,typename A1, typename A2, typename A3, typename A4, 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A5, typename A6, typename A7> 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<false, void, Runnable, 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(A1, A2, A3, A4, A5, A6, A7)> { 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) A6 a6, A7 a7) { 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3), 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a4), CallbackForward(a5), CallbackForward(a6), 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a7)); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1071868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3, 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename A4, typename A5, typename A6, typename A7> 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<true, void, Runnable, 1074868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void(BoundWeakPtr, A2, A3, A4, A5, A6, A7)> { 1075868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3, 1076868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) A4 a4, A5 a5, A6 a6, A7 a7) { 1077868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!weak_ptr.get()) { 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1080868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3), 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a4), CallbackForward(a5), CallbackForward(a6), 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(a7)); 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(_MSC_VER) 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename ReturnType, typename Runnable, typename ArgsType> 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct InvokeHelper<true, ReturnType, Runnable, ArgsType> { 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WeakCalls are only supported for functions with a void return type. 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise, the function result would be undefined if the the WeakPtr<> 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is invalidated. 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(is_void<ReturnType>::value, 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptrs_can_only_bind_to_methods_without_return_values); 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoker<> 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See description at the top of the file. 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <int NumBound, typename Storage, typename RunType> 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker; 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 0 -> 0. 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R> 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<0, StorageType, R()> { 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base) { 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void()> 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 1 -> 1. 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1> 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<0, StorageType, R(X1)> { 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X1>::ForwardType); 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X1); 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X1>::ForwardType x1) { 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename CallbackParamTraits<X1>::ForwardType x1)> 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1)); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 1 -> 0. 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1> 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<1, StorageType, R(X1)> { 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*); 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(); 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base) { 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType)> 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1)); 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 2 -> 2. 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2> 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<0, StorageType, R(X1, X2)> { 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X1>::ForwardType, 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X1, X2); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X1>::ForwardType x1, 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2) { 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename CallbackParamTraits<X1>::ForwardType x1, 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2)> 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2)); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 2 -> 1. 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2> 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<1, StorageType, R(X1, X2)> { 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType); 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X2); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2) { 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2)> 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2)); 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 2 -> 0. 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2> 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<2, StorageType, R(X1, X2)> { 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*); 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(); 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base) { 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType)> 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2)); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 3 -> 3. 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3> 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<0, StorageType, R(X1, X2, X3)> { 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X1>::ForwardType, 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType, 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType); 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X1, X2, X3); 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X1>::ForwardType x1, 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3) { 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename CallbackParamTraits<X1>::ForwardType x1, 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3)> 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3)); 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 3 -> 2. 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3> 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<1, StorageType, R(X1, X2, X3)> { 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType, 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType); 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X2, X3); 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3) { 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3)> 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3)); 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 3 -> 1. 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3> 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<2, StorageType, R(X1, X2, X3)> { 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType); 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X3); 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3) { 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3)> 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3)); 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 3 -> 0. 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3> 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<3, StorageType, R(X1, X2, X3)> { 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*); 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(); 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base) { 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits; 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType x3 = 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound3UnwrapTraits::Unwrap(storage->p3_); 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType)> 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3)); 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 4 -> 4. 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4> 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<0, StorageType, R(X1, X2, X3, X4)> { 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X1>::ForwardType, 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType, 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType, 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X1, X2, X3, X4); 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X1>::ForwardType x1, 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4) { 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename CallbackParamTraits<X1>::ForwardType x1, 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4)> 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4)); 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 4 -> 3. 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4> 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<1, StorageType, R(X1, X2, X3, X4)> { 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType, 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType, 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType); 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X2, X3, X4); 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4) { 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4)> 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4)); 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 4 -> 2. 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4> 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<2, StorageType, R(X1, X2, X3, X4)> { 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType, 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType); 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X3, X4); 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4) { 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4)> 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4)); 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 4 -> 1. 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4> 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<3, StorageType, R(X1, X2, X3, X4)> { 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType); 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X4); 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4) { 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits; 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType x3 = 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound3UnwrapTraits::Unwrap(storage->p3_); 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType, 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4)> 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4)); 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 4 -> 0. 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4> 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<4, StorageType, R(X1, X2, X3, X4)> { 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*); 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(); 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base) { 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits; 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits; 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType x3 = 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound3UnwrapTraits::Unwrap(storage->p3_); 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType x4 = 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound4UnwrapTraits::Unwrap(storage->p4_); 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType, 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType)> 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4)); 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 5 -> 5. 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5> 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<0, StorageType, R(X1, X2, X3, X4, X5)> { 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X1>::ForwardType, 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType, 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType, 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType, 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType); 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X1, X2, X3, X4, X5); 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X1>::ForwardType x1, 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5) { 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename CallbackParamTraits<X1>::ForwardType x1, 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5)> 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5)); 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 5 -> 4. 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5> 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<1, StorageType, R(X1, X2, X3, X4, X5)> { 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType, 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType, 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType, 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType); 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X2, X3, X4, X5); 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5) { 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5)> 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5)); 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 5 -> 3. 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5> 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<2, StorageType, R(X1, X2, X3, X4, X5)> { 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType, 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType, 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType); 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X3, X4, X5); 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5) { 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5)> 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5)); 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 5 -> 2. 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5> 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<3, StorageType, R(X1, X2, X3, X4, X5)> { 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType, 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType); 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X4, X5); 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5) { 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits; 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType x3 = 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound3UnwrapTraits::Unwrap(storage->p3_); 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType, 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5)> 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5)); 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 5 -> 1. 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5> 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<4, StorageType, R(X1, X2, X3, X4, X5)> { 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType); 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X5); 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5) { 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits; 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits; 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType x3 = 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound3UnwrapTraits::Unwrap(storage->p3_); 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType x4 = 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound4UnwrapTraits::Unwrap(storage->p4_); 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType, 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType, 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5)> 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5)); 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 5 -> 0. 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5> 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<5, StorageType, R(X1, X2, X3, X4, X5)> { 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*); 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(); 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base) { 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits; 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits; 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits; 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType x3 = 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound3UnwrapTraits::Unwrap(storage->p3_); 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType x4 = 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound4UnwrapTraits::Unwrap(storage->p4_); 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound5UnwrapTraits::ForwardType x5 = 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound5UnwrapTraits::Unwrap(storage->p5_); 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType, 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType, 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound5UnwrapTraits::ForwardType)> 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5)); 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 6 -> 6. 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5, typename X6> 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<0, StorageType, R(X1, X2, X3, X4, X5, X6)> { 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X1>::ForwardType, 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType, 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType, 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType, 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType, 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType); 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X1, X2, X3, X4, X5, X6); 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X1>::ForwardType x1, 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6) { 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename CallbackParamTraits<X1>::ForwardType x1, 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6)> 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5), 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x6)); 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 6 -> 5. 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5, typename X6> 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<1, StorageType, R(X1, X2, X3, X4, X5, X6)> { 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType, 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType, 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType, 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType, 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType); 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X2, X3, X4, X5, X6); 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6) { 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6)> 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5), 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x6)); 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 6 -> 4. 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5, typename X6> 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<2, StorageType, R(X1, X2, X3, X4, X5, X6)> { 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType, 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType, 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType, 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType); 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X3, X4, X5, X6); 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6) { 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6)> 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5), 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x6)); 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 6 -> 3. 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5, typename X6> 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<3, StorageType, R(X1, X2, X3, X4, X5, X6)> { 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType, 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType, 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType); 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X4, X5, X6); 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6) { 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits; 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType x3 = 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound3UnwrapTraits::Unwrap(storage->p3_); 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType, 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6)> 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5), 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x6)); 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 6 -> 2. 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5, typename X6> 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<4, StorageType, R(X1, X2, X3, X4, X5, X6)> { 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType, 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType); 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X5, X6); 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6) { 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits; 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits; 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType x3 = 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound3UnwrapTraits::Unwrap(storage->p3_); 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType x4 = 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound4UnwrapTraits::Unwrap(storage->p4_); 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType, 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType, 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6)> 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5), 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x6)); 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 6 -> 1. 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5, typename X6> 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<5, StorageType, R(X1, X2, X3, X4, X5, X6)> { 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType); 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X6); 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6) { 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits; 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits; 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits; 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType x3 = 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound3UnwrapTraits::Unwrap(storage->p3_); 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType x4 = 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound4UnwrapTraits::Unwrap(storage->p4_); 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound5UnwrapTraits::ForwardType x5 = 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound5UnwrapTraits::Unwrap(storage->p5_); 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType, 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType, 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound5UnwrapTraits::ForwardType, 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6)> 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5), 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x6)); 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 6 -> 0. 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5, typename X6> 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<6, StorageType, R(X1, X2, X3, X4, X5, X6)> { 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*); 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(); 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base) { 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits; 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits; 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits; 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound6UnwrapTraits Bound6UnwrapTraits; 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType x3 = 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound3UnwrapTraits::Unwrap(storage->p3_); 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType x4 = 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound4UnwrapTraits::Unwrap(storage->p4_); 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound5UnwrapTraits::ForwardType x5 = 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound5UnwrapTraits::Unwrap(storage->p5_); 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound6UnwrapTraits::ForwardType x6 = 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound6UnwrapTraits::Unwrap(storage->p6_); 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType, 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType, 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound5UnwrapTraits::ForwardType, 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound6UnwrapTraits::ForwardType)> 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5), 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x6)); 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 7 -> 7. 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5, typename X6, typename X7> 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<0, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> { 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X1>::ForwardType, 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType, 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType, 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType, 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType, 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType, 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType); 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X1, X2, X3, X4, X5, X6, X7); 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X1>::ForwardType x1, 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6, 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType x7) { 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename CallbackParamTraits<X1>::ForwardType x1, 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6, 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType x7)> 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5), 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x6), CallbackForward(x7)); 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 7 -> 6. 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5, typename X6, typename X7> 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<1, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> { 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType, 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType, 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType, 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType, 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType, 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType); 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X2, X3, X4, X5, X6, X7); 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6, 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType x7) { 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X2>::ForwardType x2, 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6, 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType x7)> 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5), 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x6), CallbackForward(x7)); 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 7 -> 5. 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5, typename X6, typename X7> 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<2, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> { 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType, 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType, 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType, 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType, 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType); 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X3, X4, X5, X6, X7); 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6, 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType x7) { 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X3>::ForwardType x3, 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6, 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType x7)> 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5), 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x6), CallbackForward(x7)); 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 7 -> 4. 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5, typename X6, typename X7> 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<3, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> { 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType, 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType, 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType, 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType); 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X4, X5, X6, X7); 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6, 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType x7) { 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits; 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType x3 = 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound3UnwrapTraits::Unwrap(storage->p3_); 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType, 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X4>::ForwardType x4, 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6, 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType x7)> 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5), 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x6), CallbackForward(x7)); 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 7 -> 3. 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5, typename X6, typename X7> 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<4, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> { 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType, 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType, 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType); 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X5, X6, X7); 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6, 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType x7) { 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits; 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits; 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType x3 = 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound3UnwrapTraits::Unwrap(storage->p3_); 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType x4 = 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound4UnwrapTraits::Unwrap(storage->p4_); 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType, 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType, 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X5>::ForwardType x5, 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6, 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType x7)> 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5), 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x6), CallbackForward(x7)); 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 7 -> 2. 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5, typename X6, typename X7> 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<5, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> { 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType, 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType); 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X6, X7); 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6, 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType x7) { 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits; 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits; 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits; 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType x3 = 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound3UnwrapTraits::Unwrap(storage->p3_); 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType x4 = 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound4UnwrapTraits::Unwrap(storage->p4_); 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound5UnwrapTraits::ForwardType x5 = 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound5UnwrapTraits::Unwrap(storage->p5_); 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType, 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType, 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound5UnwrapTraits::ForwardType, 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X6>::ForwardType x6, 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType x7)> 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5), 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x6), CallbackForward(x7)); 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 7 -> 1. 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5, typename X6, typename X7> 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<6, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> { 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*, 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType); 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(X7); 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base, 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType x7) { 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits; 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits; 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits; 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound6UnwrapTraits Bound6UnwrapTraits; 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType x3 = 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound3UnwrapTraits::Unwrap(storage->p3_); 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType x4 = 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound4UnwrapTraits::Unwrap(storage->p4_); 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound5UnwrapTraits::ForwardType x5 = 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound5UnwrapTraits::Unwrap(storage->p5_); 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound6UnwrapTraits::ForwardType x6 = 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound6UnwrapTraits::Unwrap(storage->p6_); 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType, 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType, 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound5UnwrapTraits::ForwardType, 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound6UnwrapTraits::ForwardType, 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename CallbackParamTraits<X7>::ForwardType x7)> 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5), 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x6), CallbackForward(x7)); 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Arity 7 -> 0. 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename StorageType, typename R,typename X1, typename X2, 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename X3, typename X4, typename X5, typename X6, typename X7> 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Invoker<7, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> { 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(RunType)(BindStateBase*); 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef R(UnboundRunType)(); 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static R Run(BindStateBase* base) { 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StorageType* storage = static_cast<StorageType*>(base); 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Local references to make debugger stepping easier. If in a debugger, 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you really want to warp ahead and step through the 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InvokeHelper<>::MakeItSo() call below. 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits; 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits; 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits; 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits; 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits; 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound6UnwrapTraits Bound6UnwrapTraits; 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename StorageType::Bound7UnwrapTraits Bound7UnwrapTraits; 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound1UnwrapTraits::ForwardType x1 = 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound1UnwrapTraits::Unwrap(storage->p1_); 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType x2 = 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound2UnwrapTraits::Unwrap(storage->p2_); 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType x3 = 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound3UnwrapTraits::Unwrap(storage->p3_); 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType x4 = 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound4UnwrapTraits::Unwrap(storage->p4_); 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound5UnwrapTraits::ForwardType x5 = 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound5UnwrapTraits::Unwrap(storage->p5_); 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound6UnwrapTraits::ForwardType x6 = 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound6UnwrapTraits::Unwrap(storage->p6_); 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound7UnwrapTraits::ForwardType x7 = 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bound7UnwrapTraits::Unwrap(storage->p7_); 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InvokeHelper<StorageType::IsWeakCall::value, R, 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename StorageType::RunnableType, 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(typename Bound1UnwrapTraits::ForwardType, 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound2UnwrapTraits::ForwardType, 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound3UnwrapTraits::ForwardType, 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound4UnwrapTraits::ForwardType, 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound5UnwrapTraits::ForwardType, 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound6UnwrapTraits::ForwardType, 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Bound7UnwrapTraits::ForwardType)> 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::MakeItSo(storage->runnable_, CallbackForward(x1), 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x2), CallbackForward(x3), 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x4), CallbackForward(x5), 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackForward(x6), CallbackForward(x7)); 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BindState<> 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This stores all the state passed into Bind() and is also where most 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the template resolution magic occurs. 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Runnable is the functor we are binding arguments to. 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RunType is type of the Run() function that the Invoker<> should use. 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Normally, this is the same as the RunType of the Runnable, but it can 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be different if an adapter like IgnoreResult() has been used. 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BoundArgsType contains the storage type for all the bound arguments by 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (ab)using a function type. 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable, typename RunType, typename BoundArgsType> 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BindState; 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable, typename RunType> 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BindState<Runnable, RunType, void()> : public BindStateBase { 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Runnable RunnableType; 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef false_type IsWeakCall; 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Invoker<0, BindState, RunType> InvokerType; 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename InvokerType::UnboundRunType UnboundRunType; 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit BindState(const Runnable& runnable) 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : runnable_(runnable) { 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BindState() { } 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunnableType runnable_; 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable, typename RunType, typename P1> 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BindState<Runnable, RunType, void(P1)> : public BindStateBase { 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Runnable RunnableType; 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall; 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Invoker<1, BindState, RunType> InvokerType; 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename InvokerType::UnboundRunType UnboundRunType; 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convenience typedefs for bound argument types. 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P1> Bound1UnwrapTraits; 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BindState(const Runnable& runnable, const P1& p1) 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : runnable_(runnable), 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p1_(p1) { 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_); 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value, 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P1>::Release(p1_); } 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunnableType runnable_; 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P1 p1_; 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable, typename RunType, typename P1, typename P2> 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BindState<Runnable, RunType, void(P1, P2)> : public BindStateBase { 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Runnable RunnableType; 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall; 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Invoker<2, BindState, RunType> InvokerType; 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename InvokerType::UnboundRunType UnboundRunType; 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convenience typedefs for bound argument types. 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P1> Bound1UnwrapTraits; 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P2> Bound2UnwrapTraits; 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BindState(const Runnable& runnable, const P1& p1, const P2& p2) 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : runnable_(runnable), 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p1_(p1), 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p2_(p2) { 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_); 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value, 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P1>::Release(p1_); } 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunnableType runnable_; 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P1 p1_; 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P2 p2_; 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable, typename RunType, typename P1, typename P2, 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename P3> 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BindState<Runnable, RunType, void(P1, P2, P3)> : public BindStateBase { 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Runnable RunnableType; 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall; 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Invoker<3, BindState, RunType> InvokerType; 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename InvokerType::UnboundRunType UnboundRunType; 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convenience typedefs for bound argument types. 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P1> Bound1UnwrapTraits; 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P2> Bound2UnwrapTraits; 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P3> Bound3UnwrapTraits; 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3) 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : runnable_(runnable), 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p1_(p1), 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p2_(p2), 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p3_(p3) { 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_); 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value, 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P1>::Release(p1_); } 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunnableType runnable_; 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P1 p1_; 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P2 p2_; 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P3 p3_; 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable, typename RunType, typename P1, typename P2, 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename P3, typename P4> 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BindState<Runnable, RunType, void(P1, P2, P3, 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P4)> : public BindStateBase { 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Runnable RunnableType; 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall; 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Invoker<4, BindState, RunType> InvokerType; 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename InvokerType::UnboundRunType UnboundRunType; 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convenience typedefs for bound argument types. 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P1> Bound1UnwrapTraits; 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P2> Bound2UnwrapTraits; 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P3> Bound3UnwrapTraits; 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P4> Bound4UnwrapTraits; 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3, 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P4& p4) 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : runnable_(runnable), 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p1_(p1), 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p2_(p2), 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p3_(p3), 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p4_(p4) { 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_); 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value, 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P1>::Release(p1_); } 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunnableType runnable_; 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P1 p1_; 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P2 p2_; 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P3 p3_; 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P4 p4_; 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable, typename RunType, typename P1, typename P2, 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename P3, typename P4, typename P5> 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BindState<Runnable, RunType, void(P1, P2, P3, P4, 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P5)> : public BindStateBase { 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Runnable RunnableType; 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall; 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Invoker<5, BindState, RunType> InvokerType; 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename InvokerType::UnboundRunType UnboundRunType; 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convenience typedefs for bound argument types. 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P1> Bound1UnwrapTraits; 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P2> Bound2UnwrapTraits; 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P3> Bound3UnwrapTraits; 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P4> Bound4UnwrapTraits; 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P5> Bound5UnwrapTraits; 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3, 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P4& p4, const P5& p5) 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : runnable_(runnable), 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p1_(p1), 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p2_(p2), 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p3_(p3), 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p4_(p4), 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p5_(p5) { 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_); 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value, 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P1>::Release(p1_); } 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunnableType runnable_; 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P1 p1_; 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P2 p2_; 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P3 p3_; 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P4 p4_; 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P5 p5_; 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable, typename RunType, typename P1, typename P2, 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename P3, typename P4, typename P5, typename P6> 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BindState<Runnable, RunType, void(P1, P2, P3, P4, P5, 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P6)> : public BindStateBase { 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Runnable RunnableType; 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall; 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Invoker<6, BindState, RunType> InvokerType; 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename InvokerType::UnboundRunType UnboundRunType; 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convenience typedefs for bound argument types. 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P1> Bound1UnwrapTraits; 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P2> Bound2UnwrapTraits; 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P3> Bound3UnwrapTraits; 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P4> Bound4UnwrapTraits; 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P5> Bound5UnwrapTraits; 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P6> Bound6UnwrapTraits; 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3, 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P4& p4, const P5& p5, const P6& p6) 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : runnable_(runnable), 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p1_(p1), 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p2_(p2), 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p3_(p3), 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p4_(p4), 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p5_(p5), 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p6_(p6) { 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_); 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value, 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P1>::Release(p1_); } 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunnableType runnable_; 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P1 p1_; 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P2 p2_; 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P3 p3_; 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P4 p4_; 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P5 p5_; 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P6 p6_; 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Runnable, typename RunType, typename P1, typename P2, 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename P3, typename P4, typename P5, typename P6, typename P7> 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BindState<Runnable, RunType, void(P1, P2, P3, P4, P5, P6, 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P7)> : public BindStateBase { 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Runnable RunnableType; 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall; 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Invoker<7, BindState, RunType> InvokerType; 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename InvokerType::UnboundRunType UnboundRunType; 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convenience typedefs for bound argument types. 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P1> Bound1UnwrapTraits; 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P2> Bound2UnwrapTraits; 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P3> Bound3UnwrapTraits; 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P4> Bound4UnwrapTraits; 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P5> Bound5UnwrapTraits; 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P6> Bound6UnwrapTraits; 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef UnwrapTraits<P7> Bound7UnwrapTraits; 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3, 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const P4& p4, const P5& p5, const P6& p6, const P7& p7) 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : runnable_(runnable), 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p1_(p1), 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p2_(p2), 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p3_(p3), 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p4_(p4), 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p5_(p5), 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p6_(p6), 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p7_(p7) { 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_); 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value, 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P1>::Release(p1_); } 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunnableType runnable_; 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P1 p1_; 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P2 p2_; 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P3 p3_; 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P4 p4_; 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P5 p5_; 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P6 p6_; 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) P7 p7_; 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // BASE_BIND_INTERNAL_H_ 2790