// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This file automatically generated by testing/generate_gmock_mutant.py.
// DO NOT EDIT.

#ifndef TESTING_GMOCK_MUTANT_H_
#define TESTING_GMOCK_MUTANT_H_

// The intention of this file is to make possible using GMock actions in
// all of its syntactic beauty. Classes and helper functions can be used as
// more generic variants of Task and Callback classes (see base/task.h)
// Mutant supports both pre-bound arguments (like Task) and call-time
// arguments (like Callback) - hence the name. :-)
//
// DispatchToMethod/Function supports two sets of arguments: pre-bound (P) and
// call-time (C). The arguments as well as the return type are templatized.
// DispatchToMethod/Function will also try to call the selected method or
// function even if provided pre-bound arguments does not match exactly with
// the function signature hence the X1, X2 ... XN parameters in CreateFunctor.
// DispatchToMethod will try to invoke method that may not belong to the
// object's class itself but to the object's class base class.
//
// Additionally you can bind the object at calltime by binding a pointer to
// pointer to the object at creation time - before including this file you
// have to #define GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING.
//
// TODO(stoyan): It's yet not clear to me should we use T& and T&* instead
// of T* and T** when we invoke CreateFunctor to match the EXPECT_CALL style.
//
//
// Sample usage with gMock:
//
// struct Mock : public ObjectDelegate {
//   MOCK_METHOD2(string, OnRequest(int n, const string& request));
//   MOCK_METHOD1(void, OnQuit(int exit_code));
//   MOCK_METHOD2(void, LogMessage(int level, const string& message));
//
//   string HandleFlowers(const string& reply, int n, const string& request) {
//     string result = SStringPrintf("In request of %d %s ", n, request);
//     for (int i = 0; i < n; ++i) result.append(reply)
//     return result;
//   }
//
//   void DoLogMessage(int level, const string& message) {
//   }
//
//   void QuitMessageLoop(int seconds) {
//     base::MessageLoop* loop = base::MessageLoop::current();
//     loop->PostDelayedTask(FROM_HERE, base::MessageLoop::QuitClosure(),
//                           1000 * seconds);
//   }
// };
//
// Mock mock;
// // Will invoke mock.HandleFlowers("orchids", n, request)
// // "orchids" is a pre-bound argument, and <n> and <request> are call-time
// // arguments - they are not known until the OnRequest mock is invoked.
// EXPECT_CALL(mock, OnRequest(Ge(5), StartsWith("flower"))
//   .Times(1)
//   .WillOnce(Invoke(CreateFunctor(&mock, &Mock::HandleFlowers,
//       string("orchids"))));
//
//
// // No pre-bound arguments, two call-time arguments passed
// // directly to DoLogMessage
// EXPECT_CALL(mock, OnLogMessage(_, _))
//   .Times(AnyNumber())
//   .WillAlways(Invoke(CreateFunctor, &mock, &Mock::DoLogMessage));
//
//
// // In this case we have a single pre-bound argument - 3. We ignore
// // all of the arguments of OnQuit.
// EXCEPT_CALL(mock, OnQuit(_))
//   .Times(1)
//   .WillOnce(InvokeWithoutArgs(CreateFunctor(
//       &mock, &Mock::QuitMessageLoop, 3)));
//
// MessageLoop loop;
// loop.Run();
//
//
//  // Here is another example of how we can set an action that invokes
//  // method of an object that is not yet created.
// struct Mock : public ObjectDelegate {
//   MOCK_METHOD1(void, DemiurgeCreated(Demiurge*));
//   MOCK_METHOD2(void, OnRequest(int count, const string&));
//
//   void StoreDemiurge(Demiurge* w) {
//     demiurge_ = w;
//   }
//
//   Demiurge* demiurge;
// }
//
// EXPECT_CALL(mock, DemiurgeCreated(_)).Times(1)
//    .WillOnce(Invoke(CreateFunctor(&mock, &Mock::StoreDemiurge)));
//
// EXPECT_CALL(mock, OnRequest(_, StrEq("Moby Dick")))
//    .Times(AnyNumber())
//    .WillAlways(WithArgs<0>(Invoke(
//        CreateFunctor(&mock->demiurge_, &Demiurge::DecreaseMonsters))));
//

#include "base/memory/linked_ptr.h"
#include "base/tuple.h"  // for Tuple

namespace testing {

// 0 - 0
template <typename R, typename T, typename Method>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<>& p,
                          const Tuple<>& c) {
  return (obj->*method)();
}
template <typename R, typename Function>
inline R DispatchToFunction(Function function,
                            const Tuple<>& p,
                            const Tuple<>& c) {
  return (*function)();
}

// 0 - 1
template <typename R, typename T, typename Method, typename C1>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<>& p,
                          const Tuple<C1>& c) {
  return (obj->*method)(get<0>(c));
}
template <typename R, typename Function, typename C1>
inline R DispatchToFunction(Function function,
                            const Tuple<>& p,
                            const Tuple<C1>& c) {
  return (*function)(get<0>(c));
}

// 0 - 2
template <typename R, typename T, typename Method, typename C1, typename C2>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<>& p,
                          const Tuple<C1, C2>& c) {
  return (obj->*method)(get<0>(c), get<1>(c));
}
template <typename R, typename Function, typename C1, typename C2>
inline R DispatchToFunction(Function function,
                            const Tuple<>& p,
                            const Tuple<C1, C2>& c) {
  return (*function)(get<0>(c), get<1>(c));
}

// 0 - 3
template <typename R, typename T, typename Method, typename C1, typename C2,
          typename C3>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<>& p,
                          const Tuple<C1, C2, C3>& c) {
  return (obj->*method)(get<0>(c), get<1>(c), get<2>(c));
}
template <typename R, typename Function, typename C1, typename C2, typename C3>
inline R DispatchToFunction(Function function,
                            const Tuple<>& p,
                            const Tuple<C1, C2, C3>& c) {
  return (*function)(get<0>(c), get<1>(c), get<2>(c));
}

// 0 - 4
template <typename R, typename T, typename Method, typename C1, typename C2,
          typename C3, typename C4>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<>& p,
                          const Tuple<C1, C2, C3, C4>& c) {
  return (obj->*method)(get<0>(c), get<1>(c), get<2>(c), get<3>(c));
}
template <typename R, typename Function, typename C1, typename C2, typename C3,
          typename C4>
inline R DispatchToFunction(Function function,
                            const Tuple<>& p,
                            const Tuple<C1, C2, C3, C4>& c) {
  return (*function)(get<0>(c), get<1>(c), get<2>(c), get<3>(c));
}

// 0 - 5
template <typename R, typename T, typename Method, typename C1, typename C2,
          typename C3, typename C4, typename C5>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<>& p,
                          const Tuple<C1, C2, C3, C4, C5>& c) {
  return (obj->*method)(get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c));
}
template <typename R, typename Function, typename C1, typename C2, typename C3,
          typename C4, typename C5>
inline R DispatchToFunction(Function function,
                            const Tuple<>& p,
                            const Tuple<C1, C2, C3, C4, C5>& c) {
  return (*function)(get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c));
}

// 0 - 6
template <typename R, typename T, typename Method, typename C1, typename C2,
          typename C3, typename C4, typename C5, typename C6>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<>& p,
                          const Tuple<C1, C2, C3, C4, C5, C6>& c) {
  return (obj->*method)(get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c), get<5>(c));
}
template <typename R, typename Function, typename C1, typename C2, typename C3,
          typename C4, typename C5, typename C6>
inline R DispatchToFunction(Function function,
                            const Tuple<>& p,
                            const Tuple<C1, C2, C3, C4, C5, C6>& c) {
  return (*function)(get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c), get<5>(c));
}

// 1 - 0
template <typename R, typename T, typename Method, typename P1>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1>& p,
                          const Tuple<>& c) {
  return (obj->*method)(get<0>(p));
}
template <typename R, typename Function, typename P1>
inline R DispatchToFunction(Function function,
                            const Tuple<P1>& p,
                            const Tuple<>& c) {
  return (*function)(get<0>(p));
}

// 1 - 1
template <typename R, typename T, typename Method, typename P1, typename C1>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1>& p,
                          const Tuple<C1>& c) {
  return (obj->*method)(get<0>(p), get<0>(c));
}
template <typename R, typename Function, typename P1, typename C1>
inline R DispatchToFunction(Function function,
                            const Tuple<P1>& p,
                            const Tuple<C1>& c) {
  return (*function)(get<0>(p), get<0>(c));
}

// 1 - 2
template <typename R, typename T, typename Method, typename P1, typename C1,
          typename C2>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1>& p,
                          const Tuple<C1, C2>& c) {
  return (obj->*method)(get<0>(p), get<0>(c), get<1>(c));
}
template <typename R, typename Function, typename P1, typename C1, typename C2>
inline R DispatchToFunction(Function function,
                            const Tuple<P1>& p,
                            const Tuple<C1, C2>& c) {
  return (*function)(get<0>(p), get<0>(c), get<1>(c));
}

// 1 - 3
template <typename R, typename T, typename Method, typename P1, typename C1,
          typename C2, typename C3>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1>& p,
                          const Tuple<C1, C2, C3>& c) {
  return (obj->*method)(get<0>(p), get<0>(c), get<1>(c), get<2>(c));
}
template <typename R, typename Function, typename P1, typename C1, typename C2,
          typename C3>
inline R DispatchToFunction(Function function,
                            const Tuple<P1>& p,
                            const Tuple<C1, C2, C3>& c) {
  return (*function)(get<0>(p), get<0>(c), get<1>(c), get<2>(c));
}

// 1 - 4
template <typename R, typename T, typename Method, typename P1, typename C1,
          typename C2, typename C3, typename C4>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1>& p,
                          const Tuple<C1, C2, C3, C4>& c) {
  return (obj->*method)(get<0>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c));
}
template <typename R, typename Function, typename P1, typename C1, typename C2,
          typename C3, typename C4>
inline R DispatchToFunction(Function function,
                            const Tuple<P1>& p,
                            const Tuple<C1, C2, C3, C4>& c) {
  return (*function)(get<0>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c));
}

