113481Sgiacomo.travaglini@arm.com// This file was GENERATED by command:
213481Sgiacomo.travaglini@arm.com//     pump.py gmock-generated-function-mockers.h.pump
313481Sgiacomo.travaglini@arm.com// DO NOT EDIT BY HAND!!!
413481Sgiacomo.travaglini@arm.com
513481Sgiacomo.travaglini@arm.com// Copyright 2007, Google Inc.
613481Sgiacomo.travaglini@arm.com// All rights reserved.
713481Sgiacomo.travaglini@arm.com//
813481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
913481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
1013481Sgiacomo.travaglini@arm.com// met:
1113481Sgiacomo.travaglini@arm.com//
1213481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
1313481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1413481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1513481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1613481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1713481Sgiacomo.travaglini@arm.com// distribution.
1813481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1913481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
2013481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
2113481Sgiacomo.travaglini@arm.com//
2213481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2313481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2513481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2613481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2713481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2813481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2913481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3013481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3113481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3213481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3313481Sgiacomo.travaglini@arm.com//
3413481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan)
3513481Sgiacomo.travaglini@arm.com
3613481Sgiacomo.travaglini@arm.com// Google Mock - a framework for writing C++ mock classes.
3713481Sgiacomo.travaglini@arm.com//
3813481Sgiacomo.travaglini@arm.com// This file implements function mockers of various arities.
3913481Sgiacomo.travaglini@arm.com
4013481Sgiacomo.travaglini@arm.com#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_
4113481Sgiacomo.travaglini@arm.com#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_
4213481Sgiacomo.travaglini@arm.com
4313481Sgiacomo.travaglini@arm.com#include "gmock/gmock-spec-builders.h"
4413481Sgiacomo.travaglini@arm.com#include "gmock/internal/gmock-internal-utils.h"
4513481Sgiacomo.travaglini@arm.com
4613481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FUNCTION_
4713481Sgiacomo.travaglini@arm.com# include <functional>
4813481Sgiacomo.travaglini@arm.com#endif
4913481Sgiacomo.travaglini@arm.com
5013481Sgiacomo.travaglini@arm.comnamespace testing {
5113481Sgiacomo.travaglini@arm.comnamespace internal {
5213481Sgiacomo.travaglini@arm.com
5313481Sgiacomo.travaglini@arm.comtemplate <typename F>
5413481Sgiacomo.travaglini@arm.comclass FunctionMockerBase;
5513481Sgiacomo.travaglini@arm.com
5613481Sgiacomo.travaglini@arm.com// Note: class FunctionMocker really belongs to the ::testing
5713481Sgiacomo.travaglini@arm.com// namespace.  However if we define it in ::testing, MSVC will
5813481Sgiacomo.travaglini@arm.com// complain when classes in ::testing::internal declare it as a
5913481Sgiacomo.travaglini@arm.com// friend class template.  To workaround this compiler bug, we define
6013481Sgiacomo.travaglini@arm.com// FunctionMocker in ::testing::internal and import it into ::testing.
6113481Sgiacomo.travaglini@arm.comtemplate <typename F>
6213481Sgiacomo.travaglini@arm.comclass FunctionMocker;
6313481Sgiacomo.travaglini@arm.com
6413481Sgiacomo.travaglini@arm.comtemplate <typename R>
6513481Sgiacomo.travaglini@arm.comclass FunctionMocker<R()> : public
6613481Sgiacomo.travaglini@arm.com    internal::FunctionMockerBase<R()> {
6713481Sgiacomo.travaglini@arm.com public:
6813481Sgiacomo.travaglini@arm.com  typedef R F();
6913481Sgiacomo.travaglini@arm.com  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
7013481Sgiacomo.travaglini@arm.com
7113481Sgiacomo.travaglini@arm.com  MockSpec<F>& With() {
7213481Sgiacomo.travaglini@arm.com    return this->current_spec();
7313481Sgiacomo.travaglini@arm.com  }
7413481Sgiacomo.travaglini@arm.com
7513481Sgiacomo.travaglini@arm.com  R Invoke() {
7613481Sgiacomo.travaglini@arm.com    // Even though gcc and MSVC don't enforce it, 'this->' is required
7713481Sgiacomo.travaglini@arm.com    // by the C++ standard [14.6.4] here, as the base class type is
7813481Sgiacomo.travaglini@arm.com    // dependent on the template argument (and thus shouldn't be
7913481Sgiacomo.travaglini@arm.com    // looked into when resolving InvokeWith).
8013481Sgiacomo.travaglini@arm.com    return this->InvokeWith(ArgumentTuple());
8113481Sgiacomo.travaglini@arm.com  }
8213481Sgiacomo.travaglini@arm.com};
8313481Sgiacomo.travaglini@arm.com
8413481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1>
8513481Sgiacomo.travaglini@arm.comclass FunctionMocker<R(A1)> : public
8613481Sgiacomo.travaglini@arm.com    internal::FunctionMockerBase<R(A1)> {
8713481Sgiacomo.travaglini@arm.com public:
8813481Sgiacomo.travaglini@arm.com  typedef R F(A1);
8913481Sgiacomo.travaglini@arm.com  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
9013481Sgiacomo.travaglini@arm.com
9113481Sgiacomo.travaglini@arm.com  MockSpec<F>& With(const Matcher<A1>& m1) {
9213481Sgiacomo.travaglini@arm.com    this->current_spec().SetMatchers(::testing::make_tuple(m1));
9313481Sgiacomo.travaglini@arm.com    return this->current_spec();
9413481Sgiacomo.travaglini@arm.com  }
9513481Sgiacomo.travaglini@arm.com
9613481Sgiacomo.travaglini@arm.com  R Invoke(A1 a1) {
9713481Sgiacomo.travaglini@arm.com    // Even though gcc and MSVC don't enforce it, 'this->' is required
9813481Sgiacomo.travaglini@arm.com    // by the C++ standard [14.6.4] here, as the base class type is
9913481Sgiacomo.travaglini@arm.com    // dependent on the template argument (and thus shouldn't be
10013481Sgiacomo.travaglini@arm.com    // looked into when resolving InvokeWith).
10113481Sgiacomo.travaglini@arm.com    return this->InvokeWith(ArgumentTuple(a1));
10213481Sgiacomo.travaglini@arm.com  }
10313481Sgiacomo.travaglini@arm.com};
10413481Sgiacomo.travaglini@arm.com
10513481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1, typename A2>
10613481Sgiacomo.travaglini@arm.comclass FunctionMocker<R(A1, A2)> : public
10713481Sgiacomo.travaglini@arm.com    internal::FunctionMockerBase<R(A1, A2)> {
10813481Sgiacomo.travaglini@arm.com public:
10913481Sgiacomo.travaglini@arm.com  typedef R F(A1, A2);
11013481Sgiacomo.travaglini@arm.com  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
11113481Sgiacomo.travaglini@arm.com
11213481Sgiacomo.travaglini@arm.com  MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2) {
11313481Sgiacomo.travaglini@arm.com    this->current_spec().SetMatchers(::testing::make_tuple(m1, m2));
11413481Sgiacomo.travaglini@arm.com    return this->current_spec();
11513481Sgiacomo.travaglini@arm.com  }
11613481Sgiacomo.travaglini@arm.com
11713481Sgiacomo.travaglini@arm.com  R Invoke(A1 a1, A2 a2) {
11813481Sgiacomo.travaglini@arm.com    // Even though gcc and MSVC don't enforce it, 'this->' is required
11913481Sgiacomo.travaglini@arm.com    // by the C++ standard [14.6.4] here, as the base class type is
12013481Sgiacomo.travaglini@arm.com    // dependent on the template argument (and thus shouldn't be
12113481Sgiacomo.travaglini@arm.com    // looked into when resolving InvokeWith).
12213481Sgiacomo.travaglini@arm.com    return this->InvokeWith(ArgumentTuple(a1, a2));
12313481Sgiacomo.travaglini@arm.com  }
12413481Sgiacomo.travaglini@arm.com};
12513481Sgiacomo.travaglini@arm.com
12613481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1, typename A2, typename A3>
12713481Sgiacomo.travaglini@arm.comclass FunctionMocker<R(A1, A2, A3)> : public
12813481Sgiacomo.travaglini@arm.com    internal::FunctionMockerBase<R(A1, A2, A3)> {
12913481Sgiacomo.travaglini@arm.com public:
13013481Sgiacomo.travaglini@arm.com  typedef R F(A1, A2, A3);
13113481Sgiacomo.travaglini@arm.com  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
13213481Sgiacomo.travaglini@arm.com
13313481Sgiacomo.travaglini@arm.com  MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2,
13413481Sgiacomo.travaglini@arm.com      const Matcher<A3>& m3) {
13513481Sgiacomo.travaglini@arm.com    this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3));
13613481Sgiacomo.travaglini@arm.com    return this->current_spec();
13713481Sgiacomo.travaglini@arm.com  }
13813481Sgiacomo.travaglini@arm.com
13913481Sgiacomo.travaglini@arm.com  R Invoke(A1 a1, A2 a2, A3 a3) {
14013481Sgiacomo.travaglini@arm.com    // Even though gcc and MSVC don't enforce it, 'this->' is required
14113481Sgiacomo.travaglini@arm.com    // by the C++ standard [14.6.4] here, as the base class type is
14213481Sgiacomo.travaglini@arm.com    // dependent on the template argument (and thus shouldn't be
14313481Sgiacomo.travaglini@arm.com    // looked into when resolving InvokeWith).
14413481Sgiacomo.travaglini@arm.com    return this->InvokeWith(ArgumentTuple(a1, a2, a3));
14513481Sgiacomo.travaglini@arm.com  }
14613481Sgiacomo.travaglini@arm.com};
14713481Sgiacomo.travaglini@arm.com
14813481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1, typename A2, typename A3, typename A4>
14913481Sgiacomo.travaglini@arm.comclass FunctionMocker<R(A1, A2, A3, A4)> : public
15013481Sgiacomo.travaglini@arm.com    internal::FunctionMockerBase<R(A1, A2, A3, A4)> {
15113481Sgiacomo.travaglini@arm.com public:
15213481Sgiacomo.travaglini@arm.com  typedef R F(A1, A2, A3, A4);
15313481Sgiacomo.travaglini@arm.com  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
15413481Sgiacomo.travaglini@arm.com
15513481Sgiacomo.travaglini@arm.com  MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2,
15613481Sgiacomo.travaglini@arm.com      const Matcher<A3>& m3, const Matcher<A4>& m4) {
15713481Sgiacomo.travaglini@arm.com    this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4));
15813481Sgiacomo.travaglini@arm.com    return this->current_spec();
15913481Sgiacomo.travaglini@arm.com  }
16013481Sgiacomo.travaglini@arm.com
16113481Sgiacomo.travaglini@arm.com  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4) {
16213481Sgiacomo.travaglini@arm.com    // Even though gcc and MSVC don't enforce it, 'this->' is required
16313481Sgiacomo.travaglini@arm.com    // by the C++ standard [14.6.4] here, as the base class type is
16413481Sgiacomo.travaglini@arm.com    // dependent on the template argument (and thus shouldn't be
16513481Sgiacomo.travaglini@arm.com    // looked into when resolving InvokeWith).
16613481Sgiacomo.travaglini@arm.com    return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4));
16713481Sgiacomo.travaglini@arm.com  }
16813481Sgiacomo.travaglini@arm.com};
16913481Sgiacomo.travaglini@arm.com
17013481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1, typename A2, typename A3, typename A4,
17113481Sgiacomo.travaglini@arm.com    typename A5>
17213481Sgiacomo.travaglini@arm.comclass FunctionMocker<R(A1, A2, A3, A4, A5)> : public
17313481Sgiacomo.travaglini@arm.com    internal::FunctionMockerBase<R(A1, A2, A3, A4, A5)> {
17413481Sgiacomo.travaglini@arm.com public:
17513481Sgiacomo.travaglini@arm.com  typedef R F(A1, A2, A3, A4, A5);
17613481Sgiacomo.travaglini@arm.com  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
17713481Sgiacomo.travaglini@arm.com
17813481Sgiacomo.travaglini@arm.com  MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2,
17913481Sgiacomo.travaglini@arm.com      const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5) {
18013481Sgiacomo.travaglini@arm.com    this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4, m5));
18113481Sgiacomo.travaglini@arm.com    return this->current_spec();
18213481Sgiacomo.travaglini@arm.com  }
18313481Sgiacomo.travaglini@arm.com
18413481Sgiacomo.travaglini@arm.com  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
18513481Sgiacomo.travaglini@arm.com    // Even though gcc and MSVC don't enforce it, 'this->' is required
18613481Sgiacomo.travaglini@arm.com    // by the C++ standard [14.6.4] here, as the base class type is
18713481Sgiacomo.travaglini@arm.com    // dependent on the template argument (and thus shouldn't be
18813481Sgiacomo.travaglini@arm.com    // looked into when resolving InvokeWith).
18913481Sgiacomo.travaglini@arm.com    return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5));
19013481Sgiacomo.travaglini@arm.com  }
19113481Sgiacomo.travaglini@arm.com};
19213481Sgiacomo.travaglini@arm.com
19313481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1, typename A2, typename A3, typename A4,
19413481Sgiacomo.travaglini@arm.com    typename A5, typename A6>
19513481Sgiacomo.travaglini@arm.comclass FunctionMocker<R(A1, A2, A3, A4, A5, A6)> : public
19613481Sgiacomo.travaglini@arm.com    internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6)> {
19713481Sgiacomo.travaglini@arm.com public:
19813481Sgiacomo.travaglini@arm.com  typedef R F(A1, A2, A3, A4, A5, A6);
19913481Sgiacomo.travaglini@arm.com  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
20013481Sgiacomo.travaglini@arm.com
20113481Sgiacomo.travaglini@arm.com  MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2,
20213481Sgiacomo.travaglini@arm.com      const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,
20313481Sgiacomo.travaglini@arm.com      const Matcher<A6>& m6) {
20413481Sgiacomo.travaglini@arm.com    this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4, m5,
20513481Sgiacomo.travaglini@arm.com        m6));
20613481Sgiacomo.travaglini@arm.com    return this->current_spec();
20713481Sgiacomo.travaglini@arm.com  }
20813481Sgiacomo.travaglini@arm.com
20913481Sgiacomo.travaglini@arm.com  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
21013481Sgiacomo.travaglini@arm.com    // Even though gcc and MSVC don't enforce it, 'this->' is required
21113481Sgiacomo.travaglini@arm.com    // by the C++ standard [14.6.4] here, as the base class type is
21213481Sgiacomo.travaglini@arm.com    // dependent on the template argument (and thus shouldn't be
21313481Sgiacomo.travaglini@arm.com    // looked into when resolving InvokeWith).
21413481Sgiacomo.travaglini@arm.com    return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6));
21513481Sgiacomo.travaglini@arm.com  }
21613481Sgiacomo.travaglini@arm.com};
21713481Sgiacomo.travaglini@arm.com
21813481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1, typename A2, typename A3, typename A4,
21913481Sgiacomo.travaglini@arm.com    typename A5, typename A6, typename A7>
22013481Sgiacomo.travaglini@arm.comclass FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7)> : public
22113481Sgiacomo.travaglini@arm.com    internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7)> {
22213481Sgiacomo.travaglini@arm.com public:
22313481Sgiacomo.travaglini@arm.com  typedef R F(A1, A2, A3, A4, A5, A6, A7);
22413481Sgiacomo.travaglini@arm.com  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
22513481Sgiacomo.travaglini@arm.com
22613481Sgiacomo.travaglini@arm.com  MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2,
22713481Sgiacomo.travaglini@arm.com      const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,
22813481Sgiacomo.travaglini@arm.com      const Matcher<A6>& m6, const Matcher<A7>& m7) {
22913481Sgiacomo.travaglini@arm.com    this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4, m5,
23013481Sgiacomo.travaglini@arm.com        m6, m7));
23113481Sgiacomo.travaglini@arm.com    return this->current_spec();
23213481Sgiacomo.travaglini@arm.com  }
23313481Sgiacomo.travaglini@arm.com
23413481Sgiacomo.travaglini@arm.com  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) {
23513481Sgiacomo.travaglini@arm.com    // Even though gcc and MSVC don't enforce it, 'this->' is required
23613481Sgiacomo.travaglini@arm.com    // by the C++ standard [14.6.4] here, as the base class type is
23713481Sgiacomo.travaglini@arm.com    // dependent on the template argument (and thus shouldn't be
23813481Sgiacomo.travaglini@arm.com    // looked into when resolving InvokeWith).
23913481Sgiacomo.travaglini@arm.com    return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7));
24013481Sgiacomo.travaglini@arm.com  }
24113481Sgiacomo.travaglini@arm.com};
24213481Sgiacomo.travaglini@arm.com
24313481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1, typename A2, typename A3, typename A4,
24413481Sgiacomo.travaglini@arm.com    typename A5, typename A6, typename A7, typename A8>
24513481Sgiacomo.travaglini@arm.comclass FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8)> : public
24613481Sgiacomo.travaglini@arm.com    internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7, A8)> {
24713481Sgiacomo.travaglini@arm.com public:
24813481Sgiacomo.travaglini@arm.com  typedef R F(A1, A2, A3, A4, A5, A6, A7, A8);
24913481Sgiacomo.travaglini@arm.com  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
25013481Sgiacomo.travaglini@arm.com
25113481Sgiacomo.travaglini@arm.com  MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2,
25213481Sgiacomo.travaglini@arm.com      const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,
25313481Sgiacomo.travaglini@arm.com      const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8) {
25413481Sgiacomo.travaglini@arm.com    this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4, m5,
25513481Sgiacomo.travaglini@arm.com        m6, m7, m8));
25613481Sgiacomo.travaglini@arm.com    return this->current_spec();
25713481Sgiacomo.travaglini@arm.com  }
25813481Sgiacomo.travaglini@arm.com
25913481Sgiacomo.travaglini@arm.com  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) {
26013481Sgiacomo.travaglini@arm.com    // Even though gcc and MSVC don't enforce it, 'this->' is required
26113481Sgiacomo.travaglini@arm.com    // by the C++ standard [14.6.4] here, as the base class type is
26213481Sgiacomo.travaglini@arm.com    // dependent on the template argument (and thus shouldn't be
26313481Sgiacomo.travaglini@arm.com    // looked into when resolving InvokeWith).
26413481Sgiacomo.travaglini@arm.com    return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7, a8));
26513481Sgiacomo.travaglini@arm.com  }
26613481Sgiacomo.travaglini@arm.com};
26713481Sgiacomo.travaglini@arm.com
26813481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1, typename A2, typename A3, typename A4,
26913481Sgiacomo.travaglini@arm.com    typename A5, typename A6, typename A7, typename A8, typename A9>
27013481Sgiacomo.travaglini@arm.comclass FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> : public
27113481Sgiacomo.travaglini@arm.com    internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> {
27213481Sgiacomo.travaglini@arm.com public:
27313481Sgiacomo.travaglini@arm.com  typedef R F(A1, A2, A3, A4, A5, A6, A7, A8, A9);
27413481Sgiacomo.travaglini@arm.com  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
27513481Sgiacomo.travaglini@arm.com
27613481Sgiacomo.travaglini@arm.com  MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2,
27713481Sgiacomo.travaglini@arm.com      const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,
27813481Sgiacomo.travaglini@arm.com      const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8,
27913481Sgiacomo.travaglini@arm.com      const Matcher<A9>& m9) {
28013481Sgiacomo.travaglini@arm.com    this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4, m5,
28113481Sgiacomo.travaglini@arm.com        m6, m7, m8, m9));
28213481Sgiacomo.travaglini@arm.com    return this->current_spec();
28313481Sgiacomo.travaglini@arm.com  }
28413481Sgiacomo.travaglini@arm.com
28513481Sgiacomo.travaglini@arm.com  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) {
28613481Sgiacomo.travaglini@arm.com    // Even though gcc and MSVC don't enforce it, 'this->' is required
28713481Sgiacomo.travaglini@arm.com    // by the C++ standard [14.6.4] here, as the base class type is
28813481Sgiacomo.travaglini@arm.com    // dependent on the template argument (and thus shouldn't be
28913481Sgiacomo.travaglini@arm.com    // looked into when resolving InvokeWith).
29013481Sgiacomo.travaglini@arm.com    return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7, a8, a9));
29113481Sgiacomo.travaglini@arm.com  }
29213481Sgiacomo.travaglini@arm.com};
29313481Sgiacomo.travaglini@arm.com
29413481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1, typename A2, typename A3, typename A4,
29513481Sgiacomo.travaglini@arm.com    typename A5, typename A6, typename A7, typename A8, typename A9,
29613481Sgiacomo.travaglini@arm.com    typename A10>
29713481Sgiacomo.travaglini@arm.comclass FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> : public
29813481Sgiacomo.travaglini@arm.com    internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> {
29913481Sgiacomo.travaglini@arm.com public:
30013481Sgiacomo.travaglini@arm.com  typedef R F(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);
30113481Sgiacomo.travaglini@arm.com  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
30213481Sgiacomo.travaglini@arm.com
30313481Sgiacomo.travaglini@arm.com  MockSpec<F>& With(const Matcher<A1>& m1, const Matcher<A2>& m2,
30413481Sgiacomo.travaglini@arm.com      const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,
30513481Sgiacomo.travaglini@arm.com      const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8,
30613481Sgiacomo.travaglini@arm.com      const Matcher<A9>& m9, const Matcher<A10>& m10) {
30713481Sgiacomo.travaglini@arm.com    this->current_spec().SetMatchers(::testing::make_tuple(m1, m2, m3, m4, m5,
30813481Sgiacomo.travaglini@arm.com        m6, m7, m8, m9, m10));
30913481Sgiacomo.travaglini@arm.com    return this->current_spec();
31013481Sgiacomo.travaglini@arm.com  }
31113481Sgiacomo.travaglini@arm.com
31213481Sgiacomo.travaglini@arm.com  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9,
31313481Sgiacomo.travaglini@arm.com      A10 a10) {
31413481Sgiacomo.travaglini@arm.com    // Even though gcc and MSVC don't enforce it, 'this->' is required
31513481Sgiacomo.travaglini@arm.com    // by the C++ standard [14.6.4] here, as the base class type is
31613481Sgiacomo.travaglini@arm.com    // dependent on the template argument (and thus shouldn't be
31713481Sgiacomo.travaglini@arm.com    // looked into when resolving InvokeWith).
31813481Sgiacomo.travaglini@arm.com    return this->InvokeWith(ArgumentTuple(a1, a2, a3, a4, a5, a6, a7, a8, a9,
31913481Sgiacomo.travaglini@arm.com        a10));
32013481Sgiacomo.travaglini@arm.com  }
32113481Sgiacomo.travaglini@arm.com};
32213481Sgiacomo.travaglini@arm.com
32313481Sgiacomo.travaglini@arm.com}  // namespace internal
32413481Sgiacomo.travaglini@arm.com
32513481Sgiacomo.travaglini@arm.com// The style guide prohibits "using" statements in a namespace scope
32613481Sgiacomo.travaglini@arm.com// inside a header file.  However, the FunctionMocker class template
32713481Sgiacomo.travaglini@arm.com// is meant to be defined in the ::testing namespace.  The following
32813481Sgiacomo.travaglini@arm.com// line is just a trick for working around a bug in MSVC 8.0, which
32913481Sgiacomo.travaglini@arm.com// cannot handle it if we define FunctionMocker in ::testing.
33013481Sgiacomo.travaglini@arm.comusing internal::FunctionMocker;
33113481Sgiacomo.travaglini@arm.com
33213481Sgiacomo.travaglini@arm.com// GMOCK_RESULT_(tn, F) expands to the result type of function type F.
33313481Sgiacomo.travaglini@arm.com// We define this as a variadic macro in case F contains unprotected
33413481Sgiacomo.travaglini@arm.com// commas (the same reason that we use variadic macros in other places
33513481Sgiacomo.travaglini@arm.com// in this file).
33613481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
33713481Sgiacomo.travaglini@arm.com#define GMOCK_RESULT_(tn, ...) \
33813481Sgiacomo.travaglini@arm.com    tn ::testing::internal::Function<__VA_ARGS__>::Result
33913481Sgiacomo.travaglini@arm.com
34013481Sgiacomo.travaglini@arm.com// The type of argument N of the given function type.
34113481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
34213481Sgiacomo.travaglini@arm.com#define GMOCK_ARG_(tn, N, ...) \
34313481Sgiacomo.travaglini@arm.com    tn ::testing::internal::Function<__VA_ARGS__>::Argument##N
34413481Sgiacomo.travaglini@arm.com
34513481Sgiacomo.travaglini@arm.com// The matcher type for argument N of the given function type.
34613481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
34713481Sgiacomo.travaglini@arm.com#define GMOCK_MATCHER_(tn, N, ...) \
34813481Sgiacomo.travaglini@arm.com    const ::testing::Matcher<GMOCK_ARG_(tn, N, __VA_ARGS__)>&
34913481Sgiacomo.travaglini@arm.com
35013481Sgiacomo.travaglini@arm.com// The variable for mocking the given method.
35113481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
35213481Sgiacomo.travaglini@arm.com#define GMOCK_MOCKER_(arity, constness, Method) \
35313481Sgiacomo.travaglini@arm.com    GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__)
35413481Sgiacomo.travaglini@arm.com
35513481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
35613481Sgiacomo.travaglini@arm.com#define GMOCK_METHOD0_(tn, constness, ct, Method, ...) \
35713481Sgiacomo.travaglini@arm.com  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
35813481Sgiacomo.travaglini@arm.com      ) constness { \
35913481Sgiacomo.travaglini@arm.com    GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \
36013481Sgiacomo.travaglini@arm.com        tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
36113481Sgiacomo.travaglini@arm.com            == 0), \
36213481Sgiacomo.travaglini@arm.com        this_method_does_not_take_0_arguments); \
36313481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(0, constness, Method).SetOwnerAndName(this, #Method); \
36413481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(0, constness, Method).Invoke(); \
36513481Sgiacomo.travaglini@arm.com  } \
36613481Sgiacomo.travaglini@arm.com  ::testing::MockSpec<__VA_ARGS__>& \
36713481Sgiacomo.travaglini@arm.com      gmock_##Method() constness { \
36813481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(0, constness, Method).RegisterOwner(this); \
36913481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(0, constness, Method).With(); \
37013481Sgiacomo.travaglini@arm.com  } \
37113481Sgiacomo.travaglini@arm.com  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(0, constness, \
37213481Sgiacomo.travaglini@arm.com      Method)
37313481Sgiacomo.travaglini@arm.com
37413481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
37513481Sgiacomo.travaglini@arm.com#define GMOCK_METHOD1_(tn, constness, ct, Method, ...) \
37613481Sgiacomo.travaglini@arm.com  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
37713481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1) constness { \
37813481Sgiacomo.travaglini@arm.com    GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \
37913481Sgiacomo.travaglini@arm.com        tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
38013481Sgiacomo.travaglini@arm.com            == 1), \
38113481Sgiacomo.travaglini@arm.com        this_method_does_not_take_1_argument); \
38213481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(1, constness, Method).SetOwnerAndName(this, #Method); \
38313481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(1, constness, Method).Invoke(gmock_a1); \
38413481Sgiacomo.travaglini@arm.com  } \
38513481Sgiacomo.travaglini@arm.com  ::testing::MockSpec<__VA_ARGS__>& \
38613481Sgiacomo.travaglini@arm.com      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1) constness { \
38713481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(1, constness, Method).RegisterOwner(this); \
38813481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(1, constness, Method).With(gmock_a1); \
38913481Sgiacomo.travaglini@arm.com  } \
39013481Sgiacomo.travaglini@arm.com  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(1, constness, \
39113481Sgiacomo.travaglini@arm.com      Method)
39213481Sgiacomo.travaglini@arm.com
39313481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
39413481Sgiacomo.travaglini@arm.com#define GMOCK_METHOD2_(tn, constness, ct, Method, ...) \
39513481Sgiacomo.travaglini@arm.com  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
39613481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \
39713481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2) constness { \
39813481Sgiacomo.travaglini@arm.com    GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \
39913481Sgiacomo.travaglini@arm.com        tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
40013481Sgiacomo.travaglini@arm.com            == 2), \
40113481Sgiacomo.travaglini@arm.com        this_method_does_not_take_2_arguments); \
40213481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(2, constness, Method).SetOwnerAndName(this, #Method); \
40313481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(2, constness, Method).Invoke(gmock_a1, gmock_a2); \
40413481Sgiacomo.travaglini@arm.com  } \
40513481Sgiacomo.travaglini@arm.com  ::testing::MockSpec<__VA_ARGS__>& \
40613481Sgiacomo.travaglini@arm.com      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
40713481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2) constness { \
40813481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(2, constness, Method).RegisterOwner(this); \
40913481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(2, constness, Method).With(gmock_a1, gmock_a2); \
41013481Sgiacomo.travaglini@arm.com  } \
41113481Sgiacomo.travaglini@arm.com  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(2, constness, \
41213481Sgiacomo.travaglini@arm.com      Method)
41313481Sgiacomo.travaglini@arm.com
41413481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
41513481Sgiacomo.travaglini@arm.com#define GMOCK_METHOD3_(tn, constness, ct, Method, ...) \
41613481Sgiacomo.travaglini@arm.com  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
41713481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \
41813481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \
41913481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3) constness { \
42013481Sgiacomo.travaglini@arm.com    GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \
42113481Sgiacomo.travaglini@arm.com        tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
42213481Sgiacomo.travaglini@arm.com            == 3), \
42313481Sgiacomo.travaglini@arm.com        this_method_does_not_take_3_arguments); \
42413481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(3, constness, Method).SetOwnerAndName(this, #Method); \
42513481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(3, constness, Method).Invoke(gmock_a1, gmock_a2, \
42613481Sgiacomo.travaglini@arm.com        gmock_a3); \
42713481Sgiacomo.travaglini@arm.com  } \
42813481Sgiacomo.travaglini@arm.com  ::testing::MockSpec<__VA_ARGS__>& \
42913481Sgiacomo.travaglini@arm.com      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
43013481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
43113481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3) constness { \
43213481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(3, constness, Method).RegisterOwner(this); \
43313481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(3, constness, Method).With(gmock_a1, gmock_a2, \
43413481Sgiacomo.travaglini@arm.com        gmock_a3); \
43513481Sgiacomo.travaglini@arm.com  } \
43613481Sgiacomo.travaglini@arm.com  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(3, constness, \
43713481Sgiacomo.travaglini@arm.com      Method)
43813481Sgiacomo.travaglini@arm.com
43913481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
44013481Sgiacomo.travaglini@arm.com#define GMOCK_METHOD4_(tn, constness, ct, Method, ...) \
44113481Sgiacomo.travaglini@arm.com  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
44213481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \
44313481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \
44413481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
44513481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4) constness { \
44613481Sgiacomo.travaglini@arm.com    GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \
44713481Sgiacomo.travaglini@arm.com        tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
44813481Sgiacomo.travaglini@arm.com            == 4), \
44913481Sgiacomo.travaglini@arm.com        this_method_does_not_take_4_arguments); \
45013481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(4, constness, Method).SetOwnerAndName(this, #Method); \
45113481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(4, constness, Method).Invoke(gmock_a1, gmock_a2, \
45213481Sgiacomo.travaglini@arm.com        gmock_a3, gmock_a4); \
45313481Sgiacomo.travaglini@arm.com  } \
45413481Sgiacomo.travaglini@arm.com  ::testing::MockSpec<__VA_ARGS__>& \
45513481Sgiacomo.travaglini@arm.com      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
45613481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
45713481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
45813481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4) constness { \
45913481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(4, constness, Method).RegisterOwner(this); \
46013481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(4, constness, Method).With(gmock_a1, gmock_a2, \
46113481Sgiacomo.travaglini@arm.com        gmock_a3, gmock_a4); \
46213481Sgiacomo.travaglini@arm.com  } \
46313481Sgiacomo.travaglini@arm.com  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(4, constness, \
46413481Sgiacomo.travaglini@arm.com      Method)
46513481Sgiacomo.travaglini@arm.com
46613481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
46713481Sgiacomo.travaglini@arm.com#define GMOCK_METHOD5_(tn, constness, ct, Method, ...) \
46813481Sgiacomo.travaglini@arm.com  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
46913481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \
47013481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \
47113481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
47213481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \
47313481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5) constness { \
47413481Sgiacomo.travaglini@arm.com    GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \
47513481Sgiacomo.travaglini@arm.com        tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
47613481Sgiacomo.travaglini@arm.com            == 5), \
47713481Sgiacomo.travaglini@arm.com        this_method_does_not_take_5_arguments); \
47813481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(5, constness, Method).SetOwnerAndName(this, #Method); \
47913481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(5, constness, Method).Invoke(gmock_a1, gmock_a2, \
48013481Sgiacomo.travaglini@arm.com        gmock_a3, gmock_a4, gmock_a5); \
48113481Sgiacomo.travaglini@arm.com  } \
48213481Sgiacomo.travaglini@arm.com  ::testing::MockSpec<__VA_ARGS__>& \
48313481Sgiacomo.travaglini@arm.com      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
48413481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
48513481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
48613481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \
48713481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5) constness { \
48813481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(5, constness, Method).RegisterOwner(this); \
48913481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(5, constness, Method).With(gmock_a1, gmock_a2, \
49013481Sgiacomo.travaglini@arm.com        gmock_a3, gmock_a4, gmock_a5); \
49113481Sgiacomo.travaglini@arm.com  } \
49213481Sgiacomo.travaglini@arm.com  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(5, constness, \
49313481Sgiacomo.travaglini@arm.com      Method)
49413481Sgiacomo.travaglini@arm.com
49513481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
49613481Sgiacomo.travaglini@arm.com#define GMOCK_METHOD6_(tn, constness, ct, Method, ...) \
49713481Sgiacomo.travaglini@arm.com  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
49813481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \
49913481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \
50013481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
50113481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \
50213481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \
50313481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6) constness { \
50413481Sgiacomo.travaglini@arm.com    GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \
50513481Sgiacomo.travaglini@arm.com        tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
50613481Sgiacomo.travaglini@arm.com            == 6), \
50713481Sgiacomo.travaglini@arm.com        this_method_does_not_take_6_arguments); \
50813481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(6, constness, Method).SetOwnerAndName(this, #Method); \
50913481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(6, constness, Method).Invoke(gmock_a1, gmock_a2, \
51013481Sgiacomo.travaglini@arm.com        gmock_a3, gmock_a4, gmock_a5, gmock_a6); \
51113481Sgiacomo.travaglini@arm.com  } \
51213481Sgiacomo.travaglini@arm.com  ::testing::MockSpec<__VA_ARGS__>& \
51313481Sgiacomo.travaglini@arm.com      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
51413481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
51513481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
51613481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \
51713481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \
51813481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6) constness { \
51913481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(6, constness, Method).RegisterOwner(this); \
52013481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(6, constness, Method).With(gmock_a1, gmock_a2, \
52113481Sgiacomo.travaglini@arm.com        gmock_a3, gmock_a4, gmock_a5, gmock_a6); \
52213481Sgiacomo.travaglini@arm.com  } \
52313481Sgiacomo.travaglini@arm.com  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(6, constness, \
52413481Sgiacomo.travaglini@arm.com      Method)
52513481Sgiacomo.travaglini@arm.com
52613481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
52713481Sgiacomo.travaglini@arm.com#define GMOCK_METHOD7_(tn, constness, ct, Method, ...) \
52813481Sgiacomo.travaglini@arm.com  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
52913481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \
53013481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \
53113481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
53213481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \
53313481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \
53413481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \
53513481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7) constness { \
53613481Sgiacomo.travaglini@arm.com    GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \
53713481Sgiacomo.travaglini@arm.com        tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
53813481Sgiacomo.travaglini@arm.com            == 7), \
53913481Sgiacomo.travaglini@arm.com        this_method_does_not_take_7_arguments); \
54013481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(7, constness, Method).SetOwnerAndName(this, #Method); \
54113481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(7, constness, Method).Invoke(gmock_a1, gmock_a2, \
54213481Sgiacomo.travaglini@arm.com        gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7); \
54313481Sgiacomo.travaglini@arm.com  } \
54413481Sgiacomo.travaglini@arm.com  ::testing::MockSpec<__VA_ARGS__>& \
54513481Sgiacomo.travaglini@arm.com      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
54613481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
54713481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
54813481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \
54913481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \
55013481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \
55113481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7) constness { \
55213481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(7, constness, Method).RegisterOwner(this); \
55313481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(7, constness, Method).With(gmock_a1, gmock_a2, \
55413481Sgiacomo.travaglini@arm.com        gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7); \
55513481Sgiacomo.travaglini@arm.com  } \
55613481Sgiacomo.travaglini@arm.com  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(7, constness, \
55713481Sgiacomo.travaglini@arm.com      Method)
55813481Sgiacomo.travaglini@arm.com
55913481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
56013481Sgiacomo.travaglini@arm.com#define GMOCK_METHOD8_(tn, constness, ct, Method, ...) \
56113481Sgiacomo.travaglini@arm.com  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
56213481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \
56313481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \
56413481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
56513481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \
56613481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \
56713481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \
56813481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, \
56913481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8) constness { \
57013481Sgiacomo.travaglini@arm.com    GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \
57113481Sgiacomo.travaglini@arm.com        tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
57213481Sgiacomo.travaglini@arm.com            == 8), \
57313481Sgiacomo.travaglini@arm.com        this_method_does_not_take_8_arguments); \
57413481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(8, constness, Method).SetOwnerAndName(this, #Method); \
57513481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(8, constness, Method).Invoke(gmock_a1, gmock_a2, \
57613481Sgiacomo.travaglini@arm.com        gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8); \
57713481Sgiacomo.travaglini@arm.com  } \
57813481Sgiacomo.travaglini@arm.com  ::testing::MockSpec<__VA_ARGS__>& \
57913481Sgiacomo.travaglini@arm.com      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
58013481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
58113481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
58213481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \
58313481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \
58413481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \
58513481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \
58613481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8) constness { \
58713481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(8, constness, Method).RegisterOwner(this); \
58813481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(8, constness, Method).With(gmock_a1, gmock_a2, \
58913481Sgiacomo.travaglini@arm.com        gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8); \
59013481Sgiacomo.travaglini@arm.com  } \
59113481Sgiacomo.travaglini@arm.com  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(8, constness, \
59213481Sgiacomo.travaglini@arm.com      Method)
59313481Sgiacomo.travaglini@arm.com
59413481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
59513481Sgiacomo.travaglini@arm.com#define GMOCK_METHOD9_(tn, constness, ct, Method, ...) \
59613481Sgiacomo.travaglini@arm.com  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
59713481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \
59813481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \
59913481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
60013481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \
60113481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \
60213481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \
60313481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, \
60413481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8, \
60513481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9) constness { \
60613481Sgiacomo.travaglini@arm.com    GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \
60713481Sgiacomo.travaglini@arm.com        tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
60813481Sgiacomo.travaglini@arm.com            == 9), \
60913481Sgiacomo.travaglini@arm.com        this_method_does_not_take_9_arguments); \
61013481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(9, constness, Method).SetOwnerAndName(this, #Method); \
61113481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(9, constness, Method).Invoke(gmock_a1, gmock_a2, \
61213481Sgiacomo.travaglini@arm.com        gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, \
61313481Sgiacomo.travaglini@arm.com        gmock_a9); \
61413481Sgiacomo.travaglini@arm.com  } \
61513481Sgiacomo.travaglini@arm.com  ::testing::MockSpec<__VA_ARGS__>& \
61613481Sgiacomo.travaglini@arm.com      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
61713481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
61813481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
61913481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \
62013481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \
62113481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \
62213481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \
62313481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8, \
62413481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9) constness { \
62513481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(9, constness, Method).RegisterOwner(this); \
62613481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(9, constness, Method).With(gmock_a1, gmock_a2, \
62713481Sgiacomo.travaglini@arm.com        gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, \
62813481Sgiacomo.travaglini@arm.com        gmock_a9); \
62913481Sgiacomo.travaglini@arm.com  } \
63013481Sgiacomo.travaglini@arm.com  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(9, constness, \
63113481Sgiacomo.travaglini@arm.com      Method)
63213481Sgiacomo.travaglini@arm.com
63313481Sgiacomo.travaglini@arm.com// INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!
63413481Sgiacomo.travaglini@arm.com#define GMOCK_METHOD10_(tn, constness, ct, Method, ...) \
63513481Sgiacomo.travaglini@arm.com  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \
63613481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, \
63713481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2, \
63813481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \
63913481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, \
64013481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5, \
64113481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \
64213481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, \
64313481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8, \
64413481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9, \
64513481Sgiacomo.travaglini@arm.com      GMOCK_ARG_(tn, 10, __VA_ARGS__) gmock_a10) constness { \
64613481Sgiacomo.travaglini@arm.com    GTEST_COMPILE_ASSERT_((::testing::tuple_size<                          \
64713481Sgiacomo.travaglini@arm.com        tn ::testing::internal::Function<__VA_ARGS__>::ArgumentTuple>::value \
64813481Sgiacomo.travaglini@arm.com            == 10), \
64913481Sgiacomo.travaglini@arm.com        this_method_does_not_take_10_arguments); \
65013481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(10, constness, Method).SetOwnerAndName(this, #Method); \
65113481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(10, constness, Method).Invoke(gmock_a1, gmock_a2, \
65213481Sgiacomo.travaglini@arm.com        gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, gmock_a9, \
65313481Sgiacomo.travaglini@arm.com        gmock_a10); \
65413481Sgiacomo.travaglini@arm.com  } \
65513481Sgiacomo.travaglini@arm.com  ::testing::MockSpec<__VA_ARGS__>& \
65613481Sgiacomo.travaglini@arm.com      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \
65713481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \
65813481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \
65913481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \
66013481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \
66113481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \
66213481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \
66313481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8, \
66413481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9, \
66513481Sgiacomo.travaglini@arm.com                     GMOCK_MATCHER_(tn, 10, \
66613481Sgiacomo.travaglini@arm.com                         __VA_ARGS__) gmock_a10) constness { \
66713481Sgiacomo.travaglini@arm.com    GMOCK_MOCKER_(10, constness, Method).RegisterOwner(this); \
66813481Sgiacomo.travaglini@arm.com    return GMOCK_MOCKER_(10, constness, Method).With(gmock_a1, gmock_a2, \
66913481Sgiacomo.travaglini@arm.com        gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, gmock_a9, \
67013481Sgiacomo.travaglini@arm.com        gmock_a10); \
67113481Sgiacomo.travaglini@arm.com  } \
67213481Sgiacomo.travaglini@arm.com  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(10, constness, \
67313481Sgiacomo.travaglini@arm.com      Method)
67413481Sgiacomo.travaglini@arm.com
67513481Sgiacomo.travaglini@arm.com#define MOCK_METHOD0(m, ...) GMOCK_METHOD0_(, , , m, __VA_ARGS__)
67613481Sgiacomo.travaglini@arm.com#define MOCK_METHOD1(m, ...) GMOCK_METHOD1_(, , , m, __VA_ARGS__)
67713481Sgiacomo.travaglini@arm.com#define MOCK_METHOD2(m, ...) GMOCK_METHOD2_(, , , m, __VA_ARGS__)
67813481Sgiacomo.travaglini@arm.com#define MOCK_METHOD3(m, ...) GMOCK_METHOD3_(, , , m, __VA_ARGS__)
67913481Sgiacomo.travaglini@arm.com#define MOCK_METHOD4(m, ...) GMOCK_METHOD4_(, , , m, __VA_ARGS__)
68013481Sgiacomo.travaglini@arm.com#define MOCK_METHOD5(m, ...) GMOCK_METHOD5_(, , , m, __VA_ARGS__)
68113481Sgiacomo.travaglini@arm.com#define MOCK_METHOD6(m, ...) GMOCK_METHOD6_(, , , m, __VA_ARGS__)
68213481Sgiacomo.travaglini@arm.com#define MOCK_METHOD7(m, ...) GMOCK_METHOD7_(, , , m, __VA_ARGS__)
68313481Sgiacomo.travaglini@arm.com#define MOCK_METHOD8(m, ...) GMOCK_METHOD8_(, , , m, __VA_ARGS__)
68413481Sgiacomo.travaglini@arm.com#define MOCK_METHOD9(m, ...) GMOCK_METHOD9_(, , , m, __VA_ARGS__)
68513481Sgiacomo.travaglini@arm.com#define MOCK_METHOD10(m, ...) GMOCK_METHOD10_(, , , m, __VA_ARGS__)
68613481Sgiacomo.travaglini@arm.com
68713481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD0(m, ...) GMOCK_METHOD0_(, const, , m, __VA_ARGS__)
68813481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD1(m, ...) GMOCK_METHOD1_(, const, , m, __VA_ARGS__)
68913481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD2(m, ...) GMOCK_METHOD2_(, const, , m, __VA_ARGS__)
69013481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD3(m, ...) GMOCK_METHOD3_(, const, , m, __VA_ARGS__)
69113481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD4(m, ...) GMOCK_METHOD4_(, const, , m, __VA_ARGS__)
69213481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD5(m, ...) GMOCK_METHOD5_(, const, , m, __VA_ARGS__)
69313481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD6(m, ...) GMOCK_METHOD6_(, const, , m, __VA_ARGS__)
69413481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD7(m, ...) GMOCK_METHOD7_(, const, , m, __VA_ARGS__)
69513481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD8(m, ...) GMOCK_METHOD8_(, const, , m, __VA_ARGS__)
69613481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD9(m, ...) GMOCK_METHOD9_(, const, , m, __VA_ARGS__)
69713481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD10(m, ...) GMOCK_METHOD10_(, const, , m, __VA_ARGS__)
69813481Sgiacomo.travaglini@arm.com
69913481Sgiacomo.travaglini@arm.com#define MOCK_METHOD0_T(m, ...) GMOCK_METHOD0_(typename, , , m, __VA_ARGS__)
70013481Sgiacomo.travaglini@arm.com#define MOCK_METHOD1_T(m, ...) GMOCK_METHOD1_(typename, , , m, __VA_ARGS__)
70113481Sgiacomo.travaglini@arm.com#define MOCK_METHOD2_T(m, ...) GMOCK_METHOD2_(typename, , , m, __VA_ARGS__)
70213481Sgiacomo.travaglini@arm.com#define MOCK_METHOD3_T(m, ...) GMOCK_METHOD3_(typename, , , m, __VA_ARGS__)
70313481Sgiacomo.travaglini@arm.com#define MOCK_METHOD4_T(m, ...) GMOCK_METHOD4_(typename, , , m, __VA_ARGS__)
70413481Sgiacomo.travaglini@arm.com#define MOCK_METHOD5_T(m, ...) GMOCK_METHOD5_(typename, , , m, __VA_ARGS__)
70513481Sgiacomo.travaglini@arm.com#define MOCK_METHOD6_T(m, ...) GMOCK_METHOD6_(typename, , , m, __VA_ARGS__)
70613481Sgiacomo.travaglini@arm.com#define MOCK_METHOD7_T(m, ...) GMOCK_METHOD7_(typename, , , m, __VA_ARGS__)
70713481Sgiacomo.travaglini@arm.com#define MOCK_METHOD8_T(m, ...) GMOCK_METHOD8_(typename, , , m, __VA_ARGS__)
70813481Sgiacomo.travaglini@arm.com#define MOCK_METHOD9_T(m, ...) GMOCK_METHOD9_(typename, , , m, __VA_ARGS__)
70913481Sgiacomo.travaglini@arm.com#define MOCK_METHOD10_T(m, ...) GMOCK_METHOD10_(typename, , , m, __VA_ARGS__)
71013481Sgiacomo.travaglini@arm.com
71113481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD0_T(m, ...) \
71213481Sgiacomo.travaglini@arm.com    GMOCK_METHOD0_(typename, const, , m, __VA_ARGS__)
71313481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD1_T(m, ...) \
71413481Sgiacomo.travaglini@arm.com    GMOCK_METHOD1_(typename, const, , m, __VA_ARGS__)
71513481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD2_T(m, ...) \
71613481Sgiacomo.travaglini@arm.com    GMOCK_METHOD2_(typename, const, , m, __VA_ARGS__)
71713481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD3_T(m, ...) \
71813481Sgiacomo.travaglini@arm.com    GMOCK_METHOD3_(typename, const, , m, __VA_ARGS__)
71913481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD4_T(m, ...) \
72013481Sgiacomo.travaglini@arm.com    GMOCK_METHOD4_(typename, const, , m, __VA_ARGS__)
72113481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD5_T(m, ...) \
72213481Sgiacomo.travaglini@arm.com    GMOCK_METHOD5_(typename, const, , m, __VA_ARGS__)
72313481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD6_T(m, ...) \
72413481Sgiacomo.travaglini@arm.com    GMOCK_METHOD6_(typename, const, , m, __VA_ARGS__)
72513481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD7_T(m, ...) \
72613481Sgiacomo.travaglini@arm.com    GMOCK_METHOD7_(typename, const, , m, __VA_ARGS__)
72713481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD8_T(m, ...) \
72813481Sgiacomo.travaglini@arm.com    GMOCK_METHOD8_(typename, const, , m, __VA_ARGS__)
72913481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD9_T(m, ...) \
73013481Sgiacomo.travaglini@arm.com    GMOCK_METHOD9_(typename, const, , m, __VA_ARGS__)
73113481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD10_T(m, ...) \
73213481Sgiacomo.travaglini@arm.com    GMOCK_METHOD10_(typename, const, , m, __VA_ARGS__)
73313481Sgiacomo.travaglini@arm.com
73413481Sgiacomo.travaglini@arm.com#define MOCK_METHOD0_WITH_CALLTYPE(ct, m, ...) \
73513481Sgiacomo.travaglini@arm.com    GMOCK_METHOD0_(, , ct, m, __VA_ARGS__)
73613481Sgiacomo.travaglini@arm.com#define MOCK_METHOD1_WITH_CALLTYPE(ct, m, ...) \
73713481Sgiacomo.travaglini@arm.com    GMOCK_METHOD1_(, , ct, m, __VA_ARGS__)
73813481Sgiacomo.travaglini@arm.com#define MOCK_METHOD2_WITH_CALLTYPE(ct, m, ...) \
73913481Sgiacomo.travaglini@arm.com    GMOCK_METHOD2_(, , ct, m, __VA_ARGS__)
74013481Sgiacomo.travaglini@arm.com#define MOCK_METHOD3_WITH_CALLTYPE(ct, m, ...) \
74113481Sgiacomo.travaglini@arm.com    GMOCK_METHOD3_(, , ct, m, __VA_ARGS__)
74213481Sgiacomo.travaglini@arm.com#define MOCK_METHOD4_WITH_CALLTYPE(ct, m, ...) \
74313481Sgiacomo.travaglini@arm.com    GMOCK_METHOD4_(, , ct, m, __VA_ARGS__)
74413481Sgiacomo.travaglini@arm.com#define MOCK_METHOD5_WITH_CALLTYPE(ct, m, ...) \
74513481Sgiacomo.travaglini@arm.com    GMOCK_METHOD5_(, , ct, m, __VA_ARGS__)
74613481Sgiacomo.travaglini@arm.com#define MOCK_METHOD6_WITH_CALLTYPE(ct, m, ...) \
74713481Sgiacomo.travaglini@arm.com    GMOCK_METHOD6_(, , ct, m, __VA_ARGS__)
74813481Sgiacomo.travaglini@arm.com#define MOCK_METHOD7_WITH_CALLTYPE(ct, m, ...) \
74913481Sgiacomo.travaglini@arm.com    GMOCK_METHOD7_(, , ct, m, __VA_ARGS__)
75013481Sgiacomo.travaglini@arm.com#define MOCK_METHOD8_WITH_CALLTYPE(ct, m, ...) \
75113481Sgiacomo.travaglini@arm.com    GMOCK_METHOD8_(, , ct, m, __VA_ARGS__)
75213481Sgiacomo.travaglini@arm.com#define MOCK_METHOD9_WITH_CALLTYPE(ct, m, ...) \
75313481Sgiacomo.travaglini@arm.com    GMOCK_METHOD9_(, , ct, m, __VA_ARGS__)
75413481Sgiacomo.travaglini@arm.com#define MOCK_METHOD10_WITH_CALLTYPE(ct, m, ...) \
75513481Sgiacomo.travaglini@arm.com    GMOCK_METHOD10_(, , ct, m, __VA_ARGS__)
75613481Sgiacomo.travaglini@arm.com
75713481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD0_WITH_CALLTYPE(ct, m, ...) \
75813481Sgiacomo.travaglini@arm.com    GMOCK_METHOD0_(, const, ct, m, __VA_ARGS__)
75913481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD1_WITH_CALLTYPE(ct, m, ...) \
76013481Sgiacomo.travaglini@arm.com    GMOCK_METHOD1_(, const, ct, m, __VA_ARGS__)
76113481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD2_WITH_CALLTYPE(ct, m, ...) \
76213481Sgiacomo.travaglini@arm.com    GMOCK_METHOD2_(, const, ct, m, __VA_ARGS__)
76313481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD3_WITH_CALLTYPE(ct, m, ...) \
76413481Sgiacomo.travaglini@arm.com    GMOCK_METHOD3_(, const, ct, m, __VA_ARGS__)
76513481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD4_WITH_CALLTYPE(ct, m, ...) \
76613481Sgiacomo.travaglini@arm.com    GMOCK_METHOD4_(, const, ct, m, __VA_ARGS__)
76713481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD5_WITH_CALLTYPE(ct, m, ...) \
76813481Sgiacomo.travaglini@arm.com    GMOCK_METHOD5_(, const, ct, m, __VA_ARGS__)
76913481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD6_WITH_CALLTYPE(ct, m, ...) \
77013481Sgiacomo.travaglini@arm.com    GMOCK_METHOD6_(, const, ct, m, __VA_ARGS__)
77113481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD7_WITH_CALLTYPE(ct, m, ...) \
77213481Sgiacomo.travaglini@arm.com    GMOCK_METHOD7_(, const, ct, m, __VA_ARGS__)
77313481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD8_WITH_CALLTYPE(ct, m, ...) \
77413481Sgiacomo.travaglini@arm.com    GMOCK_METHOD8_(, const, ct, m, __VA_ARGS__)
77513481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD9_WITH_CALLTYPE(ct, m, ...) \
77613481Sgiacomo.travaglini@arm.com    GMOCK_METHOD9_(, const, ct, m, __VA_ARGS__)
77713481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD10_WITH_CALLTYPE(ct, m, ...) \
77813481Sgiacomo.travaglini@arm.com    GMOCK_METHOD10_(, const, ct, m, __VA_ARGS__)
77913481Sgiacomo.travaglini@arm.com
78013481Sgiacomo.travaglini@arm.com#define MOCK_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \
78113481Sgiacomo.travaglini@arm.com    GMOCK_METHOD0_(typename, , ct, m, __VA_ARGS__)
78213481Sgiacomo.travaglini@arm.com#define MOCK_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \
78313481Sgiacomo.travaglini@arm.com    GMOCK_METHOD1_(typename, , ct, m, __VA_ARGS__)
78413481Sgiacomo.travaglini@arm.com#define MOCK_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \
78513481Sgiacomo.travaglini@arm.com    GMOCK_METHOD2_(typename, , ct, m, __VA_ARGS__)
78613481Sgiacomo.travaglini@arm.com#define MOCK_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \
78713481Sgiacomo.travaglini@arm.com    GMOCK_METHOD3_(typename, , ct, m, __VA_ARGS__)
78813481Sgiacomo.travaglini@arm.com#define MOCK_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \
78913481Sgiacomo.travaglini@arm.com    GMOCK_METHOD4_(typename, , ct, m, __VA_ARGS__)
79013481Sgiacomo.travaglini@arm.com#define MOCK_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \
79113481Sgiacomo.travaglini@arm.com    GMOCK_METHOD5_(typename, , ct, m, __VA_ARGS__)
79213481Sgiacomo.travaglini@arm.com#define MOCK_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \
79313481Sgiacomo.travaglini@arm.com    GMOCK_METHOD6_(typename, , ct, m, __VA_ARGS__)
79413481Sgiacomo.travaglini@arm.com#define MOCK_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \
79513481Sgiacomo.travaglini@arm.com    GMOCK_METHOD7_(typename, , ct, m, __VA_ARGS__)
79613481Sgiacomo.travaglini@arm.com#define MOCK_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \
79713481Sgiacomo.travaglini@arm.com    GMOCK_METHOD8_(typename, , ct, m, __VA_ARGS__)
79813481Sgiacomo.travaglini@arm.com#define MOCK_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \
79913481Sgiacomo.travaglini@arm.com    GMOCK_METHOD9_(typename, , ct, m, __VA_ARGS__)
80013481Sgiacomo.travaglini@arm.com#define MOCK_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \
80113481Sgiacomo.travaglini@arm.com    GMOCK_METHOD10_(typename, , ct, m, __VA_ARGS__)
80213481Sgiacomo.travaglini@arm.com
80313481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \
80413481Sgiacomo.travaglini@arm.com    GMOCK_METHOD0_(typename, const, ct, m, __VA_ARGS__)
80513481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \
80613481Sgiacomo.travaglini@arm.com    GMOCK_METHOD1_(typename, const, ct, m, __VA_ARGS__)
80713481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \
80813481Sgiacomo.travaglini@arm.com    GMOCK_METHOD2_(typename, const, ct, m, __VA_ARGS__)
80913481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \
81013481Sgiacomo.travaglini@arm.com    GMOCK_METHOD3_(typename, const, ct, m, __VA_ARGS__)
81113481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \
81213481Sgiacomo.travaglini@arm.com    GMOCK_METHOD4_(typename, const, ct, m, __VA_ARGS__)
81313481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \
81413481Sgiacomo.travaglini@arm.com    GMOCK_METHOD5_(typename, const, ct, m, __VA_ARGS__)
81513481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \
81613481Sgiacomo.travaglini@arm.com    GMOCK_METHOD6_(typename, const, ct, m, __VA_ARGS__)
81713481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \
81813481Sgiacomo.travaglini@arm.com    GMOCK_METHOD7_(typename, const, ct, m, __VA_ARGS__)
81913481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \
82013481Sgiacomo.travaglini@arm.com    GMOCK_METHOD8_(typename, const, ct, m, __VA_ARGS__)
82113481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \
82213481Sgiacomo.travaglini@arm.com    GMOCK_METHOD9_(typename, const, ct, m, __VA_ARGS__)
82313481Sgiacomo.travaglini@arm.com#define MOCK_CONST_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \
82413481Sgiacomo.travaglini@arm.com    GMOCK_METHOD10_(typename, const, ct, m, __VA_ARGS__)
82513481Sgiacomo.travaglini@arm.com
82613481Sgiacomo.travaglini@arm.com// A MockFunction<F> class has one mock method whose type is F.  It is
82713481Sgiacomo.travaglini@arm.com// useful when you just want your test code to emit some messages and
82813481Sgiacomo.travaglini@arm.com// have Google Mock verify the right messages are sent (and perhaps at
82913481Sgiacomo.travaglini@arm.com// the right times).  For example, if you are exercising code:
83013481Sgiacomo.travaglini@arm.com//
83113481Sgiacomo.travaglini@arm.com//   Foo(1);
83213481Sgiacomo.travaglini@arm.com//   Foo(2);
83313481Sgiacomo.travaglini@arm.com//   Foo(3);
83413481Sgiacomo.travaglini@arm.com//
83513481Sgiacomo.travaglini@arm.com// and want to verify that Foo(1) and Foo(3) both invoke
83613481Sgiacomo.travaglini@arm.com// mock.Bar("a"), but Foo(2) doesn't invoke anything, you can write:
83713481Sgiacomo.travaglini@arm.com//
83813481Sgiacomo.travaglini@arm.com// TEST(FooTest, InvokesBarCorrectly) {
83913481Sgiacomo.travaglini@arm.com//   MyMock mock;
84013481Sgiacomo.travaglini@arm.com//   MockFunction<void(string check_point_name)> check;
84113481Sgiacomo.travaglini@arm.com//   {
84213481Sgiacomo.travaglini@arm.com//     InSequence s;
84313481Sgiacomo.travaglini@arm.com//
84413481Sgiacomo.travaglini@arm.com//     EXPECT_CALL(mock, Bar("a"));
84513481Sgiacomo.travaglini@arm.com//     EXPECT_CALL(check, Call("1"));
84613481Sgiacomo.travaglini@arm.com//     EXPECT_CALL(check, Call("2"));
84713481Sgiacomo.travaglini@arm.com//     EXPECT_CALL(mock, Bar("a"));
84813481Sgiacomo.travaglini@arm.com//   }
84913481Sgiacomo.travaglini@arm.com//   Foo(1);
85013481Sgiacomo.travaglini@arm.com//   check.Call("1");
85113481Sgiacomo.travaglini@arm.com//   Foo(2);
85213481Sgiacomo.travaglini@arm.com//   check.Call("2");
85313481Sgiacomo.travaglini@arm.com//   Foo(3);
85413481Sgiacomo.travaglini@arm.com// }
85513481Sgiacomo.travaglini@arm.com//
85613481Sgiacomo.travaglini@arm.com// The expectation spec says that the first Bar("a") must happen
85713481Sgiacomo.travaglini@arm.com// before check point "1", the second Bar("a") must happen after check
85813481Sgiacomo.travaglini@arm.com// point "2", and nothing should happen between the two check
85913481Sgiacomo.travaglini@arm.com// points. The explicit check points make it easy to tell which
86013481Sgiacomo.travaglini@arm.com// Bar("a") is called by which call to Foo().
86113481Sgiacomo.travaglini@arm.com//
86213481Sgiacomo.travaglini@arm.com// MockFunction<F> can also be used to exercise code that accepts
86313481Sgiacomo.travaglini@arm.com// std::function<F> callbacks. To do so, use AsStdFunction() method
86413481Sgiacomo.travaglini@arm.com// to create std::function proxy forwarding to original object's Call.
86513481Sgiacomo.travaglini@arm.com// Example:
86613481Sgiacomo.travaglini@arm.com//
86713481Sgiacomo.travaglini@arm.com// TEST(FooTest, RunsCallbackWithBarArgument) {
86813481Sgiacomo.travaglini@arm.com//   MockFunction<int(string)> callback;
86913481Sgiacomo.travaglini@arm.com//   EXPECT_CALL(callback, Call("bar")).WillOnce(Return(1));
87013481Sgiacomo.travaglini@arm.com//   Foo(callback.AsStdFunction());
87113481Sgiacomo.travaglini@arm.com// }
87213481Sgiacomo.travaglini@arm.comtemplate <typename F>
87313481Sgiacomo.travaglini@arm.comclass MockFunction;
87413481Sgiacomo.travaglini@arm.com
87513481Sgiacomo.travaglini@arm.comtemplate <typename R>
87613481Sgiacomo.travaglini@arm.comclass MockFunction<R()> {
87713481Sgiacomo.travaglini@arm.com public:
87813481Sgiacomo.travaglini@arm.com  MockFunction() {}
87913481Sgiacomo.travaglini@arm.com
88013481Sgiacomo.travaglini@arm.com  MOCK_METHOD0_T(Call, R());
88113481Sgiacomo.travaglini@arm.com
88213481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FUNCTION_
88313481Sgiacomo.travaglini@arm.com  std::function<R()> AsStdFunction() {
88413481Sgiacomo.travaglini@arm.com    return [this]() -> R {
88513481Sgiacomo.travaglini@arm.com      return this->Call();
88613481Sgiacomo.travaglini@arm.com    };
88713481Sgiacomo.travaglini@arm.com  }
88813481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_STD_FUNCTION_
88913481Sgiacomo.travaglini@arm.com
89013481Sgiacomo.travaglini@arm.com private:
89113481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
89213481Sgiacomo.travaglini@arm.com};
89313481Sgiacomo.travaglini@arm.com
89413481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A0>
89513481Sgiacomo.travaglini@arm.comclass MockFunction<R(A0)> {
89613481Sgiacomo.travaglini@arm.com public:
89713481Sgiacomo.travaglini@arm.com  MockFunction() {}
89813481Sgiacomo.travaglini@arm.com
89913481Sgiacomo.travaglini@arm.com  MOCK_METHOD1_T(Call, R(A0));
90013481Sgiacomo.travaglini@arm.com
90113481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FUNCTION_
90213481Sgiacomo.travaglini@arm.com  std::function<R(A0)> AsStdFunction() {
90313481Sgiacomo.travaglini@arm.com    return [this](A0 a0) -> R {
90413481Sgiacomo.travaglini@arm.com      return this->Call(a0);
90513481Sgiacomo.travaglini@arm.com    };
90613481Sgiacomo.travaglini@arm.com  }
90713481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_STD_FUNCTION_
90813481Sgiacomo.travaglini@arm.com
90913481Sgiacomo.travaglini@arm.com private:
91013481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
91113481Sgiacomo.travaglini@arm.com};
91213481Sgiacomo.travaglini@arm.com
91313481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A0, typename A1>
91413481Sgiacomo.travaglini@arm.comclass MockFunction<R(A0, A1)> {
91513481Sgiacomo.travaglini@arm.com public:
91613481Sgiacomo.travaglini@arm.com  MockFunction() {}
91713481Sgiacomo.travaglini@arm.com
91813481Sgiacomo.travaglini@arm.com  MOCK_METHOD2_T(Call, R(A0, A1));
91913481Sgiacomo.travaglini@arm.com
92013481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FUNCTION_
92113481Sgiacomo.travaglini@arm.com  std::function<R(A0, A1)> AsStdFunction() {
92213481Sgiacomo.travaglini@arm.com    return [this](A0 a0, A1 a1) -> R {
92313481Sgiacomo.travaglini@arm.com      return this->Call(a0, a1);
92413481Sgiacomo.travaglini@arm.com    };
92513481Sgiacomo.travaglini@arm.com  }
92613481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_STD_FUNCTION_
92713481Sgiacomo.travaglini@arm.com
92813481Sgiacomo.travaglini@arm.com private:
92913481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
93013481Sgiacomo.travaglini@arm.com};
93113481Sgiacomo.travaglini@arm.com
93213481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A0, typename A1, typename A2>
93313481Sgiacomo.travaglini@arm.comclass MockFunction<R(A0, A1, A2)> {
93413481Sgiacomo.travaglini@arm.com public:
93513481Sgiacomo.travaglini@arm.com  MockFunction() {}
93613481Sgiacomo.travaglini@arm.com
93713481Sgiacomo.travaglini@arm.com  MOCK_METHOD3_T(Call, R(A0, A1, A2));
93813481Sgiacomo.travaglini@arm.com
93913481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FUNCTION_
94013481Sgiacomo.travaglini@arm.com  std::function<R(A0, A1, A2)> AsStdFunction() {
94113481Sgiacomo.travaglini@arm.com    return [this](A0 a0, A1 a1, A2 a2) -> R {
94213481Sgiacomo.travaglini@arm.com      return this->Call(a0, a1, a2);
94313481Sgiacomo.travaglini@arm.com    };
94413481Sgiacomo.travaglini@arm.com  }
94513481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_STD_FUNCTION_
94613481Sgiacomo.travaglini@arm.com
94713481Sgiacomo.travaglini@arm.com private:
94813481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
94913481Sgiacomo.travaglini@arm.com};
95013481Sgiacomo.travaglini@arm.com
95113481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A0, typename A1, typename A2, typename A3>
95213481Sgiacomo.travaglini@arm.comclass MockFunction<R(A0, A1, A2, A3)> {
95313481Sgiacomo.travaglini@arm.com public:
95413481Sgiacomo.travaglini@arm.com  MockFunction() {}
95513481Sgiacomo.travaglini@arm.com
95613481Sgiacomo.travaglini@arm.com  MOCK_METHOD4_T(Call, R(A0, A1, A2, A3));
95713481Sgiacomo.travaglini@arm.com
95813481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FUNCTION_
95913481Sgiacomo.travaglini@arm.com  std::function<R(A0, A1, A2, A3)> AsStdFunction() {
96013481Sgiacomo.travaglini@arm.com    return [this](A0 a0, A1 a1, A2 a2, A3 a3) -> R {
96113481Sgiacomo.travaglini@arm.com      return this->Call(a0, a1, a2, a3);
96213481Sgiacomo.travaglini@arm.com    };
96313481Sgiacomo.travaglini@arm.com  }
96413481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_STD_FUNCTION_
96513481Sgiacomo.travaglini@arm.com
96613481Sgiacomo.travaglini@arm.com private:
96713481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
96813481Sgiacomo.travaglini@arm.com};
96913481Sgiacomo.travaglini@arm.com
97013481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A0, typename A1, typename A2, typename A3,
97113481Sgiacomo.travaglini@arm.com    typename A4>
97213481Sgiacomo.travaglini@arm.comclass MockFunction<R(A0, A1, A2, A3, A4)> {
97313481Sgiacomo.travaglini@arm.com public:
97413481Sgiacomo.travaglini@arm.com  MockFunction() {}
97513481Sgiacomo.travaglini@arm.com
97613481Sgiacomo.travaglini@arm.com  MOCK_METHOD5_T(Call, R(A0, A1, A2, A3, A4));
97713481Sgiacomo.travaglini@arm.com
97813481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FUNCTION_
97913481Sgiacomo.travaglini@arm.com  std::function<R(A0, A1, A2, A3, A4)> AsStdFunction() {
98013481Sgiacomo.travaglini@arm.com    return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) -> R {
98113481Sgiacomo.travaglini@arm.com      return this->Call(a0, a1, a2, a3, a4);
98213481Sgiacomo.travaglini@arm.com    };
98313481Sgiacomo.travaglini@arm.com  }
98413481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_STD_FUNCTION_
98513481Sgiacomo.travaglini@arm.com
98613481Sgiacomo.travaglini@arm.com private:
98713481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
98813481Sgiacomo.travaglini@arm.com};
98913481Sgiacomo.travaglini@arm.com
99013481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A0, typename A1, typename A2, typename A3,
99113481Sgiacomo.travaglini@arm.com    typename A4, typename A5>
99213481Sgiacomo.travaglini@arm.comclass MockFunction<R(A0, A1, A2, A3, A4, A5)> {
99313481Sgiacomo.travaglini@arm.com public:
99413481Sgiacomo.travaglini@arm.com  MockFunction() {}
99513481Sgiacomo.travaglini@arm.com
99613481Sgiacomo.travaglini@arm.com  MOCK_METHOD6_T(Call, R(A0, A1, A2, A3, A4, A5));
99713481Sgiacomo.travaglini@arm.com
99813481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FUNCTION_
99913481Sgiacomo.travaglini@arm.com  std::function<R(A0, A1, A2, A3, A4, A5)> AsStdFunction() {
100013481Sgiacomo.travaglini@arm.com    return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) -> R {
100113481Sgiacomo.travaglini@arm.com      return this->Call(a0, a1, a2, a3, a4, a5);
100213481Sgiacomo.travaglini@arm.com    };
100313481Sgiacomo.travaglini@arm.com  }
100413481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_STD_FUNCTION_
100513481Sgiacomo.travaglini@arm.com
100613481Sgiacomo.travaglini@arm.com private:
100713481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
100813481Sgiacomo.travaglini@arm.com};
100913481Sgiacomo.travaglini@arm.com
101013481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A0, typename A1, typename A2, typename A3,
101113481Sgiacomo.travaglini@arm.com    typename A4, typename A5, typename A6>
101213481Sgiacomo.travaglini@arm.comclass MockFunction<R(A0, A1, A2, A3, A4, A5, A6)> {
101313481Sgiacomo.travaglini@arm.com public:
101413481Sgiacomo.travaglini@arm.com  MockFunction() {}
101513481Sgiacomo.travaglini@arm.com
101613481Sgiacomo.travaglini@arm.com  MOCK_METHOD7_T(Call, R(A0, A1, A2, A3, A4, A5, A6));
101713481Sgiacomo.travaglini@arm.com
101813481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FUNCTION_
101913481Sgiacomo.travaglini@arm.com  std::function<R(A0, A1, A2, A3, A4, A5, A6)> AsStdFunction() {
102013481Sgiacomo.travaglini@arm.com    return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) -> R {
102113481Sgiacomo.travaglini@arm.com      return this->Call(a0, a1, a2, a3, a4, a5, a6);
102213481Sgiacomo.travaglini@arm.com    };
102313481Sgiacomo.travaglini@arm.com  }
102413481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_STD_FUNCTION_
102513481Sgiacomo.travaglini@arm.com
102613481Sgiacomo.travaglini@arm.com private:
102713481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
102813481Sgiacomo.travaglini@arm.com};
102913481Sgiacomo.travaglini@arm.com
103013481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A0, typename A1, typename A2, typename A3,
103113481Sgiacomo.travaglini@arm.com    typename A4, typename A5, typename A6, typename A7>
103213481Sgiacomo.travaglini@arm.comclass MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7)> {
103313481Sgiacomo.travaglini@arm.com public:
103413481Sgiacomo.travaglini@arm.com  MockFunction() {}
103513481Sgiacomo.travaglini@arm.com
103613481Sgiacomo.travaglini@arm.com  MOCK_METHOD8_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7));
103713481Sgiacomo.travaglini@arm.com
103813481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FUNCTION_
103913481Sgiacomo.travaglini@arm.com  std::function<R(A0, A1, A2, A3, A4, A5, A6, A7)> AsStdFunction() {
104013481Sgiacomo.travaglini@arm.com    return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) -> R {
104113481Sgiacomo.travaglini@arm.com      return this->Call(a0, a1, a2, a3, a4, a5, a6, a7);
104213481Sgiacomo.travaglini@arm.com    };
104313481Sgiacomo.travaglini@arm.com  }
104413481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_STD_FUNCTION_
104513481Sgiacomo.travaglini@arm.com
104613481Sgiacomo.travaglini@arm.com private:
104713481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
104813481Sgiacomo.travaglini@arm.com};
104913481Sgiacomo.travaglini@arm.com
105013481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A0, typename A1, typename A2, typename A3,
105113481Sgiacomo.travaglini@arm.com    typename A4, typename A5, typename A6, typename A7, typename A8>
105213481Sgiacomo.travaglini@arm.comclass MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7, A8)> {
105313481Sgiacomo.travaglini@arm.com public:
105413481Sgiacomo.travaglini@arm.com  MockFunction() {}
105513481Sgiacomo.travaglini@arm.com
105613481Sgiacomo.travaglini@arm.com  MOCK_METHOD9_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7, A8));
105713481Sgiacomo.travaglini@arm.com
105813481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FUNCTION_
105913481Sgiacomo.travaglini@arm.com  std::function<R(A0, A1, A2, A3, A4, A5, A6, A7, A8)> AsStdFunction() {
106013481Sgiacomo.travaglini@arm.com    return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7,
106113481Sgiacomo.travaglini@arm.com        A8 a8) -> R {
106213481Sgiacomo.travaglini@arm.com      return this->Call(a0, a1, a2, a3, a4, a5, a6, a7, a8);
106313481Sgiacomo.travaglini@arm.com    };
106413481Sgiacomo.travaglini@arm.com  }
106513481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_STD_FUNCTION_
106613481Sgiacomo.travaglini@arm.com
106713481Sgiacomo.travaglini@arm.com private:
106813481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
106913481Sgiacomo.travaglini@arm.com};
107013481Sgiacomo.travaglini@arm.com
107113481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A0, typename A1, typename A2, typename A3,
107213481Sgiacomo.travaglini@arm.com    typename A4, typename A5, typename A6, typename A7, typename A8,
107313481Sgiacomo.travaglini@arm.com    typename A9>
107413481Sgiacomo.travaglini@arm.comclass MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9)> {
107513481Sgiacomo.travaglini@arm.com public:
107613481Sgiacomo.travaglini@arm.com  MockFunction() {}
107713481Sgiacomo.travaglini@arm.com
107813481Sgiacomo.travaglini@arm.com  MOCK_METHOD10_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9));
107913481Sgiacomo.travaglini@arm.com
108013481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STD_FUNCTION_
108113481Sgiacomo.travaglini@arm.com  std::function<R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9)> AsStdFunction() {
108213481Sgiacomo.travaglini@arm.com    return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7,
108313481Sgiacomo.travaglini@arm.com        A8 a8, A9 a9) -> R {
108413481Sgiacomo.travaglini@arm.com      return this->Call(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
108513481Sgiacomo.travaglini@arm.com    };
108613481Sgiacomo.travaglini@arm.com  }
108713481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_STD_FUNCTION_
108813481Sgiacomo.travaglini@arm.com
108913481Sgiacomo.travaglini@arm.com private:
109013481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);
109113481Sgiacomo.travaglini@arm.com};
109213481Sgiacomo.travaglini@arm.com
109313481Sgiacomo.travaglini@arm.com}  // namespace testing
109413481Sgiacomo.travaglini@arm.com
109513481Sgiacomo.travaglini@arm.com#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_
1096