diff options
author | stoyan@chromium.org <stoyan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-12 23:10:11 +0000 |
---|---|---|
committer | stoyan@chromium.org <stoyan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-12 23:10:11 +0000 |
commit | 8d7f40abdc12186dab03800d65816db57c06533e (patch) | |
tree | bd8324d32bfb6d037a47278b0585d5b9e1eab461 /testing | |
parent | b0534d44bc813d61df64ae32dd015e865c254d5f (diff) | |
download | chromium_src-8d7f40abdc12186dab03800d65816db57c06533e.zip chromium_src-8d7f40abdc12186dab03800d65816db57c06533e.tar.gz chromium_src-8d7f40abdc12186dab03800d65816db57c06533e.tar.bz2 |
Add python script that generates gmock_mutant.h
Resolve ambiguity - error C2782 in VisualC or "no matching function to call" in gcc - when attempt to create functor for base class member function.
Support for free (non class members) functions.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/371046
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@31848 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'testing')
-rw-r--r-- | testing/generate_gmock_mutant.py | 437 | ||||
-rw-r--r-- | testing/gmock_mutant.h | 1408 |
2 files changed, 1539 insertions, 306 deletions
diff --git a/testing/generate_gmock_mutant.py b/testing/generate_gmock_mutant.py new file mode 100644 index 0000000..7de9cbc --- /dev/null +++ b/testing/generate_gmock_mutant.py @@ -0,0 +1,437 @@ +#!/usr/bin/python +# Copyright (c) 2009 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import string + +HEADER = """\ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file automatically generated by testing/generate_gmock_mutant.py. +// DO NOT EDIT. + +#ifndef TESTING_GMOCK_MUTANT_H_ +#define TESTING_GMOCK_MUTANT_H_ + +// The intention of this file is to make possible using GMock actions in +// all of its syntactic beauty. Classes and helper functions can be used as +// more generic variants of Task and Callback classes (see base/task.h) +// Mutant supports both pre-bound arguments (like Task) and call-time +// arguments (like Callback) - hence the name. :-) +// +// DispatchToMethod/Function supports two sets of arguments: pre-bound (P) and +// call-time (C). The arguments as well as the return type are templatized. +// DispatchToMethod/Function will also try to call the selected method or +// function even if provided pre-bound arguments does not match exactly with +// the function signature hence the X1, X2 ... XN parameters in CreateFunctor. +// DispatchToMethod will try to invoke method that may not belong to the +// object's class itself but to the object's class base class. +// +// Additionally you can bind the object at calltime by binding a pointer to +// pointer to the object at creation time - before including this file you +// have to #define GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING. +// +// TODO(stoyan): It's yet not clear to me should we use T& and T&* instead +// of T* and T** when we invoke CreateFunctor to match the EXPECT_CALL style. +// +// +// Sample usage with gMock: +// +// struct Mock : public ObjectDelegate { +// MOCK_METHOD2(string, OnRequest(int n, const string& request)); +// MOCK_METHOD1(void, OnQuit(int exit_code)); +// MOCK_METHOD2(void, LogMessage(int level, const string& message)); +// +// string HandleFlowers(const string& reply, int n, const string& request) { +// string result = SStringPrintf("In request of %d %s ", n, request); +// for (int i = 0; i < n; ++i) result.append(reply) +// return result; +// } +// +// void DoLogMessage(int level, const string& message) { +// } +// +// void QuitMessageLoop(int seconds) { +// MessageLoop* loop = MessageLoop::current(); +// loop->PostDelayedTask(FROM_HERE, new MessageLoop::QuitTask, +// 1000 * seconds); +// } +// }; +// +// Mock mock; +// // Will invoke mock.HandleFlowers("orchids", n, request) +// // "orchids" is a pre-bound argument, and <n> and <request> are call-time +// // arguments - they are not known until the OnRequest mock is invoked. +// EXPECT_CALL(mock, OnRequest(Ge(5), StartsWith("flower")) +// .Times(1) +// .WillOnce(Invoke(CreateFunctor(&mock, &Mock::HandleFlowers, +// string("orchids")))); +// +// +// // No pre-bound arguments, two call-time arguments passed +// // directly to DoLogMessage +// EXPECT_CALL(mock, OnLogMessage(_, _)) +// .Times(AnyNumber()) +// .WillAlways(Invoke(CreateFunctor, &mock, &Mock::DoLogMessage)); +// +// +// // In this case we have a single pre-bound argument - 3. We ignore +// // all of the arguments of OnQuit. +// EXCEPT_CALL(mock, OnQuit(_)) +// .Times(1) +// .WillOnce(InvokeWithoutArgs(CreateFunctor( +// &mock, &Mock::QuitMessageLoop, 3))); +// +// MessageLoop loop; +// loop.Run(); +// +// +// // Here is another example of how we can set an action that invokes +// // method of an object that is not yet created. +// struct Mock : public ObjectDelegate { +// MOCK_METHOD1(void, DemiurgeCreated(Demiurge*)); +// MOCK_METHOD2(void, OnRequest(int count, const string&)); +// +// void StoreDemiurge(Demiurge* w) { +// demiurge_ = w; +// } +// +// Demiurge* demiurge; +// } +// +// EXPECT_CALL(mock, DemiurgeCreated(_)).Times(1) +// .WillOnce(Invoke(CreateFunctor(&mock, &Mock::StoreDemiurge))); +// +// EXPECT_CALL(mock, OnRequest(_, StrEq("Moby Dick"))) +// .Times(AnyNumber()) +// .WillAlways(WithArgs<0>(Invoke( +// CreateFunctor(&mock->demiurge_, &Demiurge::DecreaseMonsters)))); +// + +#include "base/linked_ptr.h" +#include "base/tuple.h" // for Tuple + +namespace testing {""" + +MUTANT = """\ + +// Interface that is exposed to the consumer, that does the actual calling +// of the method. +template <typename R, typename Params> +class MutantRunner { + public: + virtual R RunWithParams(const Params& params) = 0; + virtual ~MutantRunner() {} +}; + +// Mutant holds pre-bound arguments (like Task). Like Callback +// allows call-time arguments. You bind a pointer to the object +// at creation time. +template <typename R, typename T, typename Method, + typename PreBound, typename Params> +class Mutant : public MutantRunner<R, Params> { + public: + Mutant(T* obj, Method method, const PreBound& pb) + : obj_(obj), method_(method), pb_(pb) { + } + + // MutantRunner implementation + virtual R RunWithParams(const Params& params) { + return DispatchToMethod<R>(this->obj_, this->method_, pb_, params); + } + + T* obj_; + Method method_; + PreBound pb_; +}; + +template <typename R, typename Function, typename PreBound, typename Params> +class MutantFunction : public MutantRunner<R, Params> { + public: + MutantFunction(Function function, const PreBound& pb) + : function_(function), pb_(pb) { + } + + // MutantRunner implementation + virtual R RunWithParams(const Params& params) { + return DispatchToFunction<R>(function_, pb_, params); + } + + Function function_; + PreBound pb_; +}; + +#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING +// MutantLateBind is like Mutant, but you bind a pointer to a pointer +// to the object. This way you can create actions for an object +// that is not yet created (has only storage for a pointer to it). +template <typename R, typename T, typename Method, + typename PreBound, typename Params> +class MutantLateObjectBind : public MutantRunner<R, Params> { + public: + MutantLateObjectBind(T** obj, Method method, const PreBound& pb) + : obj_(obj), method_(method), pb_(pb) { + } + + // MutantRunner implementation. + virtual R RunWithParams(const Params& params) { + EXPECT_THAT(*this->obj_, testing::NotNull()); + if (NULL == *this->obj_) + return R(); + return DispatchToMethod<R>( *this->obj_, this->method_, pb_, params); + } + + T** obj_; + Method method_; + PreBound pb_; +}; +#endif + +// Simple MutantRunner<> wrapper acting as a functor. +// Redirects operator() to MutantRunner<Params>::Run() +template <typename R, typename Params> +struct MutantFunctor { + explicit MutantFunctor(MutantRunner<R, Params>* cb) : impl_(cb) { + } + + ~MutantFunctor() { + } + + inline R operator()() { + return impl_->RunWithParams(Tuple0()); + } + + template <typename Arg1> + inline R operator()(const Arg1& a) { + return impl_->RunWithParams(Params(a)); + } + + template <typename Arg1, typename Arg2> + inline R operator()(const Arg1& a, const Arg2& b) { + return impl_->RunWithParams(Params(a, b)); + } + + template <typename Arg1, typename Arg2, typename Arg3> + inline R operator()(const Arg1& a, const Arg2& b, const Arg3& c) { + return impl_->RunWithParams(Params(a, b, c)); + } + + template <typename Arg1, typename Arg2, typename Arg3, typename Arg4> + inline R operator()(const Arg1& a, const Arg2& b, const Arg3& c, + const Arg4& d) { + return impl_->RunWithParams(Params(a, b, c, d)); + } + + private: + // We need copy constructor since MutantFunctor is copied few times + // inside GMock machinery, hence no DISALLOW_EVIL_CONTRUCTORS + MutantFunctor(); + linked_ptr<MutantRunner<R, Params> > impl_; +}; +""" + +FOOTER = """\ +} // namespace testing + +#endif // TESTING_GMOCK_MUTANT_H_""" + +# Templates for DispatchToMethod/DispatchToFunction functions. +# template_params - typename P1, typename P2.. typename C1.. +# prebound - TupleN<P1, .. PN> +# calltime - TupleN<C1, .. CN> +# args - p.a, p.b.., c.a, c.b.. +DISPATCH_TO_METHOD_TEMPLATE = """\ +template <typename R, typename T, typename Method, %(template_params)s> +inline R DispatchToMethod(T* obj, Method method, + const %(prebound)s& p, + const %(calltime)s& c) { + return (obj->*method)(%(args)s); +} +""" + +DISPATCH_TO_FUNCTION_TEMPLATE = """\ +template <typename R, typename Function, %(template_params)s> +inline R DispatchToFunction(Function function, + const %(prebound)s& p, + const %(calltime)s& c) { + return (*function)(%(args)s); +} +""" + +# Templates for CreateFunctor functions. +# template_params - typename P1, typename P2.. typename C1.. typename X1.. +# prebound - TupleN<P1, .. PN> +# calltime - TupleN<A1, .. AN> +# params - X1,.. , A1, .. +# args - const P1& p1 .. +# call_args - p1, p2, p3.. +CREATE_METHOD_FUNCTOR_TEMPLATE = """\ +template <typename R, typename T, typename U, %(template_params)s> +inline MutantFunctor<R, %(calltime)s> +CreateFunctor(T* obj, R (U::*method)(%(params)s), %(args)s) { + MutantRunner<R, %(calltime)s>* t = + new Mutant<R, T, R (U::*)(%(params)s), + %(prebound)s, %(calltime)s> + (obj, method, MakeTuple(%(call_args)s)); + return MutantFunctor<R, %(calltime)s>(t); +} +""" + +CREATE_FUNCTION_FUNCTOR_TEMPLATE = """\ +template <typename R, %(template_params)s> +inline MutantFunctor<R, %(calltime)s> +CreateFunctor(R (*function)(%(params)s), %(args)s) { + MutantRunner<R, %(calltime)s>* t = + new MutantFunction<R, R (*)(%(params)s), + %(prebound)s, %(calltime)s> + (function, MakeTuple(%(call_args)s)); + return MutantFunctor<R, %(calltime)s>(t); +} +""" + +def SplitLine(line, width): + """Splits a single line at comma, at most |width| characters long.""" + if len(line) < width: + return (line, None) + n = 1 + line[:width].rfind(",") + if n == 0: # If comma cannot be found give up and return the entire line. + return (line, None) + # Assume there is a space after the comma + assert line[n] == " " + return (line[:n], line[n + 1:]) + + +def Wrap(s, width, subsequent_offset=4): + """Wraps a single line |s| at commas so every line is at most |width| + characters long. + """ + w = [] + spaces = " " * subsequent_offset + while s: + (f, s) = SplitLine(s, width) + w.append(f) + if s: + s = spaces + s + return "\n".join(w) + + +def Clean(s): + """Cleans artifacts from generated C++ code. + + Our simple string formatting/concatenation may introduce extra commas. + """ + s = s.replace("<>", "") + s = s.replace(", >", ">") + s = s.replace(", )", ")") + s = s.replace(">>", "> >") + return s + + +def ExpandPattern(pattern, it): + """Return list of expanded pattern strings. + + Each string is created by replacing all '%' in |pattern| with element of |it|. + """ + return [pattern.replace("%", x) for x in it] + + +def Gen(pattern, n): + """Expands pattern replacing '%' with sequential integers. + + Expanded patterns will be joined with comma separator. + GenAlphs("X%", 3) will return "X1, X2, X3". + """ + it = string.hexdigits[1:n + 1] + return ", ".join(ExpandPattern(pattern, it)) + + +def GenAlpha(pattern, n): + """Expands pattern replacing '%' with sequential small ASCII letters. + + Expanded patterns will be joined with comma separator. + GenAlphs("X%", 3) will return "Xa, Xb, Xc". + """ + it = string.ascii_lowercase[0:n] + return ", ".join(ExpandPattern(pattern, it)) + + +def Merge(a): + return ", ".join(filter(len, a)) + + +def GenTuple(pattern, n): + return Clean("Tuple%d<%s>" % (n, Gen(pattern, n))) + + +def FixCode(s): + lines = Clean(s).splitlines() + # Wrap sometimes very long 1st and 3rd line at 80th column. + lines[0] = Wrap(lines[0], 80, 10) + lines[2] = Wrap(lines[2], 80, 4) + return "\n".join(lines) + + +def GenerateDispatch(prebound, calltime): + print "\n// %d - %d" % (prebound, calltime) + args = { + "template_params": Merge([Gen("typename P%", prebound), + Gen("typename C%", calltime)]), + "prebound": GenTuple("P%", prebound), + "calltime": GenTuple("C%", calltime), + "args": Merge([GenAlpha("p.%", prebound), GenAlpha("c.%", calltime)]), + } + + print FixCode(DISPATCH_TO_METHOD_TEMPLATE % args) + print FixCode(DISPATCH_TO_FUNCTION_TEMPLATE % args) + + +def GenerateCreateFunctor(prebound, calltime): + print "// %d - %d" % (prebound, calltime) + args = { + "calltime": GenTuple("A%", calltime), + "prebound": GenTuple("P%", prebound), + "params": Merge([Gen("X%", prebound), Gen("A%", calltime)]), + "args": Gen("const P%& p%", prebound), + "call_args": Gen("p%", prebound), + "template_params": Merge([Gen("typename P%", prebound), + Gen("typename A%", calltime), + Gen("typename X%", prebound)]) + } + + mutant = FixCode(CREATE_METHOD_FUNCTOR_TEMPLATE % args) + print mutant + + # Slightly different version for free function call. + print "\n", FixCode(CREATE_FUNCTION_FUNCTOR_TEMPLATE % args) + + # Functor with pointer to a pointer of the object. + print "\n#ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING" + mutant2 = mutant.replace("CreateFunctor(T* obj,", "CreateFunctor(T** obj,") + mutant2 = mutant2.replace("new Mutant", "new MutantLateObjectBind") + mutant2 = mutant2.replace(" " * 17 + "Tuple", " " * 31 + "Tuple") + print mutant2 + print "#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING\n" + + # Functor for method with __stdcall calling conventions. + print "#if defined (OS_WIN)" + stdcall = CREATE_METHOD_FUNCTOR_TEMPLATE.replace("U::", "__stdcall U::") + print FixCode(stdcall % args) + print "#endif // OS_WIN\n" + + +def main(): + print HEADER + for prebound in xrange(0, 4 + 1): + for args in xrange(0, 4 + 1): + GenerateDispatch(prebound, args) + print MUTANT + for prebound in xrange(0, 4 + 1): + for args in xrange(0, 4 + 1): + GenerateCreateFunctor(prebound, args) + print FOOTER + +if __name__ == "__main__": + main() diff --git a/testing/gmock_mutant.h b/testing/gmock_mutant.h index b92ec02..dd7435e 100644 --- a/testing/gmock_mutant.h +++ b/testing/gmock_mutant.h @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// This file automatically generated by testing/generate_gmock_mutant.py. +// DO NOT EDIT. + #ifndef TESTING_GMOCK_MUTANT_H_ #define TESTING_GMOCK_MUTANT_H_ @@ -11,11 +14,13 @@ // Mutant supports both pre-bound arguments (like Task) and call-time // arguments (like Callback) - hence the name. :-) // -// DispatchToMethod supports two sets of arguments: pre-bound (P) and +// DispatchToMethod/Function supports two sets of arguments: pre-bound (P) and // call-time (C). The arguments as well as the return type are templatized. -// DispatchToMethod will also try to call the selected method even if provided -// pre-bound arguments does not match exactly with the function signature -// hence the X1, X2 ... XN parameters in CreateFunctor. +// DispatchToMethod/Function will also try to call the selected method or +// function even if provided pre-bound arguments does not match exactly with +// the function signature hence the X1, X2 ... XN parameters in CreateFunctor. +// DispatchToMethod will try to invoke method that may not belong to the +// object's class itself but to the object's class base class. // // Additionally you can bind the object at calltime by binding a pointer to // pointer to the object at creation time - before including this file you @@ -110,6 +115,12 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple0& c) { return (obj->*method)(); } +template <typename R, typename Function> +inline R DispatchToFunction(Function function, + const Tuple0& p, + const Tuple0& c) { + return (*function)(); +} // 0 - 1 template <typename R, typename T, typename Method, typename C1> @@ -118,6 +129,12 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple1<C1>& c) { return (obj->*method)(c.a); } +template <typename R, typename Function, typename C1> +inline R DispatchToFunction(Function function, + const Tuple0& p, + const Tuple1<C1>& c) { + return (*function)(c.a); +} // 0 - 2 template <typename R, typename T, typename Method, typename C1, typename C2> @@ -126,6 +143,12 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple2<C1, C2>& c) { return (obj->*method)(c.a, c.b); } +template <typename R, typename Function, typename C1, typename C2> +inline R DispatchToFunction(Function function, + const Tuple0& p, + const Tuple2<C1, C2>& c) { + return (*function)(c.a, c.b); +} // 0 - 3 template <typename R, typename T, typename Method, typename C1, typename C2, @@ -135,6 +158,12 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple3<C1, C2, C3>& c) { return (obj->*method)(c.a, c.b, c.c); } +template <typename R, typename Function, typename C1, typename C2, typename C3> +inline R DispatchToFunction(Function function, + const Tuple0& p, + const Tuple3<C1, C2, C3>& c) { + return (*function)(c.a, c.b, c.c); +} // 0 - 4 template <typename R, typename T, typename Method, typename C1, typename C2, @@ -144,6 +173,13 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple4<C1, C2, C3, C4>& c) { return (obj->*method)(c.a, c.b, c.c, c.d); } +template <typename R, typename Function, typename C1, typename C2, typename C3, + typename C4> +inline R DispatchToFunction(Function function, + const Tuple0& p, + const Tuple4<C1, C2, C3, C4>& c) { + return (*function)(c.a, c.b, c.c, c.d); +} // 1 - 0 template <typename R, typename T, typename Method, typename P1> @@ -152,6 +188,12 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple0& c) { return (obj->*method)(p.a); } +template <typename R, typename Function, typename P1> +inline R DispatchToFunction(Function function, + const Tuple1<P1>& p, + const Tuple0& c) { + return (*function)(p.a); +} // 1 - 1 template <typename R, typename T, typename Method, typename P1, typename C1> @@ -160,6 +202,12 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple1<C1>& c) { return (obj->*method)(p.a, c.a); } +template <typename R, typename Function, typename P1, typename C1> +inline R DispatchToFunction(Function function, + const Tuple1<P1>& p, + const Tuple1<C1>& c) { + return (*function)(p.a, c.a); +} // 1 - 2 template <typename R, typename T, typename Method, typename P1, typename C1, @@ -169,6 +217,12 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple2<C1, C2>& c) { return (obj->*method)(p.a, c.a, c.b); } +template <typename R, typename Function, typename P1, typename C1, typename C2> +inline R DispatchToFunction(Function function, + const Tuple1<P1>& p, + const Tuple2<C1, C2>& c) { + return (*function)(p.a, c.a, c.b); +} // 1 - 3 template <typename R, typename T, typename Method, typename P1, typename C1, @@ -178,6 +232,13 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple3<C1, C2, C3>& c) { return (obj->*method)(p.a, c.a, c.b, c.c); } +template <typename R, typename Function, typename P1, typename C1, typename C2, + typename C3> +inline R DispatchToFunction(Function function, + const Tuple1<P1>& p, + const Tuple3<C1, C2, C3>& c) { + return (*function)(p.a, c.a, c.b, c.c); +} // 1 - 4 template <typename R, typename T, typename Method, typename P1, typename C1, @@ -187,6 +248,13 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple4<C1, C2, C3, C4>& c) { return (obj->*method)(p.a, c.a, c.b, c.c, c.d); } +template <typename R, typename Function, typename P1, typename C1, typename C2, + typename C3, typename C4> +inline R DispatchToFunction(Function function, + const Tuple1<P1>& p, + const Tuple4<C1, C2, C3, C4>& c) { + return (*function)(p.a, c.a, c.b, c.c, c.d); +} // 2 - 0 template <typename R, typename T, typename Method, typename P1, typename P2> @@ -195,6 +263,12 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple0& c) { return (obj->*method)(p.a, p.b); } +template <typename R, typename Function, typename P1, typename P2> +inline R DispatchToFunction(Function function, + const Tuple2<P1, P2>& p, + const Tuple0& c) { + return (*function)(p.a, p.b); +} // 2 - 1 template <typename R, typename T, typename Method, typename P1, typename P2, @@ -204,6 +278,12 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple1<C1>& c) { return (obj->*method)(p.a, p.b, c.a); } +template <typename R, typename Function, typename P1, typename P2, typename C1> +inline R DispatchToFunction(Function function, + const Tuple2<P1, P2>& p, + const Tuple1<C1>& c) { + return (*function)(p.a, p.b, c.a); +} // 2 - 2 template <typename R, typename T, typename Method, typename P1, typename P2, @@ -213,6 +293,13 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple2<C1, C2>& c) { return (obj->*method)(p.a, p.b, c.a, c.b); } +template <typename R, typename Function, typename P1, typename P2, typename C1, + typename C2> +inline R DispatchToFunction(Function function, + const Tuple2<P1, P2>& p, + const Tuple2<C1, C2>& c) { + return (*function)(p.a, p.b, c.a, c.b); +} // 2 - 3 template <typename R, typename T, typename Method, typename P1, typename P2, @@ -222,6 +309,13 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple3<C1, C2, C3>& c) { return (obj->*method)(p.a, p.b, c.a, c.b, c.c); } +template <typename R, typename Function, typename P1, typename P2, typename C1, + typename C2, typename C3> +inline R DispatchToFunction(Function function, + const Tuple2<P1, P2>& p, + const Tuple3<C1, C2, C3>& c) { + return (*function)(p.a, p.b, c.a, c.b, c.c); +} // 2 - 4 template <typename R, typename T, typename Method, typename P1, typename P2, @@ -231,6 +325,13 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple4<C1, C2, C3, C4>& c) { return (obj->*method)(p.a, p.b, c.a, c.b, c.c, c.d); } +template <typename R, typename Function, typename P1, typename P2, typename C1, + typename C2, typename C3, typename C4> +inline R DispatchToFunction(Function function, + const Tuple2<P1, P2>& p, + const Tuple4<C1, C2, C3, C4>& c) { + return (*function)(p.a, p.b, c.a, c.b, c.c, c.d); +} // 3 - 0 template <typename R, typename T, typename Method, typename P1, typename P2, @@ -240,6 +341,12 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple0& c) { return (obj->*method)(p.a, p.b, p.c); } +template <typename R, typename Function, typename P1, typename P2, typename P3> +inline R DispatchToFunction(Function function, + const Tuple3<P1, P2, P3>& p, + const Tuple0& c) { + return (*function)(p.a, p.b, p.c); +} // 3 - 1 template <typename R, typename T, typename Method, typename P1, typename P2, @@ -249,6 +356,13 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple1<C1>& c) { return (obj->*method)(p.a, p.b, p.c, c.a); } +template <typename R, typename Function, typename P1, typename P2, typename P3, + typename C1> +inline R DispatchToFunction(Function function, + const Tuple3<P1, P2, P3>& p, + const Tuple1<C1>& c) { + return (*function)(p.a, p.b, p.c, c.a); +} // 3 - 2 template <typename R, typename T, typename Method, typename P1, typename P2, @@ -258,6 +372,13 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple2<C1, C2>& c) { return (obj->*method)(p.a, p.b, p.c, c.a, c.b); } +template <typename R, typename Function, typename P1, typename P2, typename P3, + typename C1, typename C2> +inline R DispatchToFunction(Function function, + const Tuple3<P1, P2, P3>& p, + const Tuple2<C1, C2>& c) { + return (*function)(p.a, p.b, p.c, c.a, c.b); +} // 3 - 3 template <typename R, typename T, typename Method, typename P1, typename P2, @@ -267,6 +388,13 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple3<C1, C2, C3>& c) { return (obj->*method)(p.a, p.b, p.c, c.a, c.b, c.c); } +template <typename R, typename Function, typename P1, typename P2, typename P3, + typename C1, typename C2, typename C3> +inline R DispatchToFunction(Function function, + const Tuple3<P1, P2, P3>& p, + const Tuple3<C1, C2, C3>& c) { + return (*function)(p.a, p.b, p.c, c.a, c.b, c.c); +} // 3 - 4 template <typename R, typename T, typename Method, typename P1, typename P2, @@ -276,6 +404,13 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple4<C1, C2, C3, C4>& c) { return (obj->*method)(p.a, p.b, p.c, c.a, c.b, c.c, c.d); } +template <typename R, typename Function, typename P1, typename P2, typename P3, + typename C1, typename C2, typename C3, typename C4> +inline R DispatchToFunction(Function function, + const Tuple3<P1, P2, P3>& p, + const Tuple4<C1, C2, C3, C4>& c) { + return (*function)(p.a, p.b, p.c, c.a, c.b, c.c, c.d); +} // 4 - 0 template <typename R, typename T, typename Method, typename P1, typename P2, @@ -285,6 +420,13 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple0& c) { return (obj->*method)(p.a, p.b, p.c, p.d); } +template <typename R, typename Function, typename P1, typename P2, typename P3, + typename P4> +inline R DispatchToFunction(Function function, + const Tuple4<P1, P2, P3, P4>& p, + const Tuple0& c) { + return (*function)(p.a, p.b, p.c, p.d); +} // 4 - 1 template <typename R, typename T, typename Method, typename P1, typename P2, @@ -294,6 +436,13 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple1<C1>& c) { return (obj->*method)(p.a, p.b, p.c, p.d, c.a); } +template <typename R, typename Function, typename P1, typename P2, typename P3, + typename P4, typename C1> +inline R DispatchToFunction(Function function, + const Tuple4<P1, P2, P3, P4>& p, + const Tuple1<C1>& c) { + return (*function)(p.a, p.b, p.c, p.d, c.a); +} // 4 - 2 template <typename R, typename T, typename Method, typename P1, typename P2, @@ -303,6 +452,13 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple2<C1, C2>& c) { return (obj->*method)(p.a, p.b, p.c, p.d, c.a, c.b); } +template <typename R, typename Function, typename P1, typename P2, typename P3, + typename P4, typename C1, typename C2> +inline R DispatchToFunction(Function function, + const Tuple4<P1, P2, P3, P4>& p, + const Tuple2<C1, C2>& c) { + return (*function)(p.a, p.b, p.c, p.d, c.a, c.b); +} // 4 - 3 template <typename R, typename T, typename Method, typename P1, typename P2, @@ -312,6 +468,13 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple3<C1, C2, C3>& c) { return (obj->*method)(p.a, p.b, p.c, p.d, c.a, c.b, c.c); } +template <typename R, typename Function, typename P1, typename P2, typename P3, + typename P4, typename C1, typename C2, typename C3> +inline R DispatchToFunction(Function function, + const Tuple4<P1, P2, P3, P4>& p, + const Tuple3<C1, C2, C3>& c) { + return (*function)(p.a, p.b, p.c, p.d, c.a, c.b, c.c); +} // 4 - 4 template <typename R, typename T, typename Method, typename P1, typename P2, @@ -322,6 +485,13 @@ inline R DispatchToMethod(T* obj, Method method, const Tuple4<C1, C2, C3, C4>& c) { return (obj->*method)(p.a, p.b, p.c, p.d, c.a, c.b, c.c, c.d); } +template <typename R, typename Function, typename P1, typename P2, typename P3, + typename P4, typename C1, typename C2, typename C3, typename C4> +inline R DispatchToFunction(Function function, + const Tuple4<P1, P2, P3, P4>& p, + const Tuple4<C1, C2, C3, C4>& c) { + return (*function)(p.a, p.b, p.c, p.d, c.a, c.b, c.c, c.d); +} // Interface that is exposed to the consumer, that does the actual calling // of the method. @@ -353,6 +523,22 @@ class Mutant : public MutantRunner<R, Params> { PreBound pb_; }; +template <typename R, typename Function, typename PreBound, typename Params> +class MutantFunction : public MutantRunner<R, Params> { + public: + MutantFunction(Function function, const PreBound& pb) + : function_(function), pb_(pb) { + } + + // MutantRunner implementation + virtual R RunWithParams(const Params& params) { + return DispatchToFunction<R>(function_, pb_, params); + } + + Function function_; + PreBound pb_; +}; + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING // MutantLateBind is like Mutant, but you bind a pointer to a pointer // to the object. This way you can create actions for an object @@ -421,683 +607,1293 @@ struct MutantFunctor { linked_ptr<MutantRunner<R, Params> > impl_; }; - - // 0 - 0 -template <typename R, typename T> +template <typename R, typename T, typename U> inline MutantFunctor<R, Tuple0> -CreateFunctor(T* obj, R (T::*method)()) { - MutantRunner<R, Tuple0> *t = - new Mutant<R, T, R (T::*)(), +CreateFunctor(T* obj, R (U::*method)()) { + MutantRunner<R, Tuple0>* t = + new Mutant<R, T, R (U::*)(), Tuple0, Tuple0> (obj, method, MakeTuple()); return MutantFunctor<R, Tuple0>(t); } +template <typename R> +inline MutantFunctor<R, Tuple0> +CreateFunctor(R (*function)()) { + MutantRunner<R, Tuple0>* t = + new MutantFunction<R, R (*)(), + Tuple0, Tuple0> + (function, MakeTuple()); + return MutantFunctor<R, Tuple0>(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 0 - 0 -template <typename R, typename T> +template <typename R, typename T, typename U> inline MutantFunctor<R, Tuple0> -CreateFunctor(T** obj, R (T::*method)()) { - MutantRunner<R, Tuple0> *t = - new MutantLateObjectBind<R, T, R (T::*)(), +CreateFunctor(T** obj, R (U::*method)()) { + MutantRunner<R, Tuple0>* t = + new MutantLateObjectBind<R, T, R (U::*)(), Tuple0, Tuple0> (obj, method, MakeTuple()); return MutantFunctor<R, Tuple0>(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING + +#if defined (OS_WIN) +template <typename R, typename T, typename U> +inline MutantFunctor<R, Tuple0> +CreateFunctor(T* obj, R (__stdcall U::*method)()) { + MutantRunner<R, Tuple0>* t = + new Mutant<R, T, R (__stdcall U::*)(), + Tuple0, Tuple0> + (obj, method, MakeTuple()); + return MutantFunctor<R, Tuple0>(t); +} +#endif // OS_WIN // 0 - 1 -template <typename R, typename T, typename A1> +template <typename R, typename T, typename U, typename A1> inline MutantFunctor<R, Tuple1<A1> > -CreateFunctor(T* obj, R (T::*method)(A1)) { - MutantRunner<R, Tuple1<A1> > *t = - new Mutant<R, T, R (T::*)(A1), +CreateFunctor(T* obj, R (U::*method)(A1)) { + MutantRunner<R, Tuple1<A1> >* t = + new Mutant<R, T, R (U::*)(A1), Tuple0, Tuple1<A1> > (obj, method, MakeTuple()); return MutantFunctor<R, Tuple1<A1> >(t); } +template <typename R, typename A1> +inline MutantFunctor<R, Tuple1<A1> > +CreateFunctor(R (*function)(A1)) { + MutantRunner<R, Tuple1<A1> >* t = + new MutantFunction<R, R (*)(A1), + Tuple0, Tuple1<A1> > + (function, MakeTuple()); + return MutantFunctor<R, Tuple1<A1> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 0 - 1 -template <typename R, typename T, typename A1> +template <typename R, typename T, typename U, typename A1> inline MutantFunctor<R, Tuple1<A1> > -CreateFunctor(T** obj, R (T::*method)(A1)) { - MutantRunner<R, Tuple1<A1> > *t = - new MutantLateObjectBind<R, T, R (T::*)(A1), +CreateFunctor(T** obj, R (U::*method)(A1)) { + MutantRunner<R, Tuple1<A1> >* t = + new MutantLateObjectBind<R, T, R (U::*)(A1), Tuple0, Tuple1<A1> > (obj, method, MakeTuple()); return MutantFunctor<R, Tuple1<A1> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING + +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename A1> +inline MutantFunctor<R, Tuple1<A1> > +CreateFunctor(T* obj, R (__stdcall U::*method)(A1)) { + MutantRunner<R, Tuple1<A1> >* t = + new Mutant<R, T, R (__stdcall U::*)(A1), + Tuple0, Tuple1<A1> > + (obj, method, MakeTuple()); + return MutantFunctor<R, Tuple1<A1> >(t); +} +#endif // OS_WIN // 0 - 2 -template <typename R, typename T, typename A1, typename A2> +template <typename R, typename T, typename U, typename A1, typename A2> inline MutantFunctor<R, Tuple2<A1, A2> > -CreateFunctor(T* obj, R (T::*method)(A1, A2)) { - MutantRunner<R, Tuple2<A1, A2> > *t = - new Mutant<R, T, R (T::*)(A1, A2), +CreateFunctor(T* obj, R (U::*method)(A1, A2)) { + MutantRunner<R, Tuple2<A1, A2> >* t = + new Mutant<R, T, R (U::*)(A1, A2), Tuple0, Tuple2<A1, A2> > (obj, method, MakeTuple()); return MutantFunctor<R, Tuple2<A1, A2> >(t); } +template <typename R, typename A1, typename A2> +inline MutantFunctor<R, Tuple2<A1, A2> > +CreateFunctor(R (*function)(A1, A2)) { + MutantRunner<R, Tuple2<A1, A2> >* t = + new MutantFunction<R, R (*)(A1, A2), + Tuple0, Tuple2<A1, A2> > + (function, MakeTuple()); + return MutantFunctor<R, Tuple2<A1, A2> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 0 - 2 -template <typename R, typename T, typename A1, typename A2> +template <typename R, typename T, typename U, typename A1, typename A2> inline MutantFunctor<R, Tuple2<A1, A2> > -CreateFunctor(T** obj, R (T::*method)(A1, A2)) { - MutantRunner<R, Tuple2<A1, A2> > *t = - new MutantLateObjectBind<R, T, R (T::*)(A1, A2), +CreateFunctor(T** obj, R (U::*method)(A1, A2)) { + MutantRunner<R, Tuple2<A1, A2> >* t = + new MutantLateObjectBind<R, T, R (U::*)(A1, A2), Tuple0, Tuple2<A1, A2> > (obj, method, MakeTuple()); return MutantFunctor<R, Tuple2<A1, A2> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING + +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename A1, typename A2> +inline MutantFunctor<R, Tuple2<A1, A2> > +CreateFunctor(T* obj, R (__stdcall U::*method)(A1, A2)) { + MutantRunner<R, Tuple2<A1, A2> >* t = + new Mutant<R, T, R (__stdcall U::*)(A1, A2), + Tuple0, Tuple2<A1, A2> > + (obj, method, MakeTuple()); + return MutantFunctor<R, Tuple2<A1, A2> >(t); +} +#endif // OS_WIN // 0 - 3 -template <typename R, typename T, typename A1, typename A2, typename A3> +template <typename R, typename T, typename U, typename A1, typename A2, + typename A3> inline MutantFunctor<R, Tuple3<A1, A2, A3> > -CreateFunctor(T* obj, R (T::*method)(A1, A2, A3)) { - MutantRunner<R, Tuple3<A1, A2, A3> > *t = - new Mutant<R, T, R (T::*)(A1, A2, A3), +CreateFunctor(T* obj, R (U::*method)(A1, A2, A3)) { + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new Mutant<R, T, R (U::*)(A1, A2, A3), Tuple0, Tuple3<A1, A2, A3> > (obj, method, MakeTuple()); return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); } +template <typename R, typename A1, typename A2, typename A3> +inline MutantFunctor<R, Tuple3<A1, A2, A3> > +CreateFunctor(R (*function)(A1, A2, A3)) { + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new MutantFunction<R, R (*)(A1, A2, A3), + Tuple0, Tuple3<A1, A2, A3> > + (function, MakeTuple()); + return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 0 - 3 -template <typename R, typename T, typename A1, typename A2, typename A3> +template <typename R, typename T, typename U, typename A1, typename A2, + typename A3> inline MutantFunctor<R, Tuple3<A1, A2, A3> > -CreateFunctor(T** obj, R (T::*method)(A1, A2, A3)) { - MutantRunner<R, Tuple3<A1, A2, A3> > *t = - new MutantLateObjectBind<R, T, R (T::*)(A1, A2, A3), +CreateFunctor(T** obj, R (U::*method)(A1, A2, A3)) { + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new MutantLateObjectBind<R, T, R (U::*)(A1, A2, A3), Tuple0, Tuple3<A1, A2, A3> > (obj, method, MakeTuple()); return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING + +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename A1, typename A2, + typename A3> +inline MutantFunctor<R, Tuple3<A1, A2, A3> > +CreateFunctor(T* obj, R (__stdcall U::*method)(A1, A2, A3)) { + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new Mutant<R, T, R (__stdcall U::*)(A1, A2, A3), + Tuple0, Tuple3<A1, A2, A3> > + (obj, method, MakeTuple()); + return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); +} +#endif // OS_WIN // 0 - 4 -template <typename R, typename T, typename A1, typename A2, typename A3, - typename A4> +template <typename R, typename T, typename U, typename A1, typename A2, + typename A3, typename A4> inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > -CreateFunctor(T* obj, R (T::*method)(A1, A2, A3, A4)) { - MutantRunner<R, Tuple4<A1, A2, A3, A4> > *t = - new Mutant<R, T, R (T::*)(A1, A2, A3, A4), +CreateFunctor(T* obj, R (U::*method)(A1, A2, A3, A4)) { + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new Mutant<R, T, R (U::*)(A1, A2, A3, A4), Tuple0, Tuple4<A1, A2, A3, A4> > (obj, method, MakeTuple()); return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); } +template <typename R, typename A1, typename A2, typename A3, typename A4> +inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > +CreateFunctor(R (*function)(A1, A2, A3, A4)) { + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new MutantFunction<R, R (*)(A1, A2, A3, A4), + Tuple0, Tuple4<A1, A2, A3, A4> > + (function, MakeTuple()); + return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 0 - 4 -template <typename R, typename T, typename A1, typename A2, typename A3, - typename A4> +template <typename R, typename T, typename U, typename A1, typename A2, + typename A3, typename A4> inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > -CreateFunctor(T** obj, R (T::*method)(A1, A2, A3, A4)) { - MutantRunner<R, Tuple4<A1, A2, A3, A4> > *t = - new MutantLateObjectBind<R, T, R (T::*)(A1, A2, A3, A4), +CreateFunctor(T** obj, R (U::*method)(A1, A2, A3, A4)) { + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new MutantLateObjectBind<R, T, R (U::*)(A1, A2, A3, A4), Tuple0, Tuple4<A1, A2, A3, A4> > (obj, method, MakeTuple()); return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING + +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename A1, typename A2, + typename A3, typename A4> +inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > +CreateFunctor(T* obj, R (__stdcall U::*method)(A1, A2, A3, A4)) { + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new Mutant<R, T, R (__stdcall U::*)(A1, A2, A3, A4), + Tuple0, Tuple4<A1, A2, A3, A4> > + (obj, method, MakeTuple()); + return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); +} +#endif // OS_WIN // 1 - 0 -template <typename R, typename T, typename P1, typename X1> +template <typename R, typename T, typename U, typename P1, typename X1> inline MutantFunctor<R, Tuple0> -CreateFunctor(T* obj, R (T::*method)(X1), const P1& p1) { - MutantRunner<R, Tuple0> *t = - new Mutant<R, T, R (T::*)(X1), +CreateFunctor(T* obj, R (U::*method)(X1), const P1& p1) { + MutantRunner<R, Tuple0>* t = + new Mutant<R, T, R (U::*)(X1), Tuple1<P1>, Tuple0> (obj, method, MakeTuple(p1)); return MutantFunctor<R, Tuple0>(t); } +template <typename R, typename P1, typename X1> +inline MutantFunctor<R, Tuple0> +CreateFunctor(R (*function)(X1), const P1& p1) { + MutantRunner<R, Tuple0>* t = + new MutantFunction<R, R (*)(X1), + Tuple1<P1>, Tuple0> + (function, MakeTuple(p1)); + return MutantFunctor<R, Tuple0>(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 1 - 0 -template <typename R, typename T, typename P1, typename X1> +template <typename R, typename T, typename U, typename P1, typename X1> inline MutantFunctor<R, Tuple0> -CreateFunctor(T** obj, R (T::*method)(X1), const P1& p1) { - MutantRunner<R, Tuple0> *t = - new MutantLateObjectBind<R, T, R (T::*)(X1), +CreateFunctor(T** obj, R (U::*method)(X1), const P1& p1) { + MutantRunner<R, Tuple0>* t = + new MutantLateObjectBind<R, T, R (U::*)(X1), Tuple1<P1>, Tuple0> (obj, method, MakeTuple(p1)); return MutantFunctor<R, Tuple0>(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING + +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename X1> +inline MutantFunctor<R, Tuple0> +CreateFunctor(T* obj, R (__stdcall U::*method)(X1), const P1& p1) { + MutantRunner<R, Tuple0>* t = + new Mutant<R, T, R (__stdcall U::*)(X1), + Tuple1<P1>, Tuple0> + (obj, method, MakeTuple(p1)); + return MutantFunctor<R, Tuple0>(t); +} +#endif // OS_WIN // 1 - 1 -template <typename R, typename T, typename P1, typename A1, typename X1> +template <typename R, typename T, typename U, typename P1, typename A1, + typename X1> inline MutantFunctor<R, Tuple1<A1> > -CreateFunctor(T* obj, R (T::*method)(X1, A1), const P1& p1) { - MutantRunner<R, Tuple1<A1> > *t = - new Mutant<R, T, R (T::*)(X1, A1), +CreateFunctor(T* obj, R (U::*method)(X1, A1), const P1& p1) { + MutantRunner<R, Tuple1<A1> >* t = + new Mutant<R, T, R (U::*)(X1, A1), Tuple1<P1>, Tuple1<A1> > (obj, method, MakeTuple(p1)); return MutantFunctor<R, Tuple1<A1> >(t); } +template <typename R, typename P1, typename A1, typename X1> +inline MutantFunctor<R, Tuple1<A1> > +CreateFunctor(R (*function)(X1, A1), const P1& p1) { + MutantRunner<R, Tuple1<A1> >* t = + new MutantFunction<R, R (*)(X1, A1), + Tuple1<P1>, Tuple1<A1> > + (function, MakeTuple(p1)); + return MutantFunctor<R, Tuple1<A1> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 1 - 1 -template <typename R, typename T, typename P1, typename A1, typename X1> +template <typename R, typename T, typename U, typename P1, typename A1, + typename X1> inline MutantFunctor<R, Tuple1<A1> > -CreateFunctor(T** obj, R (T::*method)(X1, A1), const P1& p1) { - MutantRunner<R, Tuple1<A1> > *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, A1), +CreateFunctor(T** obj, R (U::*method)(X1, A1), const P1& p1) { + MutantRunner<R, Tuple1<A1> >* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, A1), Tuple1<P1>, Tuple1<A1> > (obj, method, MakeTuple(p1)); return MutantFunctor<R, Tuple1<A1> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 1 - 2 -template <typename R, typename T, typename P1, typename A1, typename A2, +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename A1, typename X1> +inline MutantFunctor<R, Tuple1<A1> > +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, A1), const P1& p1) { + MutantRunner<R, Tuple1<A1> >* t = + new Mutant<R, T, R (__stdcall U::*)(X1, A1), + Tuple1<P1>, Tuple1<A1> > + (obj, method, MakeTuple(p1)); + return MutantFunctor<R, Tuple1<A1> >(t); +} +#endif // OS_WIN + +// 1 - 2 +template <typename R, typename T, typename U, typename P1, typename A1, + typename A2, typename X1> inline MutantFunctor<R, Tuple2<A1, A2> > -CreateFunctor(T* obj, R (T::*method)(X1, A1, A2), const P1& p1) { - MutantRunner<R, Tuple2<A1, A2> > *t = - new Mutant<R, T, R (T::*)(X1, A1, A2), +CreateFunctor(T* obj, R (U::*method)(X1, A1, A2), const P1& p1) { + MutantRunner<R, Tuple2<A1, A2> >* t = + new Mutant<R, T, R (U::*)(X1, A1, A2), Tuple1<P1>, Tuple2<A1, A2> > (obj, method, MakeTuple(p1)); return MutantFunctor<R, Tuple2<A1, A2> >(t); } +template <typename R, typename P1, typename A1, typename A2, typename X1> +inline MutantFunctor<R, Tuple2<A1, A2> > +CreateFunctor(R (*function)(X1, A1, A2), const P1& p1) { + MutantRunner<R, Tuple2<A1, A2> >* t = + new MutantFunction<R, R (*)(X1, A1, A2), + Tuple1<P1>, Tuple2<A1, A2> > + (function, MakeTuple(p1)); + return MutantFunctor<R, Tuple2<A1, A2> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 1 - 2 -template <typename R, typename T, typename P1, typename A1, typename A2, - typename X1> +template <typename R, typename T, typename U, typename P1, typename A1, + typename A2, typename X1> inline MutantFunctor<R, Tuple2<A1, A2> > -CreateFunctor(T** obj, R (T::*method)(X1, A1, A2), const P1& p1) { - MutantRunner<R, Tuple2<A1, A2> > *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, A1, A2), +CreateFunctor(T** obj, R (U::*method)(X1, A1, A2), const P1& p1) { + MutantRunner<R, Tuple2<A1, A2> >* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, A1, A2), Tuple1<P1>, Tuple2<A1, A2> > (obj, method, MakeTuple(p1)); return MutantFunctor<R, Tuple2<A1, A2> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING + +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename A1, + typename A2, typename X1> +inline MutantFunctor<R, Tuple2<A1, A2> > +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, A1, A2), const P1& p1) { + MutantRunner<R, Tuple2<A1, A2> >* t = + new Mutant<R, T, R (__stdcall U::*)(X1, A1, A2), + Tuple1<P1>, Tuple2<A1, A2> > + (obj, method, MakeTuple(p1)); + return MutantFunctor<R, Tuple2<A1, A2> >(t); +} +#endif // OS_WIN // 1 - 3 -template <typename R, typename T, typename P1, typename A1, typename A2, - typename A3, typename X1> +template <typename R, typename T, typename U, typename P1, typename A1, + typename A2, typename A3, typename X1> inline MutantFunctor<R, Tuple3<A1, A2, A3> > -CreateFunctor(T* obj, R (T::*method)(X1, A1, A2, A3), const P1& p1) { - MutantRunner<R, Tuple3<A1, A2, A3> > *t = - new Mutant<R, T, R (T::*)(X1, A1, A2, A3), +CreateFunctor(T* obj, R (U::*method)(X1, A1, A2, A3), const P1& p1) { + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new Mutant<R, T, R (U::*)(X1, A1, A2, A3), Tuple1<P1>, Tuple3<A1, A2, A3> > (obj, method, MakeTuple(p1)); return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); } +template <typename R, typename P1, typename A1, typename A2, typename A3, + typename X1> +inline MutantFunctor<R, Tuple3<A1, A2, A3> > +CreateFunctor(R (*function)(X1, A1, A2, A3), const P1& p1) { + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new MutantFunction<R, R (*)(X1, A1, A2, A3), + Tuple1<P1>, Tuple3<A1, A2, A3> > + (function, MakeTuple(p1)); + return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 1 - 3 -template <typename R, typename T, typename P1, typename A1, typename A2, - typename A3, typename X1> +template <typename R, typename T, typename U, typename P1, typename A1, + typename A2, typename A3, typename X1> inline MutantFunctor<R, Tuple3<A1, A2, A3> > -CreateFunctor(T** obj, R (T::*method)(X1, A1, A2, A3), const P1& p1) { - MutantRunner<R, Tuple3<A1, A2, A3> > *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, A1, A2, A3), +CreateFunctor(T** obj, R (U::*method)(X1, A1, A2, A3), const P1& p1) { + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, A1, A2, A3), Tuple1<P1>, Tuple3<A1, A2, A3> > (obj, method, MakeTuple(p1)); return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING + +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename A1, + typename A2, typename A3, typename X1> +inline MutantFunctor<R, Tuple3<A1, A2, A3> > +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, A1, A2, A3), const P1& p1) { + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new Mutant<R, T, R (__stdcall U::*)(X1, A1, A2, A3), + Tuple1<P1>, Tuple3<A1, A2, A3> > + (obj, method, MakeTuple(p1)); + return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); +} +#endif // OS_WIN // 1 - 4 -template <typename R, typename T, typename P1, typename A1, typename A2, - typename A3, typename A4, typename X1> +template <typename R, typename T, typename U, typename P1, typename A1, + typename A2, typename A3, typename A4, typename X1> inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > -CreateFunctor(T* obj, R (T::*method)(X1, A1, A2, A3, A4), const P1& p1) { - MutantRunner<R, Tuple4<A1, A2, A3, A4> > *t = - new Mutant<R, T, R (T::*)(X1, A1, A2, A3, A4), +CreateFunctor(T* obj, R (U::*method)(X1, A1, A2, A3, A4), const P1& p1) { + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new Mutant<R, T, R (U::*)(X1, A1, A2, A3, A4), Tuple1<P1>, Tuple4<A1, A2, A3, A4> > (obj, method, MakeTuple(p1)); return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); } +template <typename R, typename P1, typename A1, typename A2, typename A3, + typename A4, typename X1> +inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > +CreateFunctor(R (*function)(X1, A1, A2, A3, A4), const P1& p1) { + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new MutantFunction<R, R (*)(X1, A1, A2, A3, A4), + Tuple1<P1>, Tuple4<A1, A2, A3, A4> > + (function, MakeTuple(p1)); + return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 1 - 4 -template <typename R, typename T, typename P1, typename A1, typename A2, - typename A3, typename A4, typename X1> +template <typename R, typename T, typename U, typename P1, typename A1, + typename A2, typename A3, typename A4, typename X1> inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > -CreateFunctor(T** obj, R (T::*method)(X1, A1, A2, A3, A4), const P1& p1) { - MutantRunner<R, Tuple4<A1, A2, A3, A4> > *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, A1, A2, A3, A4), +CreateFunctor(T** obj, R (U::*method)(X1, A1, A2, A3, A4), const P1& p1) { + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, A1, A2, A3, A4), Tuple1<P1>, Tuple4<A1, A2, A3, A4> > (obj, method, MakeTuple(p1)); return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING + +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename A1, + typename A2, typename A3, typename A4, typename X1> +inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, A1, A2, A3, A4), + const P1& p1) { + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new Mutant<R, T, R (__stdcall U::*)(X1, A1, A2, A3, A4), + Tuple1<P1>, Tuple4<A1, A2, A3, A4> > + (obj, method, MakeTuple(p1)); + return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); +} +#endif // OS_WIN // 2 - 0 -template <typename R, typename T, typename P1, typename P2, typename X1, - typename X2> +template <typename R, typename T, typename U, typename P1, typename P2, + typename X1, typename X2> inline MutantFunctor<R, Tuple0> -CreateFunctor(T* obj, R (T::*method)(X1, X2), const P1& p1, const P2& p2) { - MutantRunner<R, Tuple0> *t = - new Mutant<R, T, R (T::*)(X1, X2), +CreateFunctor(T* obj, R (U::*method)(X1, X2), const P1& p1, const P2& p2) { + MutantRunner<R, Tuple0>* t = + new Mutant<R, T, R (U::*)(X1, X2), Tuple2<P1, P2>, Tuple0> (obj, method, MakeTuple(p1, p2)); return MutantFunctor<R, Tuple0>(t); } +template <typename R, typename P1, typename P2, typename X1, typename X2> +inline MutantFunctor<R, Tuple0> +CreateFunctor(R (*function)(X1, X2), const P1& p1, const P2& p2) { + MutantRunner<R, Tuple0>* t = + new MutantFunction<R, R (*)(X1, X2), + Tuple2<P1, P2>, Tuple0> + (function, MakeTuple(p1, p2)); + return MutantFunctor<R, Tuple0>(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 2 - 0 -template <typename R, typename T, typename P1, typename P2, typename X1, - typename X2> +template <typename R, typename T, typename U, typename P1, typename P2, + typename X1, typename X2> inline MutantFunctor<R, Tuple0> -CreateFunctor(T** obj, R (T::*method)(X1, X2), const P1& p1, const P2& p2) { - MutantRunner<R, Tuple0> *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, X2), +CreateFunctor(T** obj, R (U::*method)(X1, X2), const P1& p1, const P2& p2) { + MutantRunner<R, Tuple0>* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, X2), Tuple2<P1, P2>, Tuple0> (obj, method, MakeTuple(p1, p2)); return MutantFunctor<R, Tuple0>(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 2 - 1 -template <typename R, typename T, typename P1, typename P2, typename A1, +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename P2, typename X1, typename X2> +inline MutantFunctor<R, Tuple0> +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2), const P1& p1, + const P2& p2) { + MutantRunner<R, Tuple0>* t = + new Mutant<R, T, R (__stdcall U::*)(X1, X2), + Tuple2<P1, P2>, Tuple0> + (obj, method, MakeTuple(p1, p2)); + return MutantFunctor<R, Tuple0>(t); +} +#endif // OS_WIN + +// 2 - 1 +template <typename R, typename T, typename U, typename P1, typename P2, + typename A1, typename X1, typename X2> inline MutantFunctor<R, Tuple1<A1> > -CreateFunctor(T* obj, R (T::*method)(X1, X2, A1), const P1& p1, const P2& p2) { - MutantRunner<R, Tuple1<A1> > *t = - new Mutant<R, T, R (T::*)(X1, X2, A1), +CreateFunctor(T* obj, R (U::*method)(X1, X2, A1), const P1& p1, const P2& p2) { + MutantRunner<R, Tuple1<A1> >* t = + new Mutant<R, T, R (U::*)(X1, X2, A1), Tuple2<P1, P2>, Tuple1<A1> > (obj, method, MakeTuple(p1, p2)); return MutantFunctor<R, Tuple1<A1> >(t); } +template <typename R, typename P1, typename P2, typename A1, typename X1, + typename X2> +inline MutantFunctor<R, Tuple1<A1> > +CreateFunctor(R (*function)(X1, X2, A1), const P1& p1, const P2& p2) { + MutantRunner<R, Tuple1<A1> >* t = + new MutantFunction<R, R (*)(X1, X2, A1), + Tuple2<P1, P2>, Tuple1<A1> > + (function, MakeTuple(p1, p2)); + return MutantFunctor<R, Tuple1<A1> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 2 - 1 -template <typename R, typename T, typename P1, typename P2, typename A1, - typename X1, typename X2> +template <typename R, typename T, typename U, typename P1, typename P2, + typename A1, typename X1, typename X2> inline MutantFunctor<R, Tuple1<A1> > -CreateFunctor(T** obj, R (T::*method)(X1, X2, A1), const P1& p1, const P2& p2) { - MutantRunner<R, Tuple1<A1> > *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, X2, A1), +CreateFunctor(T** obj, R (U::*method)(X1, X2, A1), const P1& p1, const P2& p2) { + MutantRunner<R, Tuple1<A1> >* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, X2, A1), Tuple2<P1, P2>, Tuple1<A1> > (obj, method, MakeTuple(p1, p2)); return MutantFunctor<R, Tuple1<A1> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING + +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename P2, + typename A1, typename X1, typename X2> +inline MutantFunctor<R, Tuple1<A1> > +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, A1), const P1& p1, + const P2& p2) { + MutantRunner<R, Tuple1<A1> >* t = + new Mutant<R, T, R (__stdcall U::*)(X1, X2, A1), + Tuple2<P1, P2>, Tuple1<A1> > + (obj, method, MakeTuple(p1, p2)); + return MutantFunctor<R, Tuple1<A1> >(t); +} +#endif // OS_WIN // 2 - 2 -template <typename R, typename T, typename P1, typename P2, typename A1, - typename A2, typename X1, typename X2> +template <typename R, typename T, typename U, typename P1, typename P2, + typename A1, typename A2, typename X1, typename X2> inline MutantFunctor<R, Tuple2<A1, A2> > -CreateFunctor(T* obj, R (T::*method)(X1, X2, A1, A2), const P1& p1, +CreateFunctor(T* obj, R (U::*method)(X1, X2, A1, A2), const P1& p1, const P2& p2) { - MutantRunner<R, Tuple2<A1, A2> > *t = - new Mutant<R, T, R (T::*)(X1, X2, A1, A2), + MutantRunner<R, Tuple2<A1, A2> >* t = + new Mutant<R, T, R (U::*)(X1, X2, A1, A2), Tuple2<P1, P2>, Tuple2<A1, A2> > (obj, method, MakeTuple(p1, p2)); return MutantFunctor<R, Tuple2<A1, A2> >(t); } +template <typename R, typename P1, typename P2, typename A1, typename A2, + typename X1, typename X2> +inline MutantFunctor<R, Tuple2<A1, A2> > +CreateFunctor(R (*function)(X1, X2, A1, A2), const P1& p1, const P2& p2) { + MutantRunner<R, Tuple2<A1, A2> >* t = + new MutantFunction<R, R (*)(X1, X2, A1, A2), + Tuple2<P1, P2>, Tuple2<A1, A2> > + (function, MakeTuple(p1, p2)); + return MutantFunctor<R, Tuple2<A1, A2> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 2 - 2 -template <typename R, typename T, typename P1, typename P2, typename A1, - typename A2, typename X1, typename X2> +template <typename R, typename T, typename U, typename P1, typename P2, + typename A1, typename A2, typename X1, typename X2> inline MutantFunctor<R, Tuple2<A1, A2> > -CreateFunctor(T** obj, R (T::*method)(X1, X2, A1, A2), const P1& p1, +CreateFunctor(T** obj, R (U::*method)(X1, X2, A1, A2), const P1& p1, const P2& p2) { - MutantRunner<R, Tuple2<A1, A2> > *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, X2, A1, A2), + MutantRunner<R, Tuple2<A1, A2> >* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, X2, A1, A2), Tuple2<P1, P2>, Tuple2<A1, A2> > (obj, method, MakeTuple(p1, p2)); return MutantFunctor<R, Tuple2<A1, A2> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING + +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename P2, + typename A1, typename A2, typename X1, typename X2> +inline MutantFunctor<R, Tuple2<A1, A2> > +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, A1, A2), const P1& p1, + const P2& p2) { + MutantRunner<R, Tuple2<A1, A2> >* t = + new Mutant<R, T, R (__stdcall U::*)(X1, X2, A1, A2), + Tuple2<P1, P2>, Tuple2<A1, A2> > + (obj, method, MakeTuple(p1, p2)); + return MutantFunctor<R, Tuple2<A1, A2> >(t); +} +#endif // OS_WIN // 2 - 3 -template <typename R, typename T, typename P1, typename P2, typename A1, - typename A2, typename A3, typename X1, typename X2> +template <typename R, typename T, typename U, typename P1, typename P2, + typename A1, typename A2, typename A3, typename X1, typename X2> inline MutantFunctor<R, Tuple3<A1, A2, A3> > -CreateFunctor(T* obj, R (T::*method)(X1, X2, A1, A2, A3), const P1& p1, +CreateFunctor(T* obj, R (U::*method)(X1, X2, A1, A2, A3), const P1& p1, const P2& p2) { - MutantRunner<R, Tuple3<A1, A2, A3> > *t = - new Mutant<R, T, R (T::*)(X1, X2, A1, A2, A3), + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new Mutant<R, T, R (U::*)(X1, X2, A1, A2, A3), Tuple2<P1, P2>, Tuple3<A1, A2, A3> > (obj, method, MakeTuple(p1, p2)); return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); } +template <typename R, typename P1, typename P2, typename A1, typename A2, + typename A3, typename X1, typename X2> +inline MutantFunctor<R, Tuple3<A1, A2, A3> > +CreateFunctor(R (*function)(X1, X2, A1, A2, A3), const P1& p1, const P2& p2) { + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new MutantFunction<R, R (*)(X1, X2, A1, A2, A3), + Tuple2<P1, P2>, Tuple3<A1, A2, A3> > + (function, MakeTuple(p1, p2)); + return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 2 - 3 -template <typename R, typename T, typename P1, typename P2, typename A1, - typename A2, typename A3, typename X1, typename X2> +template <typename R, typename T, typename U, typename P1, typename P2, + typename A1, typename A2, typename A3, typename X1, typename X2> inline MutantFunctor<R, Tuple3<A1, A2, A3> > -CreateFunctor(T** obj, R (T::*method)(X1, X2, A1, A2, A3), const P1& p1, +CreateFunctor(T** obj, R (U::*method)(X1, X2, A1, A2, A3), const P1& p1, const P2& p2) { - MutantRunner<R, Tuple3<A1, A2, A3> > *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, X2, A1, A2, A3), + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, X2, A1, A2, A3), Tuple2<P1, P2>, Tuple3<A1, A2, A3> > (obj, method, MakeTuple(p1, p2)); return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING + +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename P2, + typename A1, typename A2, typename A3, typename X1, typename X2> +inline MutantFunctor<R, Tuple3<A1, A2, A3> > +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, A1, A2, A3), + const P1& p1, const P2& p2) { + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new Mutant<R, T, R (__stdcall U::*)(X1, X2, A1, A2, A3), + Tuple2<P1, P2>, Tuple3<A1, A2, A3> > + (obj, method, MakeTuple(p1, p2)); + return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); +} +#endif // OS_WIN // 2 - 4 -template <typename R, typename T, typename P1, typename P2, typename A1, - typename A2, typename A3, typename A4, typename X1, typename X2> +template <typename R, typename T, typename U, typename P1, typename P2, + typename A1, typename A2, typename A3, typename A4, typename X1, + typename X2> inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > -CreateFunctor(T* obj, R (T::*method)(X1, X2, A1, A2, A3, A4), const P1& p1, +CreateFunctor(T* obj, R (U::*method)(X1, X2, A1, A2, A3, A4), const P1& p1, const P2& p2) { - MutantRunner<R, Tuple4<A1, A2, A3, A4> > *t = - new Mutant<R, T, R (T::*)(X1, X2, A1, A2, A3, A4), + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new Mutant<R, T, R (U::*)(X1, X2, A1, A2, A3, A4), Tuple2<P1, P2>, Tuple4<A1, A2, A3, A4> > (obj, method, MakeTuple(p1, p2)); return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); } +template <typename R, typename P1, typename P2, typename A1, typename A2, + typename A3, typename A4, typename X1, typename X2> +inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > +CreateFunctor(R (*function)(X1, X2, A1, A2, A3, A4), const P1& p1, + const P2& p2) { + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new MutantFunction<R, R (*)(X1, X2, A1, A2, A3, A4), + Tuple2<P1, P2>, Tuple4<A1, A2, A3, A4> > + (function, MakeTuple(p1, p2)); + return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 2 - 4 -template <typename R, typename T, typename P1, typename P2, typename A1, - typename A2, typename A3, typename A4, typename X1, typename X2> +template <typename R, typename T, typename U, typename P1, typename P2, + typename A1, typename A2, typename A3, typename A4, typename X1, + typename X2> inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > -CreateFunctor(T** obj, R (T::*method)(X1, X2, A1, A2, A3, A4), const P1& p1, +CreateFunctor(T** obj, R (U::*method)(X1, X2, A1, A2, A3, A4), const P1& p1, const P2& p2) { - MutantRunner<R, Tuple4<A1, A2, A3, A4> > *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, X2, A1, A2, A3, A4), + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, X2, A1, A2, A3, A4), Tuple2<P1, P2>, Tuple4<A1, A2, A3, A4> > (obj, method, MakeTuple(p1, p2)); return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING + +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename P2, + typename A1, typename A2, typename A3, typename A4, typename X1, + typename X2> +inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, A1, A2, A3, A4), + const P1& p1, const P2& p2) { + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new Mutant<R, T, R (__stdcall U::*)(X1, X2, A1, A2, A3, A4), + Tuple2<P1, P2>, Tuple4<A1, A2, A3, A4> > + (obj, method, MakeTuple(p1, p2)); + return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); +} +#endif // OS_WIN // 3 - 0 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename X1, typename X2, typename X3> +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename X1, typename X2, typename X3> inline MutantFunctor<R, Tuple0> -CreateFunctor(T* obj, R (T::*method)(X1, X2, X3), const P1& p1, const P2& p2, +CreateFunctor(T* obj, R (U::*method)(X1, X2, X3), const P1& p1, const P2& p2, const P3& p3) { - MutantRunner<R, Tuple0> *t = - new Mutant<R, T, R (T::*)(X1, X2, X3), + MutantRunner<R, Tuple0>* t = + new Mutant<R, T, R (U::*)(X1, X2, X3), Tuple3<P1, P2, P3>, Tuple0> (obj, method, MakeTuple(p1, p2, p3)); return MutantFunctor<R, Tuple0>(t); } +template <typename R, typename P1, typename P2, typename P3, typename X1, + typename X2, typename X3> +inline MutantFunctor<R, Tuple0> +CreateFunctor(R (*function)(X1, X2, X3), const P1& p1, const P2& p2, + const P3& p3) { + MutantRunner<R, Tuple0>* t = + new MutantFunction<R, R (*)(X1, X2, X3), + Tuple3<P1, P2, P3>, Tuple0> + (function, MakeTuple(p1, p2, p3)); + return MutantFunctor<R, Tuple0>(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 3 - 0 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename X1, typename X2, typename X3> +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename X1, typename X2, typename X3> inline MutantFunctor<R, Tuple0> -CreateFunctor(T** obj, R (T::*method)(X1, X2, X3), const P1& p1, const P2& p2, +CreateFunctor(T** obj, R (U::*method)(X1, X2, X3), const P1& p1, const P2& p2, const P3& p3) { - MutantRunner<R, Tuple0> *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, X2, X3), + MutantRunner<R, Tuple0>* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3), Tuple3<P1, P2, P3>, Tuple0> (obj, method, MakeTuple(p1, p2, p3)); return MutantFunctor<R, Tuple0>(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING + +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename X1, typename X2, typename X3> +inline MutantFunctor<R, Tuple0> +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3), const P1& p1, + const P2& p2, const P3& p3) { + MutantRunner<R, Tuple0>* t = + new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3), + Tuple3<P1, P2, P3>, Tuple0> + (obj, method, MakeTuple(p1, p2, p3)); + return MutantFunctor<R, Tuple0>(t); +} +#endif // OS_WIN // 3 - 1 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename A1, typename X1, typename X2, typename X3> +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename A1, typename X1, typename X2, typename X3> inline MutantFunctor<R, Tuple1<A1> > -CreateFunctor(T* obj, R (T::*method)(X1, X2, X3, A1), const P1& p1, +CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, A1), const P1& p1, const P2& p2, const P3& p3) { - MutantRunner<R, Tuple1<A1> > *t = - new Mutant<R, T, R (T::*)(X1, X2, X3, A1), + MutantRunner<R, Tuple1<A1> >* t = + new Mutant<R, T, R (U::*)(X1, X2, X3, A1), Tuple3<P1, P2, P3>, Tuple1<A1> > (obj, method, MakeTuple(p1, p2, p3)); return MutantFunctor<R, Tuple1<A1> >(t); } +template <typename R, typename P1, typename P2, typename P3, typename A1, + typename X1, typename X2, typename X3> +inline MutantFunctor<R, Tuple1<A1> > +CreateFunctor(R (*function)(X1, X2, X3, A1), const P1& p1, const P2& p2, + const P3& p3) { + MutantRunner<R, Tuple1<A1> >* t = + new MutantFunction<R, R (*)(X1, X2, X3, A1), + Tuple3<P1, P2, P3>, Tuple1<A1> > + (function, MakeTuple(p1, p2, p3)); + return MutantFunctor<R, Tuple1<A1> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 3 - 1 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename A1, typename X1, typename X2, typename X3> +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename A1, typename X1, typename X2, typename X3> inline MutantFunctor<R, Tuple1<A1> > -CreateFunctor(T** obj, R (T::*method)(X1, X2, X3, A1), const P1& p1, +CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, A1), const P1& p1, const P2& p2, const P3& p3) { - MutantRunner<R, Tuple1<A1> > *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, X2, X3, A1), + MutantRunner<R, Tuple1<A1> >* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, A1), Tuple3<P1, P2, P3>, Tuple1<A1> > (obj, method, MakeTuple(p1, p2, p3)); return MutantFunctor<R, Tuple1<A1> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING + +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename A1, typename X1, typename X2, typename X3> +inline MutantFunctor<R, Tuple1<A1> > +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, A1), const P1& p1, + const P2& p2, const P3& p3) { + MutantRunner<R, Tuple1<A1> >* t = + new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, A1), + Tuple3<P1, P2, P3>, Tuple1<A1> > + (obj, method, MakeTuple(p1, p2, p3)); + return MutantFunctor<R, Tuple1<A1> >(t); +} +#endif // OS_WIN // 3 - 2 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename A1, typename A2, typename X1, typename X2, typename X3> +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename A1, typename A2, typename X1, typename X2, + typename X3> inline MutantFunctor<R, Tuple2<A1, A2> > -CreateFunctor(T* obj, R (T::*method)(X1, X2, X3, A1, A2), const P1& p1, +CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, A1, A2), const P1& p1, const P2& p2, const P3& p3) { - MutantRunner<R, Tuple2<A1, A2> > *t = - new Mutant<R, T, R (T::*)(X1, X2, X3, A1, A2), + MutantRunner<R, Tuple2<A1, A2> >* t = + new Mutant<R, T, R (U::*)(X1, X2, X3, A1, A2), Tuple3<P1, P2, P3>, Tuple2<A1, A2> > (obj, method, MakeTuple(p1, p2, p3)); return MutantFunctor<R, Tuple2<A1, A2> >(t); } +template <typename R, typename P1, typename P2, typename P3, typename A1, + typename A2, typename X1, typename X2, typename X3> +inline MutantFunctor<R, Tuple2<A1, A2> > +CreateFunctor(R (*function)(X1, X2, X3, A1, A2), const P1& p1, const P2& p2, + const P3& p3) { + MutantRunner<R, Tuple2<A1, A2> >* t = + new MutantFunction<R, R (*)(X1, X2, X3, A1, A2), + Tuple3<P1, P2, P3>, Tuple2<A1, A2> > + (function, MakeTuple(p1, p2, p3)); + return MutantFunctor<R, Tuple2<A1, A2> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 3 - 2 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename A1, typename A2, typename X1, typename X2, typename X3> +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename A1, typename A2, typename X1, typename X2, + typename X3> inline MutantFunctor<R, Tuple2<A1, A2> > -CreateFunctor(T** obj, R (T::*method)(X1, X2, X3, A1, A2), const P1& p1, +CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, A1, A2), const P1& p1, const P2& p2, const P3& p3) { - MutantRunner<R, Tuple2<A1, A2> > *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, X2, X3, A1, A2), + MutantRunner<R, Tuple2<A1, A2> >* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, A1, A2), Tuple3<P1, P2, P3>, Tuple2<A1, A2> > (obj, method, MakeTuple(p1, p2, p3)); return MutantFunctor<R, Tuple2<A1, A2> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 3 - 3 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename A1, typename A2, typename A3, typename X1, typename X2, +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename A1, typename A2, typename X1, typename X2, typename X3> +inline MutantFunctor<R, Tuple2<A1, A2> > +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2), + const P1& p1, const P2& p2, const P3& p3) { + MutantRunner<R, Tuple2<A1, A2> >* t = + new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2), + Tuple3<P1, P2, P3>, Tuple2<A1, A2> > + (obj, method, MakeTuple(p1, p2, p3)); + return MutantFunctor<R, Tuple2<A1, A2> >(t); +} +#endif // OS_WIN + +// 3 - 3 +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename A1, typename A2, typename A3, typename X1, + typename X2, typename X3> inline MutantFunctor<R, Tuple3<A1, A2, A3> > -CreateFunctor(T* obj, R (T::*method)(X1, X2, X3, A1, A2, A3), const P1& p1, +CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, A1, A2, A3), const P1& p1, const P2& p2, const P3& p3) { - MutantRunner<R, Tuple3<A1, A2, A3> > *t = - new Mutant<R, T, R (T::*)(X1, X2, X3, A1, A2, A3), + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new Mutant<R, T, R (U::*)(X1, X2, X3, A1, A2, A3), Tuple3<P1, P2, P3>, Tuple3<A1, A2, A3> > (obj, method, MakeTuple(p1, p2, p3)); return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); } +template <typename R, typename P1, typename P2, typename P3, typename A1, + typename A2, typename A3, typename X1, typename X2, typename X3> +inline MutantFunctor<R, Tuple3<A1, A2, A3> > +CreateFunctor(R (*function)(X1, X2, X3, A1, A2, A3), const P1& p1, const P2& p2, + const P3& p3) { + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new MutantFunction<R, R (*)(X1, X2, X3, A1, A2, A3), + Tuple3<P1, P2, P3>, Tuple3<A1, A2, A3> > + (function, MakeTuple(p1, p2, p3)); + return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 3 - 3 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename A1, typename A2, typename A3, typename X1, typename X2, - typename X3> +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename A1, typename A2, typename A3, typename X1, + typename X2, typename X3> inline MutantFunctor<R, Tuple3<A1, A2, A3> > -CreateFunctor(T** obj, R (T::*method)(X1, X2, X3, A1, A2, A3), const P1& p1, +CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, A1, A2, A3), const P1& p1, const P2& p2, const P3& p3) { - MutantRunner<R, Tuple3<A1, A2, A3> > *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, X2, X3, A1, A2, A3), + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, A1, A2, A3), Tuple3<P1, P2, P3>, Tuple3<A1, A2, A3> > (obj, method, MakeTuple(p1, p2, p3)); return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 3 - 4 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename A1, typename A2, typename A3, typename A4, typename X1, +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename A1, typename A2, typename A3, typename X1, typename X2, typename X3> +inline MutantFunctor<R, Tuple3<A1, A2, A3> > +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2, A3), + const P1& p1, const P2& p2, const P3& p3) { + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2, A3), + Tuple3<P1, P2, P3>, Tuple3<A1, A2, A3> > + (obj, method, MakeTuple(p1, p2, p3)); + return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); +} +#endif // OS_WIN + +// 3 - 4 +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename A1, typename A2, typename A3, typename A4, + typename X1, typename X2, typename X3> inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > -CreateFunctor(T* obj, R (T::*method)(X1, X2, X3, A1, A2, A3, A4), const P1& p1, +CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, A1, A2, A3, A4), const P1& p1, const P2& p2, const P3& p3) { - MutantRunner<R, Tuple4<A1, A2, A3, A4> > *t = - new Mutant<R, T, R (T::*)(X1, X2, X3, A1, A2, A3, A4), + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new Mutant<R, T, R (U::*)(X1, X2, X3, A1, A2, A3, A4), Tuple3<P1, P2, P3>, Tuple4<A1, A2, A3, A4> > (obj, method, MakeTuple(p1, p2, p3)); return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); } +template <typename R, typename P1, typename P2, typename P3, typename A1, + typename A2, typename A3, typename A4, typename X1, typename X2, + typename X3> +inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > +CreateFunctor(R (*function)(X1, X2, X3, A1, A2, A3, A4), const P1& p1, + const P2& p2, const P3& p3) { + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new MutantFunction<R, R (*)(X1, X2, X3, A1, A2, A3, A4), + Tuple3<P1, P2, P3>, Tuple4<A1, A2, A3, A4> > + (function, MakeTuple(p1, p2, p3)); + return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 3 - 4 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename A1, typename A2, typename A3, typename A4, typename X1, - typename X2, typename X3> +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename A1, typename A2, typename A3, typename A4, + typename X1, typename X2, typename X3> inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > -CreateFunctor(T** obj, R (T::*method)(X1, X2, X3, A1, A2, A3, A4), const P1& p1, +CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, A1, A2, A3, A4), const P1& p1, const P2& p2, const P3& p3) { - MutantRunner<R, Tuple4<A1, A2, A3, A4> > *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, X2, X3, A1, A2, A3, A4), + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, A1, A2, A3, A4), Tuple3<P1, P2, P3>, Tuple4<A1, A2, A3, A4> > (obj, method, MakeTuple(p1, p2, p3)); return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING + +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename A1, typename A2, typename A3, typename A4, + typename X1, typename X2, typename X3> +inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, A1, A2, A3, A4), + const P1& p1, const P2& p2, const P3& p3) { + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, A1, A2, A3, A4), + Tuple3<P1, P2, P3>, Tuple4<A1, A2, A3, A4> > + (obj, method, MakeTuple(p1, p2, p3)); + return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); +} +#endif // OS_WIN // 4 - 0 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename P4, typename X1, typename X2, typename X3, typename X4> +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename P4, typename X1, typename X2, typename X3, + typename X4> inline MutantFunctor<R, Tuple0> -CreateFunctor(T* obj, R (T::*method)(X1, X2, X3, X4), const P1& p1, +CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4), const P1& p1, const P2& p2, const P3& p3, const P4& p4) { - MutantRunner<R, Tuple0> *t = - new Mutant<R, T, R (T::*)(X1, X2, X3, X4), + MutantRunner<R, Tuple0>* t = + new Mutant<R, T, R (U::*)(X1, X2, X3, X4), Tuple4<P1, P2, P3, P4>, Tuple0> (obj, method, MakeTuple(p1, p2, p3, p4)); return MutantFunctor<R, Tuple0>(t); } +template <typename R, typename P1, typename P2, typename P3, typename P4, + typename X1, typename X2, typename X3, typename X4> +inline MutantFunctor<R, Tuple0> +CreateFunctor(R (*function)(X1, X2, X3, X4), const P1& p1, const P2& p2, + const P3& p3, const P4& p4) { + MutantRunner<R, Tuple0>* t = + new MutantFunction<R, R (*)(X1, X2, X3, X4), + Tuple4<P1, P2, P3, P4>, Tuple0> + (function, MakeTuple(p1, p2, p3, p4)); + return MutantFunctor<R, Tuple0>(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 4 - 0 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename P4, typename X1, typename X2, typename X3, typename X4> +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename P4, typename X1, typename X2, typename X3, + typename X4> inline MutantFunctor<R, Tuple0> -CreateFunctor(T** obj, R (T::*method)(X1, X2, X3, X4), const P1& p1, +CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4), const P1& p1, const P2& p2, const P3& p3, const P4& p4) { - MutantRunner<R, Tuple0> *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, X2, X3, X4), + MutantRunner<R, Tuple0>* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4), Tuple4<P1, P2, P3, P4>, Tuple0> (obj, method, MakeTuple(p1, p2, p3, p4)); return MutantFunctor<R, Tuple0>(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 4 - 1 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename P4, typename A1, typename X1, typename X2, typename X3, +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename P4, typename X1, typename X2, typename X3, typename X4> +inline MutantFunctor<R, Tuple0> +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4), const P1& p1, + const P2& p2, const P3& p3, const P4& p4) { + MutantRunner<R, Tuple0>* t = + new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4), + Tuple4<P1, P2, P3, P4>, Tuple0> + (obj, method, MakeTuple(p1, p2, p3, p4)); + return MutantFunctor<R, Tuple0>(t); +} +#endif // OS_WIN + +// 4 - 1 +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename P4, typename A1, typename X1, typename X2, + typename X3, typename X4> inline MutantFunctor<R, Tuple1<A1> > -CreateFunctor(T* obj, R (T::*method)(X1, X2, X3, X4, A1), const P1& p1, +CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, A1), const P1& p1, const P2& p2, const P3& p3, const P4& p4) { - MutantRunner<R, Tuple1<A1> > *t = - new Mutant<R, T, R (T::*)(X1, X2, X3, X4, A1), + MutantRunner<R, Tuple1<A1> >* t = + new Mutant<R, T, R (U::*)(X1, X2, X3, X4, A1), Tuple4<P1, P2, P3, P4>, Tuple1<A1> > (obj, method, MakeTuple(p1, p2, p3, p4)); return MutantFunctor<R, Tuple1<A1> >(t); } +template <typename R, typename P1, typename P2, typename P3, typename P4, + typename A1, typename X1, typename X2, typename X3, typename X4> +inline MutantFunctor<R, Tuple1<A1> > +CreateFunctor(R (*function)(X1, X2, X3, X4, A1), const P1& p1, const P2& p2, + const P3& p3, const P4& p4) { + MutantRunner<R, Tuple1<A1> >* t = + new MutantFunction<R, R (*)(X1, X2, X3, X4, A1), + Tuple4<P1, P2, P3, P4>, Tuple1<A1> > + (function, MakeTuple(p1, p2, p3, p4)); + return MutantFunctor<R, Tuple1<A1> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 4 - 1 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename P4, typename A1, typename X1, typename X2, typename X3, - typename X4> +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename P4, typename A1, typename X1, typename X2, + typename X3, typename X4> inline MutantFunctor<R, Tuple1<A1> > -CreateFunctor(T** obj, R (T::*method)(X1, X2, X3, X4, A1), const P1& p1, +CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, A1), const P1& p1, const P2& p2, const P3& p3, const P4& p4) { - MutantRunner<R, Tuple1<A1> > *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, X2, X3, X4, A1), + MutantRunner<R, Tuple1<A1> >* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, A1), Tuple4<P1, P2, P3, P4>, Tuple1<A1> > (obj, method, MakeTuple(p1, p2, p3, p4)); return MutantFunctor<R, Tuple1<A1> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 4 - 2 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename P4, typename A1, typename A2, typename X1, typename X2, +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename P4, typename A1, typename X1, typename X2, typename X3, typename X4> +inline MutantFunctor<R, Tuple1<A1> > +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1), + const P1& p1, const P2& p2, const P3& p3, const P4& p4) { + MutantRunner<R, Tuple1<A1> >* t = + new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1), + Tuple4<P1, P2, P3, P4>, Tuple1<A1> > + (obj, method, MakeTuple(p1, p2, p3, p4)); + return MutantFunctor<R, Tuple1<A1> >(t); +} +#endif // OS_WIN + +// 4 - 2 +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename P4, typename A1, typename A2, typename X1, + typename X2, typename X3, typename X4> inline MutantFunctor<R, Tuple2<A1, A2> > -CreateFunctor(T* obj, R (T::*method)(X1, X2, X3, X4, A1, A2), const P1& p1, +CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, A1, A2), const P1& p1, const P2& p2, const P3& p3, const P4& p4) { - MutantRunner<R, Tuple2<A1, A2> > *t = - new Mutant<R, T, R (T::*)(X1, X2, X3, X4, A1, A2), + MutantRunner<R, Tuple2<A1, A2> >* t = + new Mutant<R, T, R (U::*)(X1, X2, X3, X4, A1, A2), Tuple4<P1, P2, P3, P4>, Tuple2<A1, A2> > (obj, method, MakeTuple(p1, p2, p3, p4)); return MutantFunctor<R, Tuple2<A1, A2> >(t); } +template <typename R, typename P1, typename P2, typename P3, typename P4, + typename A1, typename A2, typename X1, typename X2, typename X3, + typename X4> +inline MutantFunctor<R, Tuple2<A1, A2> > +CreateFunctor(R (*function)(X1, X2, X3, X4, A1, A2), const P1& p1, const P2& p2, + const P3& p3, const P4& p4) { + MutantRunner<R, Tuple2<A1, A2> >* t = + new MutantFunction<R, R (*)(X1, X2, X3, X4, A1, A2), + Tuple4<P1, P2, P3, P4>, Tuple2<A1, A2> > + (function, MakeTuple(p1, p2, p3, p4)); + return MutantFunctor<R, Tuple2<A1, A2> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 4 - 2 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename P4, typename A1, typename A2, typename X1, typename X2, - typename X3, typename X4> +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename P4, typename A1, typename A2, typename X1, + typename X2, typename X3, typename X4> inline MutantFunctor<R, Tuple2<A1, A2> > -CreateFunctor(T** obj, R (T::*method)(X1, X2, X3, X4, A1, A2), const P1& p1, +CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, A1, A2), const P1& p1, const P2& p2, const P3& p3, const P4& p4) { - MutantRunner<R, Tuple2<A1, A2> > *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, X2, X3, X4, A1, A2), + MutantRunner<R, Tuple2<A1, A2> >* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, A1, A2), Tuple4<P1, P2, P3, P4>, Tuple2<A1, A2> > (obj, method, MakeTuple(p1, p2, p3, p4)); return MutantFunctor<R, Tuple2<A1, A2> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 4 - 3 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename P4, typename A1, typename A2, typename A3, typename X1, +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename P4, typename A1, typename A2, typename X1, typename X2, typename X3, typename X4> +inline MutantFunctor<R, Tuple2<A1, A2> > +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2), + const P1& p1, const P2& p2, const P3& p3, const P4& p4) { + MutantRunner<R, Tuple2<A1, A2> >* t = + new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2), + Tuple4<P1, P2, P3, P4>, Tuple2<A1, A2> > + (obj, method, MakeTuple(p1, p2, p3, p4)); + return MutantFunctor<R, Tuple2<A1, A2> >(t); +} +#endif // OS_WIN + +// 4 - 3 +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename P4, typename A1, typename A2, typename A3, + typename X1, typename X2, typename X3, typename X4> inline MutantFunctor<R, Tuple3<A1, A2, A3> > -CreateFunctor(T* obj, R (T::*method)(X1, X2, X3, X4, A1, A2, A3), const P1& p1, +CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3), const P1& p1, const P2& p2, const P3& p3, const P4& p4) { - MutantRunner<R, Tuple3<A1, A2, A3> > *t = - new Mutant<R, T, R (T::*)(X1, X2, X3, X4, A1, A2, A3), + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new Mutant<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3), Tuple4<P1, P2, P3, P4>, Tuple3<A1, A2, A3> > (obj, method, MakeTuple(p1, p2, p3, p4)); return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); } +template <typename R, typename P1, typename P2, typename P3, typename P4, + typename A1, typename A2, typename A3, typename X1, typename X2, + typename X3, typename X4> +inline MutantFunctor<R, Tuple3<A1, A2, A3> > +CreateFunctor(R (*function)(X1, X2, X3, X4, A1, A2, A3), const P1& p1, + const P2& p2, const P3& p3, const P4& p4) { + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new MutantFunction<R, R (*)(X1, X2, X3, X4, A1, A2, A3), + Tuple4<P1, P2, P3, P4>, Tuple3<A1, A2, A3> > + (function, MakeTuple(p1, p2, p3, p4)); + return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 4 - 3 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename P4, typename A1, typename A2, typename A3, typename X1, - typename X2, typename X3, typename X4> +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename P4, typename A1, typename A2, typename A3, + typename X1, typename X2, typename X3, typename X4> inline MutantFunctor<R, Tuple3<A1, A2, A3> > -CreateFunctor(T** obj, R (T::*method)(X1, X2, X3, X4, A1, A2, A3), const P1& p1, +CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3), const P1& p1, const P2& p2, const P3& p3, const P4& p4) { - MutantRunner<R, Tuple3<A1, A2, A3> > *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, X2, X3, X4, A1, A2, A3), + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3), Tuple4<P1, P2, P3, P4>, Tuple3<A1, A2, A3> > (obj, method, MakeTuple(p1, p2, p3, p4)); return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 4 - 4 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename P4, typename A1, typename A2, typename A3, typename A4, +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename P4, typename A1, typename A2, typename A3, typename X1, typename X2, typename X3, typename X4> +inline MutantFunctor<R, Tuple3<A1, A2, A3> > +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2, A3), + const P1& p1, const P2& p2, const P3& p3, const P4& p4) { + MutantRunner<R, Tuple3<A1, A2, A3> >* t = + new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2, A3), + Tuple4<P1, P2, P3, P4>, Tuple3<A1, A2, A3> > + (obj, method, MakeTuple(p1, p2, p3, p4)); + return MutantFunctor<R, Tuple3<A1, A2, A3> >(t); +} +#endif // OS_WIN + +// 4 - 4 +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename P4, typename A1, typename A2, typename A3, + typename A4, typename X1, typename X2, typename X3, typename X4> inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > -CreateFunctor(T* obj, R (T::*method)(X1, X2, X3, X4, A1, A2, A3, A4), +CreateFunctor(T* obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3, A4), const P1& p1, const P2& p2, const P3& p3, const P4& p4) { - MutantRunner<R, Tuple4<A1, A2, A3, A4> > *t = - new Mutant<R, T, R (T::*)(X1, X2, X3, X4, A1, A2, A3, A4), + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new Mutant<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3, A4), Tuple4<P1, P2, P3, P4>, Tuple4<A1, A2, A3, A4> > (obj, method, MakeTuple(p1, p2, p3, p4)); return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); } +template <typename R, typename P1, typename P2, typename P3, typename P4, + typename A1, typename A2, typename A3, typename A4, typename X1, + typename X2, typename X3, typename X4> +inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > +CreateFunctor(R (*function)(X1, X2, X3, X4, A1, A2, A3, A4), const P1& p1, + const P2& p2, const P3& p3, const P4& p4) { + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new MutantFunction<R, R (*)(X1, X2, X3, X4, A1, A2, A3, A4), + Tuple4<P1, P2, P3, P4>, Tuple4<A1, A2, A3, A4> > + (function, MakeTuple(p1, p2, p3, p4)); + return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); +} + #ifdef GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING -// 4 - 4 -template <typename R, typename T, typename P1, typename P2, typename P3, - typename P4, typename A1, typename A2, typename A3, typename A4, - typename X1, typename X2, typename X3, typename X4> +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename P4, typename A1, typename A2, typename A3, + typename A4, typename X1, typename X2, typename X3, typename X4> inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > -CreateFunctor(T** obj, R (T::*method)(X1, X2, X3, X4, A1, A2, A3, A4), +CreateFunctor(T** obj, R (U::*method)(X1, X2, X3, X4, A1, A2, A3, A4), const P1& p1, const P2& p2, const P3& p3, const P4& p4) { - MutantRunner<R, Tuple4<A1, A2, A3, A4> > *t = - new MutantLateObjectBind<R, T, R (T::*)(X1, X2, X3, X4, A1, A2, A3, A4), + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new MutantLateObjectBind<R, T, R (U::*)(X1, X2, X3, X4, A1, A2, A3, A4), Tuple4<P1, P2, P3, P4>, Tuple4<A1, A2, A3, A4> > (obj, method, MakeTuple(p1, p2, p3, p4)); return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); } -#endif +#endif // GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING + +#if defined (OS_WIN) +template <typename R, typename T, typename U, typename P1, typename P2, + typename P3, typename P4, typename A1, typename A2, typename A3, + typename A4, typename X1, typename X2, typename X3, typename X4> +inline MutantFunctor<R, Tuple4<A1, A2, A3, A4> > +CreateFunctor(T* obj, R (__stdcall U::*method)(X1, X2, X3, X4, A1, A2, A3, A4), + const P1& p1, const P2& p2, const P3& p3, const P4& p4) { + MutantRunner<R, Tuple4<A1, A2, A3, A4> >* t = + new Mutant<R, T, R (__stdcall U::*)(X1, X2, X3, X4, A1, A2, A3, A4), + Tuple4<P1, P2, P3, P4>, Tuple4<A1, A2, A3, A4> > + (obj, method, MakeTuple(p1, p2, p3, p4)); + return MutantFunctor<R, Tuple4<A1, A2, A3, A4> >(t); +} +#endif // OS_WIN } // namespace testing |