// 1 - 5
template <typename R, typename T, typename Method, typename P1, typename C1,
          typename C2, typename C3, typename C4, typename C5>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1>& p,
                          const Tuple<C1, C2, C3, C4, C5>& c) {
  return (obj->*method)(get<0>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c));
}
template <typename R, typename Function, typename P1, typename C1, typename C2,
          typename C3, typename C4, typename C5>
inline R DispatchToFunction(Function function,
                            const Tuple<P1>& p,
                            const Tuple<C1, C2, C3, C4, C5>& c) {
  return (*function)(get<0>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c));
}

// 1 - 6
template <typename R, typename T, typename Method, typename P1, typename C1,
          typename C2, typename C3, typename C4, typename C5, typename C6>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1>& p,
                          const Tuple<C1, C2, C3, C4, C5, C6>& c) {
  return (obj->*method)(get<0>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c), get<5>(c));
}
template <typename R, typename Function, typename P1, typename C1, typename C2,
          typename C3, typename C4, typename C5, typename C6>
inline R DispatchToFunction(Function function,
                            const Tuple<P1>& p,
                            const Tuple<C1, C2, C3, C4, C5, C6>& c) {
  return (*function)(get<0>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c), get<5>(c));
}

// 2 - 0
template <typename R, typename T, typename Method, typename P1, typename P2>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2>& p,
                          const Tuple<>& c) {
  return (obj->*method)(get<0>(p), get<1>(p));
}
template <typename R, typename Function, typename P1, typename P2>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2>& p,
                            const Tuple<>& c) {
  return (*function)(get<0>(p), get<1>(p));
}

// 2 - 1
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename C1>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2>& p,
                          const Tuple<C1>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<0>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename C1>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2>& p,
                            const Tuple<C1>& c) {
  return (*function)(get<0>(p), get<1>(p), get<0>(c));
}

// 2 - 2
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename C1, typename C2>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2>& p,
                          const Tuple<C1, C2>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<0>(c), get<1>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename C1,
          typename C2>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2>& p,
                            const Tuple<C1, C2>& c) {
  return (*function)(get<0>(p), get<1>(p), get<0>(c), get<1>(c));
}

// 2 - 3
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename C1, typename C2, typename C3>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2>& p,
                          const Tuple<C1, C2, C3>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<0>(c), get<1>(c), get<2>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename C1,
          typename C2, typename C3>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2>& p,
                            const Tuple<C1, C2, C3>& c) {
  return (*function)(get<0>(p), get<1>(p), get<0>(c), get<1>(c), get<2>(c));
}

// 2 - 4
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename C1, typename C2, typename C3, typename C4>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2>& p,
                          const Tuple<C1, C2, C3, C4>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename C1,
          typename C2, typename C3, typename C4>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2>& p,
                            const Tuple<C1, C2, C3, C4>& c) {
  return (*function)(get<0>(p), get<1>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c));
}

// 2 - 5
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename C1, typename C2, typename C3, typename C4, typename C5>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2>& p,
                          const Tuple<C1, C2, C3, C4, C5>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename C1,
          typename C2, typename C3, typename C4, typename C5>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2>& p,
                            const Tuple<C1, C2, C3, C4, C5>& c) {
  return (*function)(get<0>(p), get<1>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c));
}

// 2 - 6
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename C1, typename C2, typename C3, typename C4, typename C5,
          typename C6>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2>& p,
                          const Tuple<C1, C2, C3, C4, C5, C6>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c), get<5>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename C1,
          typename C2, typename C3, typename C4, typename C5, typename C6>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2>& p,
                            const Tuple<C1, C2, C3, C4, C5, C6>& c) {
  return (*function)(get<0>(p), get<1>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c), get<5>(c));
}

// 3 - 0
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3>& p,
                          const Tuple<>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p));
}
template <typename R, typename Function, typename P1, typename P2, typename P3>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3>& p,
                            const Tuple<>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p));
}

// 3 - 1
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename C1>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3>& p,
                          const Tuple<C1>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<0>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename C1>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3>& p,
                            const Tuple<C1>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<0>(c));
}

// 3 - 2
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename C1, typename C2>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3>& p,
                          const Tuple<C1, C2>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<0>(c), get<1>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename C1, typename C2>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3>& p,
                            const Tuple<C1, C2>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<0>(c), get<1>(c));
}

// 3 - 3
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename C1, typename C2, typename C3>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3>& p,
                          const Tuple<C1, C2, C3>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<0>(c), get<1>(c), get<2>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename C1, typename C2, typename C3>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3>& p,
                            const Tuple<C1, C2, C3>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<0>(c), get<1>(c), get<2>(c));
}

// 3 - 4
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename C1, typename C2, typename C3, typename C4>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3>& p,
                          const Tuple<C1, C2, C3, C4>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename C1, typename C2, typename C3, typename C4>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3>& p,
                            const Tuple<C1, C2, C3, C4>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c));
}

// 3 - 5
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename C1, typename C2, typename C3, typename C4,
          typename C5>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3>& p,
                          const Tuple<C1, C2, C3, C4, C5>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename C1, typename C2, typename C3, typename C4, typename C5>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3>& p,
                            const Tuple<C1, C2, C3, C4, C5>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c));
}

// 3 - 6
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename C1, typename C2, typename C3, typename C4,
          typename C5, typename C6>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3>& p,
                          const Tuple<C1, C2, C3, C4, C5, C6>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c), get<5>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename C1, typename C2, typename C3, typename C4, typename C5,
          typename C6>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3>& p,
                            const Tuple<C1, C2, C3, C4, C5, C6>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c), get<5>(c));
}

// 4 - 0
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4>& p,
                          const Tuple<>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4>& p,
                            const Tuple<>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p));
}

// 4 - 1
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename C1>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4>& p,
                          const Tuple<C1>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<0>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename C1>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4>& p,
                            const Tuple<C1>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<0>(c));
}

// 4 - 2
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename C1, typename C2>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4>& p,
                          const Tuple<C1, C2>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<0>(c), get<1>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename C1, typename C2>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4>& p,
                            const Tuple<C1, C2>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<0>(c), get<1>(c));
}

// 4 - 3
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename C1, typename C2, typename C3>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4>& p,
                          const Tuple<C1, C2, C3>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<0>(c), get<1>(c), get<2>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename C1, typename C2, typename C3>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4>& p,
                            const Tuple<C1, C2, C3>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<0>(c), get<1>(c), get<2>(c));
}

// 4 - 4
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename C1, typename C2, typename C3,
          typename C4>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4>& p,
                          const Tuple<C1, C2, C3, C4>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename C1, typename C2, typename C3, typename C4>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4>& p,
                            const Tuple<C1, C2, C3, C4>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c));
}

// 4 - 5
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename C1, typename C2, typename C3,
          typename C4, typename C5>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4>& p,
                          const Tuple<C1, C2, C3, C4, C5>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename C1, typename C2, typename C3, typename C4,
          typename C5>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4>& p,
                            const Tuple<C1, C2, C3, C4, C5>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c));
}

// 4 - 6
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename C1, typename C2, typename C3,
          typename C4, typename C5, typename C6>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4>& p,
                          const Tuple<C1, C2, C3, C4, C5, C6>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c), get<5>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename C1, typename C2, typename C3, typename C4,
          typename C5, typename C6>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4>& p,
                            const Tuple<C1, C2, C3, C4, C5, C6>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c), get<5>(c));
}

// 5 - 0
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename P5>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4, P5>& p,
                          const Tuple<>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename P5>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4, P5>& p,
                            const Tuple<>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p));
}

// 5 - 1
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename C1>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4, P5>& p,
                          const Tuple<C1>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<0>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename P5, typename C1>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4, P5>& p,
                            const Tuple<C1>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<0>(c));
}

// 5 - 2
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename C1, typename C2>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4, P5>& p,
                          const Tuple<C1, C2>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<0>(c), get<1>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename P5, typename C1, typename C2>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4, P5>& p,
                            const Tuple<C1, C2>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<0>(c), get<1>(c));
}

// 5 - 3
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename C1, typename C2,
          typename C3>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4, P5>& p,
                          const Tuple<C1, C2, C3>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<0>(c), get<1>(c), get<2>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename P5, typename C1, typename C2, typename C3>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4, P5>& p,
                            const Tuple<C1, C2, C3>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<0>(c), get<1>(c), get<2>(c));
}

// 5 - 4
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename C1, typename C2,
          typename C3, typename C4>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4, P5>& p,
                          const Tuple<C1, C2, C3, C4>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename P5, typename C1, typename C2, typename C3,
          typename C4>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4, P5>& p,
                            const Tuple<C1, C2, C3, C4>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c));
}

// 5 - 5
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename C1, typename C2,
          typename C3, typename C4, typename C5>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4, P5>& p,
                          const Tuple<C1, C2, C3, C4, C5>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename P5, typename C1, typename C2, typename C3,
          typename C4, typename C5>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4, P5>& p,
                            const Tuple<C1, C2, C3, C4, C5>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c));
}

// 5 - 6
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename C1, typename C2,
          typename C3, typename C4, typename C5, typename C6>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4, P5>& p,
                          const Tuple<C1, C2, C3, C4, C5, C6>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c), get<5>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename P5, typename C1, typename C2, typename C3,
          typename C4, typename C5, typename C6>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4, P5>& p,
                            const Tuple<C1, C2, C3, C4, C5, C6>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c), get<5>(c));
}

// 6 - 0
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4, P5, P6>& p,
                          const Tuple<>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<5>(p));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename P5, typename P6>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4, P5, P6>& p,
                            const Tuple<>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<5>(p));
}

// 6 - 1
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename C1>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4, P5, P6>& p,
                          const Tuple<C1>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<5>(p), get<0>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename P5, typename P6, typename C1>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4, P5, P6>& p,
                            const Tuple<C1>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<5>(p), get<0>(c));
}

// 6 - 2
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename C1,
          typename C2>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4, P5, P6>& p,
                          const Tuple<C1, C2>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<5>(p), get<0>(c), get<1>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename P5, typename P6, typename C1, typename C2>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4, P5, P6>& p,
                            const Tuple<C1, C2>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<5>(p), get<0>(c), get<1>(c));
}

// 6 - 3
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename C1,
          typename C2, typename C3>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4, P5, P6>& p,
                          const Tuple<C1, C2, C3>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<5>(p), get<0>(c), get<1>(c), get<2>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename P5, typename P6, typename C1, typename C2,
          typename C3>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4, P5, P6>& p,
                            const Tuple<C1, C2, C3>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<5>(p), get<0>(c), get<1>(c), get<2>(c));
}

// 6 - 4
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename C1,
          typename C2, typename C3, typename C4>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4, P5, P6>& p,
                          const Tuple<C1, C2, C3, C4>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<5>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename P5, typename P6, typename C1, typename C2,
          typename C3, typename C4>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4, P5, P6>& p,
                            const Tuple<C1, C2, C3, C4>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<5>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c));
}

// 6 - 5
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename C1,
          typename C2, typename C3, typename C4, typename C5>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4, P5, P6>& p,
                          const Tuple<C1, C2, C3, C4, C5>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<5>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename P5, typename P6, typename C1, typename C2,
          typename C3, typename C4, typename C5>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4, P5, P6>& p,
                            const Tuple<C1, C2, C3, C4, C5>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<5>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c));
}

// 6 - 6
template <typename R, typename T, typename Method, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename C1,
          typename C2, typename C3, typename C4, typename C5, typename C6>
inline R DispatchToMethod(T* obj, Method method,
                          const Tuple<P1, P2, P3, P4, P5, P6>& p,
                          const Tuple<C1, C2, C3, C4, C5, C6>& c) {
  return (obj->*method)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<5>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c), get<5>(c));
}
template <typename R, typename Function, typename P1, typename P2, typename P3,
          typename P4, typename P5, typename P6, typename C1, typename C2,
          typename C3, typename C4, typename C5, typename C6>
inline R DispatchToFunction(Function function,
                            const Tuple<P1, P2, P3, P4, P5, P6>& p,
                            const Tuple<C1, C2, C3, C4, C5, C6>& c) {
  return (*function)(get<0>(p), get<1>(p), get<2>(p), get<3>(p), get<4>(p), get<5>(p), get<0>(c), get<1>(c), get<2>(c), get<3>(c), get<4>(c), get<5>(c));
}

// Interface that is exposed to the consumer, that does the actual calling
// of the method.
template <typename R, typename Params>
class MutantRunner {
 public:
  virtual R RunWithParams(const Params& params) = 0;
  virtual ~MutantRunner() {}
};

// Mutant holds pre-bound arguments (like Task). Like Callback
// allows call-time arguments. You bind a pointer to the object
// at creation time.
template <typename R, typename T, typename Method,
          typename PreBound, typename Params>
class Mutant : public MutantRunner<R, Params> {
 public:
  Mutant(T* obj, Method method, const PreBound& pb)
      : obj_(obj), method_(method), pb_(pb) {
  }

  // MutantRunner implementation
  virtual R RunWithParams(const Params& params) {
    return DispatchToMethod<R>(this->obj_, this->method_, pb_, params);
  }

  T* obj_;
  Method method_;
  PreBound pb_;
};

template <typename R, typename Function, typename PreBound, typename Params>
class MutantFunction : public MutantRunner<R, Params> {
 public:
  MutantFunction(Function function, const PreBound& pb)
      : function_(function), pb_(pb) {
  }

  // MutantRunner implementation
  virtual R RunWithParams(const Params& params) {
    return DispatchToFunction<R>(function_, pb_, params);
  }

  Function function_;
  PreBound pb_;
};

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
// MutantLateBind is like Mutant, but you bind a pointer to a pointer
// to the object. This way you can create actions for an object
// that is not yet created (has only storage for a pointer to it).
template <typename R, typename T, typename Method,
          typename PreBound, typename Params>
class MutantLateObjectBind : public MutantRunner<R, Params> {
 public:
  MutantLateObjectBind(T** obj, Method method, const PreBound& pb)
      : obj_(obj), method_(method), pb_(pb) {
  }

  // MutantRunner implementation.
  virtual R RunWithParams(const Params& params) {
    EXPECT_THAT(*this->obj_, testing::NotNull());
    if (NULL == *this->obj_)
      return R();
    return DispatchToMethod<R>( *this->obj_, this->method_, pb_, params);
  }

  T** obj_;
  Method method_;
  PreBound pb_;
};
#endif

// Simple MutantRunner<> wrapper acting as a functor.
// Redirects operator() to MutantRunner<Params>::Run()
template <typename R, typename Params>
struct MutantFunctor {
  explicit MutantFunctor(MutantRunner<R, Params>*  cb) : impl_(cb) {
  }

  ~MutantFunctor() {
  }

  inline R operator()() {
    return impl_->RunWithParams(Tuple<>());
  }

  template <typename Arg1>
  inline R operator()(const Arg1& a) {
    return impl_->RunWithParams(Params(a));
  }

  template <typename Arg1, typename Arg2>
  inline R operator()(const Arg1& a, const Arg2& b) {
    return impl_->RunWithParams(Params(a, b));
  }

  template <typename Arg1, typename Arg2, typename Arg3>
  inline R operator()(const Arg1& a, const Arg2& b, const Arg3& c) {
    return impl_->RunWithParams(Params(a, b, c));
  }

  template <typename Arg1, typename Arg2, typename Arg3, typename Arg4>
  inline R operator()(const Arg1& a, const Arg2& b, const Arg3& c,
                         const Arg4& d) {
    return impl_->RunWithParams(Params(a, b, c, d));
  }

 private:
  // We need copy constructor since MutantFunctor is copied few times
  // inside GMock machinery, hence no DISALLOW_EVIL_CONTRUCTORS
  MutantFunctor();
  linked_ptr<MutantRunner<R, Params> > impl_;
};

// 0 - 0
template <typename R, typename T, typename U>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T* obj, R (U::*method)()) {
  MutantRunner<R, Tuple<>>* t =
      new Mutant<R, T, R (U::*)(),
                 Tuple<>, Tuple<>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<>>(t);
}

template <typename R>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(R (*function)()) {
  MutantRunner<R, Tuple<>>* t =
      new MutantFunction<R, R (*)(),
                         Tuple<>, Tuple<>>
          (function, MakeTuple());
  return MutantFunctor<R, Tuple<>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T** obj, R (U::*method)()) {
  MutantRunner<R, Tuple<>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(),
                               Tuple<>, Tuple<>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T* obj, R (__stdcall U::*method)()) {
  MutantRunner<R, Tuple<>>* t =
      new Mutant<R, T, R (__stdcall U::*)(),
                 Tuple<>, Tuple<>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<>>(t);
}

template <typename R>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(R (__stdcall *function)()) {
  MutantRunner<R, Tuple<>>* t =
      new MutantFunction<R, R (__stdcall *)(),
                         Tuple<>, Tuple<>>
          (function, MakeTuple());
  return MutantFunctor<R, Tuple<>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T** obj, R (__stdcall U::*method)()) {
  MutantRunner<R, Tuple<>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(),
                               Tuple<>, Tuple<>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 0 - 1
template <typename R, typename T, typename U, typename A1>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T* obj, R (U::*method)(A1)) {
  MutantRunner<R, Tuple<A1>>* t =
      new Mutant<R, T, R (U::*)(A1),
                 Tuple<>, Tuple<A1>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1>>(t);
}

template <typename R, typename A1>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(R (*function)(A1)) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantFunction<R, R (*)(A1),
                         Tuple<>, Tuple<A1>>
          (function, MakeTuple());
  return MutantFunctor<R, Tuple<A1>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename A1>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T** obj, R (U::*method)(A1)) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(A1),
                               Tuple<>, Tuple<A1>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename A1>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T* obj, R (__stdcall U::*method)(A1)) {
  MutantRunner<R, Tuple<A1>>* t =
      new Mutant<R, T, R (__stdcall U::*)(A1),
                 Tuple<>, Tuple<A1>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1>>(t);
}

template <typename R, typename A1>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(R (__stdcall *function)(A1)) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantFunction<R, R (__stdcall *)(A1),
                         Tuple<>, Tuple<A1>>
          (function, MakeTuple());
  return MutantFunctor<R, Tuple<A1>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename A1>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T** obj, R (__stdcall U::*method)(A1)) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(A1),
                               Tuple<>, Tuple<A1>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 0 - 2
template <typename R, typename T, typename U, typename A1, typename A2>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T* obj, R (U::*method)(A1, A2)) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new Mutant<R, T, R (U::*)(A1, A2),
                 Tuple<>, Tuple<A1, A2>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

template <typename R, typename A1, typename A2>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(R (*function)(A1, A2)) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantFunction<R, R (*)(A1, A2),
                         Tuple<>, Tuple<A1, A2>>
          (function, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename A1, typename A2>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T** obj, R (U::*method)(A1, A2)) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(A1, A2),
                               Tuple<>, Tuple<A1, A2>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename A1, typename A2>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T* obj, R (__stdcall U::*method)(A1, A2)) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new Mutant<R, T, R (__stdcall U::*)(A1, A2),
                 Tuple<>, Tuple<A1, A2>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

template <typename R, typename A1, typename A2>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(R (__stdcall *function)(A1, A2)) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantFunction<R, R (__stdcall *)(A1, A2),
                         Tuple<>, Tuple<A1, A2>>
          (function, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename A1, typename A2>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T** obj, R (__stdcall U::*method)(A1, A2)) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(A1, A2),
                               Tuple<>, Tuple<A1, A2>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 0 - 3
template <typename R, typename T, typename U, typename A1, typename A2,
          typename A3>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T* obj, R (U::*method)(A1, A2, A3)) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new Mutant<R, T, R (U::*)(A1, A2, A3),
                 Tuple<>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

template <typename R, typename A1, typename A2, typename A3>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(R (*function)(A1, A2, A3)) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantFunction<R, R (*)(A1, A2, A3),
                         Tuple<>, Tuple<A1, A2, A3>>
          (function, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename A1, typename A2,
          typename A3>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T** obj, R (U::*method)(A1, A2, A3)) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(A1, A2, A3),
                               Tuple<>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename A1, typename A2,
          typename A3>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T* obj, R (__stdcall U::*method)(A1, A2, A3)) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new Mutant<R, T, R (__stdcall U::*)(A1, A2, A3),
                 Tuple<>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

template <typename R, typename A1, typename A2, typename A3>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(R (__stdcall *function)(A1, A2, A3)) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantFunction<R, R (__stdcall *)(A1, A2, A3),
                         Tuple<>, Tuple<A1, A2, A3>>
          (function, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename A1, typename A2,
          typename A3>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T** obj, R (__stdcall U::*method)(A1, A2, A3)) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(A1, A2, A3),
                               Tuple<>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 0 - 4
template <typename R, typename T, typename U, typename A1, typename A2,
          typename A3, typename A4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T* obj, R (U::*method)(A1, A2, A3, A4)) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new Mutant<R, T, R (U::*)(A1, A2, A3, A4),
                 Tuple<>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

template <typename R, typename A1, typename A2, typename A3, typename A4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(R (*function)(A1, A2, A3, A4)) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantFunction<R, R (*)(A1, A2, A3, A4),
                         Tuple<>, Tuple<A1, A2, A3, A4>>
          (function, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename A1, typename A2,
          typename A3, typename A4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T** obj, R (U::*method)(A1, A2, A3, A4)) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(A1, A2, A3, A4),
                               Tuple<>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename A1, typename A2,
          typename A3, typename A4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T* obj, R (__stdcall U::*method)(A1, A2, A3, A4)) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new Mutant<R, T, R (__stdcall U::*)(A1, A2, A3, A4),
                 Tuple<>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

template <typename R, typename A1, typename A2, typename A3, typename A4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(R (__stdcall *function)(A1, A2, A3, A4)) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantFunction<R, R (__stdcall *)(A1, A2, A3, A4),
                         Tuple<>, Tuple<A1, A2, A3, A4>>
          (function, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename A1, typename A2,
          typename A3, typename A4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T** obj, R (__stdcall U::*method)(A1, A2, A3, A4)) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(A1, A2, A3, A4),
                               Tuple<>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 0 - 5
template <typename R, typename T, typename U, typename A1, typename A2,
          typename A3, typename A4, typename A5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T* obj, R (U::*method)(A1, A2, A3, A4, A5)) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new Mutant<R, T, R (U::*)(A1, A2, A3, A4, A5),
                 Tuple<>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

template <typename R, typename A1, typename A2, typename A3, typename A4,
          typename A5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(R (*function)(A1, A2, A3, A4, A5)) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantFunction<R, R (*)(A1, A2, A3, A4, A5),
                         Tuple<>, Tuple<A1, A2, A3, A4, A5>>
          (function, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename A1, typename A2,
          typename A3, typename A4, typename A5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T** obj, R (U::*method)(A1, A2, A3, A4, A5)) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(A1, A2, A3, A4, A5),
                               Tuple<>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename A1, typename A2,
          typename A3, typename A4, typename A5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T* obj, R (__stdcall U::*method)(A1, A2, A3, A4, A5)) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new Mutant<R, T, R (__stdcall U::*)(A1, A2, A3, A4, A5),
                 Tuple<>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

template <typename R, typename A1, typename A2, typename A3, typename A4,
          typename A5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(R (__stdcall *function)(A1, A2, A3, A4, A5)) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantFunction<R, R (__stdcall *)(A1, A2, A3, A4, A5),
                         Tuple<>, Tuple<A1, A2, A3, A4, A5>>
          (function, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename A1, typename A2,
          typename A3, typename A4, typename A5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T** obj, R (__stdcall U::*method)(A1, A2, A3, A4, A5)) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(A1, A2, A3, A4, A5),
                               Tuple<>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 0 - 6
template <typename R, typename T, typename U, typename A1, typename A2,
          typename A3, typename A4, typename A5, typename A6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T* obj, R (U::*method)(A1, A2, A3, A4, A5, A6)) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new Mutant<R, T, R (U::*)(A1, A2, A3, A4, A5, A6),
                 Tuple<>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

template <typename R, typename A1, typename A2, typename A3, typename A4,
          typename A5, typename A6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(R (*function)(A1, A2, A3, A4, A5, A6)) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantFunction<R, R (*)(A1, A2, A3, A4, A5, A6),
                         Tuple<>, Tuple<A1, A2, A3, A4, A5, A6>>
          (function, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename A1, typename A2,
          typename A3, typename A4, typename A5, typename A6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T** obj, R (U::*method)(A1, A2, A3, A4, A5, A6)) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(A1, A2, A3, A4, A5, A6),
                               Tuple<>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename A1, typename A2,
          typename A3, typename A4, typename A5, typename A6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T* obj, R (__stdcall U::*method)(A1, A2, A3, A4, A5, A6)) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new Mutant<R, T, R (__stdcall U::*)(A1, A2, A3, A4, A5, A6),
                 Tuple<>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

template <typename R, typename A1, typename A2, typename A3, typename A4,
          typename A5, typename A6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(R (__stdcall *function)(A1, A2, A3, A4, A5, A6)) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantFunction<R, R (__stdcall *)(A1, A2, A3, A4, A5, A6),
                         Tuple<>, Tuple<A1, A2, A3, A4, A5, A6>>
          (function, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename A1, typename A2,
          typename A3, typename A4, typename A5, typename A6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T** obj, R (__stdcall U::*method)(A1, A2, A3, A4, A5, A6)) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(A1, A2, A3, A4, A5, A6),
                               Tuple<>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple());
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 1 - 0
template <typename R, typename T, typename U, typename P1, typename X1>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T* obj, R (U::*method)(X1), const P1& p1) {
  MutantRunner<R, Tuple<>>* t =
      new Mutant<R, T, R (U::*)(X1),
                 Tuple<P1>, Tuple<>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<>>(t);
}

template <typename R, typename P1, typename X1>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(R (*function)(X1), const P1& p1) {
  MutantRunner<R, Tuple<>>* t =
      new MutantFunction<R, R (*)(X1),
                         Tuple<P1>, Tuple<>>
          (function, MakeTuple(p1));
  return MutantFunctor<R, Tuple<>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename X1>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T** obj, R (U::*method)(X1), const P1& p1) {
  MutantRunner<R, Tuple<>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1),
                               Tuple<P1>, Tuple<>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename X1>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1), const P1& p1) {
  MutantRunner<R, Tuple<>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1),
                 Tuple<P1>, Tuple<>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<>>(t);
}

template <typename R, typename P1, typename X1>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(R (__stdcall *function)(X1), const P1& p1) {
  MutantRunner<R, Tuple<>>* t =
      new MutantFunction<R, R (__stdcall *)(X1),
                         Tuple<P1>, Tuple<>>
          (function, MakeTuple(p1));
  return MutantFunctor<R, Tuple<>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename X1>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1), const P1& p1) {
  MutantRunner<R, Tuple<>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1),
                               Tuple<P1>, Tuple<>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 1 - 1
template <typename R, typename T, typename U, typename P1, typename A1,
          typename X1>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T* obj, R (U::*method)(X1, A1), const P1& p1) {
  MutantRunner<R, Tuple<A1>>* t =
      new Mutant<R, T, R (U::*)(X1, A1),
                 Tuple<P1>, Tuple<A1>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1>>(t);
}

template <typename R, typename P1, typename A1, typename X1>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(R (*function)(X1, A1), const P1& p1) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantFunction<R, R (*)(X1, A1),
                         Tuple<P1>, Tuple<A1>>
          (function, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename A1,
          typename X1>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T** obj, R (U::*method)(X1, A1), const P1& p1) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, A1),
                               Tuple<P1>, Tuple<A1>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename A1,
          typename X1>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, A1), const P1& p1) {
  MutantRunner<R, Tuple<A1>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, A1),
                 Tuple<P1>, Tuple<A1>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1>>(t);
}

template <typename R, typename P1, typename A1, typename X1>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(R (__stdcall *function)(X1, A1), const P1& p1) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, A1),
                         Tuple<P1>, Tuple<A1>>
          (function, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename A1,
          typename X1>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, A1), const P1& p1) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, A1),
                               Tuple<P1>, Tuple<A1>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 1 - 2
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename X1>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T* obj, R (U::*method)(X1, A1, A2), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new Mutant<R, T, R (U::*)(X1, A1, A2),
                 Tuple<P1>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

template <typename R, typename P1, typename A1, typename A2, typename X1>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(R (*function)(X1, A1, A2), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantFunction<R, R (*)(X1, A1, A2),
                         Tuple<P1>, Tuple<A1, A2>>
          (function, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename X1>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T** obj, R (U::*method)(X1, A1, A2), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, A1, A2),
                               Tuple<P1>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename X1>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, A1, A2), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, A1, A2),
                 Tuple<P1>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

template <typename R, typename P1, typename A1, typename A2, typename X1>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(R (__stdcall *function)(X1, A1, A2), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, A1, A2),
                         Tuple<P1>, Tuple<A1, A2>>
          (function, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename X1>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, A1, A2), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, A1, A2),
                               Tuple<P1>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 1 - 3
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename A3, typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T* obj, R (U::*method)(X1, A1, A2, A3), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new Mutant<R, T, R (U::*)(X1, A1, A2, A3),
                 Tuple<P1>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

template <typename R, typename P1, typename A1, typename A2, typename A3,
          typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(R (*function)(X1, A1, A2, A3), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantFunction<R, R (*)(X1, A1, A2, A3),
                         Tuple<P1>, Tuple<A1, A2, A3>>
          (function, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename A3, typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T** obj, R (U::*method)(X1, A1, A2, A3), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, A1, A2, A3),
                               Tuple<P1>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename A3, typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, A1, A2, A3), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, A1, A2, A3),
                 Tuple<P1>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

template <typename R, typename P1, typename A1, typename A2, typename A3,
          typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(R (__stdcall *function)(X1, A1, A2, A3), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, A1, A2, A3),
                         Tuple<P1>, Tuple<A1, A2, A3>>
          (function, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename A3, typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, A1, A2, A3), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, A1, A2, A3),
                               Tuple<P1>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 1 - 4
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename A3, typename A4, typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T* obj, R (U::*method)(X1, A1, A2, A3, A4), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new Mutant<R, T, R (U::*)(X1, A1, A2, A3, A4),
                 Tuple<P1>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

template <typename R, typename P1, typename A1, typename A2, typename A3,
          typename A4, typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(R (*function)(X1, A1, A2, A3, A4), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantFunction<R, R (*)(X1, A1, A2, A3, A4),
                         Tuple<P1>, Tuple<A1, A2, A3, A4>>
          (function, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename A3, typename A4, typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T** obj, R (U::*method)(X1, A1, A2, A3, A4), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, A1, A2, A3, A4),
                               Tuple<P1>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename A3, typename A4, typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, A1, A2, A3, A4),
    const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, A1, A2, A3, A4),
                 Tuple<P1>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

template <typename R, typename P1, typename A1, typename A2, typename A3,
          typename A4, typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(R (__stdcall *function)(X1, A1, A2, A3, A4), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, A1, A2, A3, A4),
                         Tuple<P1>, Tuple<A1, A2, A3, A4>>
          (function, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename A3, typename A4, typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, A1, A2, A3, A4),
    const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, A1, A2, A3, A4),
                               Tuple<P1>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 1 - 5
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T* obj, R (U::*method)(X1, A1, A2, A3, A4, A5), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new Mutant<R, T, R (U::*)(X1, A1, A2, A3, A4, A5),
                 Tuple<P1>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

template <typename R, typename P1, typename A1, typename A2, typename A3,
          typename A4, typename A5, typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(R (*function)(X1, A1, A2, A3, A4, A5), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantFunction<R, R (*)(X1, A1, A2, A3, A4, A5),
                         Tuple<P1>, Tuple<A1, A2, A3, A4, A5>>
          (function, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T** obj, R (U::*method)(X1, A1, A2, A3, A4, A5), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, A1, A2, A3, A4, A5),
                               Tuple<P1>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, A1, A2, A3, A4, A5),
    const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, A1, A2, A3, A4, A5),
                 Tuple<P1>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

template <typename R, typename P1, typename A1, typename A2, typename A3,
          typename A4, typename A5, typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(R (__stdcall *function)(X1, A1, A2, A3, A4, A5), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, A1, A2, A3, A4, A5),
                         Tuple<P1>, Tuple<A1, A2, A3, A4, A5>>
          (function, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, A1, A2, A3, A4, A5),
    const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, A1, A2, A3, A4, A5),
                               Tuple<P1>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 1 - 6
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename A6,
          typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T* obj, R (U::*method)(X1, A1, A2, A3, A4, A5, A6),
    const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new Mutant<R, T, R (U::*)(X1, A1, A2, A3, A4, A5, A6),
                 Tuple<P1>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

template <typename R, typename P1, typename A1, typename A2, typename A3,
          typename A4, typename A5, typename A6, typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(R (*function)(X1, A1, A2, A3, A4, A5, A6), const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantFunction<R, R (*)(X1, A1, A2, A3, A4, A5, A6),
                         Tuple<P1>, Tuple<A1, A2, A3, A4, A5, A6>>
          (function, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename A6,
          typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T** obj, R (U::*method)(X1, A1, A2, A3, A4, A5, A6),
    const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, A1, A2, A3, A4, A5, A6),
                               Tuple<P1>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename A6,
          typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, A1, A2, A3, A4, A5, A6),
    const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, A1, A2, A3, A4, A5, A6),
                 Tuple<P1>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

template <typename R, typename P1, typename A1, typename A2, typename A3,
          typename A4, typename A5, typename A6, typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(R (__stdcall *function)(X1, A1, A2, A3, A4, A5, A6),
    const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, A1, A2, A3, A4, A5, A6),
                         Tuple<P1>, Tuple<A1, A2, A3, A4, A5, A6>>
          (function, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename A6,
          typename X1>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, A1, A2, A3, A4, A5, A6),
    const P1& p1) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, A1, A2, A3, A4, A5, A6),
                               Tuple<P1>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 2 - 0
template <typename R, typename T, typename U, typename P1, typename P2,
          typename X1, typename X2>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T* obj, R (U::*method)(X1, X2), const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<>>* t =
      new Mutant<R, T, R (U::*)(X1, X2),
                 Tuple<P1, P2>, Tuple<>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<>>(t);
}

template <typename R, typename P1, typename P2, typename X1, typename X2>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(R (*function)(X1, X2), const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<>>* t =
      new MutantFunction<R, R (*)(X1, X2),
                         Tuple<P1, P2>, Tuple<>>
          (function, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename X1, typename X2>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T** obj, R (U::*method)(X1, X2), const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2),
                               Tuple<P1, P2>, Tuple<>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename X1, typename X2>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2),
                 Tuple<P1, P2>, Tuple<>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<>>(t);
}

template <typename R, typename P1, typename P2, typename X1, typename X2>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(R (__stdcall *function)(X1, X2), const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2),
                         Tuple<P1, P2>, Tuple<>>
          (function, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename X1, typename X2>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2),
                               Tuple<P1, P2>, Tuple<>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 2 - 1
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, A1), const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<A1>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, A1),
                 Tuple<P1, P2>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1>>(t);
}

template <typename R, typename P1, typename P2, typename A1, typename X1,
          typename X2>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(R (*function)(X1, X2, A1), const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantFunction<R, R (*)(X1, X2, A1),
                         Tuple<P1, P2>, Tuple<A1>>
          (function, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, A1), const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, A1),
                               Tuple<P1, P2>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, A1), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, A1),
                 Tuple<P1, P2>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1>>(t);
}

template <typename R, typename P1, typename P2, typename A1, typename X1,
          typename X2>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(R (__stdcall *function)(X1, X2, A1), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, A1),
                         Tuple<P1, P2>, Tuple<A1>>
          (function, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, A1), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, A1),
                               Tuple<P1, P2>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 2 - 2
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, A1, A2), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, A1, A2),
                 Tuple<P1, P2>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

template <typename R, typename P1, typename P2, typename A1, typename A2,
          typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(R (*function)(X1, X2, A1, A2), const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantFunction<R, R (*)(X1, X2, A1, A2),
                         Tuple<P1, P2>, Tuple<A1, A2>>
          (function, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, A1, A2), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, A1, A2),
                               Tuple<P1, P2>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, A1, A2), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, A1, A2),
                 Tuple<P1, P2>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

template <typename R, typename P1, typename P2, typename A1, typename A2,
          typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(R (__stdcall *function)(X1, X2, A1, A2), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, A1, A2),
                         Tuple<P1, P2>, Tuple<A1, A2>>
          (function, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, A1, A2), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, A1, A2),
                               Tuple<P1, P2>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 2 - 3
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename A3, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, A1, A2, A3), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, A1, A2, A3),
                 Tuple<P1, P2>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

template <typename R, typename P1, typename P2, typename A1, typename A2,
          typename A3, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(R (*function)(X1, X2, A1, A2, A3), const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantFunction<R, R (*)(X1, X2, A1, A2, A3),
                         Tuple<P1, P2>, Tuple<A1, A2, A3>>
          (function, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename A3, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, A1, A2, A3), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, A1, A2, A3),
                               Tuple<P1, P2>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename A3, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, A1, A2, A3),
    const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, A1, A2, A3),
                 Tuple<P1, P2>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

template <typename R, typename P1, typename P2, typename A1, typename A2,
          typename A3, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(R (__stdcall *function)(X1, X2, A1, A2, A3), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, A1, A2, A3),
                         Tuple<P1, P2>, Tuple<A1, A2, A3>>
          (function, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename A3, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, A1, A2, A3),
    const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, A1, A2, A3),
                               Tuple<P1, P2>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 2 - 4
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename A3, typename A4, typename X1,
          typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, A1, A2, A3, A4), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, A1, A2, A3, A4),
                 Tuple<P1, P2>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

template <typename R, typename P1, typename P2, typename A1, typename A2,
          typename A3, typename A4, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(R (*function)(X1, X2, A1, A2, A3, A4), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantFunction<R, R (*)(X1, X2, A1, A2, A3, A4),
                         Tuple<P1, P2>, Tuple<A1, A2, A3, A4>>
          (function, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename A3, typename A4, typename X1,
          typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, A1, A2, A3, A4), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, A1, A2, A3, A4),
                               Tuple<P1, P2>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename A3, typename A4, typename X1,
          typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, A1, A2, A3, A4),
    const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, A1, A2, A3, A4),
                 Tuple<P1, P2>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

template <typename R, typename P1, typename P2, typename A1, typename A2,
          typename A3, typename A4, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(R (__stdcall *function)(X1, X2, A1, A2, A3, A4), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, A1, A2, A3, A4),
                         Tuple<P1, P2>, Tuple<A1, A2, A3, A4>>
          (function, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename A3, typename A4, typename X1,
          typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, A1, A2, A3, A4),
    const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, A1, A2, A3, A4),
                               Tuple<P1, P2>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 2 - 5
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename A3, typename A4, typename A5,
          typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, A1, A2, A3, A4, A5), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, A1, A2, A3, A4, A5),
                 Tuple<P1, P2>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

template <typename R, typename P1, typename P2, typename A1, typename A2,
          typename A3, typename A4, typename A5, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(R (*function)(X1, X2, A1, A2, A3, A4, A5), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantFunction<R, R (*)(X1, X2, A1, A2, A3, A4, A5),
                         Tuple<P1, P2>, Tuple<A1, A2, A3, A4, A5>>
          (function, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename A3, typename A4, typename A5,
          typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, A1, A2, A3, A4, A5), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, A1, A2, A3, A4, A5),
                               Tuple<P1, P2>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename A3, typename A4, typename A5,
          typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, A1, A2, A3, A4, A5),
    const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, A1, A2, A3, A4, A5),
                 Tuple<P1, P2>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

template <typename R, typename P1, typename P2, typename A1, typename A2,
          typename A3, typename A4, typename A5, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(R (__stdcall *function)(X1, X2, A1, A2, A3, A4, A5), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, A1, A2, A3, A4, A5),
                         Tuple<P1, P2>, Tuple<A1, A2, A3, A4, A5>>
          (function, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename A3, typename A4, typename A5,
          typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, A1, A2, A3, A4, A5),
    const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, A1, A2, A3, A4, A5),
                               Tuple<P1, P2>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 2 - 6
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename A3, typename A4, typename A5,
          typename A6, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, A1, A2, A3, A4, A5, A6),
    const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, A1, A2, A3, A4, A5, A6),
                 Tuple<P1, P2>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

template <typename R, typename P1, typename P2, typename A1, typename A2,
          typename A3, typename A4, typename A5, typename A6, typename X1,
          typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(R (*function)(X1, X2, A1, A2, A3, A4, A5, A6), const P1& p1,
    const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantFunction<R, R (*)(X1, X2, A1, A2, A3, A4, A5, A6),
                         Tuple<P1, P2>, Tuple<A1, A2, A3, A4, A5, A6>>
          (function, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename A3, typename A4, typename A5,
          typename A6, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, A1, A2, A3, A4, A5, A6),
    const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, A1, A2, A3, A4, A5, A6),
                               Tuple<P1, P2>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename A3, typename A4, typename A5,
          typename A6, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, A1, A2, A3, A4, A5, A6),
    const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, A1, A2, A3, A4, A5, A6),
                 Tuple<P1, P2>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

template <typename R, typename P1, typename P2, typename A1, typename A2,
          typename A3, typename A4, typename A5, typename A6, typename X1,
          typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(R (__stdcall *function)(X1, X2, A1, A2, A3, A4, A5, A6),
    const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, A1, A2, A3, A4, A5, A6),
                         Tuple<P1, P2>, Tuple<A1, A2, A3, A4, A5, A6>>
          (function, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename A1, typename A2, typename A3, typename A4, typename A5,
          typename A6, typename X1, typename X2>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, A1, A2, A3, A4, A5, A6),
    const P1& p1, const P2& p2) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, A1, A2, A3, A4, A5, A6),
                               Tuple<P1, P2>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 3 - 0
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3), const P1& p1, const P2& p2,
    const P3& p3) {
  MutantRunner<R, Tuple<>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3),
                 Tuple<P1, P2, P3>, Tuple<>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename X1,
          typename X2, typename X3>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(R (*function)(X1, X2, X3), const P1& p1, const P2& p2,
    const P3& p3) {
  MutantRunner<R, Tuple<>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3),
                         Tuple<P1, P2, P3>, Tuple<>>
          (function, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3), const P1& p1, const P2& p2,
    const P3& p3) {
  MutantRunner<R, Tuple<>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3),
                               Tuple<P1, P2, P3>, Tuple<>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3),
                 Tuple<P1, P2, P3>, Tuple<>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename X1,
          typename X2, typename X3>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3), const P1& p1, const P2& p2,
    const P3& p3) {
  MutantRunner<R, Tuple<>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3),
                         Tuple<P1, P2, P3>, Tuple<>>
          (function, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3),
                               Tuple<P1, P2, P3>, Tuple<>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 3 - 1
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, A1), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, A1),
                 Tuple<P1, P2, P3>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename A1,
          typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(R (*function)(X1, X2, X3, A1), const P1& p1, const P2& p2,
    const P3& p3) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, A1),
                         Tuple<P1, P2, P3>, Tuple<A1>>
          (function, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, A1), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, A1),
                               Tuple<P1, P2, P3>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, A1), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, A1),
                 Tuple<P1, P2, P3>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename A1,
          typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, A1), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, A1),
                         Tuple<P1, P2, P3>, Tuple<A1>>
          (function, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, A1), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, A1),
                               Tuple<P1, P2, P3>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 3 - 2
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename X1, typename X2,
          typename X3>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, A1, A2), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, A1, A2),
                 Tuple<P1, P2, P3>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename A1,
          typename A2, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(R (*function)(X1, X2, X3, A1, A2), const P1& p1, const P2& p2,
    const P3& p3) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, A1, A2),
                         Tuple<P1, P2, P3>, Tuple<A1, A2>>
          (function, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename X1, typename X2,
          typename X3>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, A1, A2), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, A1, A2),
                               Tuple<P1, P2, P3>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename X1, typename X2,
          typename X3>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2),
    const P1& p1, const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2),
                 Tuple<P1, P2, P3>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename A1,
          typename A2, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, A1, A2), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, A1, A2),
                         Tuple<P1, P2, P3>, Tuple<A1, A2>>
          (function, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename X1, typename X2,
          typename X3>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2),
    const P1& p1, const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2),
                               Tuple<P1, P2, P3>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 3 - 3
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename A3, typename X1,
          typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, A1, A2, A3), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, A1, A2, A3),
                 Tuple<P1, P2, P3>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename A1,
          typename A2, typename A3, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(R (*function)(X1, X2, X3, A1, A2, A3), const P1& p1, const P2& p2,
    const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, A1, A2, A3),
                         Tuple<P1, P2, P3>, Tuple<A1, A2, A3>>
          (function, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename A3, typename X1,
          typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, A1, A2, A3), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, A1, A2, A3),
                               Tuple<P1, P2, P3>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename A3, typename X1,
          typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2, A3),
    const P1& p1, const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2, A3),
                 Tuple<P1, P2, P3>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename A1,
          typename A2, typename A3, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, A1, A2, A3), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, A1, A2, A3),
                         Tuple<P1, P2, P3>, Tuple<A1, A2, A3>>
          (function, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename A3, typename X1,
          typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2, A3),
    const P1& p1, const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2, A3),
                               Tuple<P1, P2, P3>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 3 - 4
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename A3, typename A4,
          typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, A1, A2, A3, A4), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, A1, A2, A3, A4),
                 Tuple<P1, P2, P3>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename A1,
          typename A2, typename A3, typename A4, typename X1, typename X2,
          typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(R (*function)(X1, X2, X3, A1, A2, A3, A4), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, A1, A2, A3, A4),
                         Tuple<P1, P2, P3>, Tuple<A1, A2, A3, A4>>
          (function, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename A3, typename A4,
          typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, A1, A2, A3, A4), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, A1, A2, A3, A4),
                               Tuple<P1, P2, P3>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename A3, typename A4,
          typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2, A3, A4),
    const P1& p1, const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2, A3, A4),
                 Tuple<P1, P2, P3>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename A1,
          typename A2, typename A3, typename A4, typename X1, typename X2,
          typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, A1, A2, A3, A4), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, A1, A2, A3, A4),
                         Tuple<P1, P2, P3>, Tuple<A1, A2, A3, A4>>
          (function, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename A3, typename A4,
          typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2, A3, A4),
    const P1& p1, const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2, A3, A4),
                               Tuple<P1, P2, P3>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 3 - 5
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename A3, typename A4,
          typename A5, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, A1, A2, A3, A4, A5),
    const P1& p1, const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, A1, A2, A3, A4, A5),
                 Tuple<P1, P2, P3>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename X1,
          typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(R (*function)(X1, X2, X3, A1, A2, A3, A4, A5), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, A1, A2, A3, A4, A5),
                         Tuple<P1, P2, P3>, Tuple<A1, A2, A3, A4, A5>>
          (function, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename A3, typename A4,
          typename A5, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, A1, A2, A3, A4, A5),
    const P1& p1, const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, A1, A2, A3, A4, A5),
                               Tuple<P1, P2, P3>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename A3, typename A4,
          typename A5, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2, A3, A4, A5),
    const P1& p1, const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2, A3, A4, A5),
                 Tuple<P1, P2, P3>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename X1,
          typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, A1, A2, A3, A4, A5),
    const P1& p1, const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, A1, A2, A3, A4, A5),
                         Tuple<P1, P2, P3>, Tuple<A1, A2, A3, A4, A5>>
          (function, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename A3, typename A4,
          typename A5, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2, A3, A4, A5),
    const P1& p1, const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2, A3, A4, A5),
                               Tuple<P1, P2, P3>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 3 - 6
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename A3, typename A4,
          typename A5, typename A6, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, A1, A2, A3, A4, A5, A6),
    const P1& p1, const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, A1, A2, A3, A4, A5, A6),
                 Tuple<P1, P2, P3>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename A6,
          typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(R (*function)(X1, X2, X3, A1, A2, A3, A4, A5, A6), const P1& p1,
    const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, A1, A2, A3, A4, A5, A6),
                         Tuple<P1, P2, P3>, Tuple<A1, A2, A3, A4, A5, A6>>
          (function, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename A3, typename A4,
          typename A5, typename A6, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, A1, A2, A3, A4, A5, A6),
    const P1& p1, const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, A1, A2, A3, A4, A5, A6),
                               Tuple<P1, P2, P3>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename A3, typename A4,
          typename A5, typename A6, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2, A3, A4, A5,
    A6), const P1& p1, const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2, A3, A4, A5, A6),
                 Tuple<P1, P2, P3>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename A6,
          typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, A1, A2, A3, A4, A5, A6),
    const P1& p1, const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, A1, A2, A3, A4, A5, A6),
                         Tuple<P1, P2, P3>, Tuple<A1, A2, A3, A4, A5, A6>>
          (function, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename A1, typename A2, typename A3, typename A4,
          typename A5, typename A6, typename X1, typename X2, typename X3>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2, A3, A4, A5,
    A6), const P1& p1, const P2& p2, const P3& p3) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2, A3, A4, A5, A6),
                               Tuple<P1, P2, P3>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2, p3));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 4 - 0
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename X1, typename X2, typename X3,
          typename X4>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4),
                 Tuple<P1, P2, P3, P4>, Tuple<>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename X1, typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(R (*function)(X1, X2, X3, X4), const P1& p1, const P2& p2,
    const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4),
                         Tuple<P1, P2, P3, P4>, Tuple<>>
          (function, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename X1, typename X2, typename X3,
          typename X4>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4),
                               Tuple<P1, P2, P3, P4>, Tuple<>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename X1, typename X2, typename X3,
          typename X4>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4),
                 Tuple<P1, P2, P3, P4>, Tuple<>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename X1, typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4),
                         Tuple<P1, P2, P3, P4>, Tuple<>>
          (function, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename X1, typename X2, typename X3,
          typename X4>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4),
                               Tuple<P1, P2, P3, P4>, Tuple<>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 4 - 1
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename X1, typename X2,
          typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, A1), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, A1),
                 Tuple<P1, P2, P3, P4>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename A1, typename X1, typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(R (*function)(X1, X2, X3, X4, A1), const P1& p1, const P2& p2,
    const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, A1),
                         Tuple<P1, P2, P3, P4>, Tuple<A1>>
          (function, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename X1, typename X2,
          typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, A1), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, A1),
                               Tuple<P1, P2, P3, P4>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename X1, typename X2,
          typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1),
                 Tuple<P1, P2, P3, P4>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename A1, typename X1, typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, A1), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, A1),
                         Tuple<P1, P2, P3, P4>, Tuple<A1>>
          (function, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename X1, typename X2,
          typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1),
                               Tuple<P1, P2, P3, P4>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 4 - 2
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename X1,
          typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, A1, A2), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, A1, A2),
                 Tuple<P1, P2, P3, P4>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename A1, typename A2, typename X1, typename X2, typename X3,
          typename X4>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(R (*function)(X1, X2, X3, X4, A1, A2), const P1& p1, const P2& p2,
    const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, A1, A2),
                         Tuple<P1, P2, P3, P4>, Tuple<A1, A2>>
          (function, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename X1,
          typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, A1, A2), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, A1, A2),
                               Tuple<P1, P2, P3, P4>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename X1,
          typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2),
                 Tuple<P1, P2, P3, P4>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename A1, typename A2, typename X1, typename X2, typename X3,
          typename X4>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, A1, A2), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, A1, A2),
                         Tuple<P1, P2, P3, P4>, Tuple<A1, A2>>
          (function, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename X1,
          typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2),
                               Tuple<P1, P2, P3, P4>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 4 - 3
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename A3,
          typename X1, typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3),
                 Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename A1, typename A2, typename A3, typename X1, typename X2,
          typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(R (*function)(X1, X2, X3, X4, A1, A2, A3), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, A1, A2, A3),
                         Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3>>
          (function, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename A3,
          typename X1, typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3),
                               Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename A3,
          typename X1, typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2, A3),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2, A3),
                 Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename A1, typename A2, typename A3, typename X1, typename X2,
          typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, A1, A2, A3), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, A1, A2, A3),
                         Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3>>
          (function, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename A3,
          typename X1, typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2, A3),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2, A3),
                               Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 4 - 4
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename A3,
          typename A4, typename X1, typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3, A4),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3, A4),
                 Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename A1, typename A2, typename A3, typename A4, typename X1,
          typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(R (*function)(X1, X2, X3, X4, A1, A2, A3, A4), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, A1, A2, A3, A4),
                         Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3, A4>>
          (function, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename A3,
          typename A4, typename X1, typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3, A4),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3, A4),
                               Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename A3,
          typename A4, typename X1, typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2, A3, A4),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2, A3, A4),
                 Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename A1, typename A2, typename A3, typename A4, typename X1,
          typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, A1, A2, A3, A4),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, A1, A2, A3, A4),
                         Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3, A4>>
          (function, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename A3,
          typename A4, typename X1, typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2, A3, A4),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2, A3, A4),
                               Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 4 - 5
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename A3,
          typename A4, typename A5, typename X1, typename X2, typename X3,
          typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3, A4, A5),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3, A4, A5),
                 Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename A1, typename A2, typename A3, typename A4, typename A5,
          typename X1, typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(R (*function)(X1, X2, X3, X4, A1, A2, A3, A4, A5), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, A1, A2, A3, A4, A5),
                         Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3, A4, A5>>
          (function, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename A3,
          typename A4, typename A5, typename X1, typename X2, typename X3,
          typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3, A4, A5),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3, A4, A5),
                               Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename A3,
          typename A4, typename A5, typename X1, typename X2, typename X3,
          typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2, A3, A4,
    A5), const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2, A3, A4, A5),
                 Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename A1, typename A2, typename A3, typename A4, typename A5,
          typename X1, typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, A1, A2, A3, A4, A5),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, A1, A2, A3, A4, A5),
                         Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3, A4, A5>>
          (function, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename A3,
          typename A4, typename A5, typename X1, typename X2, typename X3,
          typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2, A3, A4,
    A5), const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2, A3, A4, A5),
                               Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 4 - 6
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename A3,
          typename A4, typename A5, typename A6, typename X1, typename X2,
          typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
                 Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename A1, typename A2, typename A3, typename A4, typename A5,
          typename A6, typename X1, typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(R (*function)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
                         Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3, A4, A5, A6>>
          (function, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename A3,
          typename A4, typename A5, typename A6, typename X1, typename X2,
          typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
                               Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename A3,
          typename A4, typename A5, typename A6, typename X1, typename X2,
          typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2, A3, A4,
    A5, A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
                 Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename A1, typename A2, typename A3, typename A4, typename A5,
          typename A6, typename X1, typename X2, typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
                         Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3, A4, A5, A6>>
          (function, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename A1, typename A2, typename A3,
          typename A4, typename A5, typename A6, typename X1, typename X2,
          typename X3, typename X4>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2, A3, A4,
    A5, A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
                               Tuple<P1, P2, P3, P4>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2, p3, p4));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 5 - 0
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename X1, typename X2,
          typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5),
                 Tuple<P1, P2, P3, P4, P5>, Tuple<>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename X1, typename X2, typename X3, typename X4,
          typename X5>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(R (*function)(X1, X2, X3, X4, X5), const P1& p1, const P2& p2,
    const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, X5),
                         Tuple<P1, P2, P3, P4, P5>, Tuple<>>
          (function, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename X1, typename X2,
          typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5),
                               Tuple<P1, P2, P3, P4, P5>, Tuple<>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename X1, typename X2,
          typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5),
                 Tuple<P1, P2, P3, P4, P5>, Tuple<>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename X1, typename X2, typename X3, typename X4,
          typename X5>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5),
                         Tuple<P1, P2, P3, P4, P5>, Tuple<>>
          (function, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename X1, typename X2,
          typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5),
                               Tuple<P1, P2, P3, P4, P5>, Tuple<>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 5 - 1
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename X1,
          typename X2, typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, A1), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, A1),
                 Tuple<P1, P2, P3, P4, P5>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename A1, typename X1, typename X2, typename X3,
          typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(R (*function)(X1, X2, X3, X4, X5, A1), const P1& p1, const P2& p2,
    const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, A1),
                         Tuple<P1, P2, P3, P4, P5>, Tuple<A1>>
          (function, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename X1,
          typename X2, typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, A1), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, A1),
                               Tuple<P1, P2, P3, P4, P5>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename X1,
          typename X2, typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1),
                 Tuple<P1, P2, P3, P4, P5>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename A1, typename X1, typename X2, typename X3,
          typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, A1), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, A1),
                         Tuple<P1, P2, P3, P4, P5>, Tuple<A1>>
          (function, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename X1,
          typename X2, typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1),
                               Tuple<P1, P2, P3, P4, P5>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 5 - 2
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename X1, typename X2, typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2),
                 Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename A1, typename A2, typename X1, typename X2,
          typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(R (*function)(X1, X2, X3, X4, X5, A1, A2), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, A1, A2),
                         Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2>>
          (function, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename X1, typename X2, typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2),
                               Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename X1, typename X2, typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2),
                 Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename A1, typename A2, typename X1, typename X2,
          typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, A1, A2), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, A1, A2),
                         Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2>>
          (function, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename X1, typename X2, typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2),
                               Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 5 - 3
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename A3, typename X1, typename X2, typename X3, typename X4,
          typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2, A3),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2, A3),
                 Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename A1, typename A2, typename A3, typename X1,
          typename X2, typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(R (*function)(X1, X2, X3, X4, X5, A1, A2, A3), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, A1, A2, A3),
                         Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3>>
          (function, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename A3, typename X1, typename X2, typename X3, typename X4,
          typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2, A3),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2, A3),
                               Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename A3, typename X1, typename X2, typename X3, typename X4,
          typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2, A3),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2, A3),
                 Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename A1, typename A2, typename A3, typename X1,
          typename X2, typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, A1, A2, A3),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, A1, A2, A3),
                         Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3>>
          (function, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename A3, typename X1, typename X2, typename X3, typename X4,
          typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2, A3),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2, A3),
                               Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 5 - 4
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename A3, typename A4, typename X1, typename X2, typename X3,
          typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2, A3, A4),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4),
                 Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename A1, typename A2, typename A3, typename A4,
          typename X1, typename X2, typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(R (*function)(X1, X2, X3, X4, X5, A1, A2, A3, A4), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, A1, A2, A3, A4),
                         Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3, A4>>
          (function, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename A3, typename A4, typename X1, typename X2, typename X3,
          typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2, A3, A4),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4),
                               Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename A3, typename A4, typename X1, typename X2, typename X3,
          typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2, A3,
    A4), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
    const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4),
                 Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename A1, typename A2, typename A3, typename A4,
          typename X1, typename X2, typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, A1, A2, A3, A4),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, A1, A2, A3, A4),
                         Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3, A4>>
          (function, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename A3, typename A4, typename X1, typename X2, typename X3,
          typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2, A3,
    A4), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
    const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4),
                               Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 5 - 5
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename A3, typename A4, typename A5, typename X1, typename X2,
          typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
                 Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename A1, typename A2, typename A3, typename A4,
          typename A5, typename X1, typename X2, typename X3, typename X4,
          typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(R (*function)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
                         Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3, A4, A5>>
          (function, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename A3, typename A4, typename A5, typename X1, typename X2,
          typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
                               Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename A3, typename A4, typename A5, typename X1, typename X2,
          typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2, A3,
    A4, A5), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
    const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
                 Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename A1, typename A2, typename A3, typename A4,
          typename A5, typename X1, typename X2, typename X3, typename X4,
          typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
                         Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3, A4, A5>>
          (function, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename A3, typename A4, typename A5, typename X1, typename X2,
          typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2, A3,
    A4, A5), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
    const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
                               Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 5 - 6
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename A3, typename A4, typename A5, typename A6, typename X1,
          typename X2, typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5,
    A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
    const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5, A6),
                 Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename A1, typename A2, typename A3, typename A4,
          typename A5, typename A6, typename X1, typename X2, typename X3,
          typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(R (*function)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5, A6),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5, A6),
                         Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3, A4, A5, A6>>
          (function, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename A3, typename A4, typename A5, typename A6, typename X1,
          typename X2, typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5,
    A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
    const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5, A6),
                               Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename A3, typename A4, typename A5, typename A6, typename X1,
          typename X2, typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2, A3,
    A4, A5, A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
    const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5, A6),
                 Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename A1, typename A2, typename A3, typename A4,
          typename A5, typename A6, typename X1, typename X2, typename X3,
          typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5,
    A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
    const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5, A6),
                         Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3, A4, A5, A6>>
          (function, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename A1, typename A2,
          typename A3, typename A4, typename A5, typename A6, typename X1,
          typename X2, typename X3, typename X4, typename X5>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2, A3,
    A4, A5, A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
    const P5& p5) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5, A6),
                               Tuple<P1, P2, P3, P4, P5>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 6 - 0
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename X1,
          typename X2, typename X3, typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, X6), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
  MutantRunner<R, Tuple<>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, X6),
                 Tuple<P1, P2, P3, P4, P5, P6>, Tuple<>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename P6, typename X1, typename X2, typename X3,
          typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(R (*function)(X1, X2, X3, X4, X5, X6), const P1& p1, const P2& p2,
    const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
  MutantRunner<R, Tuple<>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, X6),
                         Tuple<P1, P2, P3, P4, P5, P6>, Tuple<>>
          (function, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename X1,
          typename X2, typename X3, typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, X6), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
  MutantRunner<R, Tuple<>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, X6),
                               Tuple<P1, P2, P3, P4, P5, P6>, Tuple<>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename X1,
          typename X2, typename X3, typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6),
                 Tuple<P1, P2, P3, P4, P5, P6>, Tuple<>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename P6, typename X1, typename X2, typename X3,
          typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, X6), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
  MutantRunner<R, Tuple<>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, X6),
                         Tuple<P1, P2, P3, P4, P5, P6>, Tuple<>>
          (function, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename X1,
          typename X2, typename X3, typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6),
                               Tuple<P1, P2, P3, P4, P5, P6>, Tuple<>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 6 - 1
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename X1, typename X2, typename X3, typename X4, typename X5,
          typename X6>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
  MutantRunner<R, Tuple<A1>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1),
                 Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename P6, typename A1, typename X1, typename X2,
          typename X3, typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(R (*function)(X1, X2, X3, X4, X5, X6, A1), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, X6, A1),
                         Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1>>
          (function, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename X1, typename X2, typename X3, typename X4, typename X5,
          typename X6>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1),
                               Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename X1, typename X2, typename X3, typename X4, typename X5,
          typename X6>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1),
                 Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename P6, typename A1, typename X1, typename X2,
          typename X3, typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, X6, A1), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, X6, A1),
                         Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1>>
          (function, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename X1, typename X2, typename X3, typename X4, typename X5,
          typename X6>
inline MutantFunctor<R, Tuple<A1>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1),
                               Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 6 - 2
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename X1, typename X2, typename X3, typename X4,
          typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2),
                 Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename P6, typename A1, typename A2, typename X1,
          typename X2, typename X3, typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(R (*function)(X1, X2, X3, X4, X5, X6, A1, A2), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, X6, A1, A2),
                         Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2>>
          (function, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename X1, typename X2, typename X3, typename X4,
          typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2),
                               Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename X1, typename X2, typename X3, typename X4,
          typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2),
                 Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename P6, typename A1, typename A2, typename X1,
          typename X2, typename X3, typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, X6, A1, A2),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, X6, A1, A2),
                         Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2>>
          (function, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename X1, typename X2, typename X3, typename X4,
          typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2),
                               Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 6 - 3
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename A3, typename X1, typename X2, typename X3,
          typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2, A3),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3),
                 Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename P6, typename A1, typename A2, typename A3,
          typename X1, typename X2, typename X3, typename X4, typename X5,
          typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(R (*function)(X1, X2, X3, X4, X5, X6, A1, A2, A3), const P1& p1,
    const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, X6, A1, A2, A3),
                         Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3>>
          (function, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename A3, typename X1, typename X2, typename X3,
          typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2, A3),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3),
                               Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename A3, typename X1, typename X2, typename X3,
          typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2,
    A3), const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3),
                 Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename P6, typename A1, typename A2, typename A3,
          typename X1, typename X2, typename X3, typename X4, typename X5,
          typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, X6, A1, A2, A3),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, X6, A1, A2, A3),
                         Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3>>
          (function, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename A3, typename X1, typename X2, typename X3,
          typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2,
    A3), const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3),
                               Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 6 - 4
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename A3, typename A4, typename X1, typename X2,
          typename X3, typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
                 Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename P6, typename A1, typename A2, typename A3,
          typename A4, typename X1, typename X2, typename X3, typename X4,
          typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(R (*function)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
                         Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3, A4>>
          (function, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename A3, typename A4, typename X1, typename X2,
          typename X3, typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
                               Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename A3, typename A4, typename X1, typename X2,
          typename X3, typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2,
    A3, A4), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
    const P5& p5, const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
                 Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename P6, typename A1, typename A2, typename A3,
          typename A4, typename X1, typename X2, typename X3, typename X4,
          typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
                         Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3, A4>>
          (function, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename A3, typename A4, typename X1, typename X2,
          typename X3, typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2,
    A3, A4), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
    const P5& p5, const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3, A4>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
                               Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3, A4>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 6 - 5
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename X1,
          typename X2, typename X3, typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4,
    A5), const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5),
                 Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename P6, typename A1, typename A2, typename A3,
          typename A4, typename A5, typename X1, typename X2, typename X3,
          typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(R (*function)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5),
                         Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3, A4, A5>>
          (function, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename X1,
          typename X2, typename X3, typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4,
    A5), const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5),
                               Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename X1,
          typename X2, typename X3, typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2,
    A3, A4, A5), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
    const P5& p5, const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5),
                 Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename P6, typename A1, typename A2, typename A3,
          typename A4, typename A5, typename X1, typename X2, typename X3,
          typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4,
    A5), const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5),
                         Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3, A4, A5>>
          (function, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename X1,
          typename X2, typename X3, typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2,
    A3, A4, A5), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
    const P5& p5, const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5),
                               Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3, A4, A5>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

// 6 - 6
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename A6,
          typename X1, typename X2, typename X3, typename X4, typename X5,
          typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5,
    A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5, A6),
                 Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename P6, typename A1, typename A2, typename A3,
          typename A4, typename A5, typename A6, typename X1, typename X2,
          typename X3, typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(R (*function)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5, A6),
    const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5, A6),
                         Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3, A4, A5, A6>>
          (function, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename A6,
          typename X1, typename X2, typename X3, typename X4, typename X5,
          typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5,
    A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
    const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5, A6),
                               Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING

#if defined (OS_WIN) && !defined (ARCH_CPU_X86_64)
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename A6,
          typename X1, typename X2, typename X3, typename X4, typename X5,
          typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2,
    A3, A4, A5, A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
    const P5& p5, const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5, A6),
                 Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}

template <typename R, typename P1, typename P2, typename P3, typename P4,
          typename P5, typename P6, typename A1, typename A2, typename A3,
          typename A4, typename A5, typename A6, typename X1, typename X2,
          typename X3, typename X4, typename X5, typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4,
    A5, A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
    const P5& p5, const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5, A6),
                         Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3, A4, A5, A6>>
          (function, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
template <typename R, typename T, typename U, typename P1, typename P2,
          typename P3, typename P4, typename P5, typename P6, typename A1,
          typename A2, typename A3, typename A4, typename A5, typename A6,
          typename X1, typename X2, typename X3, typename X4, typename X5,
          typename X6>
inline MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>
CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2,
    A3, A4, A5, A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
    const P5& p5, const P6& p6) {
  MutantRunner<R, Tuple<A1, A2, A3, A4, A5, A6>>* t =
      new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5, A6),
                               Tuple<P1, P2, P3, P4, P5, P6>, Tuple<A1, A2, A3, A4, A5, A6>>
          (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
  return MutantFunctor<R, Tuple<A1, A2, A3, A4, A5, A6>>(t);
}
#endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
#endif  // defined (OS_WIN) && !defined (ARCH_CPU_X86_64)

}  // namespace testing

#endif  // TESTING_GMOCK_MUTANT_H_
