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