Home | History | Annotate | Download | only in testing
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // This file automatically generated by testing/generate_gmock_mutant.py.
      6 // DO NOT EDIT.
      7 
      8 #ifndef TESTING_GMOCK_MUTANT_H_
      9 #define TESTING_GMOCK_MUTANT_H_
     10 
     11 // The intention of this file is to make possible using GMock actions in
     12 // all of its syntactic beauty. Classes and helper functions can be used as
     13 // more generic variants of Task and Callback classes (see base/task.h)
     14 // Mutant supports both pre-bound arguments (like Task) and call-time
     15 // arguments (like Callback) - hence the name. :-)
     16 //
     17 // DispatchToMethod/Function supports two sets of arguments: pre-bound (P) and
     18 // call-time (C). The arguments as well as the return type are templatized.
     19 // DispatchToMethod/Function will also try to call the selected method or
     20 // function even if provided pre-bound arguments does not match exactly with
     21 // the function signature hence the X1, X2 ... XN parameters in CreateFunctor.
     22 // DispatchToMethod will try to invoke method that may not belong to the
     23 // object's class itself but to the object's class base class.
     24 //
     25 // Additionally you can bind the object at calltime by binding a pointer to
     26 // pointer to the object at creation time - before including this file you
     27 // have to #define GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING.
     28 //
     29 // TODO(stoyan): It's yet not clear to me should we use T& and T&* instead
     30 // of T* and T** when we invoke CreateFunctor to match the EXPECT_CALL style.
     31 //
     32 //
     33 // Sample usage with gMock:
     34 //
     35 // struct Mock : public ObjectDelegate {
     36 //   MOCK_METHOD2(string, OnRequest(int n, const string& request));
     37 //   MOCK_METHOD1(void, OnQuit(int exit_code));
     38 //   MOCK_METHOD2(void, LogMessage(int level, const string& message));
     39 //
     40 //   string HandleFlowers(const string& reply, int n, const string& request) {
     41 //     string result = SStringPrintf("In request of %d %s ", n, request);
     42 //     for (int i = 0; i < n; ++i) result.append(reply)
     43 //     return result;
     44 //   }
     45 //
     46 //   void DoLogMessage(int level, const string& message) {
     47 //   }
     48 //
     49 //   void QuitMessageLoop(int seconds) {
     50 //     MessageLoop* loop = MessageLoop::current();
     51 //     loop->PostDelayedTask(FROM_HERE, new MessageLoop::QuitTask,
     52 //                           1000 * seconds);
     53 //   }
     54 // };
     55 //
     56 // Mock mock;
     57 // // Will invoke mock.HandleFlowers("orchids", n, request)
     58 // // "orchids" is a pre-bound argument, and <n> and <request> are call-time
     59 // // arguments - they are not known until the OnRequest mock is invoked.
     60 // EXPECT_CALL(mock, OnRequest(Ge(5), StartsWith("flower"))
     61 //   .Times(1)
     62 //   .WillOnce(Invoke(CreateFunctor(&mock, &Mock::HandleFlowers,
     63 //       string("orchids"))));
     64 //
     65 //
     66 // // No pre-bound arguments, two call-time arguments passed
     67 // // directly to DoLogMessage
     68 // EXPECT_CALL(mock, OnLogMessage(_, _))
     69 //   .Times(AnyNumber())
     70 //   .WillAlways(Invoke(CreateFunctor, &mock, &Mock::DoLogMessage));
     71 //
     72 //
     73 // // In this case we have a single pre-bound argument - 3. We ignore
     74 // // all of the arguments of OnQuit.
     75 // EXCEPT_CALL(mock, OnQuit(_))
     76 //   .Times(1)
     77 //   .WillOnce(InvokeWithoutArgs(CreateFunctor(
     78 //       &mock, &Mock::QuitMessageLoop, 3)));
     79 //
     80 // MessageLoop loop;
     81 // loop.Run();
     82 //
     83 //
     84 //  // Here is another example of how we can set an action that invokes
     85 //  // method of an object that is not yet created.
     86 // struct Mock : public ObjectDelegate {
     87 //   MOCK_METHOD1(void, DemiurgeCreated(Demiurge*));
     88 //   MOCK_METHOD2(void, OnRequest(int count, const string&));
     89 //
     90 //   void StoreDemiurge(Demiurge* w) {
     91 //     demiurge_ = w;
     92 //   }
     93 //
     94 //   Demiurge* demiurge;
     95 // }
     96 //
     97 // EXPECT_CALL(mock, DemiurgeCreated(_)).Times(1)
     98 //    .WillOnce(Invoke(CreateFunctor(&mock, &Mock::StoreDemiurge)));
     99 //
    100 // EXPECT_CALL(mock, OnRequest(_, StrEq("Moby Dick")))
    101 //    .Times(AnyNumber())
    102 //    .WillAlways(WithArgs<0>(Invoke(
    103 //        CreateFunctor(&mock->demiurge_, &Demiurge::DecreaseMonsters))));
    104 //
    105 
    106 #include "base/memory/linked_ptr.h"
    107 #include "base/tuple.h"  // for Tuple
    108 
    109 namespace testing {
    110 
    111 // 0 - 0
    112 template <typename R, typename T, typename Method>
    113 inline R DispatchToMethod(T* obj, Method method,
    114                           const Tuple0& p,
    115                           const Tuple0& c) {
    116   return (obj->*method)();
    117 }
    118 template <typename R, typename Function>
    119 inline R DispatchToFunction(Function function,
    120                             const Tuple0& p,
    121                             const Tuple0& c) {
    122   return (*function)();
    123 }
    124 
    125 // 0 - 1
    126 template <typename R, typename T, typename Method, typename C1>
    127 inline R DispatchToMethod(T* obj, Method method,
    128                           const Tuple0& p,
    129                           const Tuple1<C1>& c) {
    130   return (obj->*method)(c.a);
    131 }
    132 template <typename R, typename Function, typename C1>
    133 inline R DispatchToFunction(Function function,
    134                             const Tuple0& p,
    135                             const Tuple1<C1>& c) {
    136   return (*function)(c.a);
    137 }
    138 
    139 // 0 - 2
    140 template <typename R, typename T, typename Method, typename C1, typename C2>
    141 inline R DispatchToMethod(T* obj, Method method,
    142                           const Tuple0& p,
    143                           const Tuple2<C1, C2>& c) {
    144   return (obj->*method)(c.a, c.b);
    145 }
    146 template <typename R, typename Function, typename C1, typename C2>
    147 inline R DispatchToFunction(Function function,
    148                             const Tuple0& p,
    149                             const Tuple2<C1, C2>& c) {
    150   return (*function)(c.a, c.b);
    151 }
    152 
    153 // 0 - 3
    154 template <typename R, typename T, typename Method, typename C1, typename C2,
    155           typename C3>
    156 inline R DispatchToMethod(T* obj, Method method,
    157                           const Tuple0& p,
    158                           const Tuple3<C1, C2, C3>& c) {
    159   return (obj->*method)(c.a, c.b, c.c);
    160 }
    161 template <typename R, typename Function, typename C1, typename C2, typename C3>
    162 inline R DispatchToFunction(Function function,
    163                             const Tuple0& p,
    164                             const Tuple3<C1, C2, C3>& c) {
    165   return (*function)(c.a, c.b, c.c);
    166 }
    167 
    168 // 0 - 4
    169 template <typename R, typename T, typename Method, typename C1, typename C2,
    170           typename C3, typename C4>
    171 inline R DispatchToMethod(T* obj, Method method,
    172                           const Tuple0& p,
    173                           const Tuple4<C1, C2, C3, C4>& c) {
    174   return (obj->*method)(c.a, c.b, c.c, c.d);
    175 }
    176 template <typename R, typename Function, typename C1, typename C2, typename C3,
    177           typename C4>
    178 inline R DispatchToFunction(Function function,
    179                             const Tuple0& p,
    180                             const Tuple4<C1, C2, C3, C4>& c) {
    181   return (*function)(c.a, c.b, c.c, c.d);
    182 }
    183 
    184 // 0 - 5
    185 template <typename R, typename T, typename Method, typename C1, typename C2,
    186           typename C3, typename C4, typename C5>
    187 inline R DispatchToMethod(T* obj, Method method,
    188                           const Tuple0& p,
    189                           const Tuple5<C1, C2, C3, C4, C5>& c) {
    190   return (obj->*method)(c.a, c.b, c.c, c.d, c.e);
    191 }
    192 template <typename R, typename Function, typename C1, typename C2, typename C3,
    193           typename C4, typename C5>
    194 inline R DispatchToFunction(Function function,
    195                             const Tuple0& p,
    196                             const Tuple5<C1, C2, C3, C4, C5>& c) {
    197   return (*function)(c.a, c.b, c.c, c.d, c.e);
    198 }
    199 
    200 // 0 - 6
    201 template <typename R, typename T, typename Method, typename C1, typename C2,
    202           typename C3, typename C4, typename C5, typename C6>
    203 inline R DispatchToMethod(T* obj, Method method,
    204                           const Tuple0& p,
    205                           const Tuple6<C1, C2, C3, C4, C5, C6>& c) {
    206   return (obj->*method)(c.a, c.b, c.c, c.d, c.e, c.f);
    207 }
    208 template <typename R, typename Function, typename C1, typename C2, typename C3,
    209           typename C4, typename C5, typename C6>
    210 inline R DispatchToFunction(Function function,
    211                             const Tuple0& p,
    212                             const Tuple6<C1, C2, C3, C4, C5, C6>& c) {
    213   return (*function)(c.a, c.b, c.c, c.d, c.e, c.f);
    214 }
    215 
    216 // 1 - 0
    217 template <typename R, typename T, typename Method, typename P1>
    218 inline R DispatchToMethod(T* obj, Method method,
    219                           const Tuple1<P1>& p,
    220                           const Tuple0& c) {
    221   return (obj->*method)(p.a);
    222 }
    223 template <typename R, typename Function, typename P1>
    224 inline R DispatchToFunction(Function function,
    225                             const Tuple1<P1>& p,
    226                             const Tuple0& c) {
    227   return (*function)(p.a);
    228 }
    229 
    230 // 1 - 1
    231 template <typename R, typename T, typename Method, typename P1, typename C1>
    232 inline R DispatchToMethod(T* obj, Method method,
    233                           const Tuple1<P1>& p,
    234                           const Tuple1<C1>& c) {
    235   return (obj->*method)(p.a, c.a);
    236 }
    237 template <typename R, typename Function, typename P1, typename C1>
    238 inline R DispatchToFunction(Function function,
    239                             const Tuple1<P1>& p,
    240                             const Tuple1<C1>& c) {
    241   return (*function)(p.a, c.a);
    242 }
    243 
    244 // 1 - 2
    245 template <typename R, typename T, typename Method, typename P1, typename C1,
    246           typename C2>
    247 inline R DispatchToMethod(T* obj, Method method,
    248                           const Tuple1<P1>& p,
    249                           const Tuple2<C1, C2>& c) {
    250   return (obj->*method)(p.a, c.a, c.b);
    251 }
    252 template <typename R, typename Function, typename P1, typename C1, typename C2>
    253 inline R DispatchToFunction(Function function,
    254                             const Tuple1<P1>& p,
    255                             const Tuple2<C1, C2>& c) {
    256   return (*function)(p.a, c.a, c.b);
    257 }
    258 
    259 // 1 - 3
    260 template <typename R, typename T, typename Method, typename P1, typename C1,
    261           typename C2, typename C3>
    262 inline R DispatchToMethod(T* obj, Method method,
    263                           const Tuple1<P1>& p,
    264                           const Tuple3<C1, C2, C3>& c) {
    265   return (obj->*method)(p.a, c.a, c.b, c.c);
    266 }
    267 template <typename R, typename Function, typename P1, typename C1, typename C2,
    268           typename C3>
    269 inline R DispatchToFunction(Function function,
    270                             const Tuple1<P1>& p,
    271                             const Tuple3<C1, C2, C3>& c) {
    272   return (*function)(p.a, c.a, c.b, c.c);
    273 }
    274 
    275 // 1 - 4
    276 template <typename R, typename T, typename Method, typename P1, typename C1,
    277           typename C2, typename C3, typename C4>
    278 inline R DispatchToMethod(T* obj, Method method,
    279                           const Tuple1<P1>& p,
    280                           const Tuple4<C1, C2, C3, C4>& c) {
    281   return (obj->*method)(p.a, c.a, c.b, c.c, c.d);
    282 }
    283 template <typename R, typename Function, typename P1, typename C1, typename C2,
    284           typename C3, typename C4>
    285 inline R DispatchToFunction(Function function,
    286                             const Tuple1<P1>& p,
    287                             const Tuple4<C1, C2, C3, C4>& c) {
    288   return (*function)(p.a, c.a, c.b, c.c, c.d);
    289 }
    290 
    291 // 1 - 5
    292 template <typename R, typename T, typename Method, typename P1, typename C1,
    293           typename C2, typename C3, typename C4, typename C5>
    294 inline R DispatchToMethod(T* obj, Method method,
    295                           const Tuple1<P1>& p,
    296                           const Tuple5<C1, C2, C3, C4, C5>& c) {
    297   return (obj->*method)(p.a, c.a, c.b, c.c, c.d, c.e);
    298 }
    299 template <typename R, typename Function, typename P1, typename C1, typename C2,
    300           typename C3, typename C4, typename C5>
    301 inline R DispatchToFunction(Function function,
    302                             const Tuple1<P1>& p,
    303                             const Tuple5<C1, C2, C3, C4, C5>& c) {
    304   return (*function)(p.a, c.a, c.b, c.c, c.d, c.e);
    305 }
    306 
    307 // 1 - 6
    308 template <typename R, typename T, typename Method, typename P1, typename C1,
    309           typename C2, typename C3, typename C4, typename C5, typename C6>
    310 inline R DispatchToMethod(T* obj, Method method,
    311                           const Tuple1<P1>& p,
    312                           const Tuple6<C1, C2, C3, C4, C5, C6>& c) {
    313   return (obj->*method)(p.a, c.a, c.b, c.c, c.d, c.e, c.f);
    314 }
    315 template <typename R, typename Function, typename P1, typename C1, typename C2,
    316           typename C3, typename C4, typename C5, typename C6>
    317 inline R DispatchToFunction(Function function,
    318                             const Tuple1<P1>& p,
    319                             const Tuple6<C1, C2, C3, C4, C5, C6>& c) {
    320   return (*function)(p.a, c.a, c.b, c.c, c.d, c.e, c.f);
    321 }
    322 
    323 // 2 - 0
    324 template <typename R, typename T, typename Method, typename P1, typename P2>
    325 inline R DispatchToMethod(T* obj, Method method,
    326                           const Tuple2<P1, P2>& p,
    327                           const Tuple0& c) {
    328   return (obj->*method)(p.a, p.b);
    329 }
    330 template <typename R, typename Function, typename P1, typename P2>
    331 inline R DispatchToFunction(Function function,
    332                             const Tuple2<P1, P2>& p,
    333                             const Tuple0& c) {
    334   return (*function)(p.a, p.b);
    335 }
    336 
    337 // 2 - 1
    338 template <typename R, typename T, typename Method, typename P1, typename P2,
    339           typename C1>
    340 inline R DispatchToMethod(T* obj, Method method,
    341                           const Tuple2<P1, P2>& p,
    342                           const Tuple1<C1>& c) {
    343   return (obj->*method)(p.a, p.b, c.a);
    344 }
    345 template <typename R, typename Function, typename P1, typename P2, typename C1>
    346 inline R DispatchToFunction(Function function,
    347                             const Tuple2<P1, P2>& p,
    348                             const Tuple1<C1>& c) {
    349   return (*function)(p.a, p.b, c.a);
    350 }
    351 
    352 // 2 - 2
    353 template <typename R, typename T, typename Method, typename P1, typename P2,
    354           typename C1, typename C2>
    355 inline R DispatchToMethod(T* obj, Method method,
    356                           const Tuple2<P1, P2>& p,
    357                           const Tuple2<C1, C2>& c) {
    358   return (obj->*method)(p.a, p.b, c.a, c.b);
    359 }
    360 template <typename R, typename Function, typename P1, typename P2, typename C1,
    361           typename C2>
    362 inline R DispatchToFunction(Function function,
    363                             const Tuple2<P1, P2>& p,
    364                             const Tuple2<C1, C2>& c) {
    365   return (*function)(p.a, p.b, c.a, c.b);
    366 }
    367 
    368 // 2 - 3
    369 template <typename R, typename T, typename Method, typename P1, typename P2,
    370           typename C1, typename C2, typename C3>
    371 inline R DispatchToMethod(T* obj, Method method,
    372                           const Tuple2<P1, P2>& p,
    373                           const Tuple3<C1, C2, C3>& c) {
    374   return (obj->*method)(p.a, p.b, c.a, c.b, c.c);
    375 }
    376 template <typename R, typename Function, typename P1, typename P2, typename C1,
    377           typename C2, typename C3>
    378 inline R DispatchToFunction(Function function,
    379                             const Tuple2<P1, P2>& p,
    380                             const Tuple3<C1, C2, C3>& c) {
    381   return (*function)(p.a, p.b, c.a, c.b, c.c);
    382 }
    383 
    384 // 2 - 4
    385 template <typename R, typename T, typename Method, typename P1, typename P2,
    386           typename C1, typename C2, typename C3, typename C4>
    387 inline R DispatchToMethod(T* obj, Method method,
    388                           const Tuple2<P1, P2>& p,
    389                           const Tuple4<C1, C2, C3, C4>& c) {
    390   return (obj->*method)(p.a, p.b, c.a, c.b, c.c, c.d);
    391 }
    392 template <typename R, typename Function, typename P1, typename P2, typename C1,
    393           typename C2, typename C3, typename C4>
    394 inline R DispatchToFunction(Function function,
    395                             const Tuple2<P1, P2>& p,
    396                             const Tuple4<C1, C2, C3, C4>& c) {
    397   return (*function)(p.a, p.b, c.a, c.b, c.c, c.d);
    398 }
    399 
    400 // 2 - 5
    401 template <typename R, typename T, typename Method, typename P1, typename P2,
    402           typename C1, typename C2, typename C3, typename C4, typename C5>
    403 inline R DispatchToMethod(T* obj, Method method,
    404                           const Tuple2<P1, P2>& p,
    405                           const Tuple5<C1, C2, C3, C4, C5>& c) {
    406   return (obj->*method)(p.a, p.b, c.a, c.b, c.c, c.d, c.e);
    407 }
    408 template <typename R, typename Function, typename P1, typename P2, typename C1,
    409           typename C2, typename C3, typename C4, typename C5>
    410 inline R DispatchToFunction(Function function,
    411                             const Tuple2<P1, P2>& p,
    412                             const Tuple5<C1, C2, C3, C4, C5>& c) {
    413   return (*function)(p.a, p.b, c.a, c.b, c.c, c.d, c.e);
    414 }
    415 
    416 // 2 - 6
    417 template <typename R, typename T, typename Method, typename P1, typename P2,
    418           typename C1, typename C2, typename C3, typename C4, typename C5,
    419           typename C6>
    420 inline R DispatchToMethod(T* obj, Method method,
    421                           const Tuple2<P1, P2>& p,
    422                           const Tuple6<C1, C2, C3, C4, C5, C6>& c) {
    423   return (obj->*method)(p.a, p.b, c.a, c.b, c.c, c.d, c.e, c.f);
    424 }
    425 template <typename R, typename Function, typename P1, typename P2, typename C1,
    426           typename C2, typename C3, typename C4, typename C5, typename C6>
    427 inline R DispatchToFunction(Function function,
    428                             const Tuple2<P1, P2>& p,
    429                             const Tuple6<C1, C2, C3, C4, C5, C6>& c) {
    430   return (*function)(p.a, p.b, c.a, c.b, c.c, c.d, c.e, c.f);
    431 }
    432 
    433 // 3 - 0
    434 template <typename R, typename T, typename Method, typename P1, typename P2,
    435           typename P3>
    436 inline R DispatchToMethod(T* obj, Method method,
    437                           const Tuple3<P1, P2, P3>& p,
    438                           const Tuple0& c) {
    439   return (obj->*method)(p.a, p.b, p.c);
    440 }
    441 template <typename R, typename Function, typename P1, typename P2, typename P3>
    442 inline R DispatchToFunction(Function function,
    443                             const Tuple3<P1, P2, P3>& p,
    444                             const Tuple0& c) {
    445   return (*function)(p.a, p.b, p.c);
    446 }
    447 
    448 // 3 - 1
    449 template <typename R, typename T, typename Method, typename P1, typename P2,
    450           typename P3, typename C1>
    451 inline R DispatchToMethod(T* obj, Method method,
    452                           const Tuple3<P1, P2, P3>& p,
    453                           const Tuple1<C1>& c) {
    454   return (obj->*method)(p.a, p.b, p.c, c.a);
    455 }
    456 template <typename R, typename Function, typename P1, typename P2, typename P3,
    457           typename C1>
    458 inline R DispatchToFunction(Function function,
    459                             const Tuple3<P1, P2, P3>& p,
    460                             const Tuple1<C1>& c) {
    461   return (*function)(p.a, p.b, p.c, c.a);
    462 }
    463 
    464 // 3 - 2
    465 template <typename R, typename T, typename Method, typename P1, typename P2,
    466           typename P3, typename C1, typename C2>
    467 inline R DispatchToMethod(T* obj, Method method,
    468                           const Tuple3<P1, P2, P3>& p,
    469                           const Tuple2<C1, C2>& c) {
    470   return (obj->*method)(p.a, p.b, p.c, c.a, c.b);
    471 }
    472 template <typename R, typename Function, typename P1, typename P2, typename P3,
    473           typename C1, typename C2>
    474 inline R DispatchToFunction(Function function,
    475                             const Tuple3<P1, P2, P3>& p,
    476                             const Tuple2<C1, C2>& c) {
    477   return (*function)(p.a, p.b, p.c, c.a, c.b);
    478 }
    479 
    480 // 3 - 3
    481 template <typename R, typename T, typename Method, typename P1, typename P2,
    482           typename P3, typename C1, typename C2, typename C3>
    483 inline R DispatchToMethod(T* obj, Method method,
    484                           const Tuple3<P1, P2, P3>& p,
    485                           const Tuple3<C1, C2, C3>& c) {
    486   return (obj->*method)(p.a, p.b, p.c, c.a, c.b, c.c);
    487 }
    488 template <typename R, typename Function, typename P1, typename P2, typename P3,
    489           typename C1, typename C2, typename C3>
    490 inline R DispatchToFunction(Function function,
    491                             const Tuple3<P1, P2, P3>& p,
    492                             const Tuple3<C1, C2, C3>& c) {
    493   return (*function)(p.a, p.b, p.c, c.a, c.b, c.c);
    494 }
    495 
    496 // 3 - 4
    497 template <typename R, typename T, typename Method, typename P1, typename P2,
    498           typename P3, typename C1, typename C2, typename C3, typename C4>
    499 inline R DispatchToMethod(T* obj, Method method,
    500                           const Tuple3<P1, P2, P3>& p,
    501                           const Tuple4<C1, C2, C3, C4>& c) {
    502   return (obj->*method)(p.a, p.b, p.c, c.a, c.b, c.c, c.d);
    503 }
    504 template <typename R, typename Function, typename P1, typename P2, typename P3,
    505           typename C1, typename C2, typename C3, typename C4>
    506 inline R DispatchToFunction(Function function,
    507                             const Tuple3<P1, P2, P3>& p,
    508                             const Tuple4<C1, C2, C3, C4>& c) {
    509   return (*function)(p.a, p.b, p.c, c.a, c.b, c.c, c.d);
    510 }
    511 
    512 // 3 - 5
    513 template <typename R, typename T, typename Method, typename P1, typename P2,
    514           typename P3, typename C1, typename C2, typename C3, typename C4,
    515           typename C5>
    516 inline R DispatchToMethod(T* obj, Method method,
    517                           const Tuple3<P1, P2, P3>& p,
    518                           const Tuple5<C1, C2, C3, C4, C5>& c) {
    519   return (obj->*method)(p.a, p.b, p.c, c.a, c.b, c.c, c.d, c.e);
    520 }
    521 template <typename R, typename Function, typename P1, typename P2, typename P3,
    522           typename C1, typename C2, typename C3, typename C4, typename C5>
    523 inline R DispatchToFunction(Function function,
    524                             const Tuple3<P1, P2, P3>& p,
    525                             const Tuple5<C1, C2, C3, C4, C5>& c) {
    526   return (*function)(p.a, p.b, p.c, c.a, c.b, c.c, c.d, c.e);
    527 }
    528 
    529 // 3 - 6
    530 template <typename R, typename T, typename Method, typename P1, typename P2,
    531           typename P3, typename C1, typename C2, typename C3, typename C4,
    532           typename C5, typename C6>
    533 inline R DispatchToMethod(T* obj, Method method,
    534                           const Tuple3<P1, P2, P3>& p,
    535                           const Tuple6<C1, C2, C3, C4, C5, C6>& c) {
    536   return (obj->*method)(p.a, p.b, p.c, c.a, c.b, c.c, c.d, c.e, c.f);
    537 }
    538 template <typename R, typename Function, typename P1, typename P2, typename P3,
    539           typename C1, typename C2, typename C3, typename C4, typename C5,
    540           typename C6>
    541 inline R DispatchToFunction(Function function,
    542                             const Tuple3<P1, P2, P3>& p,
    543                             const Tuple6<C1, C2, C3, C4, C5, C6>& c) {
    544   return (*function)(p.a, p.b, p.c, c.a, c.b, c.c, c.d, c.e, c.f);
    545 }
    546 
    547 // 4 - 0
    548 template <typename R, typename T, typename Method, typename P1, typename P2,
    549           typename P3, typename P4>
    550 inline R DispatchToMethod(T* obj, Method method,
    551                           const Tuple4<P1, P2, P3, P4>& p,
    552                           const Tuple0& c) {
    553   return (obj->*method)(p.a, p.b, p.c, p.d);
    554 }
    555 template <typename R, typename Function, typename P1, typename P2, typename P3,
    556           typename P4>
    557 inline R DispatchToFunction(Function function,
    558                             const Tuple4<P1, P2, P3, P4>& p,
    559                             const Tuple0& c) {
    560   return (*function)(p.a, p.b, p.c, p.d);
    561 }
    562 
    563 // 4 - 1
    564 template <typename R, typename T, typename Method, typename P1, typename P2,
    565           typename P3, typename P4, typename C1>
    566 inline R DispatchToMethod(T* obj, Method method,
    567                           const Tuple4<P1, P2, P3, P4>& p,
    568                           const Tuple1<C1>& c) {
    569   return (obj->*method)(p.a, p.b, p.c, p.d, c.a);
    570 }
    571 template <typename R, typename Function, typename P1, typename P2, typename P3,
    572           typename P4, typename C1>
    573 inline R DispatchToFunction(Function function,
    574                             const Tuple4<P1, P2, P3, P4>& p,
    575                             const Tuple1<C1>& c) {
    576   return (*function)(p.a, p.b, p.c, p.d, c.a);
    577 }
    578 
    579 // 4 - 2
    580 template <typename R, typename T, typename Method, typename P1, typename P2,
    581           typename P3, typename P4, typename C1, typename C2>
    582 inline R DispatchToMethod(T* obj, Method method,
    583                           const Tuple4<P1, P2, P3, P4>& p,
    584                           const Tuple2<C1, C2>& c) {
    585   return (obj->*method)(p.a, p.b, p.c, p.d, c.a, c.b);
    586 }
    587 template <typename R, typename Function, typename P1, typename P2, typename P3,
    588           typename P4, typename C1, typename C2>
    589 inline R DispatchToFunction(Function function,
    590                             const Tuple4<P1, P2, P3, P4>& p,
    591                             const Tuple2<C1, C2>& c) {
    592   return (*function)(p.a, p.b, p.c, p.d, c.a, c.b);
    593 }
    594 
    595 // 4 - 3
    596 template <typename R, typename T, typename Method, typename P1, typename P2,
    597           typename P3, typename P4, typename C1, typename C2, typename C3>
    598 inline R DispatchToMethod(T* obj, Method method,
    599                           const Tuple4<P1, P2, P3, P4>& p,
    600                           const Tuple3<C1, C2, C3>& c) {
    601   return (obj->*method)(p.a, p.b, p.c, p.d, c.a, c.b, c.c);
    602 }
    603 template <typename R, typename Function, typename P1, typename P2, typename P3,
    604           typename P4, typename C1, typename C2, typename C3>
    605 inline R DispatchToFunction(Function function,
    606                             const Tuple4<P1, P2, P3, P4>& p,
    607                             const Tuple3<C1, C2, C3>& c) {
    608   return (*function)(p.a, p.b, p.c, p.d, c.a, c.b, c.c);
    609 }
    610 
    611 // 4 - 4
    612 template <typename R, typename T, typename Method, typename P1, typename P2,
    613           typename P3, typename P4, typename C1, typename C2, typename C3,
    614           typename C4>
    615 inline R DispatchToMethod(T* obj, Method method,
    616                           const Tuple4<P1, P2, P3, P4>& p,
    617                           const Tuple4<C1, C2, C3, C4>& c) {
    618   return (obj->*method)(p.a, p.b, p.c, p.d, c.a, c.b, c.c, c.d);
    619 }
    620 template <typename R, typename Function, typename P1, typename P2, typename P3,
    621           typename P4, typename C1, typename C2, typename C3, typename C4>
    622 inline R DispatchToFunction(Function function,
    623                             const Tuple4<P1, P2, P3, P4>& p,
    624                             const Tuple4<C1, C2, C3, C4>& c) {
    625   return (*function)(p.a, p.b, p.c, p.d, c.a, c.b, c.c, c.d);
    626 }
    627 
    628 // 4 - 5
    629 template <typename R, typename T, typename Method, typename P1, typename P2,
    630           typename P3, typename P4, typename C1, typename C2, typename C3,
    631           typename C4, typename C5>
    632 inline R DispatchToMethod(T* obj, Method method,
    633                           const Tuple4<P1, P2, P3, P4>& p,
    634                           const Tuple5<C1, C2, C3, C4, C5>& c) {
    635   return (obj->*method)(p.a, p.b, p.c, p.d, c.a, c.b, c.c, c.d, c.e);
    636 }
    637 template <typename R, typename Function, typename P1, typename P2, typename P3,
    638           typename P4, typename C1, typename C2, typename C3, typename C4,
    639           typename C5>
    640 inline R DispatchToFunction(Function function,
    641                             const Tuple4<P1, P2, P3, P4>& p,
    642                             const Tuple5<C1, C2, C3, C4, C5>& c) {
    643   return (*function)(p.a, p.b, p.c, p.d, c.a, c.b, c.c, c.d, c.e);
    644 }
    645 
    646 // 4 - 6
    647 template <typename R, typename T, typename Method, typename P1, typename P2,
    648           typename P3, typename P4, typename C1, typename C2, typename C3,
    649           typename C4, typename C5, typename C6>
    650 inline R DispatchToMethod(T* obj, Method method,
    651                           const Tuple4<P1, P2, P3, P4>& p,
    652                           const Tuple6<C1, C2, C3, C4, C5, C6>& c) {
    653   return (obj->*method)(p.a, p.b, p.c, p.d, c.a, c.b, c.c, c.d, c.e, c.f);
    654 }
    655 template <typename R, typename Function, typename P1, typename P2, typename P3,
    656           typename P4, typename C1, typename C2, typename C3, typename C4,
    657           typename C5, typename C6>
    658 inline R DispatchToFunction(Function function,
    659                             const Tuple4<P1, P2, P3, P4>& p,
    660                             const Tuple6<C1, C2, C3, C4, C5, C6>& c) {
    661   return (*function)(p.a, p.b, p.c, p.d, c.a, c.b, c.c, c.d, c.e, c.f);
    662 }
    663 
    664 // 5 - 0
    665 template <typename R, typename T, typename Method, typename P1, typename P2,
    666           typename P3, typename P4, typename P5>
    667 inline R DispatchToMethod(T* obj, Method method,
    668                           const Tuple5<P1, P2, P3, P4, P5>& p,
    669                           const Tuple0& c) {
    670   return (obj->*method)(p.a, p.b, p.c, p.d, p.e);
    671 }
    672 template <typename R, typename Function, typename P1, typename P2, typename P3,
    673           typename P4, typename P5>
    674 inline R DispatchToFunction(Function function,
    675                             const Tuple5<P1, P2, P3, P4, P5>& p,
    676                             const Tuple0& c) {
    677   return (*function)(p.a, p.b, p.c, p.d, p.e);
    678 }
    679 
    680 // 5 - 1
    681 template <typename R, typename T, typename Method, typename P1, typename P2,
    682           typename P3, typename P4, typename P5, typename C1>
    683 inline R DispatchToMethod(T* obj, Method method,
    684                           const Tuple5<P1, P2, P3, P4, P5>& p,
    685                           const Tuple1<C1>& c) {
    686   return (obj->*method)(p.a, p.b, p.c, p.d, p.e, c.a);
    687 }
    688 template <typename R, typename Function, typename P1, typename P2, typename P3,
    689           typename P4, typename P5, typename C1>
    690 inline R DispatchToFunction(Function function,
    691                             const Tuple5<P1, P2, P3, P4, P5>& p,
    692                             const Tuple1<C1>& c) {
    693   return (*function)(p.a, p.b, p.c, p.d, p.e, c.a);
    694 }
    695 
    696 // 5 - 2
    697 template <typename R, typename T, typename Method, typename P1, typename P2,
    698           typename P3, typename P4, typename P5, typename C1, typename C2>
    699 inline R DispatchToMethod(T* obj, Method method,
    700                           const Tuple5<P1, P2, P3, P4, P5>& p,
    701                           const Tuple2<C1, C2>& c) {
    702   return (obj->*method)(p.a, p.b, p.c, p.d, p.e, c.a, c.b);
    703 }
    704 template <typename R, typename Function, typename P1, typename P2, typename P3,
    705           typename P4, typename P5, typename C1, typename C2>
    706 inline R DispatchToFunction(Function function,
    707                             const Tuple5<P1, P2, P3, P4, P5>& p,
    708                             const Tuple2<C1, C2>& c) {
    709   return (*function)(p.a, p.b, p.c, p.d, p.e, c.a, c.b);
    710 }
    711 
    712 // 5 - 3
    713 template <typename R, typename T, typename Method, typename P1, typename P2,
    714           typename P3, typename P4, typename P5, typename C1, typename C2,
    715           typename C3>
    716 inline R DispatchToMethod(T* obj, Method method,
    717                           const Tuple5<P1, P2, P3, P4, P5>& p,
    718                           const Tuple3<C1, C2, C3>& c) {
    719   return (obj->*method)(p.a, p.b, p.c, p.d, p.e, c.a, c.b, c.c);
    720 }
    721 template <typename R, typename Function, typename P1, typename P2, typename P3,
    722           typename P4, typename P5, typename C1, typename C2, typename C3>
    723 inline R DispatchToFunction(Function function,
    724                             const Tuple5<P1, P2, P3, P4, P5>& p,
    725                             const Tuple3<C1, C2, C3>& c) {
    726   return (*function)(p.a, p.b, p.c, p.d, p.e, c.a, c.b, c.c);
    727 }
    728 
    729 // 5 - 4
    730 template <typename R, typename T, typename Method, typename P1, typename P2,
    731           typename P3, typename P4, typename P5, typename C1, typename C2,
    732           typename C3, typename C4>
    733 inline R DispatchToMethod(T* obj, Method method,
    734                           const Tuple5<P1, P2, P3, P4, P5>& p,
    735                           const Tuple4<C1, C2, C3, C4>& c) {
    736   return (obj->*method)(p.a, p.b, p.c, p.d, p.e, c.a, c.b, c.c, c.d);
    737 }
    738 template <typename R, typename Function, typename P1, typename P2, typename P3,
    739           typename P4, typename P5, typename C1, typename C2, typename C3,
    740           typename C4>
    741 inline R DispatchToFunction(Function function,
    742                             const Tuple5<P1, P2, P3, P4, P5>& p,
    743                             const Tuple4<C1, C2, C3, C4>& c) {
    744   return (*function)(p.a, p.b, p.c, p.d, p.e, c.a, c.b, c.c, c.d);
    745 }
    746 
    747 // 5 - 5
    748 template <typename R, typename T, typename Method, typename P1, typename P2,
    749           typename P3, typename P4, typename P5, typename C1, typename C2,
    750           typename C3, typename C4, typename C5>
    751 inline R DispatchToMethod(T* obj, Method method,
    752                           const Tuple5<P1, P2, P3, P4, P5>& p,
    753                           const Tuple5<C1, C2, C3, C4, C5>& c) {
    754   return (obj->*method)(p.a, p.b, p.c, p.d, p.e, c.a, c.b, c.c, c.d, c.e);
    755 }
    756 template <typename R, typename Function, typename P1, typename P2, typename P3,
    757           typename P4, typename P5, typename C1, typename C2, typename C3,
    758           typename C4, typename C5>
    759 inline R DispatchToFunction(Function function,
    760                             const Tuple5<P1, P2, P3, P4, P5>& p,
    761                             const Tuple5<C1, C2, C3, C4, C5>& c) {
    762   return (*function)(p.a, p.b, p.c, p.d, p.e, c.a, c.b, c.c, c.d, c.e);
    763 }
    764 
    765 // 5 - 6
    766 template <typename R, typename T, typename Method, typename P1, typename P2,
    767           typename P3, typename P4, typename P5, typename C1, typename C2,
    768           typename C3, typename C4, typename C5, typename C6>
    769 inline R DispatchToMethod(T* obj, Method method,
    770                           const Tuple5<P1, P2, P3, P4, P5>& p,
    771                           const Tuple6<C1, C2, C3, C4, C5, C6>& c) {
    772   return (obj->*method)(p.a, p.b, p.c, p.d, p.e, c.a, c.b, c.c, c.d, c.e, c.f);
    773 }
    774 template <typename R, typename Function, typename P1, typename P2, typename P3,
    775           typename P4, typename P5, typename C1, typename C2, typename C3,
    776           typename C4, typename C5, typename C6>
    777 inline R DispatchToFunction(Function function,
    778                             const Tuple5<P1, P2, P3, P4, P5>& p,
    779                             const Tuple6<C1, C2, C3, C4, C5, C6>& c) {
    780   return (*function)(p.a, p.b, p.c, p.d, p.e, c.a, c.b, c.c, c.d, c.e, c.f);
    781 }
    782 
    783 // 6 - 0
    784 template <typename R, typename T, typename Method, typename P1, typename P2,
    785           typename P3, typename P4, typename P5, typename P6>
    786 inline R DispatchToMethod(T* obj, Method method,
    787                           const Tuple6<P1, P2, P3, P4, P5, P6>& p,
    788                           const Tuple0& c) {
    789   return (obj->*method)(p.a, p.b, p.c, p.d, p.e, p.f);
    790 }
    791 template <typename R, typename Function, typename P1, typename P2, typename P3,
    792           typename P4, typename P5, typename P6>
    793 inline R DispatchToFunction(Function function,
    794                             const Tuple6<P1, P2, P3, P4, P5, P6>& p,
    795                             const Tuple0& c) {
    796   return (*function)(p.a, p.b, p.c, p.d, p.e, p.f);
    797 }
    798 
    799 // 6 - 1
    800 template <typename R, typename T, typename Method, typename P1, typename P2,
    801           typename P3, typename P4, typename P5, typename P6, typename C1>
    802 inline R DispatchToMethod(T* obj, Method method,
    803                           const Tuple6<P1, P2, P3, P4, P5, P6>& p,
    804                           const Tuple1<C1>& c) {
    805   return (obj->*method)(p.a, p.b, p.c, p.d, p.e, p.f, c.a);
    806 }
    807 template <typename R, typename Function, typename P1, typename P2, typename P3,
    808           typename P4, typename P5, typename P6, typename C1>
    809 inline R DispatchToFunction(Function function,
    810                             const Tuple6<P1, P2, P3, P4, P5, P6>& p,
    811                             const Tuple1<C1>& c) {
    812   return (*function)(p.a, p.b, p.c, p.d, p.e, p.f, c.a);
    813 }
    814 
    815 // 6 - 2
    816 template <typename R, typename T, typename Method, typename P1, typename P2,
    817           typename P3, typename P4, typename P5, typename P6, typename C1,
    818           typename C2>
    819 inline R DispatchToMethod(T* obj, Method method,
    820                           const Tuple6<P1, P2, P3, P4, P5, P6>& p,
    821                           const Tuple2<C1, C2>& c) {
    822   return (obj->*method)(p.a, p.b, p.c, p.d, p.e, p.f, c.a, c.b);
    823 }
    824 template <typename R, typename Function, typename P1, typename P2, typename P3,
    825           typename P4, typename P5, typename P6, typename C1, typename C2>
    826 inline R DispatchToFunction(Function function,
    827                             const Tuple6<P1, P2, P3, P4, P5, P6>& p,
    828                             const Tuple2<C1, C2>& c) {
    829   return (*function)(p.a, p.b, p.c, p.d, p.e, p.f, c.a, c.b);
    830 }
    831 
    832 // 6 - 3
    833 template <typename R, typename T, typename Method, typename P1, typename P2,
    834           typename P3, typename P4, typename P5, typename P6, typename C1,
    835           typename C2, typename C3>
    836 inline R DispatchToMethod(T* obj, Method method,
    837                           const Tuple6<P1, P2, P3, P4, P5, P6>& p,
    838                           const Tuple3<C1, C2, C3>& c) {
    839   return (obj->*method)(p.a, p.b, p.c, p.d, p.e, p.f, c.a, c.b, c.c);
    840 }
    841 template <typename R, typename Function, typename P1, typename P2, typename P3,
    842           typename P4, typename P5, typename P6, typename C1, typename C2,
    843           typename C3>
    844 inline R DispatchToFunction(Function function,
    845                             const Tuple6<P1, P2, P3, P4, P5, P6>& p,
    846                             const Tuple3<C1, C2, C3>& c) {
    847   return (*function)(p.a, p.b, p.c, p.d, p.e, p.f, c.a, c.b, c.c);
    848 }
    849 
    850 // 6 - 4
    851 template <typename R, typename T, typename Method, typename P1, typename P2,
    852           typename P3, typename P4, typename P5, typename P6, typename C1,
    853           typename C2, typename C3, typename C4>
    854 inline R DispatchToMethod(T* obj, Method method,
    855                           const Tuple6<P1, P2, P3, P4, P5, P6>& p,
    856                           const Tuple4<C1, C2, C3, C4>& c) {
    857   return (obj->*method)(p.a, p.b, p.c, p.d, p.e, p.f, c.a, c.b, c.c, c.d);
    858 }
    859 template <typename R, typename Function, typename P1, typename P2, typename P3,
    860           typename P4, typename P5, typename P6, typename C1, typename C2,
    861           typename C3, typename C4>
    862 inline R DispatchToFunction(Function function,
    863                             const Tuple6<P1, P2, P3, P4, P5, P6>& p,
    864                             const Tuple4<C1, C2, C3, C4>& c) {
    865   return (*function)(p.a, p.b, p.c, p.d, p.e, p.f, c.a, c.b, c.c, c.d);
    866 }
    867 
    868 // 6 - 5
    869 template <typename R, typename T, typename Method, typename P1, typename P2,
    870           typename P3, typename P4, typename P5, typename P6, typename C1,
    871           typename C2, typename C3, typename C4, typename C5>
    872 inline R DispatchToMethod(T* obj, Method method,
    873                           const Tuple6<P1, P2, P3, P4, P5, P6>& p,
    874                           const Tuple5<C1, C2, C3, C4, C5>& c) {
    875   return (obj->*method)(p.a, p.b, p.c, p.d, p.e, p.f, c.a, c.b, c.c, c.d, c.e);
    876 }
    877 template <typename R, typename Function, typename P1, typename P2, typename P3,
    878           typename P4, typename P5, typename P6, typename C1, typename C2,
    879           typename C3, typename C4, typename C5>
    880 inline R DispatchToFunction(Function function,
    881                             const Tuple6<P1, P2, P3, P4, P5, P6>& p,
    882                             const Tuple5<C1, C2, C3, C4, C5>& c) {
    883   return (*function)(p.a, p.b, p.c, p.d, p.e, p.f, c.a, c.b, c.c, c.d, c.e);
    884 }
    885 
    886 // 6 - 6
    887 template <typename R, typename T, typename Method, typename P1, typename P2,
    888           typename P3, typename P4, typename P5, typename P6, typename C1,
    889           typename C2, typename C3, typename C4, typename C5, typename C6>
    890 inline R DispatchToMethod(T* obj, Method method,
    891                           const Tuple6<P1, P2, P3, P4, P5, P6>& p,
    892                           const Tuple6<C1, C2, C3, C4, C5, C6>& c) {
    893   return (obj->*method)(p.a, p.b, p.c, p.d, p.e, p.f, c.a, c.b, c.c, c.d, c.e, c.f);
    894 }
    895 template <typename R, typename Function, typename P1, typename P2, typename P3,
    896           typename P4, typename P5, typename P6, typename C1, typename C2,
    897           typename C3, typename C4, typename C5, typename C6>
    898 inline R DispatchToFunction(Function function,
    899                             const Tuple6<P1, P2, P3, P4, P5, P6>& p,
    900                             const Tuple6<C1, C2, C3, C4, C5, C6>& c) {
    901   return (*function)(p.a, p.b, p.c, p.d, p.e, p.f, c.a, c.b, c.c, c.d, c.e, c.f);
    902 }
    903 
    904 // Interface that is exposed to the consumer, that does the actual calling
    905 // of the method.
    906 template <typename R, typename Params>
    907 class MutantRunner {
    908  public:
    909   virtual R RunWithParams(const Params& params) = 0;
    910   virtual ~MutantRunner() {}
    911 };
    912 
    913 // Mutant holds pre-bound arguments (like Task). Like Callback
    914 // allows call-time arguments. You bind a pointer to the object
    915 // at creation time.
    916 template <typename R, typename T, typename Method,
    917           typename PreBound, typename Params>
    918 class Mutant : public MutantRunner<R, Params> {
    919  public:
    920   Mutant(T* obj, Method method, const PreBound& pb)
    921       : obj_(obj), method_(method), pb_(pb) {
    922   }
    923 
    924   // MutantRunner implementation
    925   virtual R RunWithParams(const Params& params) {
    926     return DispatchToMethod<R>(this->obj_, this->method_, pb_, params);
    927   }
    928 
    929   T* obj_;
    930   Method method_;
    931   PreBound pb_;
    932 };
    933 
    934 template <typename R, typename Function, typename PreBound, typename Params>
    935 class MutantFunction : public MutantRunner<R, Params> {
    936  public:
    937   MutantFunction(Function function, const PreBound& pb)
    938       : function_(function), pb_(pb) {
    939   }
    940 
    941   // MutantRunner implementation
    942   virtual R RunWithParams(const Params& params) {
    943     return DispatchToFunction<R>(function_, pb_, params);
    944   }
    945 
    946   Function function_;
    947   PreBound pb_;
    948 };
    949 
    950 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
    951 // MutantLateBind is like Mutant, but you bind a pointer to a pointer
    952 // to the object. This way you can create actions for an object
    953 // that is not yet created (has only storage for a pointer to it).
    954 template <typename R, typename T, typename Method,
    955           typename PreBound, typename Params>
    956 class MutantLateObjectBind : public MutantRunner<R, Params> {
    957  public:
    958   MutantLateObjectBind(T** obj, Method method, const PreBound& pb)
    959       : obj_(obj), method_(method), pb_(pb) {
    960   }
    961 
    962   // MutantRunner implementation.
    963   virtual R RunWithParams(const Params& params) {
    964     EXPECT_THAT(*this->obj_, testing::NotNull());
    965     if (NULL == *this->obj_)
    966       return R();
    967     return DispatchToMethod<R>( *this->obj_, this->method_, pb_, params);
    968   }
    969 
    970   T** obj_;
    971   Method method_;
    972   PreBound pb_;
    973 };
    974 #endif
    975 
    976 // Simple MutantRunner<> wrapper acting as a functor.
    977 // Redirects operator() to MutantRunner<Params>::Run()
    978 template <typename R, typename Params>
    979 struct MutantFunctor {
    980   explicit MutantFunctor(MutantRunner<R, Params>*  cb) : impl_(cb) {
    981   }
    982 
    983   ~MutantFunctor() {
    984   }
    985 
    986   inline R operator()() {
    987     return impl_->RunWithParams(Tuple0());
    988   }
    989 
    990   template <typename Arg1>
    991   inline R operator()(const Arg1& a) {
    992     return impl_->RunWithParams(Params(a));
    993   }
    994 
    995   template <typename Arg1, typename Arg2>
    996   inline R operator()(const Arg1& a, const Arg2& b) {
    997     return impl_->RunWithParams(Params(a, b));
    998   }
    999 
   1000   template <typename Arg1, typename Arg2, typename Arg3>
   1001   inline R operator()(const Arg1& a, const Arg2& b, const Arg3& c) {
   1002     return impl_->RunWithParams(Params(a, b, c));
   1003   }
   1004 
   1005   template <typename Arg1, typename Arg2, typename Arg3, typename Arg4>
   1006   inline R operator()(const Arg1& a, const Arg2& b, const Arg3& c,
   1007                          const Arg4& d) {
   1008     return impl_->RunWithParams(Params(a, b, c, d));
   1009   }
   1010 
   1011  private:
   1012   // We need copy constructor since MutantFunctor is copied few times
   1013   // inside GMock machinery, hence no DISALLOW_EVIL_CONTRUCTORS
   1014   MutantFunctor();
   1015   linked_ptr<MutantRunner<R, Params> > impl_;
   1016 };
   1017 
   1018 // 0 - 0
   1019 template <typename R, typename T, typename U>
   1020 inline MutantFunctor<R, Tuple0>
   1021 CreateFunctor(T* obj, R (U::*method)()) {
   1022   MutantRunner<R, Tuple0>* t =
   1023       new Mutant<R, T, R (U::*)(),
   1024                  Tuple0, Tuple0>
   1025           (obj, method, MakeTuple());
   1026   return MutantFunctor<R, Tuple0>(t);
   1027 }
   1028 
   1029 template <typename R>
   1030 inline MutantFunctor<R, Tuple0>
   1031 CreateFunctor(R (*function)()) {
   1032   MutantRunner<R, Tuple0>* t =
   1033       new MutantFunction<R, R (*)(),
   1034                          Tuple0, Tuple0>
   1035           (function, MakeTuple());
   1036   return MutantFunctor<R, Tuple0>(t);
   1037 }
   1038 
   1039 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1040 template <typename R, typename T, typename U>
   1041 inline MutantFunctor<R, Tuple0>
   1042 CreateFunctor(T** obj, R (U::*method)()) {
   1043   MutantRunner<R, Tuple0>* t =
   1044       new MutantLateObjectBind<R, T, R (U::*)(),
   1045                                Tuple0, Tuple0>
   1046           (obj, method, MakeTuple());
   1047   return MutantFunctor<R, Tuple0>(t);
   1048 }
   1049 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1050 
   1051 #if defined (OS_WIN)
   1052 template <typename R, typename T, typename U>
   1053 inline MutantFunctor<R, Tuple0>
   1054 CreateFunctor(T* obj, R (__stdcall U::*method)()) {
   1055   MutantRunner<R, Tuple0>* t =
   1056       new Mutant<R, T, R (__stdcall U::*)(),
   1057                  Tuple0, Tuple0>
   1058           (obj, method, MakeTuple());
   1059   return MutantFunctor<R, Tuple0>(t);
   1060 }
   1061 
   1062 template <typename R>
   1063 inline MutantFunctor<R, Tuple0>
   1064 CreateFunctor(R (__stdcall *function)()) {
   1065   MutantRunner<R, Tuple0>* t =
   1066       new MutantFunction<R, R (__stdcall *)(),
   1067                          Tuple0, Tuple0>
   1068           (function, MakeTuple());
   1069   return MutantFunctor<R, Tuple0>(t);
   1070 }
   1071 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1072 template <typename R, typename T, typename U>
   1073 inline MutantFunctor<R, Tuple0>
   1074 CreateFunctor(T** obj, R (__stdcall U::*method)()) {
   1075   MutantRunner<R, Tuple0>* t =
   1076       new MutantLateObjectBind<R, T, R (__stdcall U::*)(),
   1077                                Tuple0, Tuple0>
   1078           (obj, method, MakeTuple());
   1079   return MutantFunctor<R, Tuple0>(t);
   1080 }
   1081 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1082 #endif  // OS_WIN
   1083 
   1084 // 0 - 1
   1085 template <typename R, typename T, typename U, typename A1>
   1086 inline MutantFunctor<R, Tuple1<A1> >
   1087 CreateFunctor(T* obj, R (U::*method)(A1)) {
   1088   MutantRunner<R, Tuple1<A1> >* t =
   1089       new Mutant<R, T, R (U::*)(A1),
   1090                  Tuple0, Tuple1<A1> >
   1091           (obj, method, MakeTuple());
   1092   return MutantFunctor<R, Tuple1<A1> >(t);
   1093 }
   1094 
   1095 template <typename R, typename A1>
   1096 inline MutantFunctor<R, Tuple1<A1> >
   1097 CreateFunctor(R (*function)(A1)) {
   1098   MutantRunner<R, Tuple1<A1> >* t =
   1099       new MutantFunction<R, R (*)(A1),
   1100                          Tuple0, Tuple1<A1> >
   1101           (function, MakeTuple());
   1102   return MutantFunctor<R, Tuple1<A1> >(t);
   1103 }
   1104 
   1105 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1106 template <typename R, typename T, typename U, typename A1>
   1107 inline MutantFunctor<R, Tuple1<A1> >
   1108 CreateFunctor(T** obj, R (U::*method)(A1)) {
   1109   MutantRunner<R, Tuple1<A1> >* t =
   1110       new MutantLateObjectBind<R, T, R (U::*)(A1),
   1111                                Tuple0, Tuple1<A1> >
   1112           (obj, method, MakeTuple());
   1113   return MutantFunctor<R, Tuple1<A1> >(t);
   1114 }
   1115 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1116 
   1117 #if defined (OS_WIN)
   1118 template <typename R, typename T, typename U, typename A1>
   1119 inline MutantFunctor<R, Tuple1<A1> >
   1120 CreateFunctor(T* obj, R (__stdcall U::*method)(A1)) {
   1121   MutantRunner<R, Tuple1<A1> >* t =
   1122       new Mutant<R, T, R (__stdcall U::*)(A1),
   1123                  Tuple0, Tuple1<A1> >
   1124           (obj, method, MakeTuple());
   1125   return MutantFunctor<R, Tuple1<A1> >(t);
   1126 }
   1127 
   1128 template <typename R, typename A1>
   1129 inline MutantFunctor<R, Tuple1<A1> >
   1130 CreateFunctor(R (__stdcall *function)(A1)) {
   1131   MutantRunner<R, Tuple1<A1> >* t =
   1132       new MutantFunction<R, R (__stdcall *)(A1),
   1133                          Tuple0, Tuple1<A1> >
   1134           (function, MakeTuple());
   1135   return MutantFunctor<R, Tuple1<A1> >(t);
   1136 }
   1137 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1138 template <typename R, typename T, typename U, typename A1>
   1139 inline MutantFunctor<R, Tuple1<A1> >
   1140 CreateFunctor(T** obj, R (__stdcall U::*method)(A1)) {
   1141   MutantRunner<R, Tuple1<A1> >* t =
   1142       new MutantLateObjectBind<R, T, R (__stdcall U::*)(A1),
   1143                                Tuple0, Tuple1<A1> >
   1144           (obj, method, MakeTuple());
   1145   return MutantFunctor<R, Tuple1<A1> >(t);
   1146 }
   1147 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1148 #endif  // OS_WIN
   1149 
   1150 // 0 - 2
   1151 template <typename R, typename T, typename U, typename A1, typename A2>
   1152 inline MutantFunctor<R, Tuple2<A1, A2> >
   1153 CreateFunctor(T* obj, R (U::*method)(A1, A2)) {
   1154   MutantRunner<R, Tuple2<A1, A2> >* t =
   1155       new Mutant<R, T, R (U::*)(A1, A2),
   1156                  Tuple0, Tuple2<A1, A2> >
   1157           (obj, method, MakeTuple());
   1158   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   1159 }
   1160 
   1161 template <typename R, typename A1, typename A2>
   1162 inline MutantFunctor<R, Tuple2<A1, A2> >
   1163 CreateFunctor(R (*function)(A1, A2)) {
   1164   MutantRunner<R, Tuple2<A1, A2> >* t =
   1165       new MutantFunction<R, R (*)(A1, A2),
   1166                          Tuple0, Tuple2<A1, A2> >
   1167           (function, MakeTuple());
   1168   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   1169 }
   1170 
   1171 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1172 template <typename R, typename T, typename U, typename A1, typename A2>
   1173 inline MutantFunctor<R, Tuple2<A1, A2> >
   1174 CreateFunctor(T** obj, R (U::*method)(A1, A2)) {
   1175   MutantRunner<R, Tuple2<A1, A2> >* t =
   1176       new MutantLateObjectBind<R, T, R (U::*)(A1, A2),
   1177                                Tuple0, Tuple2<A1, A2> >
   1178           (obj, method, MakeTuple());
   1179   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   1180 }
   1181 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1182 
   1183 #if defined (OS_WIN)
   1184 template <typename R, typename T, typename U, typename A1, typename A2>
   1185 inline MutantFunctor<R, Tuple2<A1, A2> >
   1186 CreateFunctor(T* obj, R (__stdcall U::*method)(A1, A2)) {
   1187   MutantRunner<R, Tuple2<A1, A2> >* t =
   1188       new Mutant<R, T, R (__stdcall U::*)(A1, A2),
   1189                  Tuple0, Tuple2<A1, A2> >
   1190           (obj, method, MakeTuple());
   1191   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   1192 }
   1193 
   1194 template <typename R, typename A1, typename A2>
   1195 inline MutantFunctor<R, Tuple2<A1, A2> >
   1196 CreateFunctor(R (__stdcall *function)(A1, A2)) {
   1197   MutantRunner<R, Tuple2<A1, A2> >* t =
   1198       new MutantFunction<R, R (__stdcall *)(A1, A2),
   1199                          Tuple0, Tuple2<A1, A2> >
   1200           (function, MakeTuple());
   1201   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   1202 }
   1203 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1204 template <typename R, typename T, typename U, typename A1, typename A2>
   1205 inline MutantFunctor<R, Tuple2<A1, A2> >
   1206 CreateFunctor(T** obj, R (__stdcall U::*method)(A1, A2)) {
   1207   MutantRunner<R, Tuple2<A1, A2> >* t =
   1208       new MutantLateObjectBind<R, T, R (__stdcall U::*)(A1, A2),
   1209                                Tuple0, Tuple2<A1, A2> >
   1210           (obj, method, MakeTuple());
   1211   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   1212 }
   1213 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1214 #endif  // OS_WIN
   1215 
   1216 // 0 - 3
   1217 template <typename R, typename T, typename U, typename A1, typename A2,
   1218           typename A3>
   1219 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   1220 CreateFunctor(T* obj, R (U::*method)(A1, A2, A3)) {
   1221   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   1222       new Mutant<R, T, R (U::*)(A1, A2, A3),
   1223                  Tuple0, Tuple3<A1, A2, A3> >
   1224           (obj, method, MakeTuple());
   1225   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   1226 }
   1227 
   1228 template <typename R, typename A1, typename A2, typename A3>
   1229 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   1230 CreateFunctor(R (*function)(A1, A2, A3)) {
   1231   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   1232       new MutantFunction<R, R (*)(A1, A2, A3),
   1233                          Tuple0, Tuple3<A1, A2, A3> >
   1234           (function, MakeTuple());
   1235   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   1236 }
   1237 
   1238 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1239 template <typename R, typename T, typename U, typename A1, typename A2,
   1240           typename A3>
   1241 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   1242 CreateFunctor(T** obj, R (U::*method)(A1, A2, A3)) {
   1243   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   1244       new MutantLateObjectBind<R, T, R (U::*)(A1, A2, A3),
   1245                                Tuple0, Tuple3<A1, A2, A3> >
   1246           (obj, method, MakeTuple());
   1247   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   1248 }
   1249 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1250 
   1251 #if defined (OS_WIN)
   1252 template <typename R, typename T, typename U, typename A1, typename A2,
   1253           typename A3>
   1254 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   1255 CreateFunctor(T* obj, R (__stdcall U::*method)(A1, A2, A3)) {
   1256   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   1257       new Mutant<R, T, R (__stdcall U::*)(A1, A2, A3),
   1258                  Tuple0, Tuple3<A1, A2, A3> >
   1259           (obj, method, MakeTuple());
   1260   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   1261 }
   1262 
   1263 template <typename R, typename A1, typename A2, typename A3>
   1264 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   1265 CreateFunctor(R (__stdcall *function)(A1, A2, A3)) {
   1266   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   1267       new MutantFunction<R, R (__stdcall *)(A1, A2, A3),
   1268                          Tuple0, Tuple3<A1, A2, A3> >
   1269           (function, MakeTuple());
   1270   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   1271 }
   1272 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1273 template <typename R, typename T, typename U, typename A1, typename A2,
   1274           typename A3>
   1275 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   1276 CreateFunctor(T** obj, R (__stdcall U::*method)(A1, A2, A3)) {
   1277   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   1278       new MutantLateObjectBind<R, T, R (__stdcall U::*)(A1, A2, A3),
   1279                                Tuple0, Tuple3<A1, A2, A3> >
   1280           (obj, method, MakeTuple());
   1281   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   1282 }
   1283 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1284 #endif  // OS_WIN
   1285 
   1286 // 0 - 4
   1287 template <typename R, typename T, typename U, typename A1, typename A2,
   1288           typename A3, typename A4>
   1289 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   1290 CreateFunctor(T* obj, R (U::*method)(A1, A2, A3, A4)) {
   1291   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   1292       new Mutant<R, T, R (U::*)(A1, A2, A3, A4),
   1293                  Tuple0, Tuple4<A1, A2, A3, A4> >
   1294           (obj, method, MakeTuple());
   1295   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   1296 }
   1297 
   1298 template <typename R, typename A1, typename A2, typename A3, typename A4>
   1299 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   1300 CreateFunctor(R (*function)(A1, A2, A3, A4)) {
   1301   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   1302       new MutantFunction<R, R (*)(A1, A2, A3, A4),
   1303                          Tuple0, Tuple4<A1, A2, A3, A4> >
   1304           (function, MakeTuple());
   1305   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   1306 }
   1307 
   1308 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1309 template <typename R, typename T, typename U, typename A1, typename A2,
   1310           typename A3, typename A4>
   1311 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   1312 CreateFunctor(T** obj, R (U::*method)(A1, A2, A3, A4)) {
   1313   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   1314       new MutantLateObjectBind<R, T, R (U::*)(A1, A2, A3, A4),
   1315                                Tuple0, Tuple4<A1, A2, A3, A4> >
   1316           (obj, method, MakeTuple());
   1317   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   1318 }
   1319 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1320 
   1321 #if defined (OS_WIN)
   1322 template <typename R, typename T, typename U, typename A1, typename A2,
   1323           typename A3, typename A4>
   1324 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   1325 CreateFunctor(T* obj, R (__stdcall U::*method)(A1, A2, A3, A4)) {
   1326   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   1327       new Mutant<R, T, R (__stdcall U::*)(A1, A2, A3, A4),
   1328                  Tuple0, Tuple4<A1, A2, A3, A4> >
   1329           (obj, method, MakeTuple());
   1330   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   1331 }
   1332 
   1333 template <typename R, typename A1, typename A2, typename A3, typename A4>
   1334 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   1335 CreateFunctor(R (__stdcall *function)(A1, A2, A3, A4)) {
   1336   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   1337       new MutantFunction<R, R (__stdcall *)(A1, A2, A3, A4),
   1338                          Tuple0, Tuple4<A1, A2, A3, A4> >
   1339           (function, MakeTuple());
   1340   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   1341 }
   1342 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1343 template <typename R, typename T, typename U, typename A1, typename A2,
   1344           typename A3, typename A4>
   1345 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   1346 CreateFunctor(T** obj, R (__stdcall U::*method)(A1, A2, A3, A4)) {
   1347   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   1348       new MutantLateObjectBind<R, T, R (__stdcall U::*)(A1, A2, A3, A4),
   1349                                Tuple0, Tuple4<A1, A2, A3, A4> >
   1350           (obj, method, MakeTuple());
   1351   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   1352 }
   1353 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1354 #endif  // OS_WIN
   1355 
   1356 // 0 - 5
   1357 template <typename R, typename T, typename U, typename A1, typename A2,
   1358           typename A3, typename A4, typename A5>
   1359 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   1360 CreateFunctor(T* obj, R (U::*method)(A1, A2, A3, A4, A5)) {
   1361   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   1362       new Mutant<R, T, R (U::*)(A1, A2, A3, A4, A5),
   1363                  Tuple0, Tuple5<A1, A2, A3, A4, A5> >
   1364           (obj, method, MakeTuple());
   1365   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   1366 }
   1367 
   1368 template <typename R, typename A1, typename A2, typename A3, typename A4,
   1369           typename A5>
   1370 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   1371 CreateFunctor(R (*function)(A1, A2, A3, A4, A5)) {
   1372   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   1373       new MutantFunction<R, R (*)(A1, A2, A3, A4, A5),
   1374                          Tuple0, Tuple5<A1, A2, A3, A4, A5> >
   1375           (function, MakeTuple());
   1376   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   1377 }
   1378 
   1379 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1380 template <typename R, typename T, typename U, typename A1, typename A2,
   1381           typename A3, typename A4, typename A5>
   1382 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   1383 CreateFunctor(T** obj, R (U::*method)(A1, A2, A3, A4, A5)) {
   1384   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   1385       new MutantLateObjectBind<R, T, R (U::*)(A1, A2, A3, A4, A5),
   1386                                Tuple0, Tuple5<A1, A2, A3, A4, A5> >
   1387           (obj, method, MakeTuple());
   1388   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   1389 }
   1390 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1391 
   1392 #if defined (OS_WIN)
   1393 template <typename R, typename T, typename U, typename A1, typename A2,
   1394           typename A3, typename A4, typename A5>
   1395 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   1396 CreateFunctor(T* obj, R (__stdcall U::*method)(A1, A2, A3, A4, A5)) {
   1397   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   1398       new Mutant<R, T, R (__stdcall U::*)(A1, A2, A3, A4, A5),
   1399                  Tuple0, Tuple5<A1, A2, A3, A4, A5> >
   1400           (obj, method, MakeTuple());
   1401   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   1402 }
   1403 
   1404 template <typename R, typename A1, typename A2, typename A3, typename A4,
   1405           typename A5>
   1406 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   1407 CreateFunctor(R (__stdcall *function)(A1, A2, A3, A4, A5)) {
   1408   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   1409       new MutantFunction<R, R (__stdcall *)(A1, A2, A3, A4, A5),
   1410                          Tuple0, Tuple5<A1, A2, A3, A4, A5> >
   1411           (function, MakeTuple());
   1412   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   1413 }
   1414 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1415 template <typename R, typename T, typename U, typename A1, typename A2,
   1416           typename A3, typename A4, typename A5>
   1417 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   1418 CreateFunctor(T** obj, R (__stdcall U::*method)(A1, A2, A3, A4, A5)) {
   1419   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   1420       new MutantLateObjectBind<R, T, R (__stdcall U::*)(A1, A2, A3, A4, A5),
   1421                                Tuple0, Tuple5<A1, A2, A3, A4, A5> >
   1422           (obj, method, MakeTuple());
   1423   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   1424 }
   1425 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1426 #endif  // OS_WIN
   1427 
   1428 // 0 - 6
   1429 template <typename R, typename T, typename U, typename A1, typename A2,
   1430           typename A3, typename A4, typename A5, typename A6>
   1431 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   1432 CreateFunctor(T* obj, R (U::*method)(A1, A2, A3, A4, A5, A6)) {
   1433   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   1434       new Mutant<R, T, R (U::*)(A1, A2, A3, A4, A5, A6),
   1435                  Tuple0, Tuple6<A1, A2, A3, A4, A5, A6> >
   1436           (obj, method, MakeTuple());
   1437   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   1438 }
   1439 
   1440 template <typename R, typename A1, typename A2, typename A3, typename A4,
   1441           typename A5, typename A6>
   1442 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   1443 CreateFunctor(R (*function)(A1, A2, A3, A4, A5, A6)) {
   1444   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   1445       new MutantFunction<R, R (*)(A1, A2, A3, A4, A5, A6),
   1446                          Tuple0, Tuple6<A1, A2, A3, A4, A5, A6> >
   1447           (function, MakeTuple());
   1448   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   1449 }
   1450 
   1451 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1452 template <typename R, typename T, typename U, typename A1, typename A2,
   1453           typename A3, typename A4, typename A5, typename A6>
   1454 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   1455 CreateFunctor(T** obj, R (U::*method)(A1, A2, A3, A4, A5, A6)) {
   1456   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   1457       new MutantLateObjectBind<R, T, R (U::*)(A1, A2, A3, A4, A5, A6),
   1458                                Tuple0, Tuple6<A1, A2, A3, A4, A5, A6> >
   1459           (obj, method, MakeTuple());
   1460   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   1461 }
   1462 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1463 
   1464 #if defined (OS_WIN)
   1465 template <typename R, typename T, typename U, typename A1, typename A2,
   1466           typename A3, typename A4, typename A5, typename A6>
   1467 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   1468 CreateFunctor(T* obj, R (__stdcall U::*method)(A1, A2, A3, A4, A5, A6)) {
   1469   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   1470       new Mutant<R, T, R (__stdcall U::*)(A1, A2, A3, A4, A5, A6),
   1471                  Tuple0, Tuple6<A1, A2, A3, A4, A5, A6> >
   1472           (obj, method, MakeTuple());
   1473   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   1474 }
   1475 
   1476 template <typename R, typename A1, typename A2, typename A3, typename A4,
   1477           typename A5, typename A6>
   1478 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   1479 CreateFunctor(R (__stdcall *function)(A1, A2, A3, A4, A5, A6)) {
   1480   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   1481       new MutantFunction<R, R (__stdcall *)(A1, A2, A3, A4, A5, A6),
   1482                          Tuple0, Tuple6<A1, A2, A3, A4, A5, A6> >
   1483           (function, MakeTuple());
   1484   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   1485 }
   1486 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1487 template <typename R, typename T, typename U, typename A1, typename A2,
   1488           typename A3, typename A4, typename A5, typename A6>
   1489 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   1490 CreateFunctor(T** obj, R (__stdcall U::*method)(A1, A2, A3, A4, A5, A6)) {
   1491   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   1492       new MutantLateObjectBind<R, T, R (__stdcall U::*)(A1, A2, A3, A4, A5, A6),
   1493                                Tuple0, Tuple6<A1, A2, A3, A4, A5, A6> >
   1494           (obj, method, MakeTuple());
   1495   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   1496 }
   1497 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1498 #endif  // OS_WIN
   1499 
   1500 // 1 - 0
   1501 template <typename R, typename T, typename U, typename P1, typename X1>
   1502 inline MutantFunctor<R, Tuple0>
   1503 CreateFunctor(T* obj, R (U::*method)(X1), const P1& p1) {
   1504   MutantRunner<R, Tuple0>* t =
   1505       new Mutant<R, T, R (U::*)(X1),
   1506                  Tuple1<P1>, Tuple0>
   1507           (obj, method, MakeTuple(p1));
   1508   return MutantFunctor<R, Tuple0>(t);
   1509 }
   1510 
   1511 template <typename R, typename P1, typename X1>
   1512 inline MutantFunctor<R, Tuple0>
   1513 CreateFunctor(R (*function)(X1), const P1& p1) {
   1514   MutantRunner<R, Tuple0>* t =
   1515       new MutantFunction<R, R (*)(X1),
   1516                          Tuple1<P1>, Tuple0>
   1517           (function, MakeTuple(p1));
   1518   return MutantFunctor<R, Tuple0>(t);
   1519 }
   1520 
   1521 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1522 template <typename R, typename T, typename U, typename P1, typename X1>
   1523 inline MutantFunctor<R, Tuple0>
   1524 CreateFunctor(T** obj, R (U::*method)(X1), const P1& p1) {
   1525   MutantRunner<R, Tuple0>* t =
   1526       new MutantLateObjectBind<R, T, R (U::*)(X1),
   1527                                Tuple1<P1>, Tuple0>
   1528           (obj, method, MakeTuple(p1));
   1529   return MutantFunctor<R, Tuple0>(t);
   1530 }
   1531 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1532 
   1533 #if defined (OS_WIN)
   1534 template <typename R, typename T, typename U, typename P1, typename X1>
   1535 inline MutantFunctor<R, Tuple0>
   1536 CreateFunctor(T* obj, R (__stdcall U::*method)(X1), const P1& p1) {
   1537   MutantRunner<R, Tuple0>* t =
   1538       new Mutant<R, T, R (__stdcall U::*)(X1),
   1539                  Tuple1<P1>, Tuple0>
   1540           (obj, method, MakeTuple(p1));
   1541   return MutantFunctor<R, Tuple0>(t);
   1542 }
   1543 
   1544 template <typename R, typename P1, typename X1>
   1545 inline MutantFunctor<R, Tuple0>
   1546 CreateFunctor(R (__stdcall *function)(X1), const P1& p1) {
   1547   MutantRunner<R, Tuple0>* t =
   1548       new MutantFunction<R, R (__stdcall *)(X1),
   1549                          Tuple1<P1>, Tuple0>
   1550           (function, MakeTuple(p1));
   1551   return MutantFunctor<R, Tuple0>(t);
   1552 }
   1553 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1554 template <typename R, typename T, typename U, typename P1, typename X1>
   1555 inline MutantFunctor<R, Tuple0>
   1556 CreateFunctor(T** obj, R (__stdcall U::*method)(X1), const P1& p1) {
   1557   MutantRunner<R, Tuple0>* t =
   1558       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1),
   1559                                Tuple1<P1>, Tuple0>
   1560           (obj, method, MakeTuple(p1));
   1561   return MutantFunctor<R, Tuple0>(t);
   1562 }
   1563 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1564 #endif  // OS_WIN
   1565 
   1566 // 1 - 1
   1567 template <typename R, typename T, typename U, typename P1, typename A1,
   1568           typename X1>
   1569 inline MutantFunctor<R, Tuple1<A1> >
   1570 CreateFunctor(T* obj, R (U::*method)(X1, A1), const P1& p1) {
   1571   MutantRunner<R, Tuple1<A1> >* t =
   1572       new Mutant<R, T, R (U::*)(X1, A1),
   1573                  Tuple1<P1>, Tuple1<A1> >
   1574           (obj, method, MakeTuple(p1));
   1575   return MutantFunctor<R, Tuple1<A1> >(t);
   1576 }
   1577 
   1578 template <typename R, typename P1, typename A1, typename X1>
   1579 inline MutantFunctor<R, Tuple1<A1> >
   1580 CreateFunctor(R (*function)(X1, A1), const P1& p1) {
   1581   MutantRunner<R, Tuple1<A1> >* t =
   1582       new MutantFunction<R, R (*)(X1, A1),
   1583                          Tuple1<P1>, Tuple1<A1> >
   1584           (function, MakeTuple(p1));
   1585   return MutantFunctor<R, Tuple1<A1> >(t);
   1586 }
   1587 
   1588 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1589 template <typename R, typename T, typename U, typename P1, typename A1,
   1590           typename X1>
   1591 inline MutantFunctor<R, Tuple1<A1> >
   1592 CreateFunctor(T** obj, R (U::*method)(X1, A1), const P1& p1) {
   1593   MutantRunner<R, Tuple1<A1> >* t =
   1594       new MutantLateObjectBind<R, T, R (U::*)(X1, A1),
   1595                                Tuple1<P1>, Tuple1<A1> >
   1596           (obj, method, MakeTuple(p1));
   1597   return MutantFunctor<R, Tuple1<A1> >(t);
   1598 }
   1599 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1600 
   1601 #if defined (OS_WIN)
   1602 template <typename R, typename T, typename U, typename P1, typename A1,
   1603           typename X1>
   1604 inline MutantFunctor<R, Tuple1<A1> >
   1605 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, A1), const P1& p1) {
   1606   MutantRunner<R, Tuple1<A1> >* t =
   1607       new Mutant<R, T, R (__stdcall U::*)(X1, A1),
   1608                  Tuple1<P1>, Tuple1<A1> >
   1609           (obj, method, MakeTuple(p1));
   1610   return MutantFunctor<R, Tuple1<A1> >(t);
   1611 }
   1612 
   1613 template <typename R, typename P1, typename A1, typename X1>
   1614 inline MutantFunctor<R, Tuple1<A1> >
   1615 CreateFunctor(R (__stdcall *function)(X1, A1), const P1& p1) {
   1616   MutantRunner<R, Tuple1<A1> >* t =
   1617       new MutantFunction<R, R (__stdcall *)(X1, A1),
   1618                          Tuple1<P1>, Tuple1<A1> >
   1619           (function, MakeTuple(p1));
   1620   return MutantFunctor<R, Tuple1<A1> >(t);
   1621 }
   1622 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1623 template <typename R, typename T, typename U, typename P1, typename A1,
   1624           typename X1>
   1625 inline MutantFunctor<R, Tuple1<A1> >
   1626 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, A1), const P1& p1) {
   1627   MutantRunner<R, Tuple1<A1> >* t =
   1628       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, A1),
   1629                                Tuple1<P1>, Tuple1<A1> >
   1630           (obj, method, MakeTuple(p1));
   1631   return MutantFunctor<R, Tuple1<A1> >(t);
   1632 }
   1633 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1634 #endif  // OS_WIN
   1635 
   1636 // 1 - 2
   1637 template <typename R, typename T, typename U, typename P1, typename A1,
   1638           typename A2, typename X1>
   1639 inline MutantFunctor<R, Tuple2<A1, A2> >
   1640 CreateFunctor(T* obj, R (U::*method)(X1, A1, A2), const P1& p1) {
   1641   MutantRunner<R, Tuple2<A1, A2> >* t =
   1642       new Mutant<R, T, R (U::*)(X1, A1, A2),
   1643                  Tuple1<P1>, Tuple2<A1, A2> >
   1644           (obj, method, MakeTuple(p1));
   1645   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   1646 }
   1647 
   1648 template <typename R, typename P1, typename A1, typename A2, typename X1>
   1649 inline MutantFunctor<R, Tuple2<A1, A2> >
   1650 CreateFunctor(R (*function)(X1, A1, A2), const P1& p1) {
   1651   MutantRunner<R, Tuple2<A1, A2> >* t =
   1652       new MutantFunction<R, R (*)(X1, A1, A2),
   1653                          Tuple1<P1>, Tuple2<A1, A2> >
   1654           (function, MakeTuple(p1));
   1655   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   1656 }
   1657 
   1658 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1659 template <typename R, typename T, typename U, typename P1, typename A1,
   1660           typename A2, typename X1>
   1661 inline MutantFunctor<R, Tuple2<A1, A2> >
   1662 CreateFunctor(T** obj, R (U::*method)(X1, A1, A2), const P1& p1) {
   1663   MutantRunner<R, Tuple2<A1, A2> >* t =
   1664       new MutantLateObjectBind<R, T, R (U::*)(X1, A1, A2),
   1665                                Tuple1<P1>, Tuple2<A1, A2> >
   1666           (obj, method, MakeTuple(p1));
   1667   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   1668 }
   1669 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1670 
   1671 #if defined (OS_WIN)
   1672 template <typename R, typename T, typename U, typename P1, typename A1,
   1673           typename A2, typename X1>
   1674 inline MutantFunctor<R, Tuple2<A1, A2> >
   1675 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, A1, A2), const P1& p1) {
   1676   MutantRunner<R, Tuple2<A1, A2> >* t =
   1677       new Mutant<R, T, R (__stdcall U::*)(X1, A1, A2),
   1678                  Tuple1<P1>, Tuple2<A1, A2> >
   1679           (obj, method, MakeTuple(p1));
   1680   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   1681 }
   1682 
   1683 template <typename R, typename P1, typename A1, typename A2, typename X1>
   1684 inline MutantFunctor<R, Tuple2<A1, A2> >
   1685 CreateFunctor(R (__stdcall *function)(X1, A1, A2), const P1& p1) {
   1686   MutantRunner<R, Tuple2<A1, A2> >* t =
   1687       new MutantFunction<R, R (__stdcall *)(X1, A1, A2),
   1688                          Tuple1<P1>, Tuple2<A1, A2> >
   1689           (function, MakeTuple(p1));
   1690   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   1691 }
   1692 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1693 template <typename R, typename T, typename U, typename P1, typename A1,
   1694           typename A2, typename X1>
   1695 inline MutantFunctor<R, Tuple2<A1, A2> >
   1696 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, A1, A2), const P1& p1) {
   1697   MutantRunner<R, Tuple2<A1, A2> >* t =
   1698       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, A1, A2),
   1699                                Tuple1<P1>, Tuple2<A1, A2> >
   1700           (obj, method, MakeTuple(p1));
   1701   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   1702 }
   1703 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1704 #endif  // OS_WIN
   1705 
   1706 // 1 - 3
   1707 template <typename R, typename T, typename U, typename P1, typename A1,
   1708           typename A2, typename A3, typename X1>
   1709 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   1710 CreateFunctor(T* obj, R (U::*method)(X1, A1, A2, A3), const P1& p1) {
   1711   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   1712       new Mutant<R, T, R (U::*)(X1, A1, A2, A3),
   1713                  Tuple1<P1>, Tuple3<A1, A2, A3> >
   1714           (obj, method, MakeTuple(p1));
   1715   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   1716 }
   1717 
   1718 template <typename R, typename P1, typename A1, typename A2, typename A3,
   1719           typename X1>
   1720 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   1721 CreateFunctor(R (*function)(X1, A1, A2, A3), const P1& p1) {
   1722   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   1723       new MutantFunction<R, R (*)(X1, A1, A2, A3),
   1724                          Tuple1<P1>, Tuple3<A1, A2, A3> >
   1725           (function, MakeTuple(p1));
   1726   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   1727 }
   1728 
   1729 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1730 template <typename R, typename T, typename U, typename P1, typename A1,
   1731           typename A2, typename A3, typename X1>
   1732 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   1733 CreateFunctor(T** obj, R (U::*method)(X1, A1, A2, A3), const P1& p1) {
   1734   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   1735       new MutantLateObjectBind<R, T, R (U::*)(X1, A1, A2, A3),
   1736                                Tuple1<P1>, Tuple3<A1, A2, A3> >
   1737           (obj, method, MakeTuple(p1));
   1738   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   1739 }
   1740 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1741 
   1742 #if defined (OS_WIN)
   1743 template <typename R, typename T, typename U, typename P1, typename A1,
   1744           typename A2, typename A3, typename X1>
   1745 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   1746 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, A1, A2, A3), const P1& p1) {
   1747   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   1748       new Mutant<R, T, R (__stdcall U::*)(X1, A1, A2, A3),
   1749                  Tuple1<P1>, Tuple3<A1, A2, A3> >
   1750           (obj, method, MakeTuple(p1));
   1751   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   1752 }
   1753 
   1754 template <typename R, typename P1, typename A1, typename A2, typename A3,
   1755           typename X1>
   1756 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   1757 CreateFunctor(R (__stdcall *function)(X1, A1, A2, A3), const P1& p1) {
   1758   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   1759       new MutantFunction<R, R (__stdcall *)(X1, A1, A2, A3),
   1760                          Tuple1<P1>, Tuple3<A1, A2, A3> >
   1761           (function, MakeTuple(p1));
   1762   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   1763 }
   1764 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1765 template <typename R, typename T, typename U, typename P1, typename A1,
   1766           typename A2, typename A3, typename X1>
   1767 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   1768 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, A1, A2, A3), const P1& p1) {
   1769   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   1770       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, A1, A2, A3),
   1771                                Tuple1<P1>, Tuple3<A1, A2, A3> >
   1772           (obj, method, MakeTuple(p1));
   1773   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   1774 }
   1775 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1776 #endif  // OS_WIN
   1777 
   1778 // 1 - 4
   1779 template <typename R, typename T, typename U, typename P1, typename A1,
   1780           typename A2, typename A3, typename A4, typename X1>
   1781 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   1782 CreateFunctor(T* obj, R (U::*method)(X1, A1, A2, A3, A4), const P1& p1) {
   1783   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   1784       new Mutant<R, T, R (U::*)(X1, A1, A2, A3, A4),
   1785                  Tuple1<P1>, Tuple4<A1, A2, A3, A4> >
   1786           (obj, method, MakeTuple(p1));
   1787   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   1788 }
   1789 
   1790 template <typename R, typename P1, typename A1, typename A2, typename A3,
   1791           typename A4, typename X1>
   1792 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   1793 CreateFunctor(R (*function)(X1, A1, A2, A3, A4), const P1& p1) {
   1794   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   1795       new MutantFunction<R, R (*)(X1, A1, A2, A3, A4),
   1796                          Tuple1<P1>, Tuple4<A1, A2, A3, A4> >
   1797           (function, MakeTuple(p1));
   1798   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   1799 }
   1800 
   1801 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1802 template <typename R, typename T, typename U, typename P1, typename A1,
   1803           typename A2, typename A3, typename A4, typename X1>
   1804 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   1805 CreateFunctor(T** obj, R (U::*method)(X1, A1, A2, A3, A4), const P1& p1) {
   1806   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   1807       new MutantLateObjectBind<R, T, R (U::*)(X1, A1, A2, A3, A4),
   1808                                Tuple1<P1>, Tuple4<A1, A2, A3, A4> >
   1809           (obj, method, MakeTuple(p1));
   1810   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   1811 }
   1812 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1813 
   1814 #if defined (OS_WIN)
   1815 template <typename R, typename T, typename U, typename P1, typename A1,
   1816           typename A2, typename A3, typename A4, typename X1>
   1817 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   1818 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, A1, A2, A3, A4),
   1819     const P1& p1) {
   1820   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   1821       new Mutant<R, T, R (__stdcall U::*)(X1, A1, A2, A3, A4),
   1822                  Tuple1<P1>, Tuple4<A1, A2, A3, A4> >
   1823           (obj, method, MakeTuple(p1));
   1824   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   1825 }
   1826 
   1827 template <typename R, typename P1, typename A1, typename A2, typename A3,
   1828           typename A4, typename X1>
   1829 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   1830 CreateFunctor(R (__stdcall *function)(X1, A1, A2, A3, A4), const P1& p1) {
   1831   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   1832       new MutantFunction<R, R (__stdcall *)(X1, A1, A2, A3, A4),
   1833                          Tuple1<P1>, Tuple4<A1, A2, A3, A4> >
   1834           (function, MakeTuple(p1));
   1835   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   1836 }
   1837 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1838 template <typename R, typename T, typename U, typename P1, typename A1,
   1839           typename A2, typename A3, typename A4, typename X1>
   1840 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   1841 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, A1, A2, A3, A4),
   1842     const P1& p1) {
   1843   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   1844       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, A1, A2, A3, A4),
   1845                                Tuple1<P1>, Tuple4<A1, A2, A3, A4> >
   1846           (obj, method, MakeTuple(p1));
   1847   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   1848 }
   1849 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1850 #endif  // OS_WIN
   1851 
   1852 // 1 - 5
   1853 template <typename R, typename T, typename U, typename P1, typename A1,
   1854           typename A2, typename A3, typename A4, typename A5, typename X1>
   1855 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   1856 CreateFunctor(T* obj, R (U::*method)(X1, A1, A2, A3, A4, A5), const P1& p1) {
   1857   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   1858       new Mutant<R, T, R (U::*)(X1, A1, A2, A3, A4, A5),
   1859                  Tuple1<P1>, Tuple5<A1, A2, A3, A4, A5> >
   1860           (obj, method, MakeTuple(p1));
   1861   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   1862 }
   1863 
   1864 template <typename R, typename P1, typename A1, typename A2, typename A3,
   1865           typename A4, typename A5, typename X1>
   1866 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   1867 CreateFunctor(R (*function)(X1, A1, A2, A3, A4, A5), const P1& p1) {
   1868   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   1869       new MutantFunction<R, R (*)(X1, A1, A2, A3, A4, A5),
   1870                          Tuple1<P1>, Tuple5<A1, A2, A3, A4, A5> >
   1871           (function, MakeTuple(p1));
   1872   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   1873 }
   1874 
   1875 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1876 template <typename R, typename T, typename U, typename P1, typename A1,
   1877           typename A2, typename A3, typename A4, typename A5, typename X1>
   1878 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   1879 CreateFunctor(T** obj, R (U::*method)(X1, A1, A2, A3, A4, A5), const P1& p1) {
   1880   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   1881       new MutantLateObjectBind<R, T, R (U::*)(X1, A1, A2, A3, A4, A5),
   1882                                Tuple1<P1>, Tuple5<A1, A2, A3, A4, A5> >
   1883           (obj, method, MakeTuple(p1));
   1884   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   1885 }
   1886 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1887 
   1888 #if defined (OS_WIN)
   1889 template <typename R, typename T, typename U, typename P1, typename A1,
   1890           typename A2, typename A3, typename A4, typename A5, typename X1>
   1891 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   1892 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, A1, A2, A3, A4, A5),
   1893     const P1& p1) {
   1894   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   1895       new Mutant<R, T, R (__stdcall U::*)(X1, A1, A2, A3, A4, A5),
   1896                  Tuple1<P1>, Tuple5<A1, A2, A3, A4, A5> >
   1897           (obj, method, MakeTuple(p1));
   1898   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   1899 }
   1900 
   1901 template <typename R, typename P1, typename A1, typename A2, typename A3,
   1902           typename A4, typename A5, typename X1>
   1903 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   1904 CreateFunctor(R (__stdcall *function)(X1, A1, A2, A3, A4, A5), const P1& p1) {
   1905   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   1906       new MutantFunction<R, R (__stdcall *)(X1, A1, A2, A3, A4, A5),
   1907                          Tuple1<P1>, Tuple5<A1, A2, A3, A4, A5> >
   1908           (function, MakeTuple(p1));
   1909   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   1910 }
   1911 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1912 template <typename R, typename T, typename U, typename P1, typename A1,
   1913           typename A2, typename A3, typename A4, typename A5, typename X1>
   1914 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   1915 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, A1, A2, A3, A4, A5),
   1916     const P1& p1) {
   1917   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   1918       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, A1, A2, A3, A4, A5),
   1919                                Tuple1<P1>, Tuple5<A1, A2, A3, A4, A5> >
   1920           (obj, method, MakeTuple(p1));
   1921   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   1922 }
   1923 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1924 #endif  // OS_WIN
   1925 
   1926 // 1 - 6
   1927 template <typename R, typename T, typename U, typename P1, typename A1,
   1928           typename A2, typename A3, typename A4, typename A5, typename A6,
   1929           typename X1>
   1930 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   1931 CreateFunctor(T* obj, R (U::*method)(X1, A1, A2, A3, A4, A5, A6),
   1932     const P1& p1) {
   1933   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   1934       new Mutant<R, T, R (U::*)(X1, A1, A2, A3, A4, A5, A6),
   1935                  Tuple1<P1>, Tuple6<A1, A2, A3, A4, A5, A6> >
   1936           (obj, method, MakeTuple(p1));
   1937   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   1938 }
   1939 
   1940 template <typename R, typename P1, typename A1, typename A2, typename A3,
   1941           typename A4, typename A5, typename A6, typename X1>
   1942 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   1943 CreateFunctor(R (*function)(X1, A1, A2, A3, A4, A5, A6), const P1& p1) {
   1944   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   1945       new MutantFunction<R, R (*)(X1, A1, A2, A3, A4, A5, A6),
   1946                          Tuple1<P1>, Tuple6<A1, A2, A3, A4, A5, A6> >
   1947           (function, MakeTuple(p1));
   1948   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   1949 }
   1950 
   1951 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1952 template <typename R, typename T, typename U, typename P1, typename A1,
   1953           typename A2, typename A3, typename A4, typename A5, typename A6,
   1954           typename X1>
   1955 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   1956 CreateFunctor(T** obj, R (U::*method)(X1, A1, A2, A3, A4, A5, A6),
   1957     const P1& p1) {
   1958   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   1959       new MutantLateObjectBind<R, T, R (U::*)(X1, A1, A2, A3, A4, A5, A6),
   1960                                Tuple1<P1>, Tuple6<A1, A2, A3, A4, A5, A6> >
   1961           (obj, method, MakeTuple(p1));
   1962   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   1963 }
   1964 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1965 
   1966 #if defined (OS_WIN)
   1967 template <typename R, typename T, typename U, typename P1, typename A1,
   1968           typename A2, typename A3, typename A4, typename A5, typename A6,
   1969           typename X1>
   1970 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   1971 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, A1, A2, A3, A4, A5, A6),
   1972     const P1& p1) {
   1973   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   1974       new Mutant<R, T, R (__stdcall U::*)(X1, A1, A2, A3, A4, A5, A6),
   1975                  Tuple1<P1>, Tuple6<A1, A2, A3, A4, A5, A6> >
   1976           (obj, method, MakeTuple(p1));
   1977   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   1978 }
   1979 
   1980 template <typename R, typename P1, typename A1, typename A2, typename A3,
   1981           typename A4, typename A5, typename A6, typename X1>
   1982 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   1983 CreateFunctor(R (__stdcall *function)(X1, A1, A2, A3, A4, A5, A6),
   1984     const P1& p1) {
   1985   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   1986       new MutantFunction<R, R (__stdcall *)(X1, A1, A2, A3, A4, A5, A6),
   1987                          Tuple1<P1>, Tuple6<A1, A2, A3, A4, A5, A6> >
   1988           (function, MakeTuple(p1));
   1989   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   1990 }
   1991 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   1992 template <typename R, typename T, typename U, typename P1, typename A1,
   1993           typename A2, typename A3, typename A4, typename A5, typename A6,
   1994           typename X1>
   1995 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   1996 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, A1, A2, A3, A4, A5, A6),
   1997     const P1& p1) {
   1998   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   1999       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, A1, A2, A3, A4, A5, A6),
   2000                                Tuple1<P1>, Tuple6<A1, A2, A3, A4, A5, A6> >
   2001           (obj, method, MakeTuple(p1));
   2002   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   2003 }
   2004 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2005 #endif  // OS_WIN
   2006 
   2007 // 2 - 0
   2008 template <typename R, typename T, typename U, typename P1, typename P2,
   2009           typename X1, typename X2>
   2010 inline MutantFunctor<R, Tuple0>
   2011 CreateFunctor(T* obj, R (U::*method)(X1, X2), const P1& p1, const P2& p2) {
   2012   MutantRunner<R, Tuple0>* t =
   2013       new Mutant<R, T, R (U::*)(X1, X2),
   2014                  Tuple2<P1, P2>, Tuple0>
   2015           (obj, method, MakeTuple(p1, p2));
   2016   return MutantFunctor<R, Tuple0>(t);
   2017 }
   2018 
   2019 template <typename R, typename P1, typename P2, typename X1, typename X2>
   2020 inline MutantFunctor<R, Tuple0>
   2021 CreateFunctor(R (*function)(X1, X2), const P1& p1, const P2& p2) {
   2022   MutantRunner<R, Tuple0>* t =
   2023       new MutantFunction<R, R (*)(X1, X2),
   2024                          Tuple2<P1, P2>, Tuple0>
   2025           (function, MakeTuple(p1, p2));
   2026   return MutantFunctor<R, Tuple0>(t);
   2027 }
   2028 
   2029 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2030 template <typename R, typename T, typename U, typename P1, typename P2,
   2031           typename X1, typename X2>
   2032 inline MutantFunctor<R, Tuple0>
   2033 CreateFunctor(T** obj, R (U::*method)(X1, X2), const P1& p1, const P2& p2) {
   2034   MutantRunner<R, Tuple0>* t =
   2035       new MutantLateObjectBind<R, T, R (U::*)(X1, X2),
   2036                                Tuple2<P1, P2>, Tuple0>
   2037           (obj, method, MakeTuple(p1, p2));
   2038   return MutantFunctor<R, Tuple0>(t);
   2039 }
   2040 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2041 
   2042 #if defined (OS_WIN)
   2043 template <typename R, typename T, typename U, typename P1, typename P2,
   2044           typename X1, typename X2>
   2045 inline MutantFunctor<R, Tuple0>
   2046 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2), const P1& p1,
   2047     const P2& p2) {
   2048   MutantRunner<R, Tuple0>* t =
   2049       new Mutant<R, T, R (__stdcall U::*)(X1, X2),
   2050                  Tuple2<P1, P2>, Tuple0>
   2051           (obj, method, MakeTuple(p1, p2));
   2052   return MutantFunctor<R, Tuple0>(t);
   2053 }
   2054 
   2055 template <typename R, typename P1, typename P2, typename X1, typename X2>
   2056 inline MutantFunctor<R, Tuple0>
   2057 CreateFunctor(R (__stdcall *function)(X1, X2), const P1& p1, const P2& p2) {
   2058   MutantRunner<R, Tuple0>* t =
   2059       new MutantFunction<R, R (__stdcall *)(X1, X2),
   2060                          Tuple2<P1, P2>, Tuple0>
   2061           (function, MakeTuple(p1, p2));
   2062   return MutantFunctor<R, Tuple0>(t);
   2063 }
   2064 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2065 template <typename R, typename T, typename U, typename P1, typename P2,
   2066           typename X1, typename X2>
   2067 inline MutantFunctor<R, Tuple0>
   2068 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2), const P1& p1,
   2069     const P2& p2) {
   2070   MutantRunner<R, Tuple0>* t =
   2071       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2),
   2072                                Tuple2<P1, P2>, Tuple0>
   2073           (obj, method, MakeTuple(p1, p2));
   2074   return MutantFunctor<R, Tuple0>(t);
   2075 }
   2076 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2077 #endif  // OS_WIN
   2078 
   2079 // 2 - 1
   2080 template <typename R, typename T, typename U, typename P1, typename P2,
   2081           typename A1, typename X1, typename X2>
   2082 inline MutantFunctor<R, Tuple1<A1> >
   2083 CreateFunctor(T* obj, R (U::*method)(X1, X2, A1), const P1& p1, const P2& p2) {
   2084   MutantRunner<R, Tuple1<A1> >* t =
   2085       new Mutant<R, T, R (U::*)(X1, X2, A1),
   2086                  Tuple2<P1, P2>, Tuple1<A1> >
   2087           (obj, method, MakeTuple(p1, p2));
   2088   return MutantFunctor<R, Tuple1<A1> >(t);
   2089 }
   2090 
   2091 template <typename R, typename P1, typename P2, typename A1, typename X1,
   2092           typename X2>
   2093 inline MutantFunctor<R, Tuple1<A1> >
   2094 CreateFunctor(R (*function)(X1, X2, A1), const P1& p1, const P2& p2) {
   2095   MutantRunner<R, Tuple1<A1> >* t =
   2096       new MutantFunction<R, R (*)(X1, X2, A1),
   2097                          Tuple2<P1, P2>, Tuple1<A1> >
   2098           (function, MakeTuple(p1, p2));
   2099   return MutantFunctor<R, Tuple1<A1> >(t);
   2100 }
   2101 
   2102 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2103 template <typename R, typename T, typename U, typename P1, typename P2,
   2104           typename A1, typename X1, typename X2>
   2105 inline MutantFunctor<R, Tuple1<A1> >
   2106 CreateFunctor(T** obj, R (U::*method)(X1, X2, A1), const P1& p1, const P2& p2) {
   2107   MutantRunner<R, Tuple1<A1> >* t =
   2108       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, A1),
   2109                                Tuple2<P1, P2>, Tuple1<A1> >
   2110           (obj, method, MakeTuple(p1, p2));
   2111   return MutantFunctor<R, Tuple1<A1> >(t);
   2112 }
   2113 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2114 
   2115 #if defined (OS_WIN)
   2116 template <typename R, typename T, typename U, typename P1, typename P2,
   2117           typename A1, typename X1, typename X2>
   2118 inline MutantFunctor<R, Tuple1<A1> >
   2119 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, A1), const P1& p1,
   2120     const P2& p2) {
   2121   MutantRunner<R, Tuple1<A1> >* t =
   2122       new Mutant<R, T, R (__stdcall U::*)(X1, X2, A1),
   2123                  Tuple2<P1, P2>, Tuple1<A1> >
   2124           (obj, method, MakeTuple(p1, p2));
   2125   return MutantFunctor<R, Tuple1<A1> >(t);
   2126 }
   2127 
   2128 template <typename R, typename P1, typename P2, typename A1, typename X1,
   2129           typename X2>
   2130 inline MutantFunctor<R, Tuple1<A1> >
   2131 CreateFunctor(R (__stdcall *function)(X1, X2, A1), const P1& p1,
   2132     const P2& p2) {
   2133   MutantRunner<R, Tuple1<A1> >* t =
   2134       new MutantFunction<R, R (__stdcall *)(X1, X2, A1),
   2135                          Tuple2<P1, P2>, Tuple1<A1> >
   2136           (function, MakeTuple(p1, p2));
   2137   return MutantFunctor<R, Tuple1<A1> >(t);
   2138 }
   2139 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2140 template <typename R, typename T, typename U, typename P1, typename P2,
   2141           typename A1, typename X1, typename X2>
   2142 inline MutantFunctor<R, Tuple1<A1> >
   2143 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, A1), const P1& p1,
   2144     const P2& p2) {
   2145   MutantRunner<R, Tuple1<A1> >* t =
   2146       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, A1),
   2147                                Tuple2<P1, P2>, Tuple1<A1> >
   2148           (obj, method, MakeTuple(p1, p2));
   2149   return MutantFunctor<R, Tuple1<A1> >(t);
   2150 }
   2151 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2152 #endif  // OS_WIN
   2153 
   2154 // 2 - 2
   2155 template <typename R, typename T, typename U, typename P1, typename P2,
   2156           typename A1, typename A2, typename X1, typename X2>
   2157 inline MutantFunctor<R, Tuple2<A1, A2> >
   2158 CreateFunctor(T* obj, R (U::*method)(X1, X2, A1, A2), const P1& p1,
   2159     const P2& p2) {
   2160   MutantRunner<R, Tuple2<A1, A2> >* t =
   2161       new Mutant<R, T, R (U::*)(X1, X2, A1, A2),
   2162                  Tuple2<P1, P2>, Tuple2<A1, A2> >
   2163           (obj, method, MakeTuple(p1, p2));
   2164   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   2165 }
   2166 
   2167 template <typename R, typename P1, typename P2, typename A1, typename A2,
   2168           typename X1, typename X2>
   2169 inline MutantFunctor<R, Tuple2<A1, A2> >
   2170 CreateFunctor(R (*function)(X1, X2, A1, A2), const P1& p1, const P2& p2) {
   2171   MutantRunner<R, Tuple2<A1, A2> >* t =
   2172       new MutantFunction<R, R (*)(X1, X2, A1, A2),
   2173                          Tuple2<P1, P2>, Tuple2<A1, A2> >
   2174           (function, MakeTuple(p1, p2));
   2175   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   2176 }
   2177 
   2178 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2179 template <typename R, typename T, typename U, typename P1, typename P2,
   2180           typename A1, typename A2, typename X1, typename X2>
   2181 inline MutantFunctor<R, Tuple2<A1, A2> >
   2182 CreateFunctor(T** obj, R (U::*method)(X1, X2, A1, A2), const P1& p1,
   2183     const P2& p2) {
   2184   MutantRunner<R, Tuple2<A1, A2> >* t =
   2185       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, A1, A2),
   2186                                Tuple2<P1, P2>, Tuple2<A1, A2> >
   2187           (obj, method, MakeTuple(p1, p2));
   2188   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   2189 }
   2190 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2191 
   2192 #if defined (OS_WIN)
   2193 template <typename R, typename T, typename U, typename P1, typename P2,
   2194           typename A1, typename A2, typename X1, typename X2>
   2195 inline MutantFunctor<R, Tuple2<A1, A2> >
   2196 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, A1, A2), const P1& p1,
   2197     const P2& p2) {
   2198   MutantRunner<R, Tuple2<A1, A2> >* t =
   2199       new Mutant<R, T, R (__stdcall U::*)(X1, X2, A1, A2),
   2200                  Tuple2<P1, P2>, Tuple2<A1, A2> >
   2201           (obj, method, MakeTuple(p1, p2));
   2202   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   2203 }
   2204 
   2205 template <typename R, typename P1, typename P2, typename A1, typename A2,
   2206           typename X1, typename X2>
   2207 inline MutantFunctor<R, Tuple2<A1, A2> >
   2208 CreateFunctor(R (__stdcall *function)(X1, X2, A1, A2), const P1& p1,
   2209     const P2& p2) {
   2210   MutantRunner<R, Tuple2<A1, A2> >* t =
   2211       new MutantFunction<R, R (__stdcall *)(X1, X2, A1, A2),
   2212                          Tuple2<P1, P2>, Tuple2<A1, A2> >
   2213           (function, MakeTuple(p1, p2));
   2214   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   2215 }
   2216 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2217 template <typename R, typename T, typename U, typename P1, typename P2,
   2218           typename A1, typename A2, typename X1, typename X2>
   2219 inline MutantFunctor<R, Tuple2<A1, A2> >
   2220 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, A1, A2), const P1& p1,
   2221     const P2& p2) {
   2222   MutantRunner<R, Tuple2<A1, A2> >* t =
   2223       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, A1, A2),
   2224                                Tuple2<P1, P2>, Tuple2<A1, A2> >
   2225           (obj, method, MakeTuple(p1, p2));
   2226   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   2227 }
   2228 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2229 #endif  // OS_WIN
   2230 
   2231 // 2 - 3
   2232 template <typename R, typename T, typename U, typename P1, typename P2,
   2233           typename A1, typename A2, typename A3, typename X1, typename X2>
   2234 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   2235 CreateFunctor(T* obj, R (U::*method)(X1, X2, A1, A2, A3), const P1& p1,
   2236     const P2& p2) {
   2237   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   2238       new Mutant<R, T, R (U::*)(X1, X2, A1, A2, A3),
   2239                  Tuple2<P1, P2>, Tuple3<A1, A2, A3> >
   2240           (obj, method, MakeTuple(p1, p2));
   2241   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   2242 }
   2243 
   2244 template <typename R, typename P1, typename P2, typename A1, typename A2,
   2245           typename A3, typename X1, typename X2>
   2246 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   2247 CreateFunctor(R (*function)(X1, X2, A1, A2, A3), const P1& p1, const P2& p2) {
   2248   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   2249       new MutantFunction<R, R (*)(X1, X2, A1, A2, A3),
   2250                          Tuple2<P1, P2>, Tuple3<A1, A2, A3> >
   2251           (function, MakeTuple(p1, p2));
   2252   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   2253 }
   2254 
   2255 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2256 template <typename R, typename T, typename U, typename P1, typename P2,
   2257           typename A1, typename A2, typename A3, typename X1, typename X2>
   2258 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   2259 CreateFunctor(T** obj, R (U::*method)(X1, X2, A1, A2, A3), const P1& p1,
   2260     const P2& p2) {
   2261   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   2262       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, A1, A2, A3),
   2263                                Tuple2<P1, P2>, Tuple3<A1, A2, A3> >
   2264           (obj, method, MakeTuple(p1, p2));
   2265   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   2266 }
   2267 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2268 
   2269 #if defined (OS_WIN)
   2270 template <typename R, typename T, typename U, typename P1, typename P2,
   2271           typename A1, typename A2, typename A3, typename X1, typename X2>
   2272 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   2273 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, A1, A2, A3),
   2274     const P1& p1, const P2& p2) {
   2275   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   2276       new Mutant<R, T, R (__stdcall U::*)(X1, X2, A1, A2, A3),
   2277                  Tuple2<P1, P2>, Tuple3<A1, A2, A3> >
   2278           (obj, method, MakeTuple(p1, p2));
   2279   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   2280 }
   2281 
   2282 template <typename R, typename P1, typename P2, typename A1, typename A2,
   2283           typename A3, typename X1, typename X2>
   2284 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   2285 CreateFunctor(R (__stdcall *function)(X1, X2, A1, A2, A3), const P1& p1,
   2286     const P2& p2) {
   2287   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   2288       new MutantFunction<R, R (__stdcall *)(X1, X2, A1, A2, A3),
   2289                          Tuple2<P1, P2>, Tuple3<A1, A2, A3> >
   2290           (function, MakeTuple(p1, p2));
   2291   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   2292 }
   2293 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2294 template <typename R, typename T, typename U, typename P1, typename P2,
   2295           typename A1, typename A2, typename A3, typename X1, typename X2>
   2296 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   2297 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, A1, A2, A3),
   2298     const P1& p1, const P2& p2) {
   2299   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   2300       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, A1, A2, A3),
   2301                                Tuple2<P1, P2>, Tuple3<A1, A2, A3> >
   2302           (obj, method, MakeTuple(p1, p2));
   2303   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   2304 }
   2305 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2306 #endif  // OS_WIN
   2307 
   2308 // 2 - 4
   2309 template <typename R, typename T, typename U, typename P1, typename P2,
   2310           typename A1, typename A2, typename A3, typename A4, typename X1,
   2311           typename X2>
   2312 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   2313 CreateFunctor(T* obj, R (U::*method)(X1, X2, A1, A2, A3, A4), const P1& p1,
   2314     const P2& p2) {
   2315   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   2316       new Mutant<R, T, R (U::*)(X1, X2, A1, A2, A3, A4),
   2317                  Tuple2<P1, P2>, Tuple4<A1, A2, A3, A4> >
   2318           (obj, method, MakeTuple(p1, p2));
   2319   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   2320 }
   2321 
   2322 template <typename R, typename P1, typename P2, typename A1, typename A2,
   2323           typename A3, typename A4, typename X1, typename X2>
   2324 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   2325 CreateFunctor(R (*function)(X1, X2, A1, A2, A3, A4), const P1& p1,
   2326     const P2& p2) {
   2327   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   2328       new MutantFunction<R, R (*)(X1, X2, A1, A2, A3, A4),
   2329                          Tuple2<P1, P2>, Tuple4<A1, A2, A3, A4> >
   2330           (function, MakeTuple(p1, p2));
   2331   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   2332 }
   2333 
   2334 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2335 template <typename R, typename T, typename U, typename P1, typename P2,
   2336           typename A1, typename A2, typename A3, typename A4, typename X1,
   2337           typename X2>
   2338 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   2339 CreateFunctor(T** obj, R (U::*method)(X1, X2, A1, A2, A3, A4), const P1& p1,
   2340     const P2& p2) {
   2341   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   2342       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, A1, A2, A3, A4),
   2343                                Tuple2<P1, P2>, Tuple4<A1, A2, A3, A4> >
   2344           (obj, method, MakeTuple(p1, p2));
   2345   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   2346 }
   2347 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2348 
   2349 #if defined (OS_WIN)
   2350 template <typename R, typename T, typename U, typename P1, typename P2,
   2351           typename A1, typename A2, typename A3, typename A4, typename X1,
   2352           typename X2>
   2353 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   2354 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, A1, A2, A3, A4),
   2355     const P1& p1, const P2& p2) {
   2356   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   2357       new Mutant<R, T, R (__stdcall U::*)(X1, X2, A1, A2, A3, A4),
   2358                  Tuple2<P1, P2>, Tuple4<A1, A2, A3, A4> >
   2359           (obj, method, MakeTuple(p1, p2));
   2360   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   2361 }
   2362 
   2363 template <typename R, typename P1, typename P2, typename A1, typename A2,
   2364           typename A3, typename A4, typename X1, typename X2>
   2365 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   2366 CreateFunctor(R (__stdcall *function)(X1, X2, A1, A2, A3, A4), const P1& p1,
   2367     const P2& p2) {
   2368   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   2369       new MutantFunction<R, R (__stdcall *)(X1, X2, A1, A2, A3, A4),
   2370                          Tuple2<P1, P2>, Tuple4<A1, A2, A3, A4> >
   2371           (function, MakeTuple(p1, p2));
   2372   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   2373 }
   2374 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2375 template <typename R, typename T, typename U, typename P1, typename P2,
   2376           typename A1, typename A2, typename A3, typename A4, typename X1,
   2377           typename X2>
   2378 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   2379 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, A1, A2, A3, A4),
   2380     const P1& p1, const P2& p2) {
   2381   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   2382       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, A1, A2, A3, A4),
   2383                                Tuple2<P1, P2>, Tuple4<A1, A2, A3, A4> >
   2384           (obj, method, MakeTuple(p1, p2));
   2385   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   2386 }
   2387 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2388 #endif  // OS_WIN
   2389 
   2390 // 2 - 5
   2391 template <typename R, typename T, typename U, typename P1, typename P2,
   2392           typename A1, typename A2, typename A3, typename A4, typename A5,
   2393           typename X1, typename X2>
   2394 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   2395 CreateFunctor(T* obj, R (U::*method)(X1, X2, A1, A2, A3, A4, A5), const P1& p1,
   2396     const P2& p2) {
   2397   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   2398       new Mutant<R, T, R (U::*)(X1, X2, A1, A2, A3, A4, A5),
   2399                  Tuple2<P1, P2>, Tuple5<A1, A2, A3, A4, A5> >
   2400           (obj, method, MakeTuple(p1, p2));
   2401   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   2402 }
   2403 
   2404 template <typename R, typename P1, typename P2, typename A1, typename A2,
   2405           typename A3, typename A4, typename A5, typename X1, typename X2>
   2406 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   2407 CreateFunctor(R (*function)(X1, X2, A1, A2, A3, A4, A5), const P1& p1,
   2408     const P2& p2) {
   2409   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   2410       new MutantFunction<R, R (*)(X1, X2, A1, A2, A3, A4, A5),
   2411                          Tuple2<P1, P2>, Tuple5<A1, A2, A3, A4, A5> >
   2412           (function, MakeTuple(p1, p2));
   2413   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   2414 }
   2415 
   2416 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2417 template <typename R, typename T, typename U, typename P1, typename P2,
   2418           typename A1, typename A2, typename A3, typename A4, typename A5,
   2419           typename X1, typename X2>
   2420 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   2421 CreateFunctor(T** obj, R (U::*method)(X1, X2, A1, A2, A3, A4, A5), const P1& p1,
   2422     const P2& p2) {
   2423   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   2424       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, A1, A2, A3, A4, A5),
   2425                                Tuple2<P1, P2>, Tuple5<A1, A2, A3, A4, A5> >
   2426           (obj, method, MakeTuple(p1, p2));
   2427   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   2428 }
   2429 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2430 
   2431 #if defined (OS_WIN)
   2432 template <typename R, typename T, typename U, typename P1, typename P2,
   2433           typename A1, typename A2, typename A3, typename A4, typename A5,
   2434           typename X1, typename X2>
   2435 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   2436 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, A1, A2, A3, A4, A5),
   2437     const P1& p1, const P2& p2) {
   2438   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   2439       new Mutant<R, T, R (__stdcall U::*)(X1, X2, A1, A2, A3, A4, A5),
   2440                  Tuple2<P1, P2>, Tuple5<A1, A2, A3, A4, A5> >
   2441           (obj, method, MakeTuple(p1, p2));
   2442   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   2443 }
   2444 
   2445 template <typename R, typename P1, typename P2, typename A1, typename A2,
   2446           typename A3, typename A4, typename A5, typename X1, typename X2>
   2447 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   2448 CreateFunctor(R (__stdcall *function)(X1, X2, A1, A2, A3, A4, A5), const P1& p1,
   2449     const P2& p2) {
   2450   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   2451       new MutantFunction<R, R (__stdcall *)(X1, X2, A1, A2, A3, A4, A5),
   2452                          Tuple2<P1, P2>, Tuple5<A1, A2, A3, A4, A5> >
   2453           (function, MakeTuple(p1, p2));
   2454   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   2455 }
   2456 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2457 template <typename R, typename T, typename U, typename P1, typename P2,
   2458           typename A1, typename A2, typename A3, typename A4, typename A5,
   2459           typename X1, typename X2>
   2460 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   2461 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, A1, A2, A3, A4, A5),
   2462     const P1& p1, const P2& p2) {
   2463   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   2464       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, A1, A2, A3, A4, A5),
   2465                                Tuple2<P1, P2>, Tuple5<A1, A2, A3, A4, A5> >
   2466           (obj, method, MakeTuple(p1, p2));
   2467   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   2468 }
   2469 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2470 #endif  // OS_WIN
   2471 
   2472 // 2 - 6
   2473 template <typename R, typename T, typename U, typename P1, typename P2,
   2474           typename A1, typename A2, typename A3, typename A4, typename A5,
   2475           typename A6, typename X1, typename X2>
   2476 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   2477 CreateFunctor(T* obj, R (U::*method)(X1, X2, A1, A2, A3, A4, A5, A6),
   2478     const P1& p1, const P2& p2) {
   2479   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   2480       new Mutant<R, T, R (U::*)(X1, X2, A1, A2, A3, A4, A5, A6),
   2481                  Tuple2<P1, P2>, Tuple6<A1, A2, A3, A4, A5, A6> >
   2482           (obj, method, MakeTuple(p1, p2));
   2483   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   2484 }
   2485 
   2486 template <typename R, typename P1, typename P2, typename A1, typename A2,
   2487           typename A3, typename A4, typename A5, typename A6, typename X1,
   2488           typename X2>
   2489 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   2490 CreateFunctor(R (*function)(X1, X2, A1, A2, A3, A4, A5, A6), const P1& p1,
   2491     const P2& p2) {
   2492   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   2493       new MutantFunction<R, R (*)(X1, X2, A1, A2, A3, A4, A5, A6),
   2494                          Tuple2<P1, P2>, Tuple6<A1, A2, A3, A4, A5, A6> >
   2495           (function, MakeTuple(p1, p2));
   2496   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   2497 }
   2498 
   2499 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2500 template <typename R, typename T, typename U, typename P1, typename P2,
   2501           typename A1, typename A2, typename A3, typename A4, typename A5,
   2502           typename A6, typename X1, typename X2>
   2503 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   2504 CreateFunctor(T** obj, R (U::*method)(X1, X2, A1, A2, A3, A4, A5, A6),
   2505     const P1& p1, const P2& p2) {
   2506   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   2507       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, A1, A2, A3, A4, A5, A6),
   2508                                Tuple2<P1, P2>, Tuple6<A1, A2, A3, A4, A5, A6> >
   2509           (obj, method, MakeTuple(p1, p2));
   2510   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   2511 }
   2512 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2513 
   2514 #if defined (OS_WIN)
   2515 template <typename R, typename T, typename U, typename P1, typename P2,
   2516           typename A1, typename A2, typename A3, typename A4, typename A5,
   2517           typename A6, typename X1, typename X2>
   2518 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   2519 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, A1, A2, A3, A4, A5, A6),
   2520     const P1& p1, const P2& p2) {
   2521   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   2522       new Mutant<R, T, R (__stdcall U::*)(X1, X2, A1, A2, A3, A4, A5, A6),
   2523                  Tuple2<P1, P2>, Tuple6<A1, A2, A3, A4, A5, A6> >
   2524           (obj, method, MakeTuple(p1, p2));
   2525   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   2526 }
   2527 
   2528 template <typename R, typename P1, typename P2, typename A1, typename A2,
   2529           typename A3, typename A4, typename A5, typename A6, typename X1,
   2530           typename X2>
   2531 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   2532 CreateFunctor(R (__stdcall *function)(X1, X2, A1, A2, A3, A4, A5, A6),
   2533     const P1& p1, const P2& p2) {
   2534   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   2535       new MutantFunction<R, R (__stdcall *)(X1, X2, A1, A2, A3, A4, A5, A6),
   2536                          Tuple2<P1, P2>, Tuple6<A1, A2, A3, A4, A5, A6> >
   2537           (function, MakeTuple(p1, p2));
   2538   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   2539 }
   2540 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2541 template <typename R, typename T, typename U, typename P1, typename P2,
   2542           typename A1, typename A2, typename A3, typename A4, typename A5,
   2543           typename A6, typename X1, typename X2>
   2544 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   2545 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, A1, A2, A3, A4, A5, A6),
   2546     const P1& p1, const P2& p2) {
   2547   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   2548       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, A1, A2, A3, A4, A5, A6),
   2549                                Tuple2<P1, P2>, Tuple6<A1, A2, A3, A4, A5, A6> >
   2550           (obj, method, MakeTuple(p1, p2));
   2551   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   2552 }
   2553 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2554 #endif  // OS_WIN
   2555 
   2556 // 3 - 0
   2557 template <typename R, typename T, typename U, typename P1, typename P2,
   2558           typename P3, typename X1, typename X2, typename X3>
   2559 inline MutantFunctor<R, Tuple0>
   2560 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3), const P1& p1, const P2& p2,
   2561     const P3& p3) {
   2562   MutantRunner<R, Tuple0>* t =
   2563       new Mutant<R, T, R (U::*)(X1, X2, X3),
   2564                  Tuple3<P1, P2, P3>, Tuple0>
   2565           (obj, method, MakeTuple(p1, p2, p3));
   2566   return MutantFunctor<R, Tuple0>(t);
   2567 }
   2568 
   2569 template <typename R, typename P1, typename P2, typename P3, typename X1,
   2570           typename X2, typename X3>
   2571 inline MutantFunctor<R, Tuple0>
   2572 CreateFunctor(R (*function)(X1, X2, X3), const P1& p1, const P2& p2,
   2573     const P3& p3) {
   2574   MutantRunner<R, Tuple0>* t =
   2575       new MutantFunction<R, R (*)(X1, X2, X3),
   2576                          Tuple3<P1, P2, P3>, Tuple0>
   2577           (function, MakeTuple(p1, p2, p3));
   2578   return MutantFunctor<R, Tuple0>(t);
   2579 }
   2580 
   2581 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2582 template <typename R, typename T, typename U, typename P1, typename P2,
   2583           typename P3, typename X1, typename X2, typename X3>
   2584 inline MutantFunctor<R, Tuple0>
   2585 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3), const P1& p1, const P2& p2,
   2586     const P3& p3) {
   2587   MutantRunner<R, Tuple0>* t =
   2588       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3),
   2589                                Tuple3<P1, P2, P3>, Tuple0>
   2590           (obj, method, MakeTuple(p1, p2, p3));
   2591   return MutantFunctor<R, Tuple0>(t);
   2592 }
   2593 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2594 
   2595 #if defined (OS_WIN)
   2596 template <typename R, typename T, typename U, typename P1, typename P2,
   2597           typename P3, typename X1, typename X2, typename X3>
   2598 inline MutantFunctor<R, Tuple0>
   2599 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3), const P1& p1,
   2600     const P2& p2, const P3& p3) {
   2601   MutantRunner<R, Tuple0>* t =
   2602       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3),
   2603                  Tuple3<P1, P2, P3>, Tuple0>
   2604           (obj, method, MakeTuple(p1, p2, p3));
   2605   return MutantFunctor<R, Tuple0>(t);
   2606 }
   2607 
   2608 template <typename R, typename P1, typename P2, typename P3, typename X1,
   2609           typename X2, typename X3>
   2610 inline MutantFunctor<R, Tuple0>
   2611 CreateFunctor(R (__stdcall *function)(X1, X2, X3), const P1& p1, const P2& p2,
   2612     const P3& p3) {
   2613   MutantRunner<R, Tuple0>* t =
   2614       new MutantFunction<R, R (__stdcall *)(X1, X2, X3),
   2615                          Tuple3<P1, P2, P3>, Tuple0>
   2616           (function, MakeTuple(p1, p2, p3));
   2617   return MutantFunctor<R, Tuple0>(t);
   2618 }
   2619 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2620 template <typename R, typename T, typename U, typename P1, typename P2,
   2621           typename P3, typename X1, typename X2, typename X3>
   2622 inline MutantFunctor<R, Tuple0>
   2623 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3), const P1& p1,
   2624     const P2& p2, const P3& p3) {
   2625   MutantRunner<R, Tuple0>* t =
   2626       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3),
   2627                                Tuple3<P1, P2, P3>, Tuple0>
   2628           (obj, method, MakeTuple(p1, p2, p3));
   2629   return MutantFunctor<R, Tuple0>(t);
   2630 }
   2631 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2632 #endif  // OS_WIN
   2633 
   2634 // 3 - 1
   2635 template <typename R, typename T, typename U, typename P1, typename P2,
   2636           typename P3, typename A1, typename X1, typename X2, typename X3>
   2637 inline MutantFunctor<R, Tuple1<A1> >
   2638 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, A1), const P1& p1,
   2639     const P2& p2, const P3& p3) {
   2640   MutantRunner<R, Tuple1<A1> >* t =
   2641       new Mutant<R, T, R (U::*)(X1, X2, X3, A1),
   2642                  Tuple3<P1, P2, P3>, Tuple1<A1> >
   2643           (obj, method, MakeTuple(p1, p2, p3));
   2644   return MutantFunctor<R, Tuple1<A1> >(t);
   2645 }
   2646 
   2647 template <typename R, typename P1, typename P2, typename P3, typename A1,
   2648           typename X1, typename X2, typename X3>
   2649 inline MutantFunctor<R, Tuple1<A1> >
   2650 CreateFunctor(R (*function)(X1, X2, X3, A1), const P1& p1, const P2& p2,
   2651     const P3& p3) {
   2652   MutantRunner<R, Tuple1<A1> >* t =
   2653       new MutantFunction<R, R (*)(X1, X2, X3, A1),
   2654                          Tuple3<P1, P2, P3>, Tuple1<A1> >
   2655           (function, MakeTuple(p1, p2, p3));
   2656   return MutantFunctor<R, Tuple1<A1> >(t);
   2657 }
   2658 
   2659 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2660 template <typename R, typename T, typename U, typename P1, typename P2,
   2661           typename P3, typename A1, typename X1, typename X2, typename X3>
   2662 inline MutantFunctor<R, Tuple1<A1> >
   2663 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, A1), const P1& p1,
   2664     const P2& p2, const P3& p3) {
   2665   MutantRunner<R, Tuple1<A1> >* t =
   2666       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, A1),
   2667                                Tuple3<P1, P2, P3>, Tuple1<A1> >
   2668           (obj, method, MakeTuple(p1, p2, p3));
   2669   return MutantFunctor<R, Tuple1<A1> >(t);
   2670 }
   2671 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2672 
   2673 #if defined (OS_WIN)
   2674 template <typename R, typename T, typename U, typename P1, typename P2,
   2675           typename P3, typename A1, typename X1, typename X2, typename X3>
   2676 inline MutantFunctor<R, Tuple1<A1> >
   2677 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, A1), const P1& p1,
   2678     const P2& p2, const P3& p3) {
   2679   MutantRunner<R, Tuple1<A1> >* t =
   2680       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, A1),
   2681                  Tuple3<P1, P2, P3>, Tuple1<A1> >
   2682           (obj, method, MakeTuple(p1, p2, p3));
   2683   return MutantFunctor<R, Tuple1<A1> >(t);
   2684 }
   2685 
   2686 template <typename R, typename P1, typename P2, typename P3, typename A1,
   2687           typename X1, typename X2, typename X3>
   2688 inline MutantFunctor<R, Tuple1<A1> >
   2689 CreateFunctor(R (__stdcall *function)(X1, X2, X3, A1), const P1& p1,
   2690     const P2& p2, const P3& p3) {
   2691   MutantRunner<R, Tuple1<A1> >* t =
   2692       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, A1),
   2693                          Tuple3<P1, P2, P3>, Tuple1<A1> >
   2694           (function, MakeTuple(p1, p2, p3));
   2695   return MutantFunctor<R, Tuple1<A1> >(t);
   2696 }
   2697 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2698 template <typename R, typename T, typename U, typename P1, typename P2,
   2699           typename P3, typename A1, typename X1, typename X2, typename X3>
   2700 inline MutantFunctor<R, Tuple1<A1> >
   2701 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, A1), const P1& p1,
   2702     const P2& p2, const P3& p3) {
   2703   MutantRunner<R, Tuple1<A1> >* t =
   2704       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, A1),
   2705                                Tuple3<P1, P2, P3>, Tuple1<A1> >
   2706           (obj, method, MakeTuple(p1, p2, p3));
   2707   return MutantFunctor<R, Tuple1<A1> >(t);
   2708 }
   2709 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2710 #endif  // OS_WIN
   2711 
   2712 // 3 - 2
   2713 template <typename R, typename T, typename U, typename P1, typename P2,
   2714           typename P3, typename A1, typename A2, typename X1, typename X2,
   2715           typename X3>
   2716 inline MutantFunctor<R, Tuple2<A1, A2> >
   2717 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, A1, A2), const P1& p1,
   2718     const P2& p2, const P3& p3) {
   2719   MutantRunner<R, Tuple2<A1, A2> >* t =
   2720       new Mutant<R, T, R (U::*)(X1, X2, X3, A1, A2),
   2721                  Tuple3<P1, P2, P3>, Tuple2<A1, A2> >
   2722           (obj, method, MakeTuple(p1, p2, p3));
   2723   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   2724 }
   2725 
   2726 template <typename R, typename P1, typename P2, typename P3, typename A1,
   2727           typename A2, typename X1, typename X2, typename X3>
   2728 inline MutantFunctor<R, Tuple2<A1, A2> >
   2729 CreateFunctor(R (*function)(X1, X2, X3, A1, A2), const P1& p1, const P2& p2,
   2730     const P3& p3) {
   2731   MutantRunner<R, Tuple2<A1, A2> >* t =
   2732       new MutantFunction<R, R (*)(X1, X2, X3, A1, A2),
   2733                          Tuple3<P1, P2, P3>, Tuple2<A1, A2> >
   2734           (function, MakeTuple(p1, p2, p3));
   2735   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   2736 }
   2737 
   2738 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2739 template <typename R, typename T, typename U, typename P1, typename P2,
   2740           typename P3, typename A1, typename A2, typename X1, typename X2,
   2741           typename X3>
   2742 inline MutantFunctor<R, Tuple2<A1, A2> >
   2743 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, A1, A2), const P1& p1,
   2744     const P2& p2, const P3& p3) {
   2745   MutantRunner<R, Tuple2<A1, A2> >* t =
   2746       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, A1, A2),
   2747                                Tuple3<P1, P2, P3>, Tuple2<A1, A2> >
   2748           (obj, method, MakeTuple(p1, p2, p3));
   2749   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   2750 }
   2751 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2752 
   2753 #if defined (OS_WIN)
   2754 template <typename R, typename T, typename U, typename P1, typename P2,
   2755           typename P3, typename A1, typename A2, typename X1, typename X2,
   2756           typename X3>
   2757 inline MutantFunctor<R, Tuple2<A1, A2> >
   2758 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2),
   2759     const P1& p1, const P2& p2, const P3& p3) {
   2760   MutantRunner<R, Tuple2<A1, A2> >* t =
   2761       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2),
   2762                  Tuple3<P1, P2, P3>, Tuple2<A1, A2> >
   2763           (obj, method, MakeTuple(p1, p2, p3));
   2764   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   2765 }
   2766 
   2767 template <typename R, typename P1, typename P2, typename P3, typename A1,
   2768           typename A2, typename X1, typename X2, typename X3>
   2769 inline MutantFunctor<R, Tuple2<A1, A2> >
   2770 CreateFunctor(R (__stdcall *function)(X1, X2, X3, A1, A2), const P1& p1,
   2771     const P2& p2, const P3& p3) {
   2772   MutantRunner<R, Tuple2<A1, A2> >* t =
   2773       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, A1, A2),
   2774                          Tuple3<P1, P2, P3>, Tuple2<A1, A2> >
   2775           (function, MakeTuple(p1, p2, p3));
   2776   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   2777 }
   2778 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2779 template <typename R, typename T, typename U, typename P1, typename P2,
   2780           typename P3, typename A1, typename A2, typename X1, typename X2,
   2781           typename X3>
   2782 inline MutantFunctor<R, Tuple2<A1, A2> >
   2783 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2),
   2784     const P1& p1, const P2& p2, const P3& p3) {
   2785   MutantRunner<R, Tuple2<A1, A2> >* t =
   2786       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2),
   2787                                Tuple3<P1, P2, P3>, Tuple2<A1, A2> >
   2788           (obj, method, MakeTuple(p1, p2, p3));
   2789   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   2790 }
   2791 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2792 #endif  // OS_WIN
   2793 
   2794 // 3 - 3
   2795 template <typename R, typename T, typename U, typename P1, typename P2,
   2796           typename P3, typename A1, typename A2, typename A3, typename X1,
   2797           typename X2, typename X3>
   2798 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   2799 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, A1, A2, A3), const P1& p1,
   2800     const P2& p2, const P3& p3) {
   2801   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   2802       new Mutant<R, T, R (U::*)(X1, X2, X3, A1, A2, A3),
   2803                  Tuple3<P1, P2, P3>, Tuple3<A1, A2, A3> >
   2804           (obj, method, MakeTuple(p1, p2, p3));
   2805   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   2806 }
   2807 
   2808 template <typename R, typename P1, typename P2, typename P3, typename A1,
   2809           typename A2, typename A3, typename X1, typename X2, typename X3>
   2810 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   2811 CreateFunctor(R (*function)(X1, X2, X3, A1, A2, A3), const P1& p1, const P2& p2,
   2812     const P3& p3) {
   2813   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   2814       new MutantFunction<R, R (*)(X1, X2, X3, A1, A2, A3),
   2815                          Tuple3<P1, P2, P3>, Tuple3<A1, A2, A3> >
   2816           (function, MakeTuple(p1, p2, p3));
   2817   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   2818 }
   2819 
   2820 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2821 template <typename R, typename T, typename U, typename P1, typename P2,
   2822           typename P3, typename A1, typename A2, typename A3, typename X1,
   2823           typename X2, typename X3>
   2824 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   2825 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, A1, A2, A3), const P1& p1,
   2826     const P2& p2, const P3& p3) {
   2827   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   2828       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, A1, A2, A3),
   2829                                Tuple3<P1, P2, P3>, Tuple3<A1, A2, A3> >
   2830           (obj, method, MakeTuple(p1, p2, p3));
   2831   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   2832 }
   2833 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2834 
   2835 #if defined (OS_WIN)
   2836 template <typename R, typename T, typename U, typename P1, typename P2,
   2837           typename P3, typename A1, typename A2, typename A3, typename X1,
   2838           typename X2, typename X3>
   2839 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   2840 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2, A3),
   2841     const P1& p1, const P2& p2, const P3& p3) {
   2842   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   2843       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2, A3),
   2844                  Tuple3<P1, P2, P3>, Tuple3<A1, A2, A3> >
   2845           (obj, method, MakeTuple(p1, p2, p3));
   2846   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   2847 }
   2848 
   2849 template <typename R, typename P1, typename P2, typename P3, typename A1,
   2850           typename A2, typename A3, typename X1, typename X2, typename X3>
   2851 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   2852 CreateFunctor(R (__stdcall *function)(X1, X2, X3, A1, A2, A3), const P1& p1,
   2853     const P2& p2, const P3& p3) {
   2854   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   2855       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, A1, A2, A3),
   2856                          Tuple3<P1, P2, P3>, Tuple3<A1, A2, A3> >
   2857           (function, MakeTuple(p1, p2, p3));
   2858   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   2859 }
   2860 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2861 template <typename R, typename T, typename U, typename P1, typename P2,
   2862           typename P3, typename A1, typename A2, typename A3, typename X1,
   2863           typename X2, typename X3>
   2864 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   2865 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2, A3),
   2866     const P1& p1, const P2& p2, const P3& p3) {
   2867   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   2868       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2, A3),
   2869                                Tuple3<P1, P2, P3>, Tuple3<A1, A2, A3> >
   2870           (obj, method, MakeTuple(p1, p2, p3));
   2871   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   2872 }
   2873 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2874 #endif  // OS_WIN
   2875 
   2876 // 3 - 4
   2877 template <typename R, typename T, typename U, typename P1, typename P2,
   2878           typename P3, typename A1, typename A2, typename A3, typename A4,
   2879           typename X1, typename X2, typename X3>
   2880 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   2881 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, A1, A2, A3, A4), const P1& p1,
   2882     const P2& p2, const P3& p3) {
   2883   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   2884       new Mutant<R, T, R (U::*)(X1, X2, X3, A1, A2, A3, A4),
   2885                  Tuple3<P1, P2, P3>, Tuple4<A1, A2, A3, A4> >
   2886           (obj, method, MakeTuple(p1, p2, p3));
   2887   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   2888 }
   2889 
   2890 template <typename R, typename P1, typename P2, typename P3, typename A1,
   2891           typename A2, typename A3, typename A4, typename X1, typename X2,
   2892           typename X3>
   2893 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   2894 CreateFunctor(R (*function)(X1, X2, X3, A1, A2, A3, A4), const P1& p1,
   2895     const P2& p2, const P3& p3) {
   2896   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   2897       new MutantFunction<R, R (*)(X1, X2, X3, A1, A2, A3, A4),
   2898                          Tuple3<P1, P2, P3>, Tuple4<A1, A2, A3, A4> >
   2899           (function, MakeTuple(p1, p2, p3));
   2900   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   2901 }
   2902 
   2903 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2904 template <typename R, typename T, typename U, typename P1, typename P2,
   2905           typename P3, typename A1, typename A2, typename A3, typename A4,
   2906           typename X1, typename X2, typename X3>
   2907 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   2908 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, A1, A2, A3, A4), const P1& p1,
   2909     const P2& p2, const P3& p3) {
   2910   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   2911       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, A1, A2, A3, A4),
   2912                                Tuple3<P1, P2, P3>, Tuple4<A1, A2, A3, A4> >
   2913           (obj, method, MakeTuple(p1, p2, p3));
   2914   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   2915 }
   2916 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2917 
   2918 #if defined (OS_WIN)
   2919 template <typename R, typename T, typename U, typename P1, typename P2,
   2920           typename P3, typename A1, typename A2, typename A3, typename A4,
   2921           typename X1, typename X2, typename X3>
   2922 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   2923 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2, A3, A4),
   2924     const P1& p1, const P2& p2, const P3& p3) {
   2925   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   2926       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2, A3, A4),
   2927                  Tuple3<P1, P2, P3>, Tuple4<A1, A2, A3, A4> >
   2928           (obj, method, MakeTuple(p1, p2, p3));
   2929   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   2930 }
   2931 
   2932 template <typename R, typename P1, typename P2, typename P3, typename A1,
   2933           typename A2, typename A3, typename A4, typename X1, typename X2,
   2934           typename X3>
   2935 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   2936 CreateFunctor(R (__stdcall *function)(X1, X2, X3, A1, A2, A3, A4), const P1& p1,
   2937     const P2& p2, const P3& p3) {
   2938   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   2939       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, A1, A2, A3, A4),
   2940                          Tuple3<P1, P2, P3>, Tuple4<A1, A2, A3, A4> >
   2941           (function, MakeTuple(p1, p2, p3));
   2942   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   2943 }
   2944 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2945 template <typename R, typename T, typename U, typename P1, typename P2,
   2946           typename P3, typename A1, typename A2, typename A3, typename A4,
   2947           typename X1, typename X2, typename X3>
   2948 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   2949 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2, A3, A4),
   2950     const P1& p1, const P2& p2, const P3& p3) {
   2951   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   2952       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2, A3, A4),
   2953                                Tuple3<P1, P2, P3>, Tuple4<A1, A2, A3, A4> >
   2954           (obj, method, MakeTuple(p1, p2, p3));
   2955   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   2956 }
   2957 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2958 #endif  // OS_WIN
   2959 
   2960 // 3 - 5
   2961 template <typename R, typename T, typename U, typename P1, typename P2,
   2962           typename P3, typename A1, typename A2, typename A3, typename A4,
   2963           typename A5, typename X1, typename X2, typename X3>
   2964 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   2965 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, A1, A2, A3, A4, A5),
   2966     const P1& p1, const P2& p2, const P3& p3) {
   2967   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   2968       new Mutant<R, T, R (U::*)(X1, X2, X3, A1, A2, A3, A4, A5),
   2969                  Tuple3<P1, P2, P3>, Tuple5<A1, A2, A3, A4, A5> >
   2970           (obj, method, MakeTuple(p1, p2, p3));
   2971   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   2972 }
   2973 
   2974 template <typename R, typename P1, typename P2, typename P3, typename A1,
   2975           typename A2, typename A3, typename A4, typename A5, typename X1,
   2976           typename X2, typename X3>
   2977 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   2978 CreateFunctor(R (*function)(X1, X2, X3, A1, A2, A3, A4, A5), const P1& p1,
   2979     const P2& p2, const P3& p3) {
   2980   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   2981       new MutantFunction<R, R (*)(X1, X2, X3, A1, A2, A3, A4, A5),
   2982                          Tuple3<P1, P2, P3>, Tuple5<A1, A2, A3, A4, A5> >
   2983           (function, MakeTuple(p1, p2, p3));
   2984   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   2985 }
   2986 
   2987 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   2988 template <typename R, typename T, typename U, typename P1, typename P2,
   2989           typename P3, typename A1, typename A2, typename A3, typename A4,
   2990           typename A5, typename X1, typename X2, typename X3>
   2991 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   2992 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, A1, A2, A3, A4, A5),
   2993     const P1& p1, const P2& p2, const P3& p3) {
   2994   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   2995       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, A1, A2, A3, A4, A5),
   2996                                Tuple3<P1, P2, P3>, Tuple5<A1, A2, A3, A4, A5> >
   2997           (obj, method, MakeTuple(p1, p2, p3));
   2998   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   2999 }
   3000 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3001 
   3002 #if defined (OS_WIN)
   3003 template <typename R, typename T, typename U, typename P1, typename P2,
   3004           typename P3, typename A1, typename A2, typename A3, typename A4,
   3005           typename A5, typename X1, typename X2, typename X3>
   3006 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   3007 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2, A3, A4, A5),
   3008     const P1& p1, const P2& p2, const P3& p3) {
   3009   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   3010       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2, A3, A4, A5),
   3011                  Tuple3<P1, P2, P3>, Tuple5<A1, A2, A3, A4, A5> >
   3012           (obj, method, MakeTuple(p1, p2, p3));
   3013   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   3014 }
   3015 
   3016 template <typename R, typename P1, typename P2, typename P3, typename A1,
   3017           typename A2, typename A3, typename A4, typename A5, typename X1,
   3018           typename X2, typename X3>
   3019 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   3020 CreateFunctor(R (__stdcall *function)(X1, X2, X3, A1, A2, A3, A4, A5),
   3021     const P1& p1, const P2& p2, const P3& p3) {
   3022   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   3023       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, A1, A2, A3, A4, A5),
   3024                          Tuple3<P1, P2, P3>, Tuple5<A1, A2, A3, A4, A5> >
   3025           (function, MakeTuple(p1, p2, p3));
   3026   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   3027 }
   3028 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3029 template <typename R, typename T, typename U, typename P1, typename P2,
   3030           typename P3, typename A1, typename A2, typename A3, typename A4,
   3031           typename A5, typename X1, typename X2, typename X3>
   3032 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   3033 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2, A3, A4, A5),
   3034     const P1& p1, const P2& p2, const P3& p3) {
   3035   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   3036       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2, A3, A4, A5),
   3037                                Tuple3<P1, P2, P3>, Tuple5<A1, A2, A3, A4, A5> >
   3038           (obj, method, MakeTuple(p1, p2, p3));
   3039   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   3040 }
   3041 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3042 #endif  // OS_WIN
   3043 
   3044 // 3 - 6
   3045 template <typename R, typename T, typename U, typename P1, typename P2,
   3046           typename P3, typename A1, typename A2, typename A3, typename A4,
   3047           typename A5, typename A6, typename X1, typename X2, typename X3>
   3048 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   3049 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, A1, A2, A3, A4, A5, A6),
   3050     const P1& p1, const P2& p2, const P3& p3) {
   3051   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   3052       new Mutant<R, T, R (U::*)(X1, X2, X3, A1, A2, A3, A4, A5, A6),
   3053                  Tuple3<P1, P2, P3>, Tuple6<A1, A2, A3, A4, A5, A6> >
   3054           (obj, method, MakeTuple(p1, p2, p3));
   3055   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   3056 }
   3057 
   3058 template <typename R, typename P1, typename P2, typename P3, typename A1,
   3059           typename A2, typename A3, typename A4, typename A5, typename A6,
   3060           typename X1, typename X2, typename X3>
   3061 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   3062 CreateFunctor(R (*function)(X1, X2, X3, A1, A2, A3, A4, A5, A6), const P1& p1,
   3063     const P2& p2, const P3& p3) {
   3064   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   3065       new MutantFunction<R, R (*)(X1, X2, X3, A1, A2, A3, A4, A5, A6),
   3066                          Tuple3<P1, P2, P3>, Tuple6<A1, A2, A3, A4, A5, A6> >
   3067           (function, MakeTuple(p1, p2, p3));
   3068   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   3069 }
   3070 
   3071 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3072 template <typename R, typename T, typename U, typename P1, typename P2,
   3073           typename P3, typename A1, typename A2, typename A3, typename A4,
   3074           typename A5, typename A6, typename X1, typename X2, typename X3>
   3075 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   3076 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, A1, A2, A3, A4, A5, A6),
   3077     const P1& p1, const P2& p2, const P3& p3) {
   3078   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   3079       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, A1, A2, A3, A4, A5, A6),
   3080                                Tuple3<P1, P2, P3>, Tuple6<A1, A2, A3, A4, A5, A6> >
   3081           (obj, method, MakeTuple(p1, p2, p3));
   3082   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   3083 }
   3084 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3085 
   3086 #if defined (OS_WIN)
   3087 template <typename R, typename T, typename U, typename P1, typename P2,
   3088           typename P3, typename A1, typename A2, typename A3, typename A4,
   3089           typename A5, typename A6, typename X1, typename X2, typename X3>
   3090 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   3091 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2, A3, A4, A5,
   3092     A6), const P1& p1, const P2& p2, const P3& p3) {
   3093   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   3094       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2, A3, A4, A5, A6),
   3095                  Tuple3<P1, P2, P3>, Tuple6<A1, A2, A3, A4, A5, A6> >
   3096           (obj, method, MakeTuple(p1, p2, p3));
   3097   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   3098 }
   3099 
   3100 template <typename R, typename P1, typename P2, typename P3, typename A1,
   3101           typename A2, typename A3, typename A4, typename A5, typename A6,
   3102           typename X1, typename X2, typename X3>
   3103 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   3104 CreateFunctor(R (__stdcall *function)(X1, X2, X3, A1, A2, A3, A4, A5, A6),
   3105     const P1& p1, const P2& p2, const P3& p3) {
   3106   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   3107       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, A1, A2, A3, A4, A5, A6),
   3108                          Tuple3<P1, P2, P3>, Tuple6<A1, A2, A3, A4, A5, A6> >
   3109           (function, MakeTuple(p1, p2, p3));
   3110   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   3111 }
   3112 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3113 template <typename R, typename T, typename U, typename P1, typename P2,
   3114           typename P3, typename A1, typename A2, typename A3, typename A4,
   3115           typename A5, typename A6, typename X1, typename X2, typename X3>
   3116 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   3117 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2, A3, A4, A5,
   3118     A6), const P1& p1, const P2& p2, const P3& p3) {
   3119   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   3120       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2, A3, A4, A5, A6),
   3121                                Tuple3<P1, P2, P3>, Tuple6<A1, A2, A3, A4, A5, A6> >
   3122           (obj, method, MakeTuple(p1, p2, p3));
   3123   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   3124 }
   3125 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3126 #endif  // OS_WIN
   3127 
   3128 // 4 - 0
   3129 template <typename R, typename T, typename U, typename P1, typename P2,
   3130           typename P3, typename P4, typename X1, typename X2, typename X3,
   3131           typename X4>
   3132 inline MutantFunctor<R, Tuple0>
   3133 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4), const P1& p1,
   3134     const P2& p2, const P3& p3, const P4& p4) {
   3135   MutantRunner<R, Tuple0>* t =
   3136       new Mutant<R, T, R (U::*)(X1, X2, X3, X4),
   3137                  Tuple4<P1, P2, P3, P4>, Tuple0>
   3138           (obj, method, MakeTuple(p1, p2, p3, p4));
   3139   return MutantFunctor<R, Tuple0>(t);
   3140 }
   3141 
   3142 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3143           typename X1, typename X2, typename X3, typename X4>
   3144 inline MutantFunctor<R, Tuple0>
   3145 CreateFunctor(R (*function)(X1, X2, X3, X4), const P1& p1, const P2& p2,
   3146     const P3& p3, const P4& p4) {
   3147   MutantRunner<R, Tuple0>* t =
   3148       new MutantFunction<R, R (*)(X1, X2, X3, X4),
   3149                          Tuple4<P1, P2, P3, P4>, Tuple0>
   3150           (function, MakeTuple(p1, p2, p3, p4));
   3151   return MutantFunctor<R, Tuple0>(t);
   3152 }
   3153 
   3154 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3155 template <typename R, typename T, typename U, typename P1, typename P2,
   3156           typename P3, typename P4, typename X1, typename X2, typename X3,
   3157           typename X4>
   3158 inline MutantFunctor<R, Tuple0>
   3159 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4), const P1& p1,
   3160     const P2& p2, const P3& p3, const P4& p4) {
   3161   MutantRunner<R, Tuple0>* t =
   3162       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4),
   3163                                Tuple4<P1, P2, P3, P4>, Tuple0>
   3164           (obj, method, MakeTuple(p1, p2, p3, p4));
   3165   return MutantFunctor<R, Tuple0>(t);
   3166 }
   3167 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3168 
   3169 #if defined (OS_WIN)
   3170 template <typename R, typename T, typename U, typename P1, typename P2,
   3171           typename P3, typename P4, typename X1, typename X2, typename X3,
   3172           typename X4>
   3173 inline MutantFunctor<R, Tuple0>
   3174 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4), const P1& p1,
   3175     const P2& p2, const P3& p3, const P4& p4) {
   3176   MutantRunner<R, Tuple0>* t =
   3177       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4),
   3178                  Tuple4<P1, P2, P3, P4>, Tuple0>
   3179           (obj, method, MakeTuple(p1, p2, p3, p4));
   3180   return MutantFunctor<R, Tuple0>(t);
   3181 }
   3182 
   3183 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3184           typename X1, typename X2, typename X3, typename X4>
   3185 inline MutantFunctor<R, Tuple0>
   3186 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4), const P1& p1,
   3187     const P2& p2, const P3& p3, const P4& p4) {
   3188   MutantRunner<R, Tuple0>* t =
   3189       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4),
   3190                          Tuple4<P1, P2, P3, P4>, Tuple0>
   3191           (function, MakeTuple(p1, p2, p3, p4));
   3192   return MutantFunctor<R, Tuple0>(t);
   3193 }
   3194 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3195 template <typename R, typename T, typename U, typename P1, typename P2,
   3196           typename P3, typename P4, typename X1, typename X2, typename X3,
   3197           typename X4>
   3198 inline MutantFunctor<R, Tuple0>
   3199 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4), const P1& p1,
   3200     const P2& p2, const P3& p3, const P4& p4) {
   3201   MutantRunner<R, Tuple0>* t =
   3202       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4),
   3203                                Tuple4<P1, P2, P3, P4>, Tuple0>
   3204           (obj, method, MakeTuple(p1, p2, p3, p4));
   3205   return MutantFunctor<R, Tuple0>(t);
   3206 }
   3207 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3208 #endif  // OS_WIN
   3209 
   3210 // 4 - 1
   3211 template <typename R, typename T, typename U, typename P1, typename P2,
   3212           typename P3, typename P4, typename A1, typename X1, typename X2,
   3213           typename X3, typename X4>
   3214 inline MutantFunctor<R, Tuple1<A1> >
   3215 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, A1), const P1& p1,
   3216     const P2& p2, const P3& p3, const P4& p4) {
   3217   MutantRunner<R, Tuple1<A1> >* t =
   3218       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, A1),
   3219                  Tuple4<P1, P2, P3, P4>, Tuple1<A1> >
   3220           (obj, method, MakeTuple(p1, p2, p3, p4));
   3221   return MutantFunctor<R, Tuple1<A1> >(t);
   3222 }
   3223 
   3224 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3225           typename A1, typename X1, typename X2, typename X3, typename X4>
   3226 inline MutantFunctor<R, Tuple1<A1> >
   3227 CreateFunctor(R (*function)(X1, X2, X3, X4, A1), const P1& p1, const P2& p2,
   3228     const P3& p3, const P4& p4) {
   3229   MutantRunner<R, Tuple1<A1> >* t =
   3230       new MutantFunction<R, R (*)(X1, X2, X3, X4, A1),
   3231                          Tuple4<P1, P2, P3, P4>, Tuple1<A1> >
   3232           (function, MakeTuple(p1, p2, p3, p4));
   3233   return MutantFunctor<R, Tuple1<A1> >(t);
   3234 }
   3235 
   3236 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3237 template <typename R, typename T, typename U, typename P1, typename P2,
   3238           typename P3, typename P4, typename A1, typename X1, typename X2,
   3239           typename X3, typename X4>
   3240 inline MutantFunctor<R, Tuple1<A1> >
   3241 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, A1), const P1& p1,
   3242     const P2& p2, const P3& p3, const P4& p4) {
   3243   MutantRunner<R, Tuple1<A1> >* t =
   3244       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, A1),
   3245                                Tuple4<P1, P2, P3, P4>, Tuple1<A1> >
   3246           (obj, method, MakeTuple(p1, p2, p3, p4));
   3247   return MutantFunctor<R, Tuple1<A1> >(t);
   3248 }
   3249 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3250 
   3251 #if defined (OS_WIN)
   3252 template <typename R, typename T, typename U, typename P1, typename P2,
   3253           typename P3, typename P4, typename A1, typename X1, typename X2,
   3254           typename X3, typename X4>
   3255 inline MutantFunctor<R, Tuple1<A1> >
   3256 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1),
   3257     const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3258   MutantRunner<R, Tuple1<A1> >* t =
   3259       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1),
   3260                  Tuple4<P1, P2, P3, P4>, Tuple1<A1> >
   3261           (obj, method, MakeTuple(p1, p2, p3, p4));
   3262   return MutantFunctor<R, Tuple1<A1> >(t);
   3263 }
   3264 
   3265 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3266           typename A1, typename X1, typename X2, typename X3, typename X4>
   3267 inline MutantFunctor<R, Tuple1<A1> >
   3268 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, A1), const P1& p1,
   3269     const P2& p2, const P3& p3, const P4& p4) {
   3270   MutantRunner<R, Tuple1<A1> >* t =
   3271       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, A1),
   3272                          Tuple4<P1, P2, P3, P4>, Tuple1<A1> >
   3273           (function, MakeTuple(p1, p2, p3, p4));
   3274   return MutantFunctor<R, Tuple1<A1> >(t);
   3275 }
   3276 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3277 template <typename R, typename T, typename U, typename P1, typename P2,
   3278           typename P3, typename P4, typename A1, typename X1, typename X2,
   3279           typename X3, typename X4>
   3280 inline MutantFunctor<R, Tuple1<A1> >
   3281 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1),
   3282     const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3283   MutantRunner<R, Tuple1<A1> >* t =
   3284       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1),
   3285                                Tuple4<P1, P2, P3, P4>, Tuple1<A1> >
   3286           (obj, method, MakeTuple(p1, p2, p3, p4));
   3287   return MutantFunctor<R, Tuple1<A1> >(t);
   3288 }
   3289 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3290 #endif  // OS_WIN
   3291 
   3292 // 4 - 2
   3293 template <typename R, typename T, typename U, typename P1, typename P2,
   3294           typename P3, typename P4, typename A1, typename A2, typename X1,
   3295           typename X2, typename X3, typename X4>
   3296 inline MutantFunctor<R, Tuple2<A1, A2> >
   3297 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, A1, A2), const P1& p1,
   3298     const P2& p2, const P3& p3, const P4& p4) {
   3299   MutantRunner<R, Tuple2<A1, A2> >* t =
   3300       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, A1, A2),
   3301                  Tuple4<P1, P2, P3, P4>, Tuple2<A1, A2> >
   3302           (obj, method, MakeTuple(p1, p2, p3, p4));
   3303   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   3304 }
   3305 
   3306 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3307           typename A1, typename A2, typename X1, typename X2, typename X3,
   3308           typename X4>
   3309 inline MutantFunctor<R, Tuple2<A1, A2> >
   3310 CreateFunctor(R (*function)(X1, X2, X3, X4, A1, A2), const P1& p1, const P2& p2,
   3311     const P3& p3, const P4& p4) {
   3312   MutantRunner<R, Tuple2<A1, A2> >* t =
   3313       new MutantFunction<R, R (*)(X1, X2, X3, X4, A1, A2),
   3314                          Tuple4<P1, P2, P3, P4>, Tuple2<A1, A2> >
   3315           (function, MakeTuple(p1, p2, p3, p4));
   3316   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   3317 }
   3318 
   3319 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3320 template <typename R, typename T, typename U, typename P1, typename P2,
   3321           typename P3, typename P4, typename A1, typename A2, typename X1,
   3322           typename X2, typename X3, typename X4>
   3323 inline MutantFunctor<R, Tuple2<A1, A2> >
   3324 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, A1, A2), const P1& p1,
   3325     const P2& p2, const P3& p3, const P4& p4) {
   3326   MutantRunner<R, Tuple2<A1, A2> >* t =
   3327       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, A1, A2),
   3328                                Tuple4<P1, P2, P3, P4>, Tuple2<A1, A2> >
   3329           (obj, method, MakeTuple(p1, p2, p3, p4));
   3330   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   3331 }
   3332 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3333 
   3334 #if defined (OS_WIN)
   3335 template <typename R, typename T, typename U, typename P1, typename P2,
   3336           typename P3, typename P4, typename A1, typename A2, typename X1,
   3337           typename X2, typename X3, typename X4>
   3338 inline MutantFunctor<R, Tuple2<A1, A2> >
   3339 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2),
   3340     const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3341   MutantRunner<R, Tuple2<A1, A2> >* t =
   3342       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2),
   3343                  Tuple4<P1, P2, P3, P4>, Tuple2<A1, A2> >
   3344           (obj, method, MakeTuple(p1, p2, p3, p4));
   3345   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   3346 }
   3347 
   3348 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3349           typename A1, typename A2, typename X1, typename X2, typename X3,
   3350           typename X4>
   3351 inline MutantFunctor<R, Tuple2<A1, A2> >
   3352 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, A1, A2), const P1& p1,
   3353     const P2& p2, const P3& p3, const P4& p4) {
   3354   MutantRunner<R, Tuple2<A1, A2> >* t =
   3355       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, A1, A2),
   3356                          Tuple4<P1, P2, P3, P4>, Tuple2<A1, A2> >
   3357           (function, MakeTuple(p1, p2, p3, p4));
   3358   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   3359 }
   3360 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3361 template <typename R, typename T, typename U, typename P1, typename P2,
   3362           typename P3, typename P4, typename A1, typename A2, typename X1,
   3363           typename X2, typename X3, typename X4>
   3364 inline MutantFunctor<R, Tuple2<A1, A2> >
   3365 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2),
   3366     const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3367   MutantRunner<R, Tuple2<A1, A2> >* t =
   3368       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2),
   3369                                Tuple4<P1, P2, P3, P4>, Tuple2<A1, A2> >
   3370           (obj, method, MakeTuple(p1, p2, p3, p4));
   3371   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   3372 }
   3373 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3374 #endif  // OS_WIN
   3375 
   3376 // 4 - 3
   3377 template <typename R, typename T, typename U, typename P1, typename P2,
   3378           typename P3, typename P4, typename A1, typename A2, typename A3,
   3379           typename X1, typename X2, typename X3, typename X4>
   3380 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   3381 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3), const P1& p1,
   3382     const P2& p2, const P3& p3, const P4& p4) {
   3383   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   3384       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3),
   3385                  Tuple4<P1, P2, P3, P4>, Tuple3<A1, A2, A3> >
   3386           (obj, method, MakeTuple(p1, p2, p3, p4));
   3387   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   3388 }
   3389 
   3390 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3391           typename A1, typename A2, typename A3, typename X1, typename X2,
   3392           typename X3, typename X4>
   3393 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   3394 CreateFunctor(R (*function)(X1, X2, X3, X4, A1, A2, A3), const P1& p1,
   3395     const P2& p2, const P3& p3, const P4& p4) {
   3396   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   3397       new MutantFunction<R, R (*)(X1, X2, X3, X4, A1, A2, A3),
   3398                          Tuple4<P1, P2, P3, P4>, Tuple3<A1, A2, A3> >
   3399           (function, MakeTuple(p1, p2, p3, p4));
   3400   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   3401 }
   3402 
   3403 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3404 template <typename R, typename T, typename U, typename P1, typename P2,
   3405           typename P3, typename P4, typename A1, typename A2, typename A3,
   3406           typename X1, typename X2, typename X3, typename X4>
   3407 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   3408 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3), const P1& p1,
   3409     const P2& p2, const P3& p3, const P4& p4) {
   3410   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   3411       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3),
   3412                                Tuple4<P1, P2, P3, P4>, Tuple3<A1, A2, A3> >
   3413           (obj, method, MakeTuple(p1, p2, p3, p4));
   3414   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   3415 }
   3416 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3417 
   3418 #if defined (OS_WIN)
   3419 template <typename R, typename T, typename U, typename P1, typename P2,
   3420           typename P3, typename P4, typename A1, typename A2, typename A3,
   3421           typename X1, typename X2, typename X3, typename X4>
   3422 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   3423 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2, A3),
   3424     const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3425   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   3426       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2, A3),
   3427                  Tuple4<P1, P2, P3, P4>, Tuple3<A1, A2, A3> >
   3428           (obj, method, MakeTuple(p1, p2, p3, p4));
   3429   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   3430 }
   3431 
   3432 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3433           typename A1, typename A2, typename A3, typename X1, typename X2,
   3434           typename X3, typename X4>
   3435 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   3436 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, A1, A2, A3), const P1& p1,
   3437     const P2& p2, const P3& p3, const P4& p4) {
   3438   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   3439       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, A1, A2, A3),
   3440                          Tuple4<P1, P2, P3, P4>, Tuple3<A1, A2, A3> >
   3441           (function, MakeTuple(p1, p2, p3, p4));
   3442   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   3443 }
   3444 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3445 template <typename R, typename T, typename U, typename P1, typename P2,
   3446           typename P3, typename P4, typename A1, typename A2, typename A3,
   3447           typename X1, typename X2, typename X3, typename X4>
   3448 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   3449 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2, A3),
   3450     const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3451   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   3452       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2, A3),
   3453                                Tuple4<P1, P2, P3, P4>, Tuple3<A1, A2, A3> >
   3454           (obj, method, MakeTuple(p1, p2, p3, p4));
   3455   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   3456 }
   3457 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3458 #endif  // OS_WIN
   3459 
   3460 // 4 - 4
   3461 template <typename R, typename T, typename U, typename P1, typename P2,
   3462           typename P3, typename P4, typename A1, typename A2, typename A3,
   3463           typename A4, typename X1, typename X2, typename X3, typename X4>
   3464 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   3465 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3, A4),
   3466     const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3467   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   3468       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3, A4),
   3469                  Tuple4<P1, P2, P3, P4>, Tuple4<A1, A2, A3, A4> >
   3470           (obj, method, MakeTuple(p1, p2, p3, p4));
   3471   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   3472 }
   3473 
   3474 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3475           typename A1, typename A2, typename A3, typename A4, typename X1,
   3476           typename X2, typename X3, typename X4>
   3477 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   3478 CreateFunctor(R (*function)(X1, X2, X3, X4, A1, A2, A3, A4), const P1& p1,
   3479     const P2& p2, const P3& p3, const P4& p4) {
   3480   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   3481       new MutantFunction<R, R (*)(X1, X2, X3, X4, A1, A2, A3, A4),
   3482                          Tuple4<P1, P2, P3, P4>, Tuple4<A1, A2, A3, A4> >
   3483           (function, MakeTuple(p1, p2, p3, p4));
   3484   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   3485 }
   3486 
   3487 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3488 template <typename R, typename T, typename U, typename P1, typename P2,
   3489           typename P3, typename P4, typename A1, typename A2, typename A3,
   3490           typename A4, typename X1, typename X2, typename X3, typename X4>
   3491 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   3492 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3, A4),
   3493     const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3494   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   3495       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3, A4),
   3496                                Tuple4<P1, P2, P3, P4>, Tuple4<A1, A2, A3, A4> >
   3497           (obj, method, MakeTuple(p1, p2, p3, p4));
   3498   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   3499 }
   3500 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3501 
   3502 #if defined (OS_WIN)
   3503 template <typename R, typename T, typename U, typename P1, typename P2,
   3504           typename P3, typename P4, typename A1, typename A2, typename A3,
   3505           typename A4, typename X1, typename X2, typename X3, typename X4>
   3506 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   3507 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2, A3, A4),
   3508     const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3509   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   3510       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2, A3, A4),
   3511                  Tuple4<P1, P2, P3, P4>, Tuple4<A1, A2, A3, A4> >
   3512           (obj, method, MakeTuple(p1, p2, p3, p4));
   3513   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   3514 }
   3515 
   3516 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3517           typename A1, typename A2, typename A3, typename A4, typename X1,
   3518           typename X2, typename X3, typename X4>
   3519 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   3520 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, A1, A2, A3, A4),
   3521     const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3522   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   3523       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, A1, A2, A3, A4),
   3524                          Tuple4<P1, P2, P3, P4>, Tuple4<A1, A2, A3, A4> >
   3525           (function, MakeTuple(p1, p2, p3, p4));
   3526   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   3527 }
   3528 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3529 template <typename R, typename T, typename U, typename P1, typename P2,
   3530           typename P3, typename P4, typename A1, typename A2, typename A3,
   3531           typename A4, typename X1, typename X2, typename X3, typename X4>
   3532 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   3533 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2, A3, A4),
   3534     const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3535   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   3536       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2, A3, A4),
   3537                                Tuple4<P1, P2, P3, P4>, Tuple4<A1, A2, A3, A4> >
   3538           (obj, method, MakeTuple(p1, p2, p3, p4));
   3539   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   3540 }
   3541 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3542 #endif  // OS_WIN
   3543 
   3544 // 4 - 5
   3545 template <typename R, typename T, typename U, typename P1, typename P2,
   3546           typename P3, typename P4, typename A1, typename A2, typename A3,
   3547           typename A4, typename A5, typename X1, typename X2, typename X3,
   3548           typename X4>
   3549 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   3550 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3, A4, A5),
   3551     const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3552   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   3553       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3, A4, A5),
   3554                  Tuple4<P1, P2, P3, P4>, Tuple5<A1, A2, A3, A4, A5> >
   3555           (obj, method, MakeTuple(p1, p2, p3, p4));
   3556   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   3557 }
   3558 
   3559 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3560           typename A1, typename A2, typename A3, typename A4, typename A5,
   3561           typename X1, typename X2, typename X3, typename X4>
   3562 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   3563 CreateFunctor(R (*function)(X1, X2, X3, X4, A1, A2, A3, A4, A5), const P1& p1,
   3564     const P2& p2, const P3& p3, const P4& p4) {
   3565   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   3566       new MutantFunction<R, R (*)(X1, X2, X3, X4, A1, A2, A3, A4, A5),
   3567                          Tuple4<P1, P2, P3, P4>, Tuple5<A1, A2, A3, A4, A5> >
   3568           (function, MakeTuple(p1, p2, p3, p4));
   3569   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   3570 }
   3571 
   3572 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3573 template <typename R, typename T, typename U, typename P1, typename P2,
   3574           typename P3, typename P4, typename A1, typename A2, typename A3,
   3575           typename A4, typename A5, typename X1, typename X2, typename X3,
   3576           typename X4>
   3577 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   3578 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3, A4, A5),
   3579     const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3580   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   3581       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3, A4, A5),
   3582                                Tuple4<P1, P2, P3, P4>, Tuple5<A1, A2, A3, A4, A5> >
   3583           (obj, method, MakeTuple(p1, p2, p3, p4));
   3584   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   3585 }
   3586 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3587 
   3588 #if defined (OS_WIN)
   3589 template <typename R, typename T, typename U, typename P1, typename P2,
   3590           typename P3, typename P4, typename A1, typename A2, typename A3,
   3591           typename A4, typename A5, typename X1, typename X2, typename X3,
   3592           typename X4>
   3593 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   3594 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2, A3, A4,
   3595     A5), const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3596   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   3597       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2, A3, A4, A5),
   3598                  Tuple4<P1, P2, P3, P4>, Tuple5<A1, A2, A3, A4, A5> >
   3599           (obj, method, MakeTuple(p1, p2, p3, p4));
   3600   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   3601 }
   3602 
   3603 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3604           typename A1, typename A2, typename A3, typename A4, typename A5,
   3605           typename X1, typename X2, typename X3, typename X4>
   3606 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   3607 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, A1, A2, A3, A4, A5),
   3608     const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3609   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   3610       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, A1, A2, A3, A4, A5),
   3611                          Tuple4<P1, P2, P3, P4>, Tuple5<A1, A2, A3, A4, A5> >
   3612           (function, MakeTuple(p1, p2, p3, p4));
   3613   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   3614 }
   3615 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3616 template <typename R, typename T, typename U, typename P1, typename P2,
   3617           typename P3, typename P4, typename A1, typename A2, typename A3,
   3618           typename A4, typename A5, typename X1, typename X2, typename X3,
   3619           typename X4>
   3620 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   3621 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2, A3, A4,
   3622     A5), const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3623   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   3624       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2, A3, A4, A5),
   3625                                Tuple4<P1, P2, P3, P4>, Tuple5<A1, A2, A3, A4, A5> >
   3626           (obj, method, MakeTuple(p1, p2, p3, p4));
   3627   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   3628 }
   3629 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3630 #endif  // OS_WIN
   3631 
   3632 // 4 - 6
   3633 template <typename R, typename T, typename U, typename P1, typename P2,
   3634           typename P3, typename P4, typename A1, typename A2, typename A3,
   3635           typename A4, typename A5, typename A6, typename X1, typename X2,
   3636           typename X3, typename X4>
   3637 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   3638 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
   3639     const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3640   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   3641       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
   3642                  Tuple4<P1, P2, P3, P4>, Tuple6<A1, A2, A3, A4, A5, A6> >
   3643           (obj, method, MakeTuple(p1, p2, p3, p4));
   3644   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   3645 }
   3646 
   3647 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3648           typename A1, typename A2, typename A3, typename A4, typename A5,
   3649           typename A6, typename X1, typename X2, typename X3, typename X4>
   3650 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   3651 CreateFunctor(R (*function)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
   3652     const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3653   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   3654       new MutantFunction<R, R (*)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
   3655                          Tuple4<P1, P2, P3, P4>, Tuple6<A1, A2, A3, A4, A5, A6> >
   3656           (function, MakeTuple(p1, p2, p3, p4));
   3657   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   3658 }
   3659 
   3660 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3661 template <typename R, typename T, typename U, typename P1, typename P2,
   3662           typename P3, typename P4, typename A1, typename A2, typename A3,
   3663           typename A4, typename A5, typename A6, typename X1, typename X2,
   3664           typename X3, typename X4>
   3665 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   3666 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
   3667     const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3668   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   3669       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
   3670                                Tuple4<P1, P2, P3, P4>, Tuple6<A1, A2, A3, A4, A5, A6> >
   3671           (obj, method, MakeTuple(p1, p2, p3, p4));
   3672   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   3673 }
   3674 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3675 
   3676 #if defined (OS_WIN)
   3677 template <typename R, typename T, typename U, typename P1, typename P2,
   3678           typename P3, typename P4, typename A1, typename A2, typename A3,
   3679           typename A4, typename A5, typename A6, typename X1, typename X2,
   3680           typename X3, typename X4>
   3681 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   3682 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2, A3, A4,
   3683     A5, A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3684   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   3685       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
   3686                  Tuple4<P1, P2, P3, P4>, Tuple6<A1, A2, A3, A4, A5, A6> >
   3687           (obj, method, MakeTuple(p1, p2, p3, p4));
   3688   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   3689 }
   3690 
   3691 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3692           typename A1, typename A2, typename A3, typename A4, typename A5,
   3693           typename A6, typename X1, typename X2, typename X3, typename X4>
   3694 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   3695 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
   3696     const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3697   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   3698       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
   3699                          Tuple4<P1, P2, P3, P4>, Tuple6<A1, A2, A3, A4, A5, A6> >
   3700           (function, MakeTuple(p1, p2, p3, p4));
   3701   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   3702 }
   3703 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3704 template <typename R, typename T, typename U, typename P1, typename P2,
   3705           typename P3, typename P4, typename A1, typename A2, typename A3,
   3706           typename A4, typename A5, typename A6, typename X1, typename X2,
   3707           typename X3, typename X4>
   3708 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   3709 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2, A3, A4,
   3710     A5, A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4) {
   3711   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   3712       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2, A3, A4, A5, A6),
   3713                                Tuple4<P1, P2, P3, P4>, Tuple6<A1, A2, A3, A4, A5, A6> >
   3714           (obj, method, MakeTuple(p1, p2, p3, p4));
   3715   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   3716 }
   3717 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3718 #endif  // OS_WIN
   3719 
   3720 // 5 - 0
   3721 template <typename R, typename T, typename U, typename P1, typename P2,
   3722           typename P3, typename P4, typename P5, typename X1, typename X2,
   3723           typename X3, typename X4, typename X5>
   3724 inline MutantFunctor<R, Tuple0>
   3725 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5), const P1& p1,
   3726     const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   3727   MutantRunner<R, Tuple0>* t =
   3728       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5),
   3729                  Tuple5<P1, P2, P3, P4, P5>, Tuple0>
   3730           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   3731   return MutantFunctor<R, Tuple0>(t);
   3732 }
   3733 
   3734 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3735           typename P5, typename X1, typename X2, typename X3, typename X4,
   3736           typename X5>
   3737 inline MutantFunctor<R, Tuple0>
   3738 CreateFunctor(R (*function)(X1, X2, X3, X4, X5), const P1& p1, const P2& p2,
   3739     const P3& p3, const P4& p4, const P5& p5) {
   3740   MutantRunner<R, Tuple0>* t =
   3741       new MutantFunction<R, R (*)(X1, X2, X3, X4, X5),
   3742                          Tuple5<P1, P2, P3, P4, P5>, Tuple0>
   3743           (function, MakeTuple(p1, p2, p3, p4, p5));
   3744   return MutantFunctor<R, Tuple0>(t);
   3745 }
   3746 
   3747 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3748 template <typename R, typename T, typename U, typename P1, typename P2,
   3749           typename P3, typename P4, typename P5, typename X1, typename X2,
   3750           typename X3, typename X4, typename X5>
   3751 inline MutantFunctor<R, Tuple0>
   3752 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5), const P1& p1,
   3753     const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   3754   MutantRunner<R, Tuple0>* t =
   3755       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5),
   3756                                Tuple5<P1, P2, P3, P4, P5>, Tuple0>
   3757           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   3758   return MutantFunctor<R, Tuple0>(t);
   3759 }
   3760 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3761 
   3762 #if defined (OS_WIN)
   3763 template <typename R, typename T, typename U, typename P1, typename P2,
   3764           typename P3, typename P4, typename P5, typename X1, typename X2,
   3765           typename X3, typename X4, typename X5>
   3766 inline MutantFunctor<R, Tuple0>
   3767 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5),
   3768     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   3769   MutantRunner<R, Tuple0>* t =
   3770       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5),
   3771                  Tuple5<P1, P2, P3, P4, P5>, Tuple0>
   3772           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   3773   return MutantFunctor<R, Tuple0>(t);
   3774 }
   3775 
   3776 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3777           typename P5, typename X1, typename X2, typename X3, typename X4,
   3778           typename X5>
   3779 inline MutantFunctor<R, Tuple0>
   3780 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5), const P1& p1,
   3781     const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   3782   MutantRunner<R, Tuple0>* t =
   3783       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5),
   3784                          Tuple5<P1, P2, P3, P4, P5>, Tuple0>
   3785           (function, MakeTuple(p1, p2, p3, p4, p5));
   3786   return MutantFunctor<R, Tuple0>(t);
   3787 }
   3788 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3789 template <typename R, typename T, typename U, typename P1, typename P2,
   3790           typename P3, typename P4, typename P5, typename X1, typename X2,
   3791           typename X3, typename X4, typename X5>
   3792 inline MutantFunctor<R, Tuple0>
   3793 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5),
   3794     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   3795   MutantRunner<R, Tuple0>* t =
   3796       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5),
   3797                                Tuple5<P1, P2, P3, P4, P5>, Tuple0>
   3798           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   3799   return MutantFunctor<R, Tuple0>(t);
   3800 }
   3801 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3802 #endif  // OS_WIN
   3803 
   3804 // 5 - 1
   3805 template <typename R, typename T, typename U, typename P1, typename P2,
   3806           typename P3, typename P4, typename P5, typename A1, typename X1,
   3807           typename X2, typename X3, typename X4, typename X5>
   3808 inline MutantFunctor<R, Tuple1<A1> >
   3809 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, A1), const P1& p1,
   3810     const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   3811   MutantRunner<R, Tuple1<A1> >* t =
   3812       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, A1),
   3813                  Tuple5<P1, P2, P3, P4, P5>, Tuple1<A1> >
   3814           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   3815   return MutantFunctor<R, Tuple1<A1> >(t);
   3816 }
   3817 
   3818 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3819           typename P5, typename A1, typename X1, typename X2, typename X3,
   3820           typename X4, typename X5>
   3821 inline MutantFunctor<R, Tuple1<A1> >
   3822 CreateFunctor(R (*function)(X1, X2, X3, X4, X5, A1), const P1& p1, const P2& p2,
   3823     const P3& p3, const P4& p4, const P5& p5) {
   3824   MutantRunner<R, Tuple1<A1> >* t =
   3825       new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, A1),
   3826                          Tuple5<P1, P2, P3, P4, P5>, Tuple1<A1> >
   3827           (function, MakeTuple(p1, p2, p3, p4, p5));
   3828   return MutantFunctor<R, Tuple1<A1> >(t);
   3829 }
   3830 
   3831 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3832 template <typename R, typename T, typename U, typename P1, typename P2,
   3833           typename P3, typename P4, typename P5, typename A1, typename X1,
   3834           typename X2, typename X3, typename X4, typename X5>
   3835 inline MutantFunctor<R, Tuple1<A1> >
   3836 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, A1), const P1& p1,
   3837     const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   3838   MutantRunner<R, Tuple1<A1> >* t =
   3839       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, A1),
   3840                                Tuple5<P1, P2, P3, P4, P5>, Tuple1<A1> >
   3841           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   3842   return MutantFunctor<R, Tuple1<A1> >(t);
   3843 }
   3844 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3845 
   3846 #if defined (OS_WIN)
   3847 template <typename R, typename T, typename U, typename P1, typename P2,
   3848           typename P3, typename P4, typename P5, typename A1, typename X1,
   3849           typename X2, typename X3, typename X4, typename X5>
   3850 inline MutantFunctor<R, Tuple1<A1> >
   3851 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1),
   3852     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   3853   MutantRunner<R, Tuple1<A1> >* t =
   3854       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1),
   3855                  Tuple5<P1, P2, P3, P4, P5>, Tuple1<A1> >
   3856           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   3857   return MutantFunctor<R, Tuple1<A1> >(t);
   3858 }
   3859 
   3860 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3861           typename P5, typename A1, typename X1, typename X2, typename X3,
   3862           typename X4, typename X5>
   3863 inline MutantFunctor<R, Tuple1<A1> >
   3864 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, A1), const P1& p1,
   3865     const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   3866   MutantRunner<R, Tuple1<A1> >* t =
   3867       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, A1),
   3868                          Tuple5<P1, P2, P3, P4, P5>, Tuple1<A1> >
   3869           (function, MakeTuple(p1, p2, p3, p4, p5));
   3870   return MutantFunctor<R, Tuple1<A1> >(t);
   3871 }
   3872 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3873 template <typename R, typename T, typename U, typename P1, typename P2,
   3874           typename P3, typename P4, typename P5, typename A1, typename X1,
   3875           typename X2, typename X3, typename X4, typename X5>
   3876 inline MutantFunctor<R, Tuple1<A1> >
   3877 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1),
   3878     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   3879   MutantRunner<R, Tuple1<A1> >* t =
   3880       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1),
   3881                                Tuple5<P1, P2, P3, P4, P5>, Tuple1<A1> >
   3882           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   3883   return MutantFunctor<R, Tuple1<A1> >(t);
   3884 }
   3885 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3886 #endif  // OS_WIN
   3887 
   3888 // 5 - 2
   3889 template <typename R, typename T, typename U, typename P1, typename P2,
   3890           typename P3, typename P4, typename P5, typename A1, typename A2,
   3891           typename X1, typename X2, typename X3, typename X4, typename X5>
   3892 inline MutantFunctor<R, Tuple2<A1, A2> >
   3893 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2), const P1& p1,
   3894     const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   3895   MutantRunner<R, Tuple2<A1, A2> >* t =
   3896       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2),
   3897                  Tuple5<P1, P2, P3, P4, P5>, Tuple2<A1, A2> >
   3898           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   3899   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   3900 }
   3901 
   3902 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3903           typename P5, typename A1, typename A2, typename X1, typename X2,
   3904           typename X3, typename X4, typename X5>
   3905 inline MutantFunctor<R, Tuple2<A1, A2> >
   3906 CreateFunctor(R (*function)(X1, X2, X3, X4, X5, A1, A2), const P1& p1,
   3907     const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   3908   MutantRunner<R, Tuple2<A1, A2> >* t =
   3909       new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, A1, A2),
   3910                          Tuple5<P1, P2, P3, P4, P5>, Tuple2<A1, A2> >
   3911           (function, MakeTuple(p1, p2, p3, p4, p5));
   3912   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   3913 }
   3914 
   3915 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3916 template <typename R, typename T, typename U, typename P1, typename P2,
   3917           typename P3, typename P4, typename P5, typename A1, typename A2,
   3918           typename X1, typename X2, typename X3, typename X4, typename X5>
   3919 inline MutantFunctor<R, Tuple2<A1, A2> >
   3920 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2), const P1& p1,
   3921     const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   3922   MutantRunner<R, Tuple2<A1, A2> >* t =
   3923       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2),
   3924                                Tuple5<P1, P2, P3, P4, P5>, Tuple2<A1, A2> >
   3925           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   3926   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   3927 }
   3928 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3929 
   3930 #if defined (OS_WIN)
   3931 template <typename R, typename T, typename U, typename P1, typename P2,
   3932           typename P3, typename P4, typename P5, typename A1, typename A2,
   3933           typename X1, typename X2, typename X3, typename X4, typename X5>
   3934 inline MutantFunctor<R, Tuple2<A1, A2> >
   3935 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2),
   3936     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   3937   MutantRunner<R, Tuple2<A1, A2> >* t =
   3938       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2),
   3939                  Tuple5<P1, P2, P3, P4, P5>, Tuple2<A1, A2> >
   3940           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   3941   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   3942 }
   3943 
   3944 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3945           typename P5, typename A1, typename A2, typename X1, typename X2,
   3946           typename X3, typename X4, typename X5>
   3947 inline MutantFunctor<R, Tuple2<A1, A2> >
   3948 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, A1, A2), const P1& p1,
   3949     const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   3950   MutantRunner<R, Tuple2<A1, A2> >* t =
   3951       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, A1, A2),
   3952                          Tuple5<P1, P2, P3, P4, P5>, Tuple2<A1, A2> >
   3953           (function, MakeTuple(p1, p2, p3, p4, p5));
   3954   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   3955 }
   3956 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3957 template <typename R, typename T, typename U, typename P1, typename P2,
   3958           typename P3, typename P4, typename P5, typename A1, typename A2,
   3959           typename X1, typename X2, typename X3, typename X4, typename X5>
   3960 inline MutantFunctor<R, Tuple2<A1, A2> >
   3961 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2),
   3962     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   3963   MutantRunner<R, Tuple2<A1, A2> >* t =
   3964       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2),
   3965                                Tuple5<P1, P2, P3, P4, P5>, Tuple2<A1, A2> >
   3966           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   3967   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   3968 }
   3969 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   3970 #endif  // OS_WIN
   3971 
   3972 // 5 - 3
   3973 template <typename R, typename T, typename U, typename P1, typename P2,
   3974           typename P3, typename P4, typename P5, typename A1, typename A2,
   3975           typename A3, typename X1, typename X2, typename X3, typename X4,
   3976           typename X5>
   3977 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   3978 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2, A3),
   3979     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   3980   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   3981       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2, A3),
   3982                  Tuple5<P1, P2, P3, P4, P5>, Tuple3<A1, A2, A3> >
   3983           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   3984   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   3985 }
   3986 
   3987 template <typename R, typename P1, typename P2, typename P3, typename P4,
   3988           typename P5, typename A1, typename A2, typename A3, typename X1,
   3989           typename X2, typename X3, typename X4, typename X5>
   3990 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   3991 CreateFunctor(R (*function)(X1, X2, X3, X4, X5, A1, A2, A3), const P1& p1,
   3992     const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   3993   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   3994       new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, A1, A2, A3),
   3995                          Tuple5<P1, P2, P3, P4, P5>, Tuple3<A1, A2, A3> >
   3996           (function, MakeTuple(p1, p2, p3, p4, p5));
   3997   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   3998 }
   3999 
   4000 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4001 template <typename R, typename T, typename U, typename P1, typename P2,
   4002           typename P3, typename P4, typename P5, typename A1, typename A2,
   4003           typename A3, typename X1, typename X2, typename X3, typename X4,
   4004           typename X5>
   4005 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   4006 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2, A3),
   4007     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   4008   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   4009       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2, A3),
   4010                                Tuple5<P1, P2, P3, P4, P5>, Tuple3<A1, A2, A3> >
   4011           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   4012   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   4013 }
   4014 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4015 
   4016 #if defined (OS_WIN)
   4017 template <typename R, typename T, typename U, typename P1, typename P2,
   4018           typename P3, typename P4, typename P5, typename A1, typename A2,
   4019           typename A3, typename X1, typename X2, typename X3, typename X4,
   4020           typename X5>
   4021 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   4022 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2, A3),
   4023     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   4024   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   4025       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2, A3),
   4026                  Tuple5<P1, P2, P3, P4, P5>, Tuple3<A1, A2, A3> >
   4027           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   4028   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   4029 }
   4030 
   4031 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4032           typename P5, typename A1, typename A2, typename A3, typename X1,
   4033           typename X2, typename X3, typename X4, typename X5>
   4034 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   4035 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, A1, A2, A3),
   4036     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   4037   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   4038       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, A1, A2, A3),
   4039                          Tuple5<P1, P2, P3, P4, P5>, Tuple3<A1, A2, A3> >
   4040           (function, MakeTuple(p1, p2, p3, p4, p5));
   4041   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   4042 }
   4043 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4044 template <typename R, typename T, typename U, typename P1, typename P2,
   4045           typename P3, typename P4, typename P5, typename A1, typename A2,
   4046           typename A3, typename X1, typename X2, typename X3, typename X4,
   4047           typename X5>
   4048 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   4049 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2, A3),
   4050     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   4051   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   4052       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2, A3),
   4053                                Tuple5<P1, P2, P3, P4, P5>, Tuple3<A1, A2, A3> >
   4054           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   4055   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   4056 }
   4057 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4058 #endif  // OS_WIN
   4059 
   4060 // 5 - 4
   4061 template <typename R, typename T, typename U, typename P1, typename P2,
   4062           typename P3, typename P4, typename P5, typename A1, typename A2,
   4063           typename A3, typename A4, typename X1, typename X2, typename X3,
   4064           typename X4, typename X5>
   4065 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   4066 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2, A3, A4),
   4067     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   4068   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   4069       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4),
   4070                  Tuple5<P1, P2, P3, P4, P5>, Tuple4<A1, A2, A3, A4> >
   4071           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   4072   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   4073 }
   4074 
   4075 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4076           typename P5, typename A1, typename A2, typename A3, typename A4,
   4077           typename X1, typename X2, typename X3, typename X4, typename X5>
   4078 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   4079 CreateFunctor(R (*function)(X1, X2, X3, X4, X5, A1, A2, A3, A4), const P1& p1,
   4080     const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   4081   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   4082       new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, A1, A2, A3, A4),
   4083                          Tuple5<P1, P2, P3, P4, P5>, Tuple4<A1, A2, A3, A4> >
   4084           (function, MakeTuple(p1, p2, p3, p4, p5));
   4085   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   4086 }
   4087 
   4088 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4089 template <typename R, typename T, typename U, typename P1, typename P2,
   4090           typename P3, typename P4, typename P5, typename A1, typename A2,
   4091           typename A3, typename A4, typename X1, typename X2, typename X3,
   4092           typename X4, typename X5>
   4093 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   4094 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2, A3, A4),
   4095     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   4096   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   4097       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4),
   4098                                Tuple5<P1, P2, P3, P4, P5>, Tuple4<A1, A2, A3, A4> >
   4099           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   4100   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   4101 }
   4102 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4103 
   4104 #if defined (OS_WIN)
   4105 template <typename R, typename T, typename U, typename P1, typename P2,
   4106           typename P3, typename P4, typename P5, typename A1, typename A2,
   4107           typename A3, typename A4, typename X1, typename X2, typename X3,
   4108           typename X4, typename X5>
   4109 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   4110 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2, A3,
   4111     A4), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
   4112     const P5& p5) {
   4113   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   4114       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4),
   4115                  Tuple5<P1, P2, P3, P4, P5>, Tuple4<A1, A2, A3, A4> >
   4116           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   4117   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   4118 }
   4119 
   4120 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4121           typename P5, typename A1, typename A2, typename A3, typename A4,
   4122           typename X1, typename X2, typename X3, typename X4, typename X5>
   4123 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   4124 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, A1, A2, A3, A4),
   4125     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   4126   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   4127       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, A1, A2, A3, A4),
   4128                          Tuple5<P1, P2, P3, P4, P5>, Tuple4<A1, A2, A3, A4> >
   4129           (function, MakeTuple(p1, p2, p3, p4, p5));
   4130   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   4131 }
   4132 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4133 template <typename R, typename T, typename U, typename P1, typename P2,
   4134           typename P3, typename P4, typename P5, typename A1, typename A2,
   4135           typename A3, typename A4, typename X1, typename X2, typename X3,
   4136           typename X4, typename X5>
   4137 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   4138 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2, A3,
   4139     A4), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
   4140     const P5& p5) {
   4141   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   4142       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4),
   4143                                Tuple5<P1, P2, P3, P4, P5>, Tuple4<A1, A2, A3, A4> >
   4144           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   4145   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   4146 }
   4147 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4148 #endif  // OS_WIN
   4149 
   4150 // 5 - 5
   4151 template <typename R, typename T, typename U, typename P1, typename P2,
   4152           typename P3, typename P4, typename P5, typename A1, typename A2,
   4153           typename A3, typename A4, typename A5, typename X1, typename X2,
   4154           typename X3, typename X4, typename X5>
   4155 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   4156 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
   4157     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   4158   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   4159       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
   4160                  Tuple5<P1, P2, P3, P4, P5>, Tuple5<A1, A2, A3, A4, A5> >
   4161           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   4162   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   4163 }
   4164 
   4165 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4166           typename P5, typename A1, typename A2, typename A3, typename A4,
   4167           typename A5, typename X1, typename X2, typename X3, typename X4,
   4168           typename X5>
   4169 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   4170 CreateFunctor(R (*function)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
   4171     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   4172   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   4173       new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
   4174                          Tuple5<P1, P2, P3, P4, P5>, Tuple5<A1, A2, A3, A4, A5> >
   4175           (function, MakeTuple(p1, p2, p3, p4, p5));
   4176   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   4177 }
   4178 
   4179 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4180 template <typename R, typename T, typename U, typename P1, typename P2,
   4181           typename P3, typename P4, typename P5, typename A1, typename A2,
   4182           typename A3, typename A4, typename A5, typename X1, typename X2,
   4183           typename X3, typename X4, typename X5>
   4184 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   4185 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
   4186     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   4187   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   4188       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
   4189                                Tuple5<P1, P2, P3, P4, P5>, Tuple5<A1, A2, A3, A4, A5> >
   4190           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   4191   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   4192 }
   4193 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4194 
   4195 #if defined (OS_WIN)
   4196 template <typename R, typename T, typename U, typename P1, typename P2,
   4197           typename P3, typename P4, typename P5, typename A1, typename A2,
   4198           typename A3, typename A4, typename A5, typename X1, typename X2,
   4199           typename X3, typename X4, typename X5>
   4200 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   4201 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2, A3,
   4202     A4, A5), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
   4203     const P5& p5) {
   4204   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   4205       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
   4206                  Tuple5<P1, P2, P3, P4, P5>, Tuple5<A1, A2, A3, A4, A5> >
   4207           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   4208   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   4209 }
   4210 
   4211 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4212           typename P5, typename A1, typename A2, typename A3, typename A4,
   4213           typename A5, typename X1, typename X2, typename X3, typename X4,
   4214           typename X5>
   4215 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   4216 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
   4217     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   4218   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   4219       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
   4220                          Tuple5<P1, P2, P3, P4, P5>, Tuple5<A1, A2, A3, A4, A5> >
   4221           (function, MakeTuple(p1, p2, p3, p4, p5));
   4222   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   4223 }
   4224 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4225 template <typename R, typename T, typename U, typename P1, typename P2,
   4226           typename P3, typename P4, typename P5, typename A1, typename A2,
   4227           typename A3, typename A4, typename A5, typename X1, typename X2,
   4228           typename X3, typename X4, typename X5>
   4229 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   4230 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2, A3,
   4231     A4, A5), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
   4232     const P5& p5) {
   4233   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   4234       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5),
   4235                                Tuple5<P1, P2, P3, P4, P5>, Tuple5<A1, A2, A3, A4, A5> >
   4236           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   4237   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   4238 }
   4239 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4240 #endif  // OS_WIN
   4241 
   4242 // 5 - 6
   4243 template <typename R, typename T, typename U, typename P1, typename P2,
   4244           typename P3, typename P4, typename P5, typename A1, typename A2,
   4245           typename A3, typename A4, typename A5, typename A6, typename X1,
   4246           typename X2, typename X3, typename X4, typename X5>
   4247 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   4248 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5,
   4249     A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
   4250     const P5& p5) {
   4251   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   4252       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5, A6),
   4253                  Tuple5<P1, P2, P3, P4, P5>, Tuple6<A1, A2, A3, A4, A5, A6> >
   4254           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   4255   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   4256 }
   4257 
   4258 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4259           typename P5, typename A1, typename A2, typename A3, typename A4,
   4260           typename A5, typename A6, typename X1, typename X2, typename X3,
   4261           typename X4, typename X5>
   4262 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   4263 CreateFunctor(R (*function)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5, A6),
   4264     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) {
   4265   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   4266       new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5, A6),
   4267                          Tuple5<P1, P2, P3, P4, P5>, Tuple6<A1, A2, A3, A4, A5, A6> >
   4268           (function, MakeTuple(p1, p2, p3, p4, p5));
   4269   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   4270 }
   4271 
   4272 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4273 template <typename R, typename T, typename U, typename P1, typename P2,
   4274           typename P3, typename P4, typename P5, typename A1, typename A2,
   4275           typename A3, typename A4, typename A5, typename A6, typename X1,
   4276           typename X2, typename X3, typename X4, typename X5>
   4277 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   4278 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5,
   4279     A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
   4280     const P5& p5) {
   4281   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   4282       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5, A6),
   4283                                Tuple5<P1, P2, P3, P4, P5>, Tuple6<A1, A2, A3, A4, A5, A6> >
   4284           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   4285   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   4286 }
   4287 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4288 
   4289 #if defined (OS_WIN)
   4290 template <typename R, typename T, typename U, typename P1, typename P2,
   4291           typename P3, typename P4, typename P5, typename A1, typename A2,
   4292           typename A3, typename A4, typename A5, typename A6, typename X1,
   4293           typename X2, typename X3, typename X4, typename X5>
   4294 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   4295 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2, A3,
   4296     A4, A5, A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
   4297     const P5& p5) {
   4298   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   4299       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5, A6),
   4300                  Tuple5<P1, P2, P3, P4, P5>, Tuple6<A1, A2, A3, A4, A5, A6> >
   4301           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   4302   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   4303 }
   4304 
   4305 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4306           typename P5, typename A1, typename A2, typename A3, typename A4,
   4307           typename A5, typename A6, typename X1, typename X2, typename X3,
   4308           typename X4, typename X5>
   4309 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   4310 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5,
   4311     A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
   4312     const P5& p5) {
   4313   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   4314       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5, A6),
   4315                          Tuple5<P1, P2, P3, P4, P5>, Tuple6<A1, A2, A3, A4, A5, A6> >
   4316           (function, MakeTuple(p1, p2, p3, p4, p5));
   4317   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   4318 }
   4319 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4320 template <typename R, typename T, typename U, typename P1, typename P2,
   4321           typename P3, typename P4, typename P5, typename A1, typename A2,
   4322           typename A3, typename A4, typename A5, typename A6, typename X1,
   4323           typename X2, typename X3, typename X4, typename X5>
   4324 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   4325 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, A1, A2, A3,
   4326     A4, A5, A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
   4327     const P5& p5) {
   4328   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   4329       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, A1, A2, A3, A4, A5, A6),
   4330                                Tuple5<P1, P2, P3, P4, P5>, Tuple6<A1, A2, A3, A4, A5, A6> >
   4331           (obj, method, MakeTuple(p1, p2, p3, p4, p5));
   4332   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   4333 }
   4334 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4335 #endif  // OS_WIN
   4336 
   4337 // 6 - 0
   4338 template <typename R, typename T, typename U, typename P1, typename P2,
   4339           typename P3, typename P4, typename P5, typename P6, typename X1,
   4340           typename X2, typename X3, typename X4, typename X5, typename X6>
   4341 inline MutantFunctor<R, Tuple0>
   4342 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, X6), const P1& p1,
   4343     const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
   4344   MutantRunner<R, Tuple0>* t =
   4345       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, X6),
   4346                  Tuple6<P1, P2, P3, P4, P5, P6>, Tuple0>
   4347           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4348   return MutantFunctor<R, Tuple0>(t);
   4349 }
   4350 
   4351 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4352           typename P5, typename P6, typename X1, typename X2, typename X3,
   4353           typename X4, typename X5, typename X6>
   4354 inline MutantFunctor<R, Tuple0>
   4355 CreateFunctor(R (*function)(X1, X2, X3, X4, X5, X6), const P1& p1, const P2& p2,
   4356     const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
   4357   MutantRunner<R, Tuple0>* t =
   4358       new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, X6),
   4359                          Tuple6<P1, P2, P3, P4, P5, P6>, Tuple0>
   4360           (function, MakeTuple(p1, p2, p3, p4, p5, p6));
   4361   return MutantFunctor<R, Tuple0>(t);
   4362 }
   4363 
   4364 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4365 template <typename R, typename T, typename U, typename P1, typename P2,
   4366           typename P3, typename P4, typename P5, typename P6, typename X1,
   4367           typename X2, typename X3, typename X4, typename X5, typename X6>
   4368 inline MutantFunctor<R, Tuple0>
   4369 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, X6), const P1& p1,
   4370     const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
   4371   MutantRunner<R, Tuple0>* t =
   4372       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, X6),
   4373                                Tuple6<P1, P2, P3, P4, P5, P6>, Tuple0>
   4374           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4375   return MutantFunctor<R, Tuple0>(t);
   4376 }
   4377 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4378 
   4379 #if defined (OS_WIN)
   4380 template <typename R, typename T, typename U, typename P1, typename P2,
   4381           typename P3, typename P4, typename P5, typename P6, typename X1,
   4382           typename X2, typename X3, typename X4, typename X5, typename X6>
   4383 inline MutantFunctor<R, Tuple0>
   4384 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6),
   4385     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4386     const P6& p6) {
   4387   MutantRunner<R, Tuple0>* t =
   4388       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6),
   4389                  Tuple6<P1, P2, P3, P4, P5, P6>, Tuple0>
   4390           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4391   return MutantFunctor<R, Tuple0>(t);
   4392 }
   4393 
   4394 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4395           typename P5, typename P6, typename X1, typename X2, typename X3,
   4396           typename X4, typename X5, typename X6>
   4397 inline MutantFunctor<R, Tuple0>
   4398 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, X6), const P1& p1,
   4399     const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
   4400   MutantRunner<R, Tuple0>* t =
   4401       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, X6),
   4402                          Tuple6<P1, P2, P3, P4, P5, P6>, Tuple0>
   4403           (function, MakeTuple(p1, p2, p3, p4, p5, p6));
   4404   return MutantFunctor<R, Tuple0>(t);
   4405 }
   4406 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4407 template <typename R, typename T, typename U, typename P1, typename P2,
   4408           typename P3, typename P4, typename P5, typename P6, typename X1,
   4409           typename X2, typename X3, typename X4, typename X5, typename X6>
   4410 inline MutantFunctor<R, Tuple0>
   4411 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6),
   4412     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4413     const P6& p6) {
   4414   MutantRunner<R, Tuple0>* t =
   4415       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6),
   4416                                Tuple6<P1, P2, P3, P4, P5, P6>, Tuple0>
   4417           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4418   return MutantFunctor<R, Tuple0>(t);
   4419 }
   4420 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4421 #endif  // OS_WIN
   4422 
   4423 // 6 - 1
   4424 template <typename R, typename T, typename U, typename P1, typename P2,
   4425           typename P3, typename P4, typename P5, typename P6, typename A1,
   4426           typename X1, typename X2, typename X3, typename X4, typename X5,
   4427           typename X6>
   4428 inline MutantFunctor<R, Tuple1<A1> >
   4429 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1), const P1& p1,
   4430     const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
   4431   MutantRunner<R, Tuple1<A1> >* t =
   4432       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1),
   4433                  Tuple6<P1, P2, P3, P4, P5, P6>, Tuple1<A1> >
   4434           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4435   return MutantFunctor<R, Tuple1<A1> >(t);
   4436 }
   4437 
   4438 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4439           typename P5, typename P6, typename A1, typename X1, typename X2,
   4440           typename X3, typename X4, typename X5, typename X6>
   4441 inline MutantFunctor<R, Tuple1<A1> >
   4442 CreateFunctor(R (*function)(X1, X2, X3, X4, X5, X6, A1), const P1& p1,
   4443     const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
   4444   MutantRunner<R, Tuple1<A1> >* t =
   4445       new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, X6, A1),
   4446                          Tuple6<P1, P2, P3, P4, P5, P6>, Tuple1<A1> >
   4447           (function, MakeTuple(p1, p2, p3, p4, p5, p6));
   4448   return MutantFunctor<R, Tuple1<A1> >(t);
   4449 }
   4450 
   4451 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4452 template <typename R, typename T, typename U, typename P1, typename P2,
   4453           typename P3, typename P4, typename P5, typename P6, typename A1,
   4454           typename X1, typename X2, typename X3, typename X4, typename X5,
   4455           typename X6>
   4456 inline MutantFunctor<R, Tuple1<A1> >
   4457 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1), const P1& p1,
   4458     const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
   4459   MutantRunner<R, Tuple1<A1> >* t =
   4460       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1),
   4461                                Tuple6<P1, P2, P3, P4, P5, P6>, Tuple1<A1> >
   4462           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4463   return MutantFunctor<R, Tuple1<A1> >(t);
   4464 }
   4465 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4466 
   4467 #if defined (OS_WIN)
   4468 template <typename R, typename T, typename U, typename P1, typename P2,
   4469           typename P3, typename P4, typename P5, typename P6, typename A1,
   4470           typename X1, typename X2, typename X3, typename X4, typename X5,
   4471           typename X6>
   4472 inline MutantFunctor<R, Tuple1<A1> >
   4473 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1),
   4474     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4475     const P6& p6) {
   4476   MutantRunner<R, Tuple1<A1> >* t =
   4477       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1),
   4478                  Tuple6<P1, P2, P3, P4, P5, P6>, Tuple1<A1> >
   4479           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4480   return MutantFunctor<R, Tuple1<A1> >(t);
   4481 }
   4482 
   4483 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4484           typename P5, typename P6, typename A1, typename X1, typename X2,
   4485           typename X3, typename X4, typename X5, typename X6>
   4486 inline MutantFunctor<R, Tuple1<A1> >
   4487 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, X6, A1), const P1& p1,
   4488     const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
   4489   MutantRunner<R, Tuple1<A1> >* t =
   4490       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, X6, A1),
   4491                          Tuple6<P1, P2, P3, P4, P5, P6>, Tuple1<A1> >
   4492           (function, MakeTuple(p1, p2, p3, p4, p5, p6));
   4493   return MutantFunctor<R, Tuple1<A1> >(t);
   4494 }
   4495 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4496 template <typename R, typename T, typename U, typename P1, typename P2,
   4497           typename P3, typename P4, typename P5, typename P6, typename A1,
   4498           typename X1, typename X2, typename X3, typename X4, typename X5,
   4499           typename X6>
   4500 inline MutantFunctor<R, Tuple1<A1> >
   4501 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1),
   4502     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4503     const P6& p6) {
   4504   MutantRunner<R, Tuple1<A1> >* t =
   4505       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1),
   4506                                Tuple6<P1, P2, P3, P4, P5, P6>, Tuple1<A1> >
   4507           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4508   return MutantFunctor<R, Tuple1<A1> >(t);
   4509 }
   4510 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4511 #endif  // OS_WIN
   4512 
   4513 // 6 - 2
   4514 template <typename R, typename T, typename U, typename P1, typename P2,
   4515           typename P3, typename P4, typename P5, typename P6, typename A1,
   4516           typename A2, typename X1, typename X2, typename X3, typename X4,
   4517           typename X5, typename X6>
   4518 inline MutantFunctor<R, Tuple2<A1, A2> >
   4519 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2),
   4520     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4521     const P6& p6) {
   4522   MutantRunner<R, Tuple2<A1, A2> >* t =
   4523       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2),
   4524                  Tuple6<P1, P2, P3, P4, P5, P6>, Tuple2<A1, A2> >
   4525           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4526   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   4527 }
   4528 
   4529 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4530           typename P5, typename P6, typename A1, typename A2, typename X1,
   4531           typename X2, typename X3, typename X4, typename X5, typename X6>
   4532 inline MutantFunctor<R, Tuple2<A1, A2> >
   4533 CreateFunctor(R (*function)(X1, X2, X3, X4, X5, X6, A1, A2), const P1& p1,
   4534     const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
   4535   MutantRunner<R, Tuple2<A1, A2> >* t =
   4536       new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, X6, A1, A2),
   4537                          Tuple6<P1, P2, P3, P4, P5, P6>, Tuple2<A1, A2> >
   4538           (function, MakeTuple(p1, p2, p3, p4, p5, p6));
   4539   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   4540 }
   4541 
   4542 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4543 template <typename R, typename T, typename U, typename P1, typename P2,
   4544           typename P3, typename P4, typename P5, typename P6, typename A1,
   4545           typename A2, typename X1, typename X2, typename X3, typename X4,
   4546           typename X5, typename X6>
   4547 inline MutantFunctor<R, Tuple2<A1, A2> >
   4548 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2),
   4549     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4550     const P6& p6) {
   4551   MutantRunner<R, Tuple2<A1, A2> >* t =
   4552       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2),
   4553                                Tuple6<P1, P2, P3, P4, P5, P6>, Tuple2<A1, A2> >
   4554           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4555   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   4556 }
   4557 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4558 
   4559 #if defined (OS_WIN)
   4560 template <typename R, typename T, typename U, typename P1, typename P2,
   4561           typename P3, typename P4, typename P5, typename P6, typename A1,
   4562           typename A2, typename X1, typename X2, typename X3, typename X4,
   4563           typename X5, typename X6>
   4564 inline MutantFunctor<R, Tuple2<A1, A2> >
   4565 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2),
   4566     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4567     const P6& p6) {
   4568   MutantRunner<R, Tuple2<A1, A2> >* t =
   4569       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2),
   4570                  Tuple6<P1, P2, P3, P4, P5, P6>, Tuple2<A1, A2> >
   4571           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4572   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   4573 }
   4574 
   4575 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4576           typename P5, typename P6, typename A1, typename A2, typename X1,
   4577           typename X2, typename X3, typename X4, typename X5, typename X6>
   4578 inline MutantFunctor<R, Tuple2<A1, A2> >
   4579 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, X6, A1, A2),
   4580     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4581     const P6& p6) {
   4582   MutantRunner<R, Tuple2<A1, A2> >* t =
   4583       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, X6, A1, A2),
   4584                          Tuple6<P1, P2, P3, P4, P5, P6>, Tuple2<A1, A2> >
   4585           (function, MakeTuple(p1, p2, p3, p4, p5, p6));
   4586   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   4587 }
   4588 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4589 template <typename R, typename T, typename U, typename P1, typename P2,
   4590           typename P3, typename P4, typename P5, typename P6, typename A1,
   4591           typename A2, typename X1, typename X2, typename X3, typename X4,
   4592           typename X5, typename X6>
   4593 inline MutantFunctor<R, Tuple2<A1, A2> >
   4594 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2),
   4595     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4596     const P6& p6) {
   4597   MutantRunner<R, Tuple2<A1, A2> >* t =
   4598       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2),
   4599                                Tuple6<P1, P2, P3, P4, P5, P6>, Tuple2<A1, A2> >
   4600           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4601   return MutantFunctor<R, Tuple2<A1, A2> >(t);
   4602 }
   4603 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4604 #endif  // OS_WIN
   4605 
   4606 // 6 - 3
   4607 template <typename R, typename T, typename U, typename P1, typename P2,
   4608           typename P3, typename P4, typename P5, typename P6, typename A1,
   4609           typename A2, typename A3, typename X1, typename X2, typename X3,
   4610           typename X4, typename X5, typename X6>
   4611 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   4612 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2, A3),
   4613     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4614     const P6& p6) {
   4615   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   4616       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3),
   4617                  Tuple6<P1, P2, P3, P4, P5, P6>, Tuple3<A1, A2, A3> >
   4618           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4619   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   4620 }
   4621 
   4622 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4623           typename P5, typename P6, typename A1, typename A2, typename A3,
   4624           typename X1, typename X2, typename X3, typename X4, typename X5,
   4625           typename X6>
   4626 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   4627 CreateFunctor(R (*function)(X1, X2, X3, X4, X5, X6, A1, A2, A3), const P1& p1,
   4628     const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) {
   4629   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   4630       new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, X6, A1, A2, A3),
   4631                          Tuple6<P1, P2, P3, P4, P5, P6>, Tuple3<A1, A2, A3> >
   4632           (function, MakeTuple(p1, p2, p3, p4, p5, p6));
   4633   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   4634 }
   4635 
   4636 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4637 template <typename R, typename T, typename U, typename P1, typename P2,
   4638           typename P3, typename P4, typename P5, typename P6, typename A1,
   4639           typename A2, typename A3, typename X1, typename X2, typename X3,
   4640           typename X4, typename X5, typename X6>
   4641 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   4642 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2, A3),
   4643     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4644     const P6& p6) {
   4645   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   4646       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3),
   4647                                Tuple6<P1, P2, P3, P4, P5, P6>, Tuple3<A1, A2, A3> >
   4648           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4649   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   4650 }
   4651 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4652 
   4653 #if defined (OS_WIN)
   4654 template <typename R, typename T, typename U, typename P1, typename P2,
   4655           typename P3, typename P4, typename P5, typename P6, typename A1,
   4656           typename A2, typename A3, typename X1, typename X2, typename X3,
   4657           typename X4, typename X5, typename X6>
   4658 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   4659 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2,
   4660     A3), const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4661     const P6& p6) {
   4662   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   4663       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3),
   4664                  Tuple6<P1, P2, P3, P4, P5, P6>, Tuple3<A1, A2, A3> >
   4665           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4666   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   4667 }
   4668 
   4669 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4670           typename P5, typename P6, typename A1, typename A2, typename A3,
   4671           typename X1, typename X2, typename X3, typename X4, typename X5,
   4672           typename X6>
   4673 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   4674 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, X6, A1, A2, A3),
   4675     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4676     const P6& p6) {
   4677   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   4678       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, X6, A1, A2, A3),
   4679                          Tuple6<P1, P2, P3, P4, P5, P6>, Tuple3<A1, A2, A3> >
   4680           (function, MakeTuple(p1, p2, p3, p4, p5, p6));
   4681   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   4682 }
   4683 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4684 template <typename R, typename T, typename U, typename P1, typename P2,
   4685           typename P3, typename P4, typename P5, typename P6, typename A1,
   4686           typename A2, typename A3, typename X1, typename X2, typename X3,
   4687           typename X4, typename X5, typename X6>
   4688 inline MutantFunctor<R, Tuple3<A1, A2, A3> >
   4689 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2,
   4690     A3), const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4691     const P6& p6) {
   4692   MutantRunner<R, Tuple3<A1, A2, A3> >* t =
   4693       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3),
   4694                                Tuple6<P1, P2, P3, P4, P5, P6>, Tuple3<A1, A2, A3> >
   4695           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4696   return MutantFunctor<R, Tuple3<A1, A2, A3> >(t);
   4697 }
   4698 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4699 #endif  // OS_WIN
   4700 
   4701 // 6 - 4
   4702 template <typename R, typename T, typename U, typename P1, typename P2,
   4703           typename P3, typename P4, typename P5, typename P6, typename A1,
   4704           typename A2, typename A3, typename A4, typename X1, typename X2,
   4705           typename X3, typename X4, typename X5, typename X6>
   4706 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   4707 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
   4708     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4709     const P6& p6) {
   4710   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   4711       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
   4712                  Tuple6<P1, P2, P3, P4, P5, P6>, Tuple4<A1, A2, A3, A4> >
   4713           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4714   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   4715 }
   4716 
   4717 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4718           typename P5, typename P6, typename A1, typename A2, typename A3,
   4719           typename A4, typename X1, typename X2, typename X3, typename X4,
   4720           typename X5, typename X6>
   4721 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   4722 CreateFunctor(R (*function)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
   4723     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4724     const P6& p6) {
   4725   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   4726       new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
   4727                          Tuple6<P1, P2, P3, P4, P5, P6>, Tuple4<A1, A2, A3, A4> >
   4728           (function, MakeTuple(p1, p2, p3, p4, p5, p6));
   4729   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   4730 }
   4731 
   4732 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4733 template <typename R, typename T, typename U, typename P1, typename P2,
   4734           typename P3, typename P4, typename P5, typename P6, typename A1,
   4735           typename A2, typename A3, typename A4, typename X1, typename X2,
   4736           typename X3, typename X4, typename X5, typename X6>
   4737 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   4738 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
   4739     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4740     const P6& p6) {
   4741   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   4742       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
   4743                                Tuple6<P1, P2, P3, P4, P5, P6>, Tuple4<A1, A2, A3, A4> >
   4744           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4745   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   4746 }
   4747 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4748 
   4749 #if defined (OS_WIN)
   4750 template <typename R, typename T, typename U, typename P1, typename P2,
   4751           typename P3, typename P4, typename P5, typename P6, typename A1,
   4752           typename A2, typename A3, typename A4, typename X1, typename X2,
   4753           typename X3, typename X4, typename X5, typename X6>
   4754 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   4755 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2,
   4756     A3, A4), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
   4757     const P5& p5, const P6& p6) {
   4758   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   4759       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
   4760                  Tuple6<P1, P2, P3, P4, P5, P6>, Tuple4<A1, A2, A3, A4> >
   4761           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4762   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   4763 }
   4764 
   4765 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4766           typename P5, typename P6, typename A1, typename A2, typename A3,
   4767           typename A4, typename X1, typename X2, typename X3, typename X4,
   4768           typename X5, typename X6>
   4769 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   4770 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
   4771     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4772     const P6& p6) {
   4773   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   4774       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
   4775                          Tuple6<P1, P2, P3, P4, P5, P6>, Tuple4<A1, A2, A3, A4> >
   4776           (function, MakeTuple(p1, p2, p3, p4, p5, p6));
   4777   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   4778 }
   4779 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4780 template <typename R, typename T, typename U, typename P1, typename P2,
   4781           typename P3, typename P4, typename P5, typename P6, typename A1,
   4782           typename A2, typename A3, typename A4, typename X1, typename X2,
   4783           typename X3, typename X4, typename X5, typename X6>
   4784 inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> >
   4785 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2,
   4786     A3, A4), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
   4787     const P5& p5, const P6& p6) {
   4788   MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t =
   4789       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4),
   4790                                Tuple6<P1, P2, P3, P4, P5, P6>, Tuple4<A1, A2, A3, A4> >
   4791           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4792   return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t);
   4793 }
   4794 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4795 #endif  // OS_WIN
   4796 
   4797 // 6 - 5
   4798 template <typename R, typename T, typename U, typename P1, typename P2,
   4799           typename P3, typename P4, typename P5, typename P6, typename A1,
   4800           typename A2, typename A3, typename A4, typename A5, typename X1,
   4801           typename X2, typename X3, typename X4, typename X5, typename X6>
   4802 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   4803 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4,
   4804     A5), const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4805     const P6& p6) {
   4806   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   4807       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5),
   4808                  Tuple6<P1, P2, P3, P4, P5, P6>, Tuple5<A1, A2, A3, A4, A5> >
   4809           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4810   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   4811 }
   4812 
   4813 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4814           typename P5, typename P6, typename A1, typename A2, typename A3,
   4815           typename A4, typename A5, typename X1, typename X2, typename X3,
   4816           typename X4, typename X5, typename X6>
   4817 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   4818 CreateFunctor(R (*function)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5),
   4819     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4820     const P6& p6) {
   4821   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   4822       new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5),
   4823                          Tuple6<P1, P2, P3, P4, P5, P6>, Tuple5<A1, A2, A3, A4, A5> >
   4824           (function, MakeTuple(p1, p2, p3, p4, p5, p6));
   4825   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   4826 }
   4827 
   4828 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4829 template <typename R, typename T, typename U, typename P1, typename P2,
   4830           typename P3, typename P4, typename P5, typename P6, typename A1,
   4831           typename A2, typename A3, typename A4, typename A5, typename X1,
   4832           typename X2, typename X3, typename X4, typename X5, typename X6>
   4833 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   4834 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4,
   4835     A5), const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4836     const P6& p6) {
   4837   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   4838       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5),
   4839                                Tuple6<P1, P2, P3, P4, P5, P6>, Tuple5<A1, A2, A3, A4, A5> >
   4840           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4841   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   4842 }
   4843 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4844 
   4845 #if defined (OS_WIN)
   4846 template <typename R, typename T, typename U, typename P1, typename P2,
   4847           typename P3, typename P4, typename P5, typename P6, typename A1,
   4848           typename A2, typename A3, typename A4, typename A5, typename X1,
   4849           typename X2, typename X3, typename X4, typename X5, typename X6>
   4850 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   4851 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2,
   4852     A3, A4, A5), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
   4853     const P5& p5, const P6& p6) {
   4854   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   4855       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5),
   4856                  Tuple6<P1, P2, P3, P4, P5, P6>, Tuple5<A1, A2, A3, A4, A5> >
   4857           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4858   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   4859 }
   4860 
   4861 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4862           typename P5, typename P6, typename A1, typename A2, typename A3,
   4863           typename A4, typename A5, typename X1, typename X2, typename X3,
   4864           typename X4, typename X5, typename X6>
   4865 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   4866 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4,
   4867     A5), const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4868     const P6& p6) {
   4869   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   4870       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5),
   4871                          Tuple6<P1, P2, P3, P4, P5, P6>, Tuple5<A1, A2, A3, A4, A5> >
   4872           (function, MakeTuple(p1, p2, p3, p4, p5, p6));
   4873   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   4874 }
   4875 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4876 template <typename R, typename T, typename U, typename P1, typename P2,
   4877           typename P3, typename P4, typename P5, typename P6, typename A1,
   4878           typename A2, typename A3, typename A4, typename A5, typename X1,
   4879           typename X2, typename X3, typename X4, typename X5, typename X6>
   4880 inline MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >
   4881 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2,
   4882     A3, A4, A5), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
   4883     const P5& p5, const P6& p6) {
   4884   MutantRunner<R, Tuple5<A1, A2, A3, A4, A5> >* t =
   4885       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5),
   4886                                Tuple6<P1, P2, P3, P4, P5, P6>, Tuple5<A1, A2, A3, A4, A5> >
   4887           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4888   return MutantFunctor<R, Tuple5<A1, A2, A3, A4, A5> >(t);
   4889 }
   4890 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4891 #endif  // OS_WIN
   4892 
   4893 // 6 - 6
   4894 template <typename R, typename T, typename U, typename P1, typename P2,
   4895           typename P3, typename P4, typename P5, typename P6, typename A1,
   4896           typename A2, typename A3, typename A4, typename A5, typename A6,
   4897           typename X1, typename X2, typename X3, typename X4, typename X5,
   4898           typename X6>
   4899 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   4900 CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5,
   4901     A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4902     const P6& p6) {
   4903   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   4904       new Mutant<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5, A6),
   4905                  Tuple6<P1, P2, P3, P4, P5, P6>, Tuple6<A1, A2, A3, A4, A5, A6> >
   4906           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4907   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   4908 }
   4909 
   4910 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4911           typename P5, typename P6, typename A1, typename A2, typename A3,
   4912           typename A4, typename A5, typename A6, typename X1, typename X2,
   4913           typename X3, typename X4, typename X5, typename X6>
   4914 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   4915 CreateFunctor(R (*function)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5, A6),
   4916     const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4917     const P6& p6) {
   4918   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   4919       new MutantFunction<R, R (*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5, A6),
   4920                          Tuple6<P1, P2, P3, P4, P5, P6>, Tuple6<A1, A2, A3, A4, A5, A6> >
   4921           (function, MakeTuple(p1, p2, p3, p4, p5, p6));
   4922   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   4923 }
   4924 
   4925 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4926 template <typename R, typename T, typename U, typename P1, typename P2,
   4927           typename P3, typename P4, typename P5, typename P6, typename A1,
   4928           typename A2, typename A3, typename A4, typename A5, typename A6,
   4929           typename X1, typename X2, typename X3, typename X4, typename X5,
   4930           typename X6>
   4931 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   4932 CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5,
   4933     A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5,
   4934     const P6& p6) {
   4935   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   4936       new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5, A6),
   4937                                Tuple6<P1, P2, P3, P4, P5, P6>, Tuple6<A1, A2, A3, A4, A5, A6> >
   4938           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4939   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   4940 }
   4941 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4942 
   4943 #if defined (OS_WIN)
   4944 template <typename R, typename T, typename U, typename P1, typename P2,
   4945           typename P3, typename P4, typename P5, typename P6, typename A1,
   4946           typename A2, typename A3, typename A4, typename A5, typename A6,
   4947           typename X1, typename X2, typename X3, typename X4, typename X5,
   4948           typename X6>
   4949 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   4950 CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2,
   4951     A3, A4, A5, A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
   4952     const P5& p5, const P6& p6) {
   4953   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   4954       new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5, A6),
   4955                  Tuple6<P1, P2, P3, P4, P5, P6>, Tuple6<A1, A2, A3, A4, A5, A6> >
   4956           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4957   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   4958 }
   4959 
   4960 template <typename R, typename P1, typename P2, typename P3, typename P4,
   4961           typename P5, typename P6, typename A1, typename A2, typename A3,
   4962           typename A4, typename A5, typename A6, typename X1, typename X2,
   4963           typename X3, typename X4, typename X5, typename X6>
   4964 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   4965 CreateFunctor(R (__stdcall *function)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4,
   4966     A5, A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
   4967     const P5& p5, const P6& p6) {
   4968   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   4969       new MutantFunction<R, R (__stdcall *)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5, A6),
   4970                          Tuple6<P1, P2, P3, P4, P5, P6>, Tuple6<A1, A2, A3, A4, A5, A6> >
   4971           (function, MakeTuple(p1, p2, p3, p4, p5, p6));
   4972   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   4973 }
   4974 #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4975 template <typename R, typename T, typename U, typename P1, typename P2,
   4976           typename P3, typename P4, typename P5, typename P6, typename A1,
   4977           typename A2, typename A3, typename A4, typename A5, typename A6,
   4978           typename X1, typename X2, typename X3, typename X4, typename X5,
   4979           typename X6>
   4980 inline MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >
   4981 CreateFunctor(T** obj, R (__stdcall U::*method)(X1, X2, X3, X4, X5, X6, A1, A2,
   4982     A3, A4, A5, A6), const P1& p1, const P2& p2, const P3& p3, const P4& p4,
   4983     const P5& p5, const P6& p6) {
   4984   MutantRunner<R, Tuple6<A1, A2, A3, A4, A5, A6> >* t =
   4985       new MutantLateObjectBind<R, T, R (__stdcall U::*)(X1, X2, X3, X4, X5, X6, A1, A2, A3, A4, A5, A6),
   4986                                Tuple6<P1, P2, P3, P4, P5, P6>, Tuple6<A1, A2, A3, A4, A5, A6> >
   4987           (obj, method, MakeTuple(p1, p2, p3, p4, p5, p6));
   4988   return MutantFunctor<R, Tuple6<A1, A2, A3, A4, A5, A6> >(t);
   4989 }
   4990 #endif  // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
   4991 #endif  // OS_WIN
   4992 
   4993 }  // namespace testing
   4994 
   4995 #endif  // TESTING_GMOCK_MUTANT_H_
   4996