113481Sgiacomo.travaglini@arm.com// This file was GENERATED by a script.  DO NOT EDIT BY HAND!!!
213481Sgiacomo.travaglini@arm.com
313481Sgiacomo.travaglini@arm.com// Copyright 2007, Google Inc.
413481Sgiacomo.travaglini@arm.com// All rights reserved.
513481Sgiacomo.travaglini@arm.com//
613481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
713481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
813481Sgiacomo.travaglini@arm.com// met:
913481Sgiacomo.travaglini@arm.com//
1013481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
1113481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1213481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1313481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1413481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1513481Sgiacomo.travaglini@arm.com// distribution.
1613481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1713481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
1813481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
1913481Sgiacomo.travaglini@arm.com//
2013481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2113481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2213481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2313481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2413481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2513481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2613481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2713481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2813481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2913481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3013481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3113481Sgiacomo.travaglini@arm.com//
3213481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan)
3313481Sgiacomo.travaglini@arm.com
3413481Sgiacomo.travaglini@arm.com// Google Mock - a framework for writing C++ mock classes.
3513481Sgiacomo.travaglini@arm.com//
3613481Sgiacomo.travaglini@arm.com// This file implements some commonly used variadic actions.
3713481Sgiacomo.travaglini@arm.com
3813481Sgiacomo.travaglini@arm.com#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_
3913481Sgiacomo.travaglini@arm.com#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_
4013481Sgiacomo.travaglini@arm.com
4113481Sgiacomo.travaglini@arm.com#include "gmock/gmock-actions.h"
4213481Sgiacomo.travaglini@arm.com#include "gmock/internal/gmock-port.h"
4313481Sgiacomo.travaglini@arm.com
4413481Sgiacomo.travaglini@arm.comnamespace testing {
4513481Sgiacomo.travaglini@arm.comnamespace internal {
4613481Sgiacomo.travaglini@arm.com
4713481Sgiacomo.travaglini@arm.com// InvokeHelper<F> knows how to unpack an N-tuple and invoke an N-ary
4813481Sgiacomo.travaglini@arm.com// function or method with the unpacked values, where F is a function
4913481Sgiacomo.travaglini@arm.com// type that takes N arguments.
5013481Sgiacomo.travaglini@arm.comtemplate <typename Result, typename ArgumentTuple>
5113481Sgiacomo.travaglini@arm.comclass InvokeHelper;
5213481Sgiacomo.travaglini@arm.com
5313481Sgiacomo.travaglini@arm.comtemplate <typename R>
5413481Sgiacomo.travaglini@arm.comclass InvokeHelper<R, ::testing::tuple<> > {
5513481Sgiacomo.travaglini@arm.com public:
5613481Sgiacomo.travaglini@arm.com  template <typename Function>
5713481Sgiacomo.travaglini@arm.com  static R Invoke(Function function, const ::testing::tuple<>&) {
5813481Sgiacomo.travaglini@arm.com           return function();
5913481Sgiacomo.travaglini@arm.com  }
6013481Sgiacomo.travaglini@arm.com
6113481Sgiacomo.travaglini@arm.com  template <class Class, typename MethodPtr>
6213481Sgiacomo.travaglini@arm.com  static R InvokeMethod(Class* obj_ptr,
6313481Sgiacomo.travaglini@arm.com                        MethodPtr method_ptr,
6413481Sgiacomo.travaglini@arm.com                        const ::testing::tuple<>&) {
6513481Sgiacomo.travaglini@arm.com           return (obj_ptr->*method_ptr)();
6613481Sgiacomo.travaglini@arm.com  }
6713481Sgiacomo.travaglini@arm.com};
6813481Sgiacomo.travaglini@arm.com
6913481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1>
7013481Sgiacomo.travaglini@arm.comclass InvokeHelper<R, ::testing::tuple<A1> > {
7113481Sgiacomo.travaglini@arm.com public:
7213481Sgiacomo.travaglini@arm.com  template <typename Function>
7313481Sgiacomo.travaglini@arm.com  static R Invoke(Function function, const ::testing::tuple<A1>& args) {
7413481Sgiacomo.travaglini@arm.com           return function(get<0>(args));
7513481Sgiacomo.travaglini@arm.com  }
7613481Sgiacomo.travaglini@arm.com
7713481Sgiacomo.travaglini@arm.com  template <class Class, typename MethodPtr>
7813481Sgiacomo.travaglini@arm.com  static R InvokeMethod(Class* obj_ptr,
7913481Sgiacomo.travaglini@arm.com                        MethodPtr method_ptr,
8013481Sgiacomo.travaglini@arm.com                        const ::testing::tuple<A1>& args) {
8113481Sgiacomo.travaglini@arm.com           return (obj_ptr->*method_ptr)(get<0>(args));
8213481Sgiacomo.travaglini@arm.com  }
8313481Sgiacomo.travaglini@arm.com};
8413481Sgiacomo.travaglini@arm.com
8513481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1, typename A2>
8613481Sgiacomo.travaglini@arm.comclass InvokeHelper<R, ::testing::tuple<A1, A2> > {
8713481Sgiacomo.travaglini@arm.com public:
8813481Sgiacomo.travaglini@arm.com  template <typename Function>
8913481Sgiacomo.travaglini@arm.com  static R Invoke(Function function, const ::testing::tuple<A1, A2>& args) {
9013481Sgiacomo.travaglini@arm.com           return function(get<0>(args), get<1>(args));
9113481Sgiacomo.travaglini@arm.com  }
9213481Sgiacomo.travaglini@arm.com
9313481Sgiacomo.travaglini@arm.com  template <class Class, typename MethodPtr>
9413481Sgiacomo.travaglini@arm.com  static R InvokeMethod(Class* obj_ptr,
9513481Sgiacomo.travaglini@arm.com                        MethodPtr method_ptr,
9613481Sgiacomo.travaglini@arm.com                        const ::testing::tuple<A1, A2>& args) {
9713481Sgiacomo.travaglini@arm.com           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args));
9813481Sgiacomo.travaglini@arm.com  }
9913481Sgiacomo.travaglini@arm.com};
10013481Sgiacomo.travaglini@arm.com
10113481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1, typename A2, typename A3>
10213481Sgiacomo.travaglini@arm.comclass InvokeHelper<R, ::testing::tuple<A1, A2, A3> > {
10313481Sgiacomo.travaglini@arm.com public:
10413481Sgiacomo.travaglini@arm.com  template <typename Function>
10513481Sgiacomo.travaglini@arm.com  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3>& args) {
10613481Sgiacomo.travaglini@arm.com           return function(get<0>(args), get<1>(args), get<2>(args));
10713481Sgiacomo.travaglini@arm.com  }
10813481Sgiacomo.travaglini@arm.com
10913481Sgiacomo.travaglini@arm.com  template <class Class, typename MethodPtr>
11013481Sgiacomo.travaglini@arm.com  static R InvokeMethod(Class* obj_ptr,
11113481Sgiacomo.travaglini@arm.com                        MethodPtr method_ptr,
11213481Sgiacomo.travaglini@arm.com                        const ::testing::tuple<A1, A2, A3>& args) {
11313481Sgiacomo.travaglini@arm.com           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),
11413481Sgiacomo.travaglini@arm.com               get<2>(args));
11513481Sgiacomo.travaglini@arm.com  }
11613481Sgiacomo.travaglini@arm.com};
11713481Sgiacomo.travaglini@arm.com
11813481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1, typename A2, typename A3, typename A4>
11913481Sgiacomo.travaglini@arm.comclass InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4> > {
12013481Sgiacomo.travaglini@arm.com public:
12113481Sgiacomo.travaglini@arm.com  template <typename Function>
12213481Sgiacomo.travaglini@arm.com  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3,
12313481Sgiacomo.travaglini@arm.com      A4>& args) {
12413481Sgiacomo.travaglini@arm.com           return function(get<0>(args), get<1>(args), get<2>(args),
12513481Sgiacomo.travaglini@arm.com               get<3>(args));
12613481Sgiacomo.travaglini@arm.com  }
12713481Sgiacomo.travaglini@arm.com
12813481Sgiacomo.travaglini@arm.com  template <class Class, typename MethodPtr>
12913481Sgiacomo.travaglini@arm.com  static R InvokeMethod(Class* obj_ptr,
13013481Sgiacomo.travaglini@arm.com                        MethodPtr method_ptr,
13113481Sgiacomo.travaglini@arm.com                        const ::testing::tuple<A1, A2, A3, A4>& args) {
13213481Sgiacomo.travaglini@arm.com           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),
13313481Sgiacomo.travaglini@arm.com               get<2>(args), get<3>(args));
13413481Sgiacomo.travaglini@arm.com  }
13513481Sgiacomo.travaglini@arm.com};
13613481Sgiacomo.travaglini@arm.com
13713481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1, typename A2, typename A3, typename A4,
13813481Sgiacomo.travaglini@arm.com    typename A5>
13913481Sgiacomo.travaglini@arm.comclass InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5> > {
14013481Sgiacomo.travaglini@arm.com public:
14113481Sgiacomo.travaglini@arm.com  template <typename Function>
14213481Sgiacomo.travaglini@arm.com  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4,
14313481Sgiacomo.travaglini@arm.com      A5>& args) {
14413481Sgiacomo.travaglini@arm.com           return function(get<0>(args), get<1>(args), get<2>(args),
14513481Sgiacomo.travaglini@arm.com               get<3>(args), get<4>(args));
14613481Sgiacomo.travaglini@arm.com  }
14713481Sgiacomo.travaglini@arm.com
14813481Sgiacomo.travaglini@arm.com  template <class Class, typename MethodPtr>
14913481Sgiacomo.travaglini@arm.com  static R InvokeMethod(Class* obj_ptr,
15013481Sgiacomo.travaglini@arm.com                        MethodPtr method_ptr,
15113481Sgiacomo.travaglini@arm.com                        const ::testing::tuple<A1, A2, A3, A4, A5>& args) {
15213481Sgiacomo.travaglini@arm.com           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),
15313481Sgiacomo.travaglini@arm.com               get<2>(args), get<3>(args), get<4>(args));
15413481Sgiacomo.travaglini@arm.com  }
15513481Sgiacomo.travaglini@arm.com};
15613481Sgiacomo.travaglini@arm.com
15713481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1, typename A2, typename A3, typename A4,
15813481Sgiacomo.travaglini@arm.com    typename A5, typename A6>
15913481Sgiacomo.travaglini@arm.comclass InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6> > {
16013481Sgiacomo.travaglini@arm.com public:
16113481Sgiacomo.travaglini@arm.com  template <typename Function>
16213481Sgiacomo.travaglini@arm.com  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,
16313481Sgiacomo.travaglini@arm.com      A6>& args) {
16413481Sgiacomo.travaglini@arm.com           return function(get<0>(args), get<1>(args), get<2>(args),
16513481Sgiacomo.travaglini@arm.com               get<3>(args), get<4>(args), get<5>(args));
16613481Sgiacomo.travaglini@arm.com  }
16713481Sgiacomo.travaglini@arm.com
16813481Sgiacomo.travaglini@arm.com  template <class Class, typename MethodPtr>
16913481Sgiacomo.travaglini@arm.com  static R InvokeMethod(Class* obj_ptr,
17013481Sgiacomo.travaglini@arm.com                        MethodPtr method_ptr,
17113481Sgiacomo.travaglini@arm.com                        const ::testing::tuple<A1, A2, A3, A4, A5, A6>& args) {
17213481Sgiacomo.travaglini@arm.com           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),
17313481Sgiacomo.travaglini@arm.com               get<2>(args), get<3>(args), get<4>(args), get<5>(args));
17413481Sgiacomo.travaglini@arm.com  }
17513481Sgiacomo.travaglini@arm.com};
17613481Sgiacomo.travaglini@arm.com
17713481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1, typename A2, typename A3, typename A4,
17813481Sgiacomo.travaglini@arm.com    typename A5, typename A6, typename A7>
17913481Sgiacomo.travaglini@arm.comclass InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> > {
18013481Sgiacomo.travaglini@arm.com public:
18113481Sgiacomo.travaglini@arm.com  template <typename Function>
18213481Sgiacomo.travaglini@arm.com  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,
18313481Sgiacomo.travaglini@arm.com      A6, A7>& args) {
18413481Sgiacomo.travaglini@arm.com           return function(get<0>(args), get<1>(args), get<2>(args),
18513481Sgiacomo.travaglini@arm.com               get<3>(args), get<4>(args), get<5>(args), get<6>(args));
18613481Sgiacomo.travaglini@arm.com  }
18713481Sgiacomo.travaglini@arm.com
18813481Sgiacomo.travaglini@arm.com  template <class Class, typename MethodPtr>
18913481Sgiacomo.travaglini@arm.com  static R InvokeMethod(Class* obj_ptr,
19013481Sgiacomo.travaglini@arm.com                        MethodPtr method_ptr,
19113481Sgiacomo.travaglini@arm.com                        const ::testing::tuple<A1, A2, A3, A4, A5, A6,
19213481Sgiacomo.travaglini@arm.com                            A7>& args) {
19313481Sgiacomo.travaglini@arm.com           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),
19413481Sgiacomo.travaglini@arm.com               get<2>(args), get<3>(args), get<4>(args), get<5>(args),
19513481Sgiacomo.travaglini@arm.com               get<6>(args));
19613481Sgiacomo.travaglini@arm.com  }
19713481Sgiacomo.travaglini@arm.com};
19813481Sgiacomo.travaglini@arm.com
19913481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1, typename A2, typename A3, typename A4,
20013481Sgiacomo.travaglini@arm.com    typename A5, typename A6, typename A7, typename A8>
20113481Sgiacomo.travaglini@arm.comclass InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> > {
20213481Sgiacomo.travaglini@arm.com public:
20313481Sgiacomo.travaglini@arm.com  template <typename Function>
20413481Sgiacomo.travaglini@arm.com  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,
20513481Sgiacomo.travaglini@arm.com      A6, A7, A8>& args) {
20613481Sgiacomo.travaglini@arm.com           return function(get<0>(args), get<1>(args), get<2>(args),
20713481Sgiacomo.travaglini@arm.com               get<3>(args), get<4>(args), get<5>(args), get<6>(args),
20813481Sgiacomo.travaglini@arm.com               get<7>(args));
20913481Sgiacomo.travaglini@arm.com  }
21013481Sgiacomo.travaglini@arm.com
21113481Sgiacomo.travaglini@arm.com  template <class Class, typename MethodPtr>
21213481Sgiacomo.travaglini@arm.com  static R InvokeMethod(Class* obj_ptr,
21313481Sgiacomo.travaglini@arm.com                        MethodPtr method_ptr,
21413481Sgiacomo.travaglini@arm.com                        const ::testing::tuple<A1, A2, A3, A4, A5, A6, A7,
21513481Sgiacomo.travaglini@arm.com                            A8>& args) {
21613481Sgiacomo.travaglini@arm.com           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),
21713481Sgiacomo.travaglini@arm.com               get<2>(args), get<3>(args), get<4>(args), get<5>(args),
21813481Sgiacomo.travaglini@arm.com               get<6>(args), get<7>(args));
21913481Sgiacomo.travaglini@arm.com  }
22013481Sgiacomo.travaglini@arm.com};
22113481Sgiacomo.travaglini@arm.com
22213481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1, typename A2, typename A3, typename A4,
22313481Sgiacomo.travaglini@arm.com    typename A5, typename A6, typename A7, typename A8, typename A9>
22413481Sgiacomo.travaglini@arm.comclass InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> > {
22513481Sgiacomo.travaglini@arm.com public:
22613481Sgiacomo.travaglini@arm.com  template <typename Function>
22713481Sgiacomo.travaglini@arm.com  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,
22813481Sgiacomo.travaglini@arm.com      A6, A7, A8, A9>& args) {
22913481Sgiacomo.travaglini@arm.com           return function(get<0>(args), get<1>(args), get<2>(args),
23013481Sgiacomo.travaglini@arm.com               get<3>(args), get<4>(args), get<5>(args), get<6>(args),
23113481Sgiacomo.travaglini@arm.com               get<7>(args), get<8>(args));
23213481Sgiacomo.travaglini@arm.com  }
23313481Sgiacomo.travaglini@arm.com
23413481Sgiacomo.travaglini@arm.com  template <class Class, typename MethodPtr>
23513481Sgiacomo.travaglini@arm.com  static R InvokeMethod(Class* obj_ptr,
23613481Sgiacomo.travaglini@arm.com                        MethodPtr method_ptr,
23713481Sgiacomo.travaglini@arm.com                        const ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8,
23813481Sgiacomo.travaglini@arm.com                            A9>& args) {
23913481Sgiacomo.travaglini@arm.com           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),
24013481Sgiacomo.travaglini@arm.com               get<2>(args), get<3>(args), get<4>(args), get<5>(args),
24113481Sgiacomo.travaglini@arm.com               get<6>(args), get<7>(args), get<8>(args));
24213481Sgiacomo.travaglini@arm.com  }
24313481Sgiacomo.travaglini@arm.com};
24413481Sgiacomo.travaglini@arm.com
24513481Sgiacomo.travaglini@arm.comtemplate <typename R, typename A1, typename A2, typename A3, typename A4,
24613481Sgiacomo.travaglini@arm.com    typename A5, typename A6, typename A7, typename A8, typename A9,
24713481Sgiacomo.travaglini@arm.com    typename A10>
24813481Sgiacomo.travaglini@arm.comclass InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,
24913481Sgiacomo.travaglini@arm.com    A10> > {
25013481Sgiacomo.travaglini@arm.com public:
25113481Sgiacomo.travaglini@arm.com  template <typename Function>
25213481Sgiacomo.travaglini@arm.com  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,
25313481Sgiacomo.travaglini@arm.com      A6, A7, A8, A9, A10>& args) {
25413481Sgiacomo.travaglini@arm.com           return function(get<0>(args), get<1>(args), get<2>(args),
25513481Sgiacomo.travaglini@arm.com               get<3>(args), get<4>(args), get<5>(args), get<6>(args),
25613481Sgiacomo.travaglini@arm.com               get<7>(args), get<8>(args), get<9>(args));
25713481Sgiacomo.travaglini@arm.com  }
25813481Sgiacomo.travaglini@arm.com
25913481Sgiacomo.travaglini@arm.com  template <class Class, typename MethodPtr>
26013481Sgiacomo.travaglini@arm.com  static R InvokeMethod(Class* obj_ptr,
26113481Sgiacomo.travaglini@arm.com                        MethodPtr method_ptr,
26213481Sgiacomo.travaglini@arm.com                        const ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8,
26313481Sgiacomo.travaglini@arm.com                            A9, A10>& args) {
26413481Sgiacomo.travaglini@arm.com           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),
26513481Sgiacomo.travaglini@arm.com               get<2>(args), get<3>(args), get<4>(args), get<5>(args),
26613481Sgiacomo.travaglini@arm.com               get<6>(args), get<7>(args), get<8>(args), get<9>(args));
26713481Sgiacomo.travaglini@arm.com  }
26813481Sgiacomo.travaglini@arm.com};
26913481Sgiacomo.travaglini@arm.com
27013481Sgiacomo.travaglini@arm.com// An INTERNAL macro for extracting the type of a tuple field.  It's
27113481Sgiacomo.travaglini@arm.com// subject to change without notice - DO NOT USE IN USER CODE!
27213481Sgiacomo.travaglini@arm.com#define GMOCK_FIELD_(Tuple, N) \
27313481Sgiacomo.travaglini@arm.com    typename ::testing::tuple_element<N, Tuple>::type
27413481Sgiacomo.travaglini@arm.com
27513481Sgiacomo.travaglini@arm.com// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::type is the
27613481Sgiacomo.travaglini@arm.com// type of an n-ary function whose i-th (1-based) argument type is the
27713481Sgiacomo.travaglini@arm.com// k{i}-th (0-based) field of ArgumentTuple, which must be a tuple
27813481Sgiacomo.travaglini@arm.com// type, and whose return type is Result.  For example,
27913481Sgiacomo.travaglini@arm.com//   SelectArgs<int, ::testing::tuple<bool, char, double, long>, 0, 3>::type
28013481Sgiacomo.travaglini@arm.com// is int(bool, long).
28113481Sgiacomo.travaglini@arm.com//
28213481Sgiacomo.travaglini@arm.com// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::Select(args)
28313481Sgiacomo.travaglini@arm.com// returns the selected fields (k1, k2, ..., k_n) of args as a tuple.
28413481Sgiacomo.travaglini@arm.com// For example,
28513481Sgiacomo.travaglini@arm.com//   SelectArgs<int, tuple<bool, char, double>, 2, 0>::Select(
28613481Sgiacomo.travaglini@arm.com//       ::testing::make_tuple(true, 'a', 2.5))
28713481Sgiacomo.travaglini@arm.com// returns tuple (2.5, true).
28813481Sgiacomo.travaglini@arm.com//
28913481Sgiacomo.travaglini@arm.com// The numbers in list k1, k2, ..., k_n must be >= 0, where n can be
29013481Sgiacomo.travaglini@arm.com// in the range [0, 10].  Duplicates are allowed and they don't have
29113481Sgiacomo.travaglini@arm.com// to be in an ascending or descending order.
29213481Sgiacomo.travaglini@arm.com
29313481Sgiacomo.travaglini@arm.comtemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
29413481Sgiacomo.travaglini@arm.com    int k4, int k5, int k6, int k7, int k8, int k9, int k10>
29513481Sgiacomo.travaglini@arm.comclass SelectArgs {
29613481Sgiacomo.travaglini@arm.com public:
29713481Sgiacomo.travaglini@arm.com  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
29813481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
29913481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
30013481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),
30113481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9),
30213481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k10));
30313481Sgiacomo.travaglini@arm.com  typedef typename Function<type>::ArgumentTuple SelectedArgs;
30413481Sgiacomo.travaglini@arm.com  static SelectedArgs Select(const ArgumentTuple& args) {
30513481Sgiacomo.travaglini@arm.com    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
30613481Sgiacomo.travaglini@arm.com        get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),
30713481Sgiacomo.travaglini@arm.com        get<k8>(args), get<k9>(args), get<k10>(args));
30813481Sgiacomo.travaglini@arm.com  }
30913481Sgiacomo.travaglini@arm.com};
31013481Sgiacomo.travaglini@arm.com
31113481Sgiacomo.travaglini@arm.comtemplate <typename Result, typename ArgumentTuple>
31213481Sgiacomo.travaglini@arm.comclass SelectArgs<Result, ArgumentTuple,
31313481Sgiacomo.travaglini@arm.com                 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
31413481Sgiacomo.travaglini@arm.com public:
31513481Sgiacomo.travaglini@arm.com  typedef Result type();
31613481Sgiacomo.travaglini@arm.com  typedef typename Function<type>::ArgumentTuple SelectedArgs;
31713481Sgiacomo.travaglini@arm.com  static SelectedArgs Select(const ArgumentTuple& /* args */) {
31813481Sgiacomo.travaglini@arm.com    return SelectedArgs();
31913481Sgiacomo.travaglini@arm.com  }
32013481Sgiacomo.travaglini@arm.com};
32113481Sgiacomo.travaglini@arm.com
32213481Sgiacomo.travaglini@arm.comtemplate <typename Result, typename ArgumentTuple, int k1>
32313481Sgiacomo.travaglini@arm.comclass SelectArgs<Result, ArgumentTuple,
32413481Sgiacomo.travaglini@arm.com                 k1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
32513481Sgiacomo.travaglini@arm.com public:
32613481Sgiacomo.travaglini@arm.com  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1));
32713481Sgiacomo.travaglini@arm.com  typedef typename Function<type>::ArgumentTuple SelectedArgs;
32813481Sgiacomo.travaglini@arm.com  static SelectedArgs Select(const ArgumentTuple& args) {
32913481Sgiacomo.travaglini@arm.com    return SelectedArgs(get<k1>(args));
33013481Sgiacomo.travaglini@arm.com  }
33113481Sgiacomo.travaglini@arm.com};
33213481Sgiacomo.travaglini@arm.com
33313481Sgiacomo.travaglini@arm.comtemplate <typename Result, typename ArgumentTuple, int k1, int k2>
33413481Sgiacomo.travaglini@arm.comclass SelectArgs<Result, ArgumentTuple,
33513481Sgiacomo.travaglini@arm.com                 k1, k2, -1, -1, -1, -1, -1, -1, -1, -1> {
33613481Sgiacomo.travaglini@arm.com public:
33713481Sgiacomo.travaglini@arm.com  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
33813481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k2));
33913481Sgiacomo.travaglini@arm.com  typedef typename Function<type>::ArgumentTuple SelectedArgs;
34013481Sgiacomo.travaglini@arm.com  static SelectedArgs Select(const ArgumentTuple& args) {
34113481Sgiacomo.travaglini@arm.com    return SelectedArgs(get<k1>(args), get<k2>(args));
34213481Sgiacomo.travaglini@arm.com  }
34313481Sgiacomo.travaglini@arm.com};
34413481Sgiacomo.travaglini@arm.com
34513481Sgiacomo.travaglini@arm.comtemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3>
34613481Sgiacomo.travaglini@arm.comclass SelectArgs<Result, ArgumentTuple,
34713481Sgiacomo.travaglini@arm.com                 k1, k2, k3, -1, -1, -1, -1, -1, -1, -1> {
34813481Sgiacomo.travaglini@arm.com public:
34913481Sgiacomo.travaglini@arm.com  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
35013481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3));
35113481Sgiacomo.travaglini@arm.com  typedef typename Function<type>::ArgumentTuple SelectedArgs;
35213481Sgiacomo.travaglini@arm.com  static SelectedArgs Select(const ArgumentTuple& args) {
35313481Sgiacomo.travaglini@arm.com    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args));
35413481Sgiacomo.travaglini@arm.com  }
35513481Sgiacomo.travaglini@arm.com};
35613481Sgiacomo.travaglini@arm.com
35713481Sgiacomo.travaglini@arm.comtemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
35813481Sgiacomo.travaglini@arm.com    int k4>
35913481Sgiacomo.travaglini@arm.comclass SelectArgs<Result, ArgumentTuple,
36013481Sgiacomo.travaglini@arm.com                 k1, k2, k3, k4, -1, -1, -1, -1, -1, -1> {
36113481Sgiacomo.travaglini@arm.com public:
36213481Sgiacomo.travaglini@arm.com  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
36313481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
36413481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k4));
36513481Sgiacomo.travaglini@arm.com  typedef typename Function<type>::ArgumentTuple SelectedArgs;
36613481Sgiacomo.travaglini@arm.com  static SelectedArgs Select(const ArgumentTuple& args) {
36713481Sgiacomo.travaglini@arm.com    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
36813481Sgiacomo.travaglini@arm.com        get<k4>(args));
36913481Sgiacomo.travaglini@arm.com  }
37013481Sgiacomo.travaglini@arm.com};
37113481Sgiacomo.travaglini@arm.com
37213481Sgiacomo.travaglini@arm.comtemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
37313481Sgiacomo.travaglini@arm.com    int k4, int k5>
37413481Sgiacomo.travaglini@arm.comclass SelectArgs<Result, ArgumentTuple,
37513481Sgiacomo.travaglini@arm.com                 k1, k2, k3, k4, k5, -1, -1, -1, -1, -1> {
37613481Sgiacomo.travaglini@arm.com public:
37713481Sgiacomo.travaglini@arm.com  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
37813481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
37913481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5));
38013481Sgiacomo.travaglini@arm.com  typedef typename Function<type>::ArgumentTuple SelectedArgs;
38113481Sgiacomo.travaglini@arm.com  static SelectedArgs Select(const ArgumentTuple& args) {
38213481Sgiacomo.travaglini@arm.com    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
38313481Sgiacomo.travaglini@arm.com        get<k4>(args), get<k5>(args));
38413481Sgiacomo.travaglini@arm.com  }
38513481Sgiacomo.travaglini@arm.com};
38613481Sgiacomo.travaglini@arm.com
38713481Sgiacomo.travaglini@arm.comtemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
38813481Sgiacomo.travaglini@arm.com    int k4, int k5, int k6>
38913481Sgiacomo.travaglini@arm.comclass SelectArgs<Result, ArgumentTuple,
39013481Sgiacomo.travaglini@arm.com                 k1, k2, k3, k4, k5, k6, -1, -1, -1, -1> {
39113481Sgiacomo.travaglini@arm.com public:
39213481Sgiacomo.travaglini@arm.com  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
39313481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
39413481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
39513481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k6));
39613481Sgiacomo.travaglini@arm.com  typedef typename Function<type>::ArgumentTuple SelectedArgs;
39713481Sgiacomo.travaglini@arm.com  static SelectedArgs Select(const ArgumentTuple& args) {
39813481Sgiacomo.travaglini@arm.com    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
39913481Sgiacomo.travaglini@arm.com        get<k4>(args), get<k5>(args), get<k6>(args));
40013481Sgiacomo.travaglini@arm.com  }
40113481Sgiacomo.travaglini@arm.com};
40213481Sgiacomo.travaglini@arm.com
40313481Sgiacomo.travaglini@arm.comtemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
40413481Sgiacomo.travaglini@arm.com    int k4, int k5, int k6, int k7>
40513481Sgiacomo.travaglini@arm.comclass SelectArgs<Result, ArgumentTuple,
40613481Sgiacomo.travaglini@arm.com                 k1, k2, k3, k4, k5, k6, k7, -1, -1, -1> {
40713481Sgiacomo.travaglini@arm.com public:
40813481Sgiacomo.travaglini@arm.com  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
40913481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
41013481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
41113481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7));
41213481Sgiacomo.travaglini@arm.com  typedef typename Function<type>::ArgumentTuple SelectedArgs;
41313481Sgiacomo.travaglini@arm.com  static SelectedArgs Select(const ArgumentTuple& args) {
41413481Sgiacomo.travaglini@arm.com    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
41513481Sgiacomo.travaglini@arm.com        get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args));
41613481Sgiacomo.travaglini@arm.com  }
41713481Sgiacomo.travaglini@arm.com};
41813481Sgiacomo.travaglini@arm.com
41913481Sgiacomo.travaglini@arm.comtemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
42013481Sgiacomo.travaglini@arm.com    int k4, int k5, int k6, int k7, int k8>
42113481Sgiacomo.travaglini@arm.comclass SelectArgs<Result, ArgumentTuple,
42213481Sgiacomo.travaglini@arm.com                 k1, k2, k3, k4, k5, k6, k7, k8, -1, -1> {
42313481Sgiacomo.travaglini@arm.com public:
42413481Sgiacomo.travaglini@arm.com  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
42513481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
42613481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
42713481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),
42813481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k8));
42913481Sgiacomo.travaglini@arm.com  typedef typename Function<type>::ArgumentTuple SelectedArgs;
43013481Sgiacomo.travaglini@arm.com  static SelectedArgs Select(const ArgumentTuple& args) {
43113481Sgiacomo.travaglini@arm.com    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
43213481Sgiacomo.travaglini@arm.com        get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),
43313481Sgiacomo.travaglini@arm.com        get<k8>(args));
43413481Sgiacomo.travaglini@arm.com  }
43513481Sgiacomo.travaglini@arm.com};
43613481Sgiacomo.travaglini@arm.com
43713481Sgiacomo.travaglini@arm.comtemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
43813481Sgiacomo.travaglini@arm.com    int k4, int k5, int k6, int k7, int k8, int k9>
43913481Sgiacomo.travaglini@arm.comclass SelectArgs<Result, ArgumentTuple,
44013481Sgiacomo.travaglini@arm.com                 k1, k2, k3, k4, k5, k6, k7, k8, k9, -1> {
44113481Sgiacomo.travaglini@arm.com public:
44213481Sgiacomo.travaglini@arm.com  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
44313481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
44413481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
44513481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),
44613481Sgiacomo.travaglini@arm.com      GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9));
44713481Sgiacomo.travaglini@arm.com  typedef typename Function<type>::ArgumentTuple SelectedArgs;
44813481Sgiacomo.travaglini@arm.com  static SelectedArgs Select(const ArgumentTuple& args) {
44913481Sgiacomo.travaglini@arm.com    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
45013481Sgiacomo.travaglini@arm.com        get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),
45113481Sgiacomo.travaglini@arm.com        get<k8>(args), get<k9>(args));
45213481Sgiacomo.travaglini@arm.com  }
45313481Sgiacomo.travaglini@arm.com};
45413481Sgiacomo.travaglini@arm.com
45513481Sgiacomo.travaglini@arm.com#undef GMOCK_FIELD_
45613481Sgiacomo.travaglini@arm.com
45713481Sgiacomo.travaglini@arm.com// Implements the WithArgs action.
45813481Sgiacomo.travaglini@arm.comtemplate <typename InnerAction, int k1 = -1, int k2 = -1, int k3 = -1,
45913481Sgiacomo.travaglini@arm.com    int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,
46013481Sgiacomo.travaglini@arm.com    int k9 = -1, int k10 = -1>
46113481Sgiacomo.travaglini@arm.comclass WithArgsAction {
46213481Sgiacomo.travaglini@arm.com public:
46313481Sgiacomo.travaglini@arm.com  explicit WithArgsAction(const InnerAction& action) : action_(action) {}
46413481Sgiacomo.travaglini@arm.com
46513481Sgiacomo.travaglini@arm.com  template <typename F>
46613481Sgiacomo.travaglini@arm.com  operator Action<F>() const { return MakeAction(new Impl<F>(action_)); }
46713481Sgiacomo.travaglini@arm.com
46813481Sgiacomo.travaglini@arm.com private:
46913481Sgiacomo.travaglini@arm.com  template <typename F>
47013481Sgiacomo.travaglini@arm.com  class Impl : public ActionInterface<F> {
47113481Sgiacomo.travaglini@arm.com   public:
47213481Sgiacomo.travaglini@arm.com    typedef typename Function<F>::Result Result;
47313481Sgiacomo.travaglini@arm.com    typedef typename Function<F>::ArgumentTuple ArgumentTuple;
47413481Sgiacomo.travaglini@arm.com
47513481Sgiacomo.travaglini@arm.com    explicit Impl(const InnerAction& action) : action_(action) {}
47613481Sgiacomo.travaglini@arm.com
47713481Sgiacomo.travaglini@arm.com    virtual Result Perform(const ArgumentTuple& args) {
47813481Sgiacomo.travaglini@arm.com      return action_.Perform(SelectArgs<Result, ArgumentTuple, k1, k2, k3, k4,
47913481Sgiacomo.travaglini@arm.com          k5, k6, k7, k8, k9, k10>::Select(args));
48013481Sgiacomo.travaglini@arm.com    }
48113481Sgiacomo.travaglini@arm.com
48213481Sgiacomo.travaglini@arm.com   private:
48313481Sgiacomo.travaglini@arm.com    typedef typename SelectArgs<Result, ArgumentTuple,
48413481Sgiacomo.travaglini@arm.com        k1, k2, k3, k4, k5, k6, k7, k8, k9, k10>::type InnerFunctionType;
48513481Sgiacomo.travaglini@arm.com
48613481Sgiacomo.travaglini@arm.com    Action<InnerFunctionType> action_;
48713481Sgiacomo.travaglini@arm.com  };
48813481Sgiacomo.travaglini@arm.com
48913481Sgiacomo.travaglini@arm.com  const InnerAction action_;
49013481Sgiacomo.travaglini@arm.com
49113481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_ASSIGN_(WithArgsAction);
49213481Sgiacomo.travaglini@arm.com};
49313481Sgiacomo.travaglini@arm.com
49413481Sgiacomo.travaglini@arm.com// A macro from the ACTION* family (defined later in this file)
49513481Sgiacomo.travaglini@arm.com// defines an action that can be used in a mock function.  Typically,
49613481Sgiacomo.travaglini@arm.com// these actions only care about a subset of the arguments of the mock
49713481Sgiacomo.travaglini@arm.com// function.  For example, if such an action only uses the second
49813481Sgiacomo.travaglini@arm.com// argument, it can be used in any mock function that takes >= 2
49913481Sgiacomo.travaglini@arm.com// arguments where the type of the second argument is compatible.
50013481Sgiacomo.travaglini@arm.com//
50113481Sgiacomo.travaglini@arm.com// Therefore, the action implementation must be prepared to take more
50213481Sgiacomo.travaglini@arm.com// arguments than it needs.  The ExcessiveArg type is used to
50313481Sgiacomo.travaglini@arm.com// represent those excessive arguments.  In order to keep the compiler
50413481Sgiacomo.travaglini@arm.com// error messages tractable, we define it in the testing namespace
50513481Sgiacomo.travaglini@arm.com// instead of testing::internal.  However, this is an INTERNAL TYPE
50613481Sgiacomo.travaglini@arm.com// and subject to change without notice, so a user MUST NOT USE THIS
50713481Sgiacomo.travaglini@arm.com// TYPE DIRECTLY.
50813481Sgiacomo.travaglini@arm.comstruct ExcessiveArg {};
50913481Sgiacomo.travaglini@arm.com
51013481Sgiacomo.travaglini@arm.com// A helper class needed for implementing the ACTION* macros.
51113481Sgiacomo.travaglini@arm.comtemplate <typename Result, class Impl>
51213481Sgiacomo.travaglini@arm.comclass ActionHelper {
51313481Sgiacomo.travaglini@arm.com public:
51413481Sgiacomo.travaglini@arm.com  static Result Perform(Impl* impl, const ::testing::tuple<>& args) {
51513481Sgiacomo.travaglini@arm.com    return impl->template gmock_PerformImpl<>(args, ExcessiveArg(),
51613481Sgiacomo.travaglini@arm.com        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
51713481Sgiacomo.travaglini@arm.com        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
51813481Sgiacomo.travaglini@arm.com        ExcessiveArg());
51913481Sgiacomo.travaglini@arm.com  }
52013481Sgiacomo.travaglini@arm.com
52113481Sgiacomo.travaglini@arm.com  template <typename A0>
52213481Sgiacomo.travaglini@arm.com  static Result Perform(Impl* impl, const ::testing::tuple<A0>& args) {
52313481Sgiacomo.travaglini@arm.com    return impl->template gmock_PerformImpl<A0>(args, get<0>(args),
52413481Sgiacomo.travaglini@arm.com        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
52513481Sgiacomo.travaglini@arm.com        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
52613481Sgiacomo.travaglini@arm.com        ExcessiveArg());
52713481Sgiacomo.travaglini@arm.com  }
52813481Sgiacomo.travaglini@arm.com
52913481Sgiacomo.travaglini@arm.com  template <typename A0, typename A1>
53013481Sgiacomo.travaglini@arm.com  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1>& args) {
53113481Sgiacomo.travaglini@arm.com    return impl->template gmock_PerformImpl<A0, A1>(args, get<0>(args),
53213481Sgiacomo.travaglini@arm.com        get<1>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
53313481Sgiacomo.travaglini@arm.com        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
53413481Sgiacomo.travaglini@arm.com        ExcessiveArg());
53513481Sgiacomo.travaglini@arm.com  }
53613481Sgiacomo.travaglini@arm.com
53713481Sgiacomo.travaglini@arm.com  template <typename A0, typename A1, typename A2>
53813481Sgiacomo.travaglini@arm.com  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2>& args) {
53913481Sgiacomo.travaglini@arm.com    return impl->template gmock_PerformImpl<A0, A1, A2>(args, get<0>(args),
54013481Sgiacomo.travaglini@arm.com        get<1>(args), get<2>(args), ExcessiveArg(), ExcessiveArg(),
54113481Sgiacomo.travaglini@arm.com        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
54213481Sgiacomo.travaglini@arm.com        ExcessiveArg());
54313481Sgiacomo.travaglini@arm.com  }
54413481Sgiacomo.travaglini@arm.com
54513481Sgiacomo.travaglini@arm.com  template <typename A0, typename A1, typename A2, typename A3>
54613481Sgiacomo.travaglini@arm.com  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2,
54713481Sgiacomo.travaglini@arm.com      A3>& args) {
54813481Sgiacomo.travaglini@arm.com    return impl->template gmock_PerformImpl<A0, A1, A2, A3>(args, get<0>(args),
54913481Sgiacomo.travaglini@arm.com        get<1>(args), get<2>(args), get<3>(args), ExcessiveArg(),
55013481Sgiacomo.travaglini@arm.com        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
55113481Sgiacomo.travaglini@arm.com        ExcessiveArg());
55213481Sgiacomo.travaglini@arm.com  }
55313481Sgiacomo.travaglini@arm.com
55413481Sgiacomo.travaglini@arm.com  template <typename A0, typename A1, typename A2, typename A3, typename A4>
55513481Sgiacomo.travaglini@arm.com  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3,
55613481Sgiacomo.travaglini@arm.com      A4>& args) {
55713481Sgiacomo.travaglini@arm.com    return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4>(args,
55813481Sgiacomo.travaglini@arm.com        get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),
55913481Sgiacomo.travaglini@arm.com        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
56013481Sgiacomo.travaglini@arm.com        ExcessiveArg());
56113481Sgiacomo.travaglini@arm.com  }
56213481Sgiacomo.travaglini@arm.com
56313481Sgiacomo.travaglini@arm.com  template <typename A0, typename A1, typename A2, typename A3, typename A4,
56413481Sgiacomo.travaglini@arm.com      typename A5>
56513481Sgiacomo.travaglini@arm.com  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,
56613481Sgiacomo.travaglini@arm.com      A5>& args) {
56713481Sgiacomo.travaglini@arm.com    return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5>(args,
56813481Sgiacomo.travaglini@arm.com        get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),
56913481Sgiacomo.travaglini@arm.com        get<5>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
57013481Sgiacomo.travaglini@arm.com        ExcessiveArg());
57113481Sgiacomo.travaglini@arm.com  }
57213481Sgiacomo.travaglini@arm.com
57313481Sgiacomo.travaglini@arm.com  template <typename A0, typename A1, typename A2, typename A3, typename A4,
57413481Sgiacomo.travaglini@arm.com      typename A5, typename A6>
57513481Sgiacomo.travaglini@arm.com  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,
57613481Sgiacomo.travaglini@arm.com      A5, A6>& args) {
57713481Sgiacomo.travaglini@arm.com    return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6>(args,
57813481Sgiacomo.travaglini@arm.com        get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),
57913481Sgiacomo.travaglini@arm.com        get<5>(args), get<6>(args), ExcessiveArg(), ExcessiveArg(),
58013481Sgiacomo.travaglini@arm.com        ExcessiveArg());
58113481Sgiacomo.travaglini@arm.com  }
58213481Sgiacomo.travaglini@arm.com
58313481Sgiacomo.travaglini@arm.com  template <typename A0, typename A1, typename A2, typename A3, typename A4,
58413481Sgiacomo.travaglini@arm.com      typename A5, typename A6, typename A7>
58513481Sgiacomo.travaglini@arm.com  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,
58613481Sgiacomo.travaglini@arm.com      A5, A6, A7>& args) {
58713481Sgiacomo.travaglini@arm.com    return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6,
58813481Sgiacomo.travaglini@arm.com        A7>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),
58913481Sgiacomo.travaglini@arm.com        get<4>(args), get<5>(args), get<6>(args), get<7>(args), ExcessiveArg(),
59013481Sgiacomo.travaglini@arm.com        ExcessiveArg());
59113481Sgiacomo.travaglini@arm.com  }
59213481Sgiacomo.travaglini@arm.com
59313481Sgiacomo.travaglini@arm.com  template <typename A0, typename A1, typename A2, typename A3, typename A4,
59413481Sgiacomo.travaglini@arm.com      typename A5, typename A6, typename A7, typename A8>
59513481Sgiacomo.travaglini@arm.com  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,
59613481Sgiacomo.travaglini@arm.com      A5, A6, A7, A8>& args) {
59713481Sgiacomo.travaglini@arm.com    return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7,
59813481Sgiacomo.travaglini@arm.com        A8>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),
59913481Sgiacomo.travaglini@arm.com        get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),
60013481Sgiacomo.travaglini@arm.com        ExcessiveArg());
60113481Sgiacomo.travaglini@arm.com  }
60213481Sgiacomo.travaglini@arm.com
60313481Sgiacomo.travaglini@arm.com  template <typename A0, typename A1, typename A2, typename A3, typename A4,
60413481Sgiacomo.travaglini@arm.com      typename A5, typename A6, typename A7, typename A8, typename A9>
60513481Sgiacomo.travaglini@arm.com  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,
60613481Sgiacomo.travaglini@arm.com      A5, A6, A7, A8, A9>& args) {
60713481Sgiacomo.travaglini@arm.com    return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7, A8,
60813481Sgiacomo.travaglini@arm.com        A9>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),
60913481Sgiacomo.travaglini@arm.com        get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),
61013481Sgiacomo.travaglini@arm.com        get<9>(args));
61113481Sgiacomo.travaglini@arm.com  }
61213481Sgiacomo.travaglini@arm.com};
61313481Sgiacomo.travaglini@arm.com
61413481Sgiacomo.travaglini@arm.com}  // namespace internal
61513481Sgiacomo.travaglini@arm.com
61613481Sgiacomo.travaglini@arm.com// Various overloads for Invoke().
61713481Sgiacomo.travaglini@arm.com
61813481Sgiacomo.travaglini@arm.com// WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes
61913481Sgiacomo.travaglini@arm.com// the selected arguments of the mock function to an_action and
62013481Sgiacomo.travaglini@arm.com// performs it.  It serves as an adaptor between actions with
62113481Sgiacomo.travaglini@arm.com// different argument lists.  C++ doesn't support default arguments for
62213481Sgiacomo.travaglini@arm.com// function templates, so we have to overload it.
62313481Sgiacomo.travaglini@arm.comtemplate <int k1, typename InnerAction>
62413481Sgiacomo.travaglini@arm.cominline internal::WithArgsAction<InnerAction, k1>
62513481Sgiacomo.travaglini@arm.comWithArgs(const InnerAction& action) {
62613481Sgiacomo.travaglini@arm.com  return internal::WithArgsAction<InnerAction, k1>(action);
62713481Sgiacomo.travaglini@arm.com}
62813481Sgiacomo.travaglini@arm.com
62913481Sgiacomo.travaglini@arm.comtemplate <int k1, int k2, typename InnerAction>
63013481Sgiacomo.travaglini@arm.cominline internal::WithArgsAction<InnerAction, k1, k2>
63113481Sgiacomo.travaglini@arm.comWithArgs(const InnerAction& action) {
63213481Sgiacomo.travaglini@arm.com  return internal::WithArgsAction<InnerAction, k1, k2>(action);
63313481Sgiacomo.travaglini@arm.com}
63413481Sgiacomo.travaglini@arm.com
63513481Sgiacomo.travaglini@arm.comtemplate <int k1, int k2, int k3, typename InnerAction>
63613481Sgiacomo.travaglini@arm.cominline internal::WithArgsAction<InnerAction, k1, k2, k3>
63713481Sgiacomo.travaglini@arm.comWithArgs(const InnerAction& action) {
63813481Sgiacomo.travaglini@arm.com  return internal::WithArgsAction<InnerAction, k1, k2, k3>(action);
63913481Sgiacomo.travaglini@arm.com}
64013481Sgiacomo.travaglini@arm.com
64113481Sgiacomo.travaglini@arm.comtemplate <int k1, int k2, int k3, int k4, typename InnerAction>
64213481Sgiacomo.travaglini@arm.cominline internal::WithArgsAction<InnerAction, k1, k2, k3, k4>
64313481Sgiacomo.travaglini@arm.comWithArgs(const InnerAction& action) {
64413481Sgiacomo.travaglini@arm.com  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4>(action);
64513481Sgiacomo.travaglini@arm.com}
64613481Sgiacomo.travaglini@arm.com
64713481Sgiacomo.travaglini@arm.comtemplate <int k1, int k2, int k3, int k4, int k5, typename InnerAction>
64813481Sgiacomo.travaglini@arm.cominline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>
64913481Sgiacomo.travaglini@arm.comWithArgs(const InnerAction& action) {
65013481Sgiacomo.travaglini@arm.com  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>(action);
65113481Sgiacomo.travaglini@arm.com}
65213481Sgiacomo.travaglini@arm.com
65313481Sgiacomo.travaglini@arm.comtemplate <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerAction>
65413481Sgiacomo.travaglini@arm.cominline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>
65513481Sgiacomo.travaglini@arm.comWithArgs(const InnerAction& action) {
65613481Sgiacomo.travaglini@arm.com  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>(action);
65713481Sgiacomo.travaglini@arm.com}
65813481Sgiacomo.travaglini@arm.com
65913481Sgiacomo.travaglini@arm.comtemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7,
66013481Sgiacomo.travaglini@arm.com    typename InnerAction>
66113481Sgiacomo.travaglini@arm.cominline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7>
66213481Sgiacomo.travaglini@arm.comWithArgs(const InnerAction& action) {
66313481Sgiacomo.travaglini@arm.com  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6,
66413481Sgiacomo.travaglini@arm.com      k7>(action);
66513481Sgiacomo.travaglini@arm.com}
66613481Sgiacomo.travaglini@arm.com
66713481Sgiacomo.travaglini@arm.comtemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
66813481Sgiacomo.travaglini@arm.com    typename InnerAction>
66913481Sgiacomo.travaglini@arm.cominline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8>
67013481Sgiacomo.travaglini@arm.comWithArgs(const InnerAction& action) {
67113481Sgiacomo.travaglini@arm.com  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7,
67213481Sgiacomo.travaglini@arm.com      k8>(action);
67313481Sgiacomo.travaglini@arm.com}
67413481Sgiacomo.travaglini@arm.com
67513481Sgiacomo.travaglini@arm.comtemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
67613481Sgiacomo.travaglini@arm.com    int k9, typename InnerAction>
67713481Sgiacomo.travaglini@arm.cominline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8, k9>
67813481Sgiacomo.travaglini@arm.comWithArgs(const InnerAction& action) {
67913481Sgiacomo.travaglini@arm.com  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
68013481Sgiacomo.travaglini@arm.com      k9>(action);
68113481Sgiacomo.travaglini@arm.com}
68213481Sgiacomo.travaglini@arm.com
68313481Sgiacomo.travaglini@arm.comtemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
68413481Sgiacomo.travaglini@arm.com    int k9, int k10, typename InnerAction>
68513481Sgiacomo.travaglini@arm.cominline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
68613481Sgiacomo.travaglini@arm.com    k9, k10>
68713481Sgiacomo.travaglini@arm.comWithArgs(const InnerAction& action) {
68813481Sgiacomo.travaglini@arm.com  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
68913481Sgiacomo.travaglini@arm.com      k9, k10>(action);
69013481Sgiacomo.travaglini@arm.com}
69113481Sgiacomo.travaglini@arm.com
69213481Sgiacomo.travaglini@arm.com// Creates an action that does actions a1, a2, ..., sequentially in
69313481Sgiacomo.travaglini@arm.com// each invocation.
69413481Sgiacomo.travaglini@arm.comtemplate <typename Action1, typename Action2>
69513481Sgiacomo.travaglini@arm.cominline internal::DoBothAction<Action1, Action2>
69613481Sgiacomo.travaglini@arm.comDoAll(Action1 a1, Action2 a2) {
69713481Sgiacomo.travaglini@arm.com  return internal::DoBothAction<Action1, Action2>(a1, a2);
69813481Sgiacomo.travaglini@arm.com}
69913481Sgiacomo.travaglini@arm.com
70013481Sgiacomo.travaglini@arm.comtemplate <typename Action1, typename Action2, typename Action3>
70113481Sgiacomo.travaglini@arm.cominline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
70213481Sgiacomo.travaglini@arm.com    Action3> >
70313481Sgiacomo.travaglini@arm.comDoAll(Action1 a1, Action2 a2, Action3 a3) {
70413481Sgiacomo.travaglini@arm.com  return DoAll(a1, DoAll(a2, a3));
70513481Sgiacomo.travaglini@arm.com}
70613481Sgiacomo.travaglini@arm.com
70713481Sgiacomo.travaglini@arm.comtemplate <typename Action1, typename Action2, typename Action3,
70813481Sgiacomo.travaglini@arm.com    typename Action4>
70913481Sgiacomo.travaglini@arm.cominline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
71013481Sgiacomo.travaglini@arm.com    internal::DoBothAction<Action3, Action4> > >
71113481Sgiacomo.travaglini@arm.comDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4) {
71213481Sgiacomo.travaglini@arm.com  return DoAll(a1, DoAll(a2, a3, a4));
71313481Sgiacomo.travaglini@arm.com}
71413481Sgiacomo.travaglini@arm.com
71513481Sgiacomo.travaglini@arm.comtemplate <typename Action1, typename Action2, typename Action3,
71613481Sgiacomo.travaglini@arm.com    typename Action4, typename Action5>
71713481Sgiacomo.travaglini@arm.cominline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
71813481Sgiacomo.travaglini@arm.com    internal::DoBothAction<Action3, internal::DoBothAction<Action4,
71913481Sgiacomo.travaglini@arm.com    Action5> > > >
72013481Sgiacomo.travaglini@arm.comDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5) {
72113481Sgiacomo.travaglini@arm.com  return DoAll(a1, DoAll(a2, a3, a4, a5));
72213481Sgiacomo.travaglini@arm.com}
72313481Sgiacomo.travaglini@arm.com
72413481Sgiacomo.travaglini@arm.comtemplate <typename Action1, typename Action2, typename Action3,
72513481Sgiacomo.travaglini@arm.com    typename Action4, typename Action5, typename Action6>
72613481Sgiacomo.travaglini@arm.cominline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
72713481Sgiacomo.travaglini@arm.com    internal::DoBothAction<Action3, internal::DoBothAction<Action4,
72813481Sgiacomo.travaglini@arm.com    internal::DoBothAction<Action5, Action6> > > > >
72913481Sgiacomo.travaglini@arm.comDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6) {
73013481Sgiacomo.travaglini@arm.com  return DoAll(a1, DoAll(a2, a3, a4, a5, a6));
73113481Sgiacomo.travaglini@arm.com}
73213481Sgiacomo.travaglini@arm.com
73313481Sgiacomo.travaglini@arm.comtemplate <typename Action1, typename Action2, typename Action3,
73413481Sgiacomo.travaglini@arm.com    typename Action4, typename Action5, typename Action6, typename Action7>
73513481Sgiacomo.travaglini@arm.cominline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
73613481Sgiacomo.travaglini@arm.com    internal::DoBothAction<Action3, internal::DoBothAction<Action4,
73713481Sgiacomo.travaglini@arm.com    internal::DoBothAction<Action5, internal::DoBothAction<Action6,
73813481Sgiacomo.travaglini@arm.com    Action7> > > > > >
73913481Sgiacomo.travaglini@arm.comDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
74013481Sgiacomo.travaglini@arm.com    Action7 a7) {
74113481Sgiacomo.travaglini@arm.com  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7));
74213481Sgiacomo.travaglini@arm.com}
74313481Sgiacomo.travaglini@arm.com
74413481Sgiacomo.travaglini@arm.comtemplate <typename Action1, typename Action2, typename Action3,
74513481Sgiacomo.travaglini@arm.com    typename Action4, typename Action5, typename Action6, typename Action7,
74613481Sgiacomo.travaglini@arm.com    typename Action8>
74713481Sgiacomo.travaglini@arm.cominline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
74813481Sgiacomo.travaglini@arm.com    internal::DoBothAction<Action3, internal::DoBothAction<Action4,
74913481Sgiacomo.travaglini@arm.com    internal::DoBothAction<Action5, internal::DoBothAction<Action6,
75013481Sgiacomo.travaglini@arm.com    internal::DoBothAction<Action7, Action8> > > > > > >
75113481Sgiacomo.travaglini@arm.comDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
75213481Sgiacomo.travaglini@arm.com    Action7 a7, Action8 a8) {
75313481Sgiacomo.travaglini@arm.com  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8));
75413481Sgiacomo.travaglini@arm.com}
75513481Sgiacomo.travaglini@arm.com
75613481Sgiacomo.travaglini@arm.comtemplate <typename Action1, typename Action2, typename Action3,
75713481Sgiacomo.travaglini@arm.com    typename Action4, typename Action5, typename Action6, typename Action7,
75813481Sgiacomo.travaglini@arm.com    typename Action8, typename Action9>
75913481Sgiacomo.travaglini@arm.cominline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
76013481Sgiacomo.travaglini@arm.com    internal::DoBothAction<Action3, internal::DoBothAction<Action4,
76113481Sgiacomo.travaglini@arm.com    internal::DoBothAction<Action5, internal::DoBothAction<Action6,
76213481Sgiacomo.travaglini@arm.com    internal::DoBothAction<Action7, internal::DoBothAction<Action8,
76313481Sgiacomo.travaglini@arm.com    Action9> > > > > > > >
76413481Sgiacomo.travaglini@arm.comDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
76513481Sgiacomo.travaglini@arm.com    Action7 a7, Action8 a8, Action9 a9) {
76613481Sgiacomo.travaglini@arm.com  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9));
76713481Sgiacomo.travaglini@arm.com}
76813481Sgiacomo.travaglini@arm.com
76913481Sgiacomo.travaglini@arm.comtemplate <typename Action1, typename Action2, typename Action3,
77013481Sgiacomo.travaglini@arm.com    typename Action4, typename Action5, typename Action6, typename Action7,
77113481Sgiacomo.travaglini@arm.com    typename Action8, typename Action9, typename Action10>
77213481Sgiacomo.travaglini@arm.cominline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
77313481Sgiacomo.travaglini@arm.com    internal::DoBothAction<Action3, internal::DoBothAction<Action4,
77413481Sgiacomo.travaglini@arm.com    internal::DoBothAction<Action5, internal::DoBothAction<Action6,
77513481Sgiacomo.travaglini@arm.com    internal::DoBothAction<Action7, internal::DoBothAction<Action8,
77613481Sgiacomo.travaglini@arm.com    internal::DoBothAction<Action9, Action10> > > > > > > > >
77713481Sgiacomo.travaglini@arm.comDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
77813481Sgiacomo.travaglini@arm.com    Action7 a7, Action8 a8, Action9 a9, Action10 a10) {
77913481Sgiacomo.travaglini@arm.com  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9, a10));
78013481Sgiacomo.travaglini@arm.com}
78113481Sgiacomo.travaglini@arm.com
78213481Sgiacomo.travaglini@arm.com}  // namespace testing
78313481Sgiacomo.travaglini@arm.com
78413481Sgiacomo.travaglini@arm.com// The ACTION* family of macros can be used in a namespace scope to
78513481Sgiacomo.travaglini@arm.com// define custom actions easily.  The syntax:
78613481Sgiacomo.travaglini@arm.com//
78713481Sgiacomo.travaglini@arm.com//   ACTION(name) { statements; }
78813481Sgiacomo.travaglini@arm.com//
78913481Sgiacomo.travaglini@arm.com// will define an action with the given name that executes the
79013481Sgiacomo.travaglini@arm.com// statements.  The value returned by the statements will be used as
79113481Sgiacomo.travaglini@arm.com// the return value of the action.  Inside the statements, you can
79213481Sgiacomo.travaglini@arm.com// refer to the K-th (0-based) argument of the mock function by
79313481Sgiacomo.travaglini@arm.com// 'argK', and refer to its type by 'argK_type'.  For example:
79413481Sgiacomo.travaglini@arm.com//
79513481Sgiacomo.travaglini@arm.com//   ACTION(IncrementArg1) {
79613481Sgiacomo.travaglini@arm.com//     arg1_type temp = arg1;
79713481Sgiacomo.travaglini@arm.com//     return ++(*temp);
79813481Sgiacomo.travaglini@arm.com//   }
79913481Sgiacomo.travaglini@arm.com//
80013481Sgiacomo.travaglini@arm.com// allows you to write
80113481Sgiacomo.travaglini@arm.com//
80213481Sgiacomo.travaglini@arm.com//   ...WillOnce(IncrementArg1());
80313481Sgiacomo.travaglini@arm.com//
80413481Sgiacomo.travaglini@arm.com// You can also refer to the entire argument tuple and its type by
80513481Sgiacomo.travaglini@arm.com// 'args' and 'args_type', and refer to the mock function type and its
80613481Sgiacomo.travaglini@arm.com// return type by 'function_type' and 'return_type'.
80713481Sgiacomo.travaglini@arm.com//
80813481Sgiacomo.travaglini@arm.com// Note that you don't need to specify the types of the mock function
80913481Sgiacomo.travaglini@arm.com// arguments.  However rest assured that your code is still type-safe:
81013481Sgiacomo.travaglini@arm.com// you'll get a compiler error if *arg1 doesn't support the ++
81113481Sgiacomo.travaglini@arm.com// operator, or if the type of ++(*arg1) isn't compatible with the
81213481Sgiacomo.travaglini@arm.com// mock function's return type, for example.
81313481Sgiacomo.travaglini@arm.com//
81413481Sgiacomo.travaglini@arm.com// Sometimes you'll want to parameterize the action.   For that you can use
81513481Sgiacomo.travaglini@arm.com// another macro:
81613481Sgiacomo.travaglini@arm.com//
81713481Sgiacomo.travaglini@arm.com//   ACTION_P(name, param_name) { statements; }
81813481Sgiacomo.travaglini@arm.com//
81913481Sgiacomo.travaglini@arm.com// For example:
82013481Sgiacomo.travaglini@arm.com//
82113481Sgiacomo.travaglini@arm.com//   ACTION_P(Add, n) { return arg0 + n; }
82213481Sgiacomo.travaglini@arm.com//
82313481Sgiacomo.travaglini@arm.com// will allow you to write:
82413481Sgiacomo.travaglini@arm.com//
82513481Sgiacomo.travaglini@arm.com//   ...WillOnce(Add(5));
82613481Sgiacomo.travaglini@arm.com//
82713481Sgiacomo.travaglini@arm.com// Note that you don't need to provide the type of the parameter
82813481Sgiacomo.travaglini@arm.com// either.  If you need to reference the type of a parameter named
82913481Sgiacomo.travaglini@arm.com// 'foo', you can write 'foo_type'.  For example, in the body of
83013481Sgiacomo.travaglini@arm.com// ACTION_P(Add, n) above, you can write 'n_type' to refer to the type
83113481Sgiacomo.travaglini@arm.com// of 'n'.
83213481Sgiacomo.travaglini@arm.com//
83313481Sgiacomo.travaglini@arm.com// We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P10 to support
83413481Sgiacomo.travaglini@arm.com// multi-parameter actions.
83513481Sgiacomo.travaglini@arm.com//
83613481Sgiacomo.travaglini@arm.com// For the purpose of typing, you can view
83713481Sgiacomo.travaglini@arm.com//
83813481Sgiacomo.travaglini@arm.com//   ACTION_Pk(Foo, p1, ..., pk) { ... }
83913481Sgiacomo.travaglini@arm.com//
84013481Sgiacomo.travaglini@arm.com// as shorthand for
84113481Sgiacomo.travaglini@arm.com//
84213481Sgiacomo.travaglini@arm.com//   template <typename p1_type, ..., typename pk_type>
84313481Sgiacomo.travaglini@arm.com//   FooActionPk<p1_type, ..., pk_type> Foo(p1_type p1, ..., pk_type pk) { ... }
84413481Sgiacomo.travaglini@arm.com//
84513481Sgiacomo.travaglini@arm.com// In particular, you can provide the template type arguments
84613481Sgiacomo.travaglini@arm.com// explicitly when invoking Foo(), as in Foo<long, bool>(5, false);
84713481Sgiacomo.travaglini@arm.com// although usually you can rely on the compiler to infer the types
84813481Sgiacomo.travaglini@arm.com// for you automatically.  You can assign the result of expression
84913481Sgiacomo.travaglini@arm.com// Foo(p1, ..., pk) to a variable of type FooActionPk<p1_type, ...,
85013481Sgiacomo.travaglini@arm.com// pk_type>.  This can be useful when composing actions.
85113481Sgiacomo.travaglini@arm.com//
85213481Sgiacomo.travaglini@arm.com// You can also overload actions with different numbers of parameters:
85313481Sgiacomo.travaglini@arm.com//
85413481Sgiacomo.travaglini@arm.com//   ACTION_P(Plus, a) { ... }
85513481Sgiacomo.travaglini@arm.com//   ACTION_P2(Plus, a, b) { ... }
85613481Sgiacomo.travaglini@arm.com//
85713481Sgiacomo.travaglini@arm.com// While it's tempting to always use the ACTION* macros when defining
85813481Sgiacomo.travaglini@arm.com// a new action, you should also consider implementing ActionInterface
85913481Sgiacomo.travaglini@arm.com// or using MakePolymorphicAction() instead, especially if you need to
86013481Sgiacomo.travaglini@arm.com// use the action a lot.  While these approaches require more work,
86113481Sgiacomo.travaglini@arm.com// they give you more control on the types of the mock function
86213481Sgiacomo.travaglini@arm.com// arguments and the action parameters, which in general leads to
86313481Sgiacomo.travaglini@arm.com// better compiler error messages that pay off in the long run.  They
86413481Sgiacomo.travaglini@arm.com// also allow overloading actions based on parameter types (as opposed
86513481Sgiacomo.travaglini@arm.com// to just based on the number of parameters).
86613481Sgiacomo.travaglini@arm.com//
86713481Sgiacomo.travaglini@arm.com// CAVEAT:
86813481Sgiacomo.travaglini@arm.com//
86913481Sgiacomo.travaglini@arm.com// ACTION*() can only be used in a namespace scope.  The reason is
87013481Sgiacomo.travaglini@arm.com// that C++ doesn't yet allow function-local types to be used to
87113481Sgiacomo.travaglini@arm.com// instantiate templates.  The up-coming C++0x standard will fix this.
87213481Sgiacomo.travaglini@arm.com// Once that's done, we'll consider supporting using ACTION*() inside
87313481Sgiacomo.travaglini@arm.com// a function.
87413481Sgiacomo.travaglini@arm.com//
87513481Sgiacomo.travaglini@arm.com// MORE INFORMATION:
87613481Sgiacomo.travaglini@arm.com//
87713481Sgiacomo.travaglini@arm.com// To learn more about using these macros, please search for 'ACTION'
87813481Sgiacomo.travaglini@arm.com// on http://code.google.com/p/googlemock/wiki/CookBook.
87913481Sgiacomo.travaglini@arm.com
88013481Sgiacomo.travaglini@arm.com// An internal macro needed for implementing ACTION*().
88113481Sgiacomo.travaglini@arm.com#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\
88213481Sgiacomo.travaglini@arm.com    const args_type& args GTEST_ATTRIBUTE_UNUSED_, \
88313481Sgiacomo.travaglini@arm.com    arg0_type arg0 GTEST_ATTRIBUTE_UNUSED_, \
88413481Sgiacomo.travaglini@arm.com    arg1_type arg1 GTEST_ATTRIBUTE_UNUSED_, \
88513481Sgiacomo.travaglini@arm.com    arg2_type arg2 GTEST_ATTRIBUTE_UNUSED_, \
88613481Sgiacomo.travaglini@arm.com    arg3_type arg3 GTEST_ATTRIBUTE_UNUSED_, \
88713481Sgiacomo.travaglini@arm.com    arg4_type arg4 GTEST_ATTRIBUTE_UNUSED_, \
88813481Sgiacomo.travaglini@arm.com    arg5_type arg5 GTEST_ATTRIBUTE_UNUSED_, \
88913481Sgiacomo.travaglini@arm.com    arg6_type arg6 GTEST_ATTRIBUTE_UNUSED_, \
89013481Sgiacomo.travaglini@arm.com    arg7_type arg7 GTEST_ATTRIBUTE_UNUSED_, \
89113481Sgiacomo.travaglini@arm.com    arg8_type arg8 GTEST_ATTRIBUTE_UNUSED_, \
89213481Sgiacomo.travaglini@arm.com    arg9_type arg9 GTEST_ATTRIBUTE_UNUSED_
89313481Sgiacomo.travaglini@arm.com
89413481Sgiacomo.travaglini@arm.com// Sometimes you want to give an action explicit template parameters
89513481Sgiacomo.travaglini@arm.com// that cannot be inferred from its value parameters.  ACTION() and
89613481Sgiacomo.travaglini@arm.com// ACTION_P*() don't support that.  ACTION_TEMPLATE() remedies that
89713481Sgiacomo.travaglini@arm.com// and can be viewed as an extension to ACTION() and ACTION_P*().
89813481Sgiacomo.travaglini@arm.com//
89913481Sgiacomo.travaglini@arm.com// The syntax:
90013481Sgiacomo.travaglini@arm.com//
90113481Sgiacomo.travaglini@arm.com//   ACTION_TEMPLATE(ActionName,
90213481Sgiacomo.travaglini@arm.com//                   HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m),
90313481Sgiacomo.travaglini@arm.com//                   AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; }
90413481Sgiacomo.travaglini@arm.com//
90513481Sgiacomo.travaglini@arm.com// defines an action template that takes m explicit template
90613481Sgiacomo.travaglini@arm.com// parameters and n value parameters.  name_i is the name of the i-th
90713481Sgiacomo.travaglini@arm.com// template parameter, and kind_i specifies whether it's a typename,
90813481Sgiacomo.travaglini@arm.com// an integral constant, or a template.  p_i is the name of the i-th
90913481Sgiacomo.travaglini@arm.com// value parameter.
91013481Sgiacomo.travaglini@arm.com//
91113481Sgiacomo.travaglini@arm.com// Example:
91213481Sgiacomo.travaglini@arm.com//
91313481Sgiacomo.travaglini@arm.com//   // DuplicateArg<k, T>(output) converts the k-th argument of the mock
91413481Sgiacomo.travaglini@arm.com//   // function to type T and copies it to *output.
91513481Sgiacomo.travaglini@arm.com//   ACTION_TEMPLATE(DuplicateArg,
91613481Sgiacomo.travaglini@arm.com//                   HAS_2_TEMPLATE_PARAMS(int, k, typename, T),
91713481Sgiacomo.travaglini@arm.com//                   AND_1_VALUE_PARAMS(output)) {
91813481Sgiacomo.travaglini@arm.com//     *output = T(::testing::get<k>(args));
91913481Sgiacomo.travaglini@arm.com//   }
92013481Sgiacomo.travaglini@arm.com//   ...
92113481Sgiacomo.travaglini@arm.com//     int n;
92213481Sgiacomo.travaglini@arm.com//     EXPECT_CALL(mock, Foo(_, _))
92313481Sgiacomo.travaglini@arm.com//         .WillOnce(DuplicateArg<1, unsigned char>(&n));
92413481Sgiacomo.travaglini@arm.com//
92513481Sgiacomo.travaglini@arm.com// To create an instance of an action template, write:
92613481Sgiacomo.travaglini@arm.com//
92713481Sgiacomo.travaglini@arm.com//   ActionName<t1, ..., t_m>(v1, ..., v_n)
92813481Sgiacomo.travaglini@arm.com//
92913481Sgiacomo.travaglini@arm.com// where the ts are the template arguments and the vs are the value
93013481Sgiacomo.travaglini@arm.com// arguments.  The value argument types are inferred by the compiler.
93113481Sgiacomo.travaglini@arm.com// If you want to explicitly specify the value argument types, you can
93213481Sgiacomo.travaglini@arm.com// provide additional template arguments:
93313481Sgiacomo.travaglini@arm.com//
93413481Sgiacomo.travaglini@arm.com//   ActionName<t1, ..., t_m, u1, ..., u_k>(v1, ..., v_n)
93513481Sgiacomo.travaglini@arm.com//
93613481Sgiacomo.travaglini@arm.com// where u_i is the desired type of v_i.
93713481Sgiacomo.travaglini@arm.com//
93813481Sgiacomo.travaglini@arm.com// ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the
93913481Sgiacomo.travaglini@arm.com// number of value parameters, but not on the number of template
94013481Sgiacomo.travaglini@arm.com// parameters.  Without the restriction, the meaning of the following
94113481Sgiacomo.travaglini@arm.com// is unclear:
94213481Sgiacomo.travaglini@arm.com//
94313481Sgiacomo.travaglini@arm.com//   OverloadedAction<int, bool>(x);
94413481Sgiacomo.travaglini@arm.com//
94513481Sgiacomo.travaglini@arm.com// Are we using a single-template-parameter action where 'bool' refers
94613481Sgiacomo.travaglini@arm.com// to the type of x, or are we using a two-template-parameter action
94713481Sgiacomo.travaglini@arm.com// where the compiler is asked to infer the type of x?
94813481Sgiacomo.travaglini@arm.com//
94913481Sgiacomo.travaglini@arm.com// Implementation notes:
95013481Sgiacomo.travaglini@arm.com//
95113481Sgiacomo.travaglini@arm.com// GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and
95213481Sgiacomo.travaglini@arm.com// GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for
95313481Sgiacomo.travaglini@arm.com// implementing ACTION_TEMPLATE.  The main trick we use is to create
95413481Sgiacomo.travaglini@arm.com// new macro invocations when expanding a macro.  For example, we have
95513481Sgiacomo.travaglini@arm.com//
95613481Sgiacomo.travaglini@arm.com//   #define ACTION_TEMPLATE(name, template_params, value_params)
95713481Sgiacomo.travaglini@arm.com//       ... GMOCK_INTERNAL_DECL_##template_params ...
95813481Sgiacomo.travaglini@arm.com//
95913481Sgiacomo.travaglini@arm.com// which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...)
96013481Sgiacomo.travaglini@arm.com// to expand to
96113481Sgiacomo.travaglini@arm.com//
96213481Sgiacomo.travaglini@arm.com//       ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ...
96313481Sgiacomo.travaglini@arm.com//
96413481Sgiacomo.travaglini@arm.com// Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the
96513481Sgiacomo.travaglini@arm.com// preprocessor will continue to expand it to
96613481Sgiacomo.travaglini@arm.com//
96713481Sgiacomo.travaglini@arm.com//       ... typename T ...
96813481Sgiacomo.travaglini@arm.com//
96913481Sgiacomo.travaglini@arm.com// This technique conforms to the C++ standard and is portable.  It
97013481Sgiacomo.travaglini@arm.com// allows us to implement action templates using O(N) code, where N is
97113481Sgiacomo.travaglini@arm.com// the maximum number of template/value parameters supported.  Without
97213481Sgiacomo.travaglini@arm.com// using it, we'd have to devote O(N^2) amount of code to implement all
97313481Sgiacomo.travaglini@arm.com// combinations of m and n.
97413481Sgiacomo.travaglini@arm.com
97513481Sgiacomo.travaglini@arm.com// Declares the template parameters.
97613481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(kind0, name0) kind0 name0
97713481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \
97813481Sgiacomo.travaglini@arm.com    name1) kind0 name0, kind1 name1
97913481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
98013481Sgiacomo.travaglini@arm.com    kind2, name2) kind0 name0, kind1 name1, kind2 name2
98113481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
98213481Sgiacomo.travaglini@arm.com    kind2, name2, kind3, name3) kind0 name0, kind1 name1, kind2 name2, \
98313481Sgiacomo.travaglini@arm.com    kind3 name3
98413481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
98513481Sgiacomo.travaglini@arm.com    kind2, name2, kind3, name3, kind4, name4) kind0 name0, kind1 name1, \
98613481Sgiacomo.travaglini@arm.com    kind2 name2, kind3 name3, kind4 name4
98713481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
98813481Sgiacomo.travaglini@arm.com    kind2, name2, kind3, name3, kind4, name4, kind5, name5) kind0 name0, \
98913481Sgiacomo.travaglini@arm.com    kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5
99013481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
99113481Sgiacomo.travaglini@arm.com    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
99213481Sgiacomo.travaglini@arm.com    name6) kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4, \
99313481Sgiacomo.travaglini@arm.com    kind5 name5, kind6 name6
99413481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
99513481Sgiacomo.travaglini@arm.com    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
99613481Sgiacomo.travaglini@arm.com    kind7, name7) kind0 name0, kind1 name1, kind2 name2, kind3 name3, \
99713481Sgiacomo.travaglini@arm.com    kind4 name4, kind5 name5, kind6 name6, kind7 name7
99813481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
99913481Sgiacomo.travaglini@arm.com    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
100013481Sgiacomo.travaglini@arm.com    kind7, name7, kind8, name8) kind0 name0, kind1 name1, kind2 name2, \
100113481Sgiacomo.travaglini@arm.com    kind3 name3, kind4 name4, kind5 name5, kind6 name6, kind7 name7, \
100213481Sgiacomo.travaglini@arm.com    kind8 name8
100313481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \
100413481Sgiacomo.travaglini@arm.com    name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
100513481Sgiacomo.travaglini@arm.com    name6, kind7, name7, kind8, name8, kind9, name9) kind0 name0, \
100613481Sgiacomo.travaglini@arm.com    kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5, \
100713481Sgiacomo.travaglini@arm.com    kind6 name6, kind7 name7, kind8 name8, kind9 name9
100813481Sgiacomo.travaglini@arm.com
100913481Sgiacomo.travaglini@arm.com// Lists the template parameters.
101013481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_HAS_1_TEMPLATE_PARAMS(kind0, name0) name0
101113481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \
101213481Sgiacomo.travaglini@arm.com    name1) name0, name1
101313481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
101413481Sgiacomo.travaglini@arm.com    kind2, name2) name0, name1, name2
101513481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
101613481Sgiacomo.travaglini@arm.com    kind2, name2, kind3, name3) name0, name1, name2, name3
101713481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
101813481Sgiacomo.travaglini@arm.com    kind2, name2, kind3, name3, kind4, name4) name0, name1, name2, name3, \
101913481Sgiacomo.travaglini@arm.com    name4
102013481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
102113481Sgiacomo.travaglini@arm.com    kind2, name2, kind3, name3, kind4, name4, kind5, name5) name0, name1, \
102213481Sgiacomo.travaglini@arm.com    name2, name3, name4, name5
102313481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
102413481Sgiacomo.travaglini@arm.com    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
102513481Sgiacomo.travaglini@arm.com    name6) name0, name1, name2, name3, name4, name5, name6
102613481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
102713481Sgiacomo.travaglini@arm.com    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
102813481Sgiacomo.travaglini@arm.com    kind7, name7) name0, name1, name2, name3, name4, name5, name6, name7
102913481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
103013481Sgiacomo.travaglini@arm.com    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
103113481Sgiacomo.travaglini@arm.com    kind7, name7, kind8, name8) name0, name1, name2, name3, name4, name5, \
103213481Sgiacomo.travaglini@arm.com    name6, name7, name8
103313481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \
103413481Sgiacomo.travaglini@arm.com    name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
103513481Sgiacomo.travaglini@arm.com    name6, kind7, name7, kind8, name8, kind9, name9) name0, name1, name2, \
103613481Sgiacomo.travaglini@arm.com    name3, name4, name5, name6, name7, name8, name9
103713481Sgiacomo.travaglini@arm.com
103813481Sgiacomo.travaglini@arm.com// Declares the types of value parameters.
103913481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_TYPE_AND_0_VALUE_PARAMS()
104013481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_TYPE_AND_1_VALUE_PARAMS(p0) , typename p0##_type
104113481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_TYPE_AND_2_VALUE_PARAMS(p0, p1) , \
104213481Sgiacomo.travaglini@arm.com    typename p0##_type, typename p1##_type
104313481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , \
104413481Sgiacomo.travaglini@arm.com    typename p0##_type, typename p1##_type, typename p2##_type
104513481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \
104613481Sgiacomo.travaglini@arm.com    typename p0##_type, typename p1##_type, typename p2##_type, \
104713481Sgiacomo.travaglini@arm.com    typename p3##_type
104813481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \
104913481Sgiacomo.travaglini@arm.com    typename p0##_type, typename p1##_type, typename p2##_type, \
105013481Sgiacomo.travaglini@arm.com    typename p3##_type, typename p4##_type
105113481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \
105213481Sgiacomo.travaglini@arm.com    typename p0##_type, typename p1##_type, typename p2##_type, \
105313481Sgiacomo.travaglini@arm.com    typename p3##_type, typename p4##_type, typename p5##_type
105413481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
105513481Sgiacomo.travaglini@arm.com    p6) , typename p0##_type, typename p1##_type, typename p2##_type, \
105613481Sgiacomo.travaglini@arm.com    typename p3##_type, typename p4##_type, typename p5##_type, \
105713481Sgiacomo.travaglini@arm.com    typename p6##_type
105813481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
105913481Sgiacomo.travaglini@arm.com    p6, p7) , typename p0##_type, typename p1##_type, typename p2##_type, \
106013481Sgiacomo.travaglini@arm.com    typename p3##_type, typename p4##_type, typename p5##_type, \
106113481Sgiacomo.travaglini@arm.com    typename p6##_type, typename p7##_type
106213481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
106313481Sgiacomo.travaglini@arm.com    p6, p7, p8) , typename p0##_type, typename p1##_type, typename p2##_type, \
106413481Sgiacomo.travaglini@arm.com    typename p3##_type, typename p4##_type, typename p5##_type, \
106513481Sgiacomo.travaglini@arm.com    typename p6##_type, typename p7##_type, typename p8##_type
106613481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
106713481Sgiacomo.travaglini@arm.com    p6, p7, p8, p9) , typename p0##_type, typename p1##_type, \
106813481Sgiacomo.travaglini@arm.com    typename p2##_type, typename p3##_type, typename p4##_type, \
106913481Sgiacomo.travaglini@arm.com    typename p5##_type, typename p6##_type, typename p7##_type, \
107013481Sgiacomo.travaglini@arm.com    typename p8##_type, typename p9##_type
107113481Sgiacomo.travaglini@arm.com
107213481Sgiacomo.travaglini@arm.com// Initializes the value parameters.
107313481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_INIT_AND_0_VALUE_PARAMS()\
107413481Sgiacomo.travaglini@arm.com    ()
107513481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_INIT_AND_1_VALUE_PARAMS(p0)\
107613481Sgiacomo.travaglini@arm.com    (p0##_type gmock_p0) : p0(gmock_p0)
107713481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_INIT_AND_2_VALUE_PARAMS(p0, p1)\
107813481Sgiacomo.travaglini@arm.com    (p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), p1(gmock_p1)
107913481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_INIT_AND_3_VALUE_PARAMS(p0, p1, p2)\
108013481Sgiacomo.travaglini@arm.com    (p0##_type gmock_p0, p1##_type gmock_p1, \
108113481Sgiacomo.travaglini@arm.com        p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2)
108213481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_INIT_AND_4_VALUE_PARAMS(p0, p1, p2, p3)\
108313481Sgiacomo.travaglini@arm.com    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
108413481Sgiacomo.travaglini@arm.com        p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
108513481Sgiacomo.travaglini@arm.com        p3(gmock_p3)
108613481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_INIT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)\
108713481Sgiacomo.travaglini@arm.com    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
108813481Sgiacomo.travaglini@arm.com        p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), \
108913481Sgiacomo.travaglini@arm.com        p2(gmock_p2), p3(gmock_p3), p4(gmock_p4)
109013481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_INIT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)\
109113481Sgiacomo.travaglini@arm.com    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
109213481Sgiacomo.travaglini@arm.com        p3##_type gmock_p3, p4##_type gmock_p4, \
109313481Sgiacomo.travaglini@arm.com        p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
109413481Sgiacomo.travaglini@arm.com        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5)
109513481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_INIT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)\
109613481Sgiacomo.travaglini@arm.com    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
109713481Sgiacomo.travaglini@arm.com        p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
109813481Sgiacomo.travaglini@arm.com        p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
109913481Sgiacomo.travaglini@arm.com        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6)
110013481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_INIT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)\
110113481Sgiacomo.travaglini@arm.com    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
110213481Sgiacomo.travaglini@arm.com        p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
110313481Sgiacomo.travaglini@arm.com        p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), \
110413481Sgiacomo.travaglini@arm.com        p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
110513481Sgiacomo.travaglini@arm.com        p7(gmock_p7)
110613481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_INIT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
110713481Sgiacomo.travaglini@arm.com    p7, p8)\
110813481Sgiacomo.travaglini@arm.com    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
110913481Sgiacomo.travaglini@arm.com        p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
111013481Sgiacomo.travaglini@arm.com        p6##_type gmock_p6, p7##_type gmock_p7, \
111113481Sgiacomo.travaglini@arm.com        p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
111213481Sgiacomo.travaglini@arm.com        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
111313481Sgiacomo.travaglini@arm.com        p8(gmock_p8)
111413481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_INIT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
111513481Sgiacomo.travaglini@arm.com    p7, p8, p9)\
111613481Sgiacomo.travaglini@arm.com    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
111713481Sgiacomo.travaglini@arm.com        p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
111813481Sgiacomo.travaglini@arm.com        p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \
111913481Sgiacomo.travaglini@arm.com        p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
112013481Sgiacomo.travaglini@arm.com        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
112113481Sgiacomo.travaglini@arm.com        p8(gmock_p8), p9(gmock_p9)
112213481Sgiacomo.travaglini@arm.com
112313481Sgiacomo.travaglini@arm.com// Declares the fields for storing the value parameters.
112413481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DEFN_AND_0_VALUE_PARAMS()
112513481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DEFN_AND_1_VALUE_PARAMS(p0) p0##_type p0;
112613481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DEFN_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0; \
112713481Sgiacomo.travaglini@arm.com    p1##_type p1;
112813481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DEFN_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0; \
112913481Sgiacomo.travaglini@arm.com    p1##_type p1; p2##_type p2;
113013481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DEFN_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0; \
113113481Sgiacomo.travaglini@arm.com    p1##_type p1; p2##_type p2; p3##_type p3;
113213481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DEFN_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \
113313481Sgiacomo.travaglini@arm.com    p4) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4;
113413481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DEFN_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \
113513481Sgiacomo.travaglini@arm.com    p5) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \
113613481Sgiacomo.travaglini@arm.com    p5##_type p5;
113713481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DEFN_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
113813481Sgiacomo.travaglini@arm.com    p6) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \
113913481Sgiacomo.travaglini@arm.com    p5##_type p5; p6##_type p6;
114013481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DEFN_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
114113481Sgiacomo.travaglini@arm.com    p7) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \
114213481Sgiacomo.travaglini@arm.com    p5##_type p5; p6##_type p6; p7##_type p7;
114313481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DEFN_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
114413481Sgiacomo.travaglini@arm.com    p7, p8) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \
114513481Sgiacomo.travaglini@arm.com    p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8;
114613481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DEFN_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
114713481Sgiacomo.travaglini@arm.com    p7, p8, p9) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \
114813481Sgiacomo.travaglini@arm.com    p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8; \
114913481Sgiacomo.travaglini@arm.com    p9##_type p9;
115013481Sgiacomo.travaglini@arm.com
115113481Sgiacomo.travaglini@arm.com// Lists the value parameters.
115213481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_AND_0_VALUE_PARAMS()
115313481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_AND_1_VALUE_PARAMS(p0) p0
115413481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_AND_2_VALUE_PARAMS(p0, p1) p0, p1
115513481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_AND_3_VALUE_PARAMS(p0, p1, p2) p0, p1, p2
115613481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0, p1, p2, p3
115713481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) p0, p1, \
115813481Sgiacomo.travaglini@arm.com    p2, p3, p4
115913481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) p0, \
116013481Sgiacomo.travaglini@arm.com    p1, p2, p3, p4, p5
116113481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
116213481Sgiacomo.travaglini@arm.com    p6) p0, p1, p2, p3, p4, p5, p6
116313481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
116413481Sgiacomo.travaglini@arm.com    p7) p0, p1, p2, p3, p4, p5, p6, p7
116513481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
116613481Sgiacomo.travaglini@arm.com    p7, p8) p0, p1, p2, p3, p4, p5, p6, p7, p8
116713481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
116813481Sgiacomo.travaglini@arm.com    p7, p8, p9) p0, p1, p2, p3, p4, p5, p6, p7, p8, p9
116913481Sgiacomo.travaglini@arm.com
117013481Sgiacomo.travaglini@arm.com// Lists the value parameter types.
117113481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_TYPE_AND_0_VALUE_PARAMS()
117213481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_TYPE_AND_1_VALUE_PARAMS(p0) , p0##_type
117313481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_TYPE_AND_2_VALUE_PARAMS(p0, p1) , p0##_type, \
117413481Sgiacomo.travaglini@arm.com    p1##_type
117513481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , p0##_type, \
117613481Sgiacomo.travaglini@arm.com    p1##_type, p2##_type
117713481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \
117813481Sgiacomo.travaglini@arm.com    p0##_type, p1##_type, p2##_type, p3##_type
117913481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \
118013481Sgiacomo.travaglini@arm.com    p0##_type, p1##_type, p2##_type, p3##_type, p4##_type
118113481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \
118213481Sgiacomo.travaglini@arm.com    p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type
118313481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
118413481Sgiacomo.travaglini@arm.com    p6) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, \
118513481Sgiacomo.travaglini@arm.com    p6##_type
118613481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
118713481Sgiacomo.travaglini@arm.com    p6, p7) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
118813481Sgiacomo.travaglini@arm.com    p5##_type, p6##_type, p7##_type
118913481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
119013481Sgiacomo.travaglini@arm.com    p6, p7, p8) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
119113481Sgiacomo.travaglini@arm.com    p5##_type, p6##_type, p7##_type, p8##_type
119213481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_LIST_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
119313481Sgiacomo.travaglini@arm.com    p6, p7, p8, p9) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
119413481Sgiacomo.travaglini@arm.com    p5##_type, p6##_type, p7##_type, p8##_type, p9##_type
119513481Sgiacomo.travaglini@arm.com
119613481Sgiacomo.travaglini@arm.com// Declares the value parameters.
119713481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_AND_0_VALUE_PARAMS()
119813481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_AND_1_VALUE_PARAMS(p0) p0##_type p0
119913481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0, \
120013481Sgiacomo.travaglini@arm.com    p1##_type p1
120113481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0, \
120213481Sgiacomo.travaglini@arm.com    p1##_type p1, p2##_type p2
120313481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0, \
120413481Sgiacomo.travaglini@arm.com    p1##_type p1, p2##_type p2, p3##_type p3
120513481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \
120613481Sgiacomo.travaglini@arm.com    p4) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4
120713481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \
120813481Sgiacomo.travaglini@arm.com    p5) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \
120913481Sgiacomo.travaglini@arm.com    p5##_type p5
121013481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
121113481Sgiacomo.travaglini@arm.com    p6) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \
121213481Sgiacomo.travaglini@arm.com    p5##_type p5, p6##_type p6
121313481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
121413481Sgiacomo.travaglini@arm.com    p7) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \
121513481Sgiacomo.travaglini@arm.com    p5##_type p5, p6##_type p6, p7##_type p7
121613481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
121713481Sgiacomo.travaglini@arm.com    p7, p8) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
121813481Sgiacomo.travaglini@arm.com    p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8
121913481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_DECL_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
122013481Sgiacomo.travaglini@arm.com    p7, p8, p9) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
122113481Sgiacomo.travaglini@arm.com    p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \
122213481Sgiacomo.travaglini@arm.com    p9##_type p9
122313481Sgiacomo.travaglini@arm.com
122413481Sgiacomo.travaglini@arm.com// The suffix of the class template implementing the action template.
122513481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_COUNT_AND_0_VALUE_PARAMS()
122613481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_COUNT_AND_1_VALUE_PARAMS(p0) P
122713481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_COUNT_AND_2_VALUE_PARAMS(p0, p1) P2
122813481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_COUNT_AND_3_VALUE_PARAMS(p0, p1, p2) P3
122913481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_COUNT_AND_4_VALUE_PARAMS(p0, p1, p2, p3) P4
123013481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_COUNT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) P5
123113481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_COUNT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) P6
123213481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_COUNT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6) P7
123313481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_COUNT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
123413481Sgiacomo.travaglini@arm.com    p7) P8
123513481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_COUNT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
123613481Sgiacomo.travaglini@arm.com    p7, p8) P9
123713481Sgiacomo.travaglini@arm.com#define GMOCK_INTERNAL_COUNT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
123813481Sgiacomo.travaglini@arm.com    p7, p8, p9) P10
123913481Sgiacomo.travaglini@arm.com
124013481Sgiacomo.travaglini@arm.com// The name of the class template implementing the action template.
124113481Sgiacomo.travaglini@arm.com#define GMOCK_ACTION_CLASS_(name, value_params)\
124213481Sgiacomo.travaglini@arm.com    GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params)
124313481Sgiacomo.travaglini@arm.com
124413481Sgiacomo.travaglini@arm.com#define ACTION_TEMPLATE(name, template_params, value_params)\
124513481Sgiacomo.travaglini@arm.com  template <GMOCK_INTERNAL_DECL_##template_params\
124613481Sgiacomo.travaglini@arm.com            GMOCK_INTERNAL_DECL_TYPE_##value_params>\
124713481Sgiacomo.travaglini@arm.com  class GMOCK_ACTION_CLASS_(name, value_params) {\
124813481Sgiacomo.travaglini@arm.com   public:\
124913481Sgiacomo.travaglini@arm.com    explicit GMOCK_ACTION_CLASS_(name, value_params)\
125013481Sgiacomo.travaglini@arm.com        GMOCK_INTERNAL_INIT_##value_params {}\
125113481Sgiacomo.travaglini@arm.com    template <typename F>\
125213481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::ActionInterface<F> {\
125313481Sgiacomo.travaglini@arm.com     public:\
125413481Sgiacomo.travaglini@arm.com      typedef F function_type;\
125513481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::Result return_type;\
125613481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
125713481Sgiacomo.travaglini@arm.com          args_type;\
125813481Sgiacomo.travaglini@arm.com      explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\
125913481Sgiacomo.travaglini@arm.com      virtual return_type Perform(const args_type& args) {\
126013481Sgiacomo.travaglini@arm.com        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
126113481Sgiacomo.travaglini@arm.com            Perform(this, args);\
126213481Sgiacomo.travaglini@arm.com      }\
126313481Sgiacomo.travaglini@arm.com      template <typename arg0_type, typename arg1_type, typename arg2_type, \
126413481Sgiacomo.travaglini@arm.com          typename arg3_type, typename arg4_type, typename arg5_type, \
126513481Sgiacomo.travaglini@arm.com          typename arg6_type, typename arg7_type, typename arg8_type, \
126613481Sgiacomo.travaglini@arm.com          typename arg9_type>\
126713481Sgiacomo.travaglini@arm.com      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
126813481Sgiacomo.travaglini@arm.com          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
126913481Sgiacomo.travaglini@arm.com          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
127013481Sgiacomo.travaglini@arm.com          arg9_type arg9) const;\
127113481Sgiacomo.travaglini@arm.com      GMOCK_INTERNAL_DEFN_##value_params\
127213481Sgiacomo.travaglini@arm.com     private:\
127313481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
127413481Sgiacomo.travaglini@arm.com    };\
127513481Sgiacomo.travaglini@arm.com    template <typename F> operator ::testing::Action<F>() const {\
127613481Sgiacomo.travaglini@arm.com      return ::testing::Action<F>(\
127713481Sgiacomo.travaglini@arm.com          new gmock_Impl<F>(GMOCK_INTERNAL_LIST_##value_params));\
127813481Sgiacomo.travaglini@arm.com    }\
127913481Sgiacomo.travaglini@arm.com    GMOCK_INTERNAL_DEFN_##value_params\
128013481Sgiacomo.travaglini@arm.com   private:\
128113481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(GMOCK_ACTION_CLASS_(name, value_params));\
128213481Sgiacomo.travaglini@arm.com  };\
128313481Sgiacomo.travaglini@arm.com  template <GMOCK_INTERNAL_DECL_##template_params\
128413481Sgiacomo.travaglini@arm.com            GMOCK_INTERNAL_DECL_TYPE_##value_params>\
128513481Sgiacomo.travaglini@arm.com  inline GMOCK_ACTION_CLASS_(name, value_params)<\
128613481Sgiacomo.travaglini@arm.com      GMOCK_INTERNAL_LIST_##template_params\
128713481Sgiacomo.travaglini@arm.com      GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\
128813481Sgiacomo.travaglini@arm.com          GMOCK_INTERNAL_DECL_##value_params) {\
128913481Sgiacomo.travaglini@arm.com    return GMOCK_ACTION_CLASS_(name, value_params)<\
129013481Sgiacomo.travaglini@arm.com        GMOCK_INTERNAL_LIST_##template_params\
129113481Sgiacomo.travaglini@arm.com        GMOCK_INTERNAL_LIST_TYPE_##value_params>(\
129213481Sgiacomo.travaglini@arm.com            GMOCK_INTERNAL_LIST_##value_params);\
129313481Sgiacomo.travaglini@arm.com  }\
129413481Sgiacomo.travaglini@arm.com  template <GMOCK_INTERNAL_DECL_##template_params\
129513481Sgiacomo.travaglini@arm.com            GMOCK_INTERNAL_DECL_TYPE_##value_params>\
129613481Sgiacomo.travaglini@arm.com  template <typename F>\
129713481Sgiacomo.travaglini@arm.com  template <typename arg0_type, typename arg1_type, typename arg2_type, \
129813481Sgiacomo.travaglini@arm.com      typename arg3_type, typename arg4_type, typename arg5_type, \
129913481Sgiacomo.travaglini@arm.com      typename arg6_type, typename arg7_type, typename arg8_type, \
130013481Sgiacomo.travaglini@arm.com      typename arg9_type>\
130113481Sgiacomo.travaglini@arm.com  typename ::testing::internal::Function<F>::Result\
130213481Sgiacomo.travaglini@arm.com      GMOCK_ACTION_CLASS_(name, value_params)<\
130313481Sgiacomo.travaglini@arm.com          GMOCK_INTERNAL_LIST_##template_params\
130413481Sgiacomo.travaglini@arm.com          GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl<F>::\
130513481Sgiacomo.travaglini@arm.com              gmock_PerformImpl(\
130613481Sgiacomo.travaglini@arm.com          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
130713481Sgiacomo.travaglini@arm.com
130813481Sgiacomo.travaglini@arm.com#define ACTION(name)\
130913481Sgiacomo.travaglini@arm.com  class name##Action {\
131013481Sgiacomo.travaglini@arm.com   public:\
131113481Sgiacomo.travaglini@arm.com    name##Action() {}\
131213481Sgiacomo.travaglini@arm.com    template <typename F>\
131313481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::ActionInterface<F> {\
131413481Sgiacomo.travaglini@arm.com     public:\
131513481Sgiacomo.travaglini@arm.com      typedef F function_type;\
131613481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::Result return_type;\
131713481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
131813481Sgiacomo.travaglini@arm.com          args_type;\
131913481Sgiacomo.travaglini@arm.com      gmock_Impl() {}\
132013481Sgiacomo.travaglini@arm.com      virtual return_type Perform(const args_type& args) {\
132113481Sgiacomo.travaglini@arm.com        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
132213481Sgiacomo.travaglini@arm.com            Perform(this, args);\
132313481Sgiacomo.travaglini@arm.com      }\
132413481Sgiacomo.travaglini@arm.com      template <typename arg0_type, typename arg1_type, typename arg2_type, \
132513481Sgiacomo.travaglini@arm.com          typename arg3_type, typename arg4_type, typename arg5_type, \
132613481Sgiacomo.travaglini@arm.com          typename arg6_type, typename arg7_type, typename arg8_type, \
132713481Sgiacomo.travaglini@arm.com          typename arg9_type>\
132813481Sgiacomo.travaglini@arm.com      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
132913481Sgiacomo.travaglini@arm.com          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
133013481Sgiacomo.travaglini@arm.com          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
133113481Sgiacomo.travaglini@arm.com          arg9_type arg9) const;\
133213481Sgiacomo.travaglini@arm.com     private:\
133313481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
133413481Sgiacomo.travaglini@arm.com    };\
133513481Sgiacomo.travaglini@arm.com    template <typename F> operator ::testing::Action<F>() const {\
133613481Sgiacomo.travaglini@arm.com      return ::testing::Action<F>(new gmock_Impl<F>());\
133713481Sgiacomo.travaglini@arm.com    }\
133813481Sgiacomo.travaglini@arm.com   private:\
133913481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##Action);\
134013481Sgiacomo.travaglini@arm.com  };\
134113481Sgiacomo.travaglini@arm.com  inline name##Action name() {\
134213481Sgiacomo.travaglini@arm.com    return name##Action();\
134313481Sgiacomo.travaglini@arm.com  }\
134413481Sgiacomo.travaglini@arm.com  template <typename F>\
134513481Sgiacomo.travaglini@arm.com  template <typename arg0_type, typename arg1_type, typename arg2_type, \
134613481Sgiacomo.travaglini@arm.com      typename arg3_type, typename arg4_type, typename arg5_type, \
134713481Sgiacomo.travaglini@arm.com      typename arg6_type, typename arg7_type, typename arg8_type, \
134813481Sgiacomo.travaglini@arm.com      typename arg9_type>\
134913481Sgiacomo.travaglini@arm.com  typename ::testing::internal::Function<F>::Result\
135013481Sgiacomo.travaglini@arm.com      name##Action::gmock_Impl<F>::gmock_PerformImpl(\
135113481Sgiacomo.travaglini@arm.com          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
135213481Sgiacomo.travaglini@arm.com
135313481Sgiacomo.travaglini@arm.com#define ACTION_P(name, p0)\
135413481Sgiacomo.travaglini@arm.com  template <typename p0##_type>\
135513481Sgiacomo.travaglini@arm.com  class name##ActionP {\
135613481Sgiacomo.travaglini@arm.com   public:\
135713481Sgiacomo.travaglini@arm.com    explicit name##ActionP(p0##_type gmock_p0) : p0(gmock_p0) {}\
135813481Sgiacomo.travaglini@arm.com    template <typename F>\
135913481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::ActionInterface<F> {\
136013481Sgiacomo.travaglini@arm.com     public:\
136113481Sgiacomo.travaglini@arm.com      typedef F function_type;\
136213481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::Result return_type;\
136313481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
136413481Sgiacomo.travaglini@arm.com          args_type;\
136513481Sgiacomo.travaglini@arm.com      explicit gmock_Impl(p0##_type gmock_p0) : p0(gmock_p0) {}\
136613481Sgiacomo.travaglini@arm.com      virtual return_type Perform(const args_type& args) {\
136713481Sgiacomo.travaglini@arm.com        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
136813481Sgiacomo.travaglini@arm.com            Perform(this, args);\
136913481Sgiacomo.travaglini@arm.com      }\
137013481Sgiacomo.travaglini@arm.com      template <typename arg0_type, typename arg1_type, typename arg2_type, \
137113481Sgiacomo.travaglini@arm.com          typename arg3_type, typename arg4_type, typename arg5_type, \
137213481Sgiacomo.travaglini@arm.com          typename arg6_type, typename arg7_type, typename arg8_type, \
137313481Sgiacomo.travaglini@arm.com          typename arg9_type>\
137413481Sgiacomo.travaglini@arm.com      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
137513481Sgiacomo.travaglini@arm.com          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
137613481Sgiacomo.travaglini@arm.com          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
137713481Sgiacomo.travaglini@arm.com          arg9_type arg9) const;\
137813481Sgiacomo.travaglini@arm.com      p0##_type p0;\
137913481Sgiacomo.travaglini@arm.com     private:\
138013481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
138113481Sgiacomo.travaglini@arm.com    };\
138213481Sgiacomo.travaglini@arm.com    template <typename F> operator ::testing::Action<F>() const {\
138313481Sgiacomo.travaglini@arm.com      return ::testing::Action<F>(new gmock_Impl<F>(p0));\
138413481Sgiacomo.travaglini@arm.com    }\
138513481Sgiacomo.travaglini@arm.com    p0##_type p0;\
138613481Sgiacomo.travaglini@arm.com   private:\
138713481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##ActionP);\
138813481Sgiacomo.travaglini@arm.com  };\
138913481Sgiacomo.travaglini@arm.com  template <typename p0##_type>\
139013481Sgiacomo.travaglini@arm.com  inline name##ActionP<p0##_type> name(p0##_type p0) {\
139113481Sgiacomo.travaglini@arm.com    return name##ActionP<p0##_type>(p0);\
139213481Sgiacomo.travaglini@arm.com  }\
139313481Sgiacomo.travaglini@arm.com  template <typename p0##_type>\
139413481Sgiacomo.travaglini@arm.com  template <typename F>\
139513481Sgiacomo.travaglini@arm.com  template <typename arg0_type, typename arg1_type, typename arg2_type, \
139613481Sgiacomo.travaglini@arm.com      typename arg3_type, typename arg4_type, typename arg5_type, \
139713481Sgiacomo.travaglini@arm.com      typename arg6_type, typename arg7_type, typename arg8_type, \
139813481Sgiacomo.travaglini@arm.com      typename arg9_type>\
139913481Sgiacomo.travaglini@arm.com  typename ::testing::internal::Function<F>::Result\
140013481Sgiacomo.travaglini@arm.com      name##ActionP<p0##_type>::gmock_Impl<F>::gmock_PerformImpl(\
140113481Sgiacomo.travaglini@arm.com          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
140213481Sgiacomo.travaglini@arm.com
140313481Sgiacomo.travaglini@arm.com#define ACTION_P2(name, p0, p1)\
140413481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type>\
140513481Sgiacomo.travaglini@arm.com  class name##ActionP2 {\
140613481Sgiacomo.travaglini@arm.com   public:\
140713481Sgiacomo.travaglini@arm.com    name##ActionP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \
140813481Sgiacomo.travaglini@arm.com        p1(gmock_p1) {}\
140913481Sgiacomo.travaglini@arm.com    template <typename F>\
141013481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::ActionInterface<F> {\
141113481Sgiacomo.travaglini@arm.com     public:\
141213481Sgiacomo.travaglini@arm.com      typedef F function_type;\
141313481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::Result return_type;\
141413481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
141513481Sgiacomo.travaglini@arm.com          args_type;\
141613481Sgiacomo.travaglini@arm.com      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \
141713481Sgiacomo.travaglini@arm.com          p1(gmock_p1) {}\
141813481Sgiacomo.travaglini@arm.com      virtual return_type Perform(const args_type& args) {\
141913481Sgiacomo.travaglini@arm.com        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
142013481Sgiacomo.travaglini@arm.com            Perform(this, args);\
142113481Sgiacomo.travaglini@arm.com      }\
142213481Sgiacomo.travaglini@arm.com      template <typename arg0_type, typename arg1_type, typename arg2_type, \
142313481Sgiacomo.travaglini@arm.com          typename arg3_type, typename arg4_type, typename arg5_type, \
142413481Sgiacomo.travaglini@arm.com          typename arg6_type, typename arg7_type, typename arg8_type, \
142513481Sgiacomo.travaglini@arm.com          typename arg9_type>\
142613481Sgiacomo.travaglini@arm.com      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
142713481Sgiacomo.travaglini@arm.com          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
142813481Sgiacomo.travaglini@arm.com          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
142913481Sgiacomo.travaglini@arm.com          arg9_type arg9) const;\
143013481Sgiacomo.travaglini@arm.com      p0##_type p0;\
143113481Sgiacomo.travaglini@arm.com      p1##_type p1;\
143213481Sgiacomo.travaglini@arm.com     private:\
143313481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
143413481Sgiacomo.travaglini@arm.com    };\
143513481Sgiacomo.travaglini@arm.com    template <typename F> operator ::testing::Action<F>() const {\
143613481Sgiacomo.travaglini@arm.com      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1));\
143713481Sgiacomo.travaglini@arm.com    }\
143813481Sgiacomo.travaglini@arm.com    p0##_type p0;\
143913481Sgiacomo.travaglini@arm.com    p1##_type p1;\
144013481Sgiacomo.travaglini@arm.com   private:\
144113481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##ActionP2);\
144213481Sgiacomo.travaglini@arm.com  };\
144313481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type>\
144413481Sgiacomo.travaglini@arm.com  inline name##ActionP2<p0##_type, p1##_type> name(p0##_type p0, \
144513481Sgiacomo.travaglini@arm.com      p1##_type p1) {\
144613481Sgiacomo.travaglini@arm.com    return name##ActionP2<p0##_type, p1##_type>(p0, p1);\
144713481Sgiacomo.travaglini@arm.com  }\
144813481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type>\
144913481Sgiacomo.travaglini@arm.com  template <typename F>\
145013481Sgiacomo.travaglini@arm.com  template <typename arg0_type, typename arg1_type, typename arg2_type, \
145113481Sgiacomo.travaglini@arm.com      typename arg3_type, typename arg4_type, typename arg5_type, \
145213481Sgiacomo.travaglini@arm.com      typename arg6_type, typename arg7_type, typename arg8_type, \
145313481Sgiacomo.travaglini@arm.com      typename arg9_type>\
145413481Sgiacomo.travaglini@arm.com  typename ::testing::internal::Function<F>::Result\
145513481Sgiacomo.travaglini@arm.com      name##ActionP2<p0##_type, p1##_type>::gmock_Impl<F>::gmock_PerformImpl(\
145613481Sgiacomo.travaglini@arm.com          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
145713481Sgiacomo.travaglini@arm.com
145813481Sgiacomo.travaglini@arm.com#define ACTION_P3(name, p0, p1, p2)\
145913481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type>\
146013481Sgiacomo.travaglini@arm.com  class name##ActionP3 {\
146113481Sgiacomo.travaglini@arm.com   public:\
146213481Sgiacomo.travaglini@arm.com    name##ActionP3(p0##_type gmock_p0, p1##_type gmock_p1, \
146313481Sgiacomo.travaglini@arm.com        p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\
146413481Sgiacomo.travaglini@arm.com    template <typename F>\
146513481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::ActionInterface<F> {\
146613481Sgiacomo.travaglini@arm.com     public:\
146713481Sgiacomo.travaglini@arm.com      typedef F function_type;\
146813481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::Result return_type;\
146913481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
147013481Sgiacomo.travaglini@arm.com          args_type;\
147113481Sgiacomo.travaglini@arm.com      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, \
147213481Sgiacomo.travaglini@arm.com          p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\
147313481Sgiacomo.travaglini@arm.com      virtual return_type Perform(const args_type& args) {\
147413481Sgiacomo.travaglini@arm.com        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
147513481Sgiacomo.travaglini@arm.com            Perform(this, args);\
147613481Sgiacomo.travaglini@arm.com      }\
147713481Sgiacomo.travaglini@arm.com      template <typename arg0_type, typename arg1_type, typename arg2_type, \
147813481Sgiacomo.travaglini@arm.com          typename arg3_type, typename arg4_type, typename arg5_type, \
147913481Sgiacomo.travaglini@arm.com          typename arg6_type, typename arg7_type, typename arg8_type, \
148013481Sgiacomo.travaglini@arm.com          typename arg9_type>\
148113481Sgiacomo.travaglini@arm.com      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
148213481Sgiacomo.travaglini@arm.com          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
148313481Sgiacomo.travaglini@arm.com          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
148413481Sgiacomo.travaglini@arm.com          arg9_type arg9) const;\
148513481Sgiacomo.travaglini@arm.com      p0##_type p0;\
148613481Sgiacomo.travaglini@arm.com      p1##_type p1;\
148713481Sgiacomo.travaglini@arm.com      p2##_type p2;\
148813481Sgiacomo.travaglini@arm.com     private:\
148913481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
149013481Sgiacomo.travaglini@arm.com    };\
149113481Sgiacomo.travaglini@arm.com    template <typename F> operator ::testing::Action<F>() const {\
149213481Sgiacomo.travaglini@arm.com      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2));\
149313481Sgiacomo.travaglini@arm.com    }\
149413481Sgiacomo.travaglini@arm.com    p0##_type p0;\
149513481Sgiacomo.travaglini@arm.com    p1##_type p1;\
149613481Sgiacomo.travaglini@arm.com    p2##_type p2;\
149713481Sgiacomo.travaglini@arm.com   private:\
149813481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##ActionP3);\
149913481Sgiacomo.travaglini@arm.com  };\
150013481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type>\
150113481Sgiacomo.travaglini@arm.com  inline name##ActionP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \
150213481Sgiacomo.travaglini@arm.com      p1##_type p1, p2##_type p2) {\
150313481Sgiacomo.travaglini@arm.com    return name##ActionP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\
150413481Sgiacomo.travaglini@arm.com  }\
150513481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type>\
150613481Sgiacomo.travaglini@arm.com  template <typename F>\
150713481Sgiacomo.travaglini@arm.com  template <typename arg0_type, typename arg1_type, typename arg2_type, \
150813481Sgiacomo.travaglini@arm.com      typename arg3_type, typename arg4_type, typename arg5_type, \
150913481Sgiacomo.travaglini@arm.com      typename arg6_type, typename arg7_type, typename arg8_type, \
151013481Sgiacomo.travaglini@arm.com      typename arg9_type>\
151113481Sgiacomo.travaglini@arm.com  typename ::testing::internal::Function<F>::Result\
151213481Sgiacomo.travaglini@arm.com      name##ActionP3<p0##_type, p1##_type, \
151313481Sgiacomo.travaglini@arm.com          p2##_type>::gmock_Impl<F>::gmock_PerformImpl(\
151413481Sgiacomo.travaglini@arm.com          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
151513481Sgiacomo.travaglini@arm.com
151613481Sgiacomo.travaglini@arm.com#define ACTION_P4(name, p0, p1, p2, p3)\
151713481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
151813481Sgiacomo.travaglini@arm.com      typename p3##_type>\
151913481Sgiacomo.travaglini@arm.com  class name##ActionP4 {\
152013481Sgiacomo.travaglini@arm.com   public:\
152113481Sgiacomo.travaglini@arm.com    name##ActionP4(p0##_type gmock_p0, p1##_type gmock_p1, \
152213481Sgiacomo.travaglini@arm.com        p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \
152313481Sgiacomo.travaglini@arm.com        p2(gmock_p2), p3(gmock_p3) {}\
152413481Sgiacomo.travaglini@arm.com    template <typename F>\
152513481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::ActionInterface<F> {\
152613481Sgiacomo.travaglini@arm.com     public:\
152713481Sgiacomo.travaglini@arm.com      typedef F function_type;\
152813481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::Result return_type;\
152913481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
153013481Sgiacomo.travaglini@arm.com          args_type;\
153113481Sgiacomo.travaglini@arm.com      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
153213481Sgiacomo.travaglini@arm.com          p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
153313481Sgiacomo.travaglini@arm.com          p3(gmock_p3) {}\
153413481Sgiacomo.travaglini@arm.com      virtual return_type Perform(const args_type& args) {\
153513481Sgiacomo.travaglini@arm.com        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
153613481Sgiacomo.travaglini@arm.com            Perform(this, args);\
153713481Sgiacomo.travaglini@arm.com      }\
153813481Sgiacomo.travaglini@arm.com      template <typename arg0_type, typename arg1_type, typename arg2_type, \
153913481Sgiacomo.travaglini@arm.com          typename arg3_type, typename arg4_type, typename arg5_type, \
154013481Sgiacomo.travaglini@arm.com          typename arg6_type, typename arg7_type, typename arg8_type, \
154113481Sgiacomo.travaglini@arm.com          typename arg9_type>\
154213481Sgiacomo.travaglini@arm.com      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
154313481Sgiacomo.travaglini@arm.com          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
154413481Sgiacomo.travaglini@arm.com          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
154513481Sgiacomo.travaglini@arm.com          arg9_type arg9) const;\
154613481Sgiacomo.travaglini@arm.com      p0##_type p0;\
154713481Sgiacomo.travaglini@arm.com      p1##_type p1;\
154813481Sgiacomo.travaglini@arm.com      p2##_type p2;\
154913481Sgiacomo.travaglini@arm.com      p3##_type p3;\
155013481Sgiacomo.travaglini@arm.com     private:\
155113481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
155213481Sgiacomo.travaglini@arm.com    };\
155313481Sgiacomo.travaglini@arm.com    template <typename F> operator ::testing::Action<F>() const {\
155413481Sgiacomo.travaglini@arm.com      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3));\
155513481Sgiacomo.travaglini@arm.com    }\
155613481Sgiacomo.travaglini@arm.com    p0##_type p0;\
155713481Sgiacomo.travaglini@arm.com    p1##_type p1;\
155813481Sgiacomo.travaglini@arm.com    p2##_type p2;\
155913481Sgiacomo.travaglini@arm.com    p3##_type p3;\
156013481Sgiacomo.travaglini@arm.com   private:\
156113481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##ActionP4);\
156213481Sgiacomo.travaglini@arm.com  };\
156313481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
156413481Sgiacomo.travaglini@arm.com      typename p3##_type>\
156513481Sgiacomo.travaglini@arm.com  inline name##ActionP4<p0##_type, p1##_type, p2##_type, \
156613481Sgiacomo.travaglini@arm.com      p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
156713481Sgiacomo.travaglini@arm.com      p3##_type p3) {\
156813481Sgiacomo.travaglini@arm.com    return name##ActionP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, p1, \
156913481Sgiacomo.travaglini@arm.com        p2, p3);\
157013481Sgiacomo.travaglini@arm.com  }\
157113481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
157213481Sgiacomo.travaglini@arm.com      typename p3##_type>\
157313481Sgiacomo.travaglini@arm.com  template <typename F>\
157413481Sgiacomo.travaglini@arm.com  template <typename arg0_type, typename arg1_type, typename arg2_type, \
157513481Sgiacomo.travaglini@arm.com      typename arg3_type, typename arg4_type, typename arg5_type, \
157613481Sgiacomo.travaglini@arm.com      typename arg6_type, typename arg7_type, typename arg8_type, \
157713481Sgiacomo.travaglini@arm.com      typename arg9_type>\
157813481Sgiacomo.travaglini@arm.com  typename ::testing::internal::Function<F>::Result\
157913481Sgiacomo.travaglini@arm.com      name##ActionP4<p0##_type, p1##_type, p2##_type, \
158013481Sgiacomo.travaglini@arm.com          p3##_type>::gmock_Impl<F>::gmock_PerformImpl(\
158113481Sgiacomo.travaglini@arm.com          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
158213481Sgiacomo.travaglini@arm.com
158313481Sgiacomo.travaglini@arm.com#define ACTION_P5(name, p0, p1, p2, p3, p4)\
158413481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
158513481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type>\
158613481Sgiacomo.travaglini@arm.com  class name##ActionP5 {\
158713481Sgiacomo.travaglini@arm.com   public:\
158813481Sgiacomo.travaglini@arm.com    name##ActionP5(p0##_type gmock_p0, p1##_type gmock_p1, \
158913481Sgiacomo.travaglini@arm.com        p2##_type gmock_p2, p3##_type gmock_p3, \
159013481Sgiacomo.travaglini@arm.com        p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
159113481Sgiacomo.travaglini@arm.com        p3(gmock_p3), p4(gmock_p4) {}\
159213481Sgiacomo.travaglini@arm.com    template <typename F>\
159313481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::ActionInterface<F> {\
159413481Sgiacomo.travaglini@arm.com     public:\
159513481Sgiacomo.travaglini@arm.com      typedef F function_type;\
159613481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::Result return_type;\
159713481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
159813481Sgiacomo.travaglini@arm.com          args_type;\
159913481Sgiacomo.travaglini@arm.com      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
160013481Sgiacomo.travaglini@arm.com          p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), \
160113481Sgiacomo.travaglini@arm.com          p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4) {}\
160213481Sgiacomo.travaglini@arm.com      virtual return_type Perform(const args_type& args) {\
160313481Sgiacomo.travaglini@arm.com        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
160413481Sgiacomo.travaglini@arm.com            Perform(this, args);\
160513481Sgiacomo.travaglini@arm.com      }\
160613481Sgiacomo.travaglini@arm.com      template <typename arg0_type, typename arg1_type, typename arg2_type, \
160713481Sgiacomo.travaglini@arm.com          typename arg3_type, typename arg4_type, typename arg5_type, \
160813481Sgiacomo.travaglini@arm.com          typename arg6_type, typename arg7_type, typename arg8_type, \
160913481Sgiacomo.travaglini@arm.com          typename arg9_type>\
161013481Sgiacomo.travaglini@arm.com      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
161113481Sgiacomo.travaglini@arm.com          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
161213481Sgiacomo.travaglini@arm.com          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
161313481Sgiacomo.travaglini@arm.com          arg9_type arg9) const;\
161413481Sgiacomo.travaglini@arm.com      p0##_type p0;\
161513481Sgiacomo.travaglini@arm.com      p1##_type p1;\
161613481Sgiacomo.travaglini@arm.com      p2##_type p2;\
161713481Sgiacomo.travaglini@arm.com      p3##_type p3;\
161813481Sgiacomo.travaglini@arm.com      p4##_type p4;\
161913481Sgiacomo.travaglini@arm.com     private:\
162013481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
162113481Sgiacomo.travaglini@arm.com    };\
162213481Sgiacomo.travaglini@arm.com    template <typename F> operator ::testing::Action<F>() const {\
162313481Sgiacomo.travaglini@arm.com      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4));\
162413481Sgiacomo.travaglini@arm.com    }\
162513481Sgiacomo.travaglini@arm.com    p0##_type p0;\
162613481Sgiacomo.travaglini@arm.com    p1##_type p1;\
162713481Sgiacomo.travaglini@arm.com    p2##_type p2;\
162813481Sgiacomo.travaglini@arm.com    p3##_type p3;\
162913481Sgiacomo.travaglini@arm.com    p4##_type p4;\
163013481Sgiacomo.travaglini@arm.com   private:\
163113481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##ActionP5);\
163213481Sgiacomo.travaglini@arm.com  };\
163313481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
163413481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type>\
163513481Sgiacomo.travaglini@arm.com  inline name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \
163613481Sgiacomo.travaglini@arm.com      p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
163713481Sgiacomo.travaglini@arm.com      p4##_type p4) {\
163813481Sgiacomo.travaglini@arm.com    return name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \
163913481Sgiacomo.travaglini@arm.com        p4##_type>(p0, p1, p2, p3, p4);\
164013481Sgiacomo.travaglini@arm.com  }\
164113481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
164213481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type>\
164313481Sgiacomo.travaglini@arm.com  template <typename F>\
164413481Sgiacomo.travaglini@arm.com  template <typename arg0_type, typename arg1_type, typename arg2_type, \
164513481Sgiacomo.travaglini@arm.com      typename arg3_type, typename arg4_type, typename arg5_type, \
164613481Sgiacomo.travaglini@arm.com      typename arg6_type, typename arg7_type, typename arg8_type, \
164713481Sgiacomo.travaglini@arm.com      typename arg9_type>\
164813481Sgiacomo.travaglini@arm.com  typename ::testing::internal::Function<F>::Result\
164913481Sgiacomo.travaglini@arm.com      name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \
165013481Sgiacomo.travaglini@arm.com          p4##_type>::gmock_Impl<F>::gmock_PerformImpl(\
165113481Sgiacomo.travaglini@arm.com          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
165213481Sgiacomo.travaglini@arm.com
165313481Sgiacomo.travaglini@arm.com#define ACTION_P6(name, p0, p1, p2, p3, p4, p5)\
165413481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
165513481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type>\
165613481Sgiacomo.travaglini@arm.com  class name##ActionP6 {\
165713481Sgiacomo.travaglini@arm.com   public:\
165813481Sgiacomo.travaglini@arm.com    name##ActionP6(p0##_type gmock_p0, p1##_type gmock_p1, \
165913481Sgiacomo.travaglini@arm.com        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
166013481Sgiacomo.travaglini@arm.com        p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
166113481Sgiacomo.travaglini@arm.com        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\
166213481Sgiacomo.travaglini@arm.com    template <typename F>\
166313481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::ActionInterface<F> {\
166413481Sgiacomo.travaglini@arm.com     public:\
166513481Sgiacomo.travaglini@arm.com      typedef F function_type;\
166613481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::Result return_type;\
166713481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
166813481Sgiacomo.travaglini@arm.com          args_type;\
166913481Sgiacomo.travaglini@arm.com      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
167013481Sgiacomo.travaglini@arm.com          p3##_type gmock_p3, p4##_type gmock_p4, \
167113481Sgiacomo.travaglini@arm.com          p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
167213481Sgiacomo.travaglini@arm.com          p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\
167313481Sgiacomo.travaglini@arm.com      virtual return_type Perform(const args_type& args) {\
167413481Sgiacomo.travaglini@arm.com        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
167513481Sgiacomo.travaglini@arm.com            Perform(this, args);\
167613481Sgiacomo.travaglini@arm.com      }\
167713481Sgiacomo.travaglini@arm.com      template <typename arg0_type, typename arg1_type, typename arg2_type, \
167813481Sgiacomo.travaglini@arm.com          typename arg3_type, typename arg4_type, typename arg5_type, \
167913481Sgiacomo.travaglini@arm.com          typename arg6_type, typename arg7_type, typename arg8_type, \
168013481Sgiacomo.travaglini@arm.com          typename arg9_type>\
168113481Sgiacomo.travaglini@arm.com      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
168213481Sgiacomo.travaglini@arm.com          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
168313481Sgiacomo.travaglini@arm.com          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
168413481Sgiacomo.travaglini@arm.com          arg9_type arg9) const;\
168513481Sgiacomo.travaglini@arm.com      p0##_type p0;\
168613481Sgiacomo.travaglini@arm.com      p1##_type p1;\
168713481Sgiacomo.travaglini@arm.com      p2##_type p2;\
168813481Sgiacomo.travaglini@arm.com      p3##_type p3;\
168913481Sgiacomo.travaglini@arm.com      p4##_type p4;\
169013481Sgiacomo.travaglini@arm.com      p5##_type p5;\
169113481Sgiacomo.travaglini@arm.com     private:\
169213481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
169313481Sgiacomo.travaglini@arm.com    };\
169413481Sgiacomo.travaglini@arm.com    template <typename F> operator ::testing::Action<F>() const {\
169513481Sgiacomo.travaglini@arm.com      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5));\
169613481Sgiacomo.travaglini@arm.com    }\
169713481Sgiacomo.travaglini@arm.com    p0##_type p0;\
169813481Sgiacomo.travaglini@arm.com    p1##_type p1;\
169913481Sgiacomo.travaglini@arm.com    p2##_type p2;\
170013481Sgiacomo.travaglini@arm.com    p3##_type p3;\
170113481Sgiacomo.travaglini@arm.com    p4##_type p4;\
170213481Sgiacomo.travaglini@arm.com    p5##_type p5;\
170313481Sgiacomo.travaglini@arm.com   private:\
170413481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##ActionP6);\
170513481Sgiacomo.travaglini@arm.com  };\
170613481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
170713481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type>\
170813481Sgiacomo.travaglini@arm.com  inline name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, \
170913481Sgiacomo.travaglini@arm.com      p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
171013481Sgiacomo.travaglini@arm.com      p3##_type p3, p4##_type p4, p5##_type p5) {\
171113481Sgiacomo.travaglini@arm.com    return name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, \
171213481Sgiacomo.travaglini@arm.com        p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\
171313481Sgiacomo.travaglini@arm.com  }\
171413481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
171513481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type>\
171613481Sgiacomo.travaglini@arm.com  template <typename F>\
171713481Sgiacomo.travaglini@arm.com  template <typename arg0_type, typename arg1_type, typename arg2_type, \
171813481Sgiacomo.travaglini@arm.com      typename arg3_type, typename arg4_type, typename arg5_type, \
171913481Sgiacomo.travaglini@arm.com      typename arg6_type, typename arg7_type, typename arg8_type, \
172013481Sgiacomo.travaglini@arm.com      typename arg9_type>\
172113481Sgiacomo.travaglini@arm.com  typename ::testing::internal::Function<F>::Result\
172213481Sgiacomo.travaglini@arm.com      name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
172313481Sgiacomo.travaglini@arm.com          p5##_type>::gmock_Impl<F>::gmock_PerformImpl(\
172413481Sgiacomo.travaglini@arm.com          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
172513481Sgiacomo.travaglini@arm.com
172613481Sgiacomo.travaglini@arm.com#define ACTION_P7(name, p0, p1, p2, p3, p4, p5, p6)\
172713481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
172813481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
172913481Sgiacomo.travaglini@arm.com      typename p6##_type>\
173013481Sgiacomo.travaglini@arm.com  class name##ActionP7 {\
173113481Sgiacomo.travaglini@arm.com   public:\
173213481Sgiacomo.travaglini@arm.com    name##ActionP7(p0##_type gmock_p0, p1##_type gmock_p1, \
173313481Sgiacomo.travaglini@arm.com        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
173413481Sgiacomo.travaglini@arm.com        p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \
173513481Sgiacomo.travaglini@arm.com        p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \
173613481Sgiacomo.travaglini@arm.com        p6(gmock_p6) {}\
173713481Sgiacomo.travaglini@arm.com    template <typename F>\
173813481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::ActionInterface<F> {\
173913481Sgiacomo.travaglini@arm.com     public:\
174013481Sgiacomo.travaglini@arm.com      typedef F function_type;\
174113481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::Result return_type;\
174213481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
174313481Sgiacomo.travaglini@arm.com          args_type;\
174413481Sgiacomo.travaglini@arm.com      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
174513481Sgiacomo.travaglini@arm.com          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
174613481Sgiacomo.travaglini@arm.com          p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
174713481Sgiacomo.travaglini@arm.com          p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\
174813481Sgiacomo.travaglini@arm.com      virtual return_type Perform(const args_type& args) {\
174913481Sgiacomo.travaglini@arm.com        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
175013481Sgiacomo.travaglini@arm.com            Perform(this, args);\
175113481Sgiacomo.travaglini@arm.com      }\
175213481Sgiacomo.travaglini@arm.com      template <typename arg0_type, typename arg1_type, typename arg2_type, \
175313481Sgiacomo.travaglini@arm.com          typename arg3_type, typename arg4_type, typename arg5_type, \
175413481Sgiacomo.travaglini@arm.com          typename arg6_type, typename arg7_type, typename arg8_type, \
175513481Sgiacomo.travaglini@arm.com          typename arg9_type>\
175613481Sgiacomo.travaglini@arm.com      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
175713481Sgiacomo.travaglini@arm.com          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
175813481Sgiacomo.travaglini@arm.com          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
175913481Sgiacomo.travaglini@arm.com          arg9_type arg9) const;\
176013481Sgiacomo.travaglini@arm.com      p0##_type p0;\
176113481Sgiacomo.travaglini@arm.com      p1##_type p1;\
176213481Sgiacomo.travaglini@arm.com      p2##_type p2;\
176313481Sgiacomo.travaglini@arm.com      p3##_type p3;\
176413481Sgiacomo.travaglini@arm.com      p4##_type p4;\
176513481Sgiacomo.travaglini@arm.com      p5##_type p5;\
176613481Sgiacomo.travaglini@arm.com      p6##_type p6;\
176713481Sgiacomo.travaglini@arm.com     private:\
176813481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
176913481Sgiacomo.travaglini@arm.com    };\
177013481Sgiacomo.travaglini@arm.com    template <typename F> operator ::testing::Action<F>() const {\
177113481Sgiacomo.travaglini@arm.com      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
177213481Sgiacomo.travaglini@arm.com          p6));\
177313481Sgiacomo.travaglini@arm.com    }\
177413481Sgiacomo.travaglini@arm.com    p0##_type p0;\
177513481Sgiacomo.travaglini@arm.com    p1##_type p1;\
177613481Sgiacomo.travaglini@arm.com    p2##_type p2;\
177713481Sgiacomo.travaglini@arm.com    p3##_type p3;\
177813481Sgiacomo.travaglini@arm.com    p4##_type p4;\
177913481Sgiacomo.travaglini@arm.com    p5##_type p5;\
178013481Sgiacomo.travaglini@arm.com    p6##_type p6;\
178113481Sgiacomo.travaglini@arm.com   private:\
178213481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##ActionP7);\
178313481Sgiacomo.travaglini@arm.com  };\
178413481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
178513481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
178613481Sgiacomo.travaglini@arm.com      typename p6##_type>\
178713481Sgiacomo.travaglini@arm.com  inline name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, \
178813481Sgiacomo.travaglini@arm.com      p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \
178913481Sgiacomo.travaglini@arm.com      p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
179013481Sgiacomo.travaglini@arm.com      p6##_type p6) {\
179113481Sgiacomo.travaglini@arm.com    return name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, \
179213481Sgiacomo.travaglini@arm.com        p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\
179313481Sgiacomo.travaglini@arm.com  }\
179413481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
179513481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
179613481Sgiacomo.travaglini@arm.com      typename p6##_type>\
179713481Sgiacomo.travaglini@arm.com  template <typename F>\
179813481Sgiacomo.travaglini@arm.com  template <typename arg0_type, typename arg1_type, typename arg2_type, \
179913481Sgiacomo.travaglini@arm.com      typename arg3_type, typename arg4_type, typename arg5_type, \
180013481Sgiacomo.travaglini@arm.com      typename arg6_type, typename arg7_type, typename arg8_type, \
180113481Sgiacomo.travaglini@arm.com      typename arg9_type>\
180213481Sgiacomo.travaglini@arm.com  typename ::testing::internal::Function<F>::Result\
180313481Sgiacomo.travaglini@arm.com      name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
180413481Sgiacomo.travaglini@arm.com          p5##_type, p6##_type>::gmock_Impl<F>::gmock_PerformImpl(\
180513481Sgiacomo.travaglini@arm.com          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
180613481Sgiacomo.travaglini@arm.com
180713481Sgiacomo.travaglini@arm.com#define ACTION_P8(name, p0, p1, p2, p3, p4, p5, p6, p7)\
180813481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
180913481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
181013481Sgiacomo.travaglini@arm.com      typename p6##_type, typename p7##_type>\
181113481Sgiacomo.travaglini@arm.com  class name##ActionP8 {\
181213481Sgiacomo.travaglini@arm.com   public:\
181313481Sgiacomo.travaglini@arm.com    name##ActionP8(p0##_type gmock_p0, p1##_type gmock_p1, \
181413481Sgiacomo.travaglini@arm.com        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
181513481Sgiacomo.travaglini@arm.com        p5##_type gmock_p5, p6##_type gmock_p6, \
181613481Sgiacomo.travaglini@arm.com        p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
181713481Sgiacomo.travaglini@arm.com        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
181813481Sgiacomo.travaglini@arm.com        p7(gmock_p7) {}\
181913481Sgiacomo.travaglini@arm.com    template <typename F>\
182013481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::ActionInterface<F> {\
182113481Sgiacomo.travaglini@arm.com     public:\
182213481Sgiacomo.travaglini@arm.com      typedef F function_type;\
182313481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::Result return_type;\
182413481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
182513481Sgiacomo.travaglini@arm.com          args_type;\
182613481Sgiacomo.travaglini@arm.com      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
182713481Sgiacomo.travaglini@arm.com          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
182813481Sgiacomo.travaglini@arm.com          p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), \
182913481Sgiacomo.travaglini@arm.com          p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), \
183013481Sgiacomo.travaglini@arm.com          p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\
183113481Sgiacomo.travaglini@arm.com      virtual return_type Perform(const args_type& args) {\
183213481Sgiacomo.travaglini@arm.com        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
183313481Sgiacomo.travaglini@arm.com            Perform(this, args);\
183413481Sgiacomo.travaglini@arm.com      }\
183513481Sgiacomo.travaglini@arm.com      template <typename arg0_type, typename arg1_type, typename arg2_type, \
183613481Sgiacomo.travaglini@arm.com          typename arg3_type, typename arg4_type, typename arg5_type, \
183713481Sgiacomo.travaglini@arm.com          typename arg6_type, typename arg7_type, typename arg8_type, \
183813481Sgiacomo.travaglini@arm.com          typename arg9_type>\
183913481Sgiacomo.travaglini@arm.com      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
184013481Sgiacomo.travaglini@arm.com          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
184113481Sgiacomo.travaglini@arm.com          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
184213481Sgiacomo.travaglini@arm.com          arg9_type arg9) const;\
184313481Sgiacomo.travaglini@arm.com      p0##_type p0;\
184413481Sgiacomo.travaglini@arm.com      p1##_type p1;\
184513481Sgiacomo.travaglini@arm.com      p2##_type p2;\
184613481Sgiacomo.travaglini@arm.com      p3##_type p3;\
184713481Sgiacomo.travaglini@arm.com      p4##_type p4;\
184813481Sgiacomo.travaglini@arm.com      p5##_type p5;\
184913481Sgiacomo.travaglini@arm.com      p6##_type p6;\
185013481Sgiacomo.travaglini@arm.com      p7##_type p7;\
185113481Sgiacomo.travaglini@arm.com     private:\
185213481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
185313481Sgiacomo.travaglini@arm.com    };\
185413481Sgiacomo.travaglini@arm.com    template <typename F> operator ::testing::Action<F>() const {\
185513481Sgiacomo.travaglini@arm.com      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
185613481Sgiacomo.travaglini@arm.com          p6, p7));\
185713481Sgiacomo.travaglini@arm.com    }\
185813481Sgiacomo.travaglini@arm.com    p0##_type p0;\
185913481Sgiacomo.travaglini@arm.com    p1##_type p1;\
186013481Sgiacomo.travaglini@arm.com    p2##_type p2;\
186113481Sgiacomo.travaglini@arm.com    p3##_type p3;\
186213481Sgiacomo.travaglini@arm.com    p4##_type p4;\
186313481Sgiacomo.travaglini@arm.com    p5##_type p5;\
186413481Sgiacomo.travaglini@arm.com    p6##_type p6;\
186513481Sgiacomo.travaglini@arm.com    p7##_type p7;\
186613481Sgiacomo.travaglini@arm.com   private:\
186713481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##ActionP8);\
186813481Sgiacomo.travaglini@arm.com  };\
186913481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
187013481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
187113481Sgiacomo.travaglini@arm.com      typename p6##_type, typename p7##_type>\
187213481Sgiacomo.travaglini@arm.com  inline name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, \
187313481Sgiacomo.travaglini@arm.com      p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \
187413481Sgiacomo.travaglini@arm.com      p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
187513481Sgiacomo.travaglini@arm.com      p6##_type p6, p7##_type p7) {\
187613481Sgiacomo.travaglini@arm.com    return name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, \
187713481Sgiacomo.travaglini@arm.com        p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \
187813481Sgiacomo.travaglini@arm.com        p6, p7);\
187913481Sgiacomo.travaglini@arm.com  }\
188013481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
188113481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
188213481Sgiacomo.travaglini@arm.com      typename p6##_type, typename p7##_type>\
188313481Sgiacomo.travaglini@arm.com  template <typename F>\
188413481Sgiacomo.travaglini@arm.com  template <typename arg0_type, typename arg1_type, typename arg2_type, \
188513481Sgiacomo.travaglini@arm.com      typename arg3_type, typename arg4_type, typename arg5_type, \
188613481Sgiacomo.travaglini@arm.com      typename arg6_type, typename arg7_type, typename arg8_type, \
188713481Sgiacomo.travaglini@arm.com      typename arg9_type>\
188813481Sgiacomo.travaglini@arm.com  typename ::testing::internal::Function<F>::Result\
188913481Sgiacomo.travaglini@arm.com      name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
189013481Sgiacomo.travaglini@arm.com          p5##_type, p6##_type, \
189113481Sgiacomo.travaglini@arm.com          p7##_type>::gmock_Impl<F>::gmock_PerformImpl(\
189213481Sgiacomo.travaglini@arm.com          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
189313481Sgiacomo.travaglini@arm.com
189413481Sgiacomo.travaglini@arm.com#define ACTION_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8)\
189513481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
189613481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
189713481Sgiacomo.travaglini@arm.com      typename p6##_type, typename p7##_type, typename p8##_type>\
189813481Sgiacomo.travaglini@arm.com  class name##ActionP9 {\
189913481Sgiacomo.travaglini@arm.com   public:\
190013481Sgiacomo.travaglini@arm.com    name##ActionP9(p0##_type gmock_p0, p1##_type gmock_p1, \
190113481Sgiacomo.travaglini@arm.com        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
190213481Sgiacomo.travaglini@arm.com        p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
190313481Sgiacomo.travaglini@arm.com        p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
190413481Sgiacomo.travaglini@arm.com        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
190513481Sgiacomo.travaglini@arm.com        p8(gmock_p8) {}\
190613481Sgiacomo.travaglini@arm.com    template <typename F>\
190713481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::ActionInterface<F> {\
190813481Sgiacomo.travaglini@arm.com     public:\
190913481Sgiacomo.travaglini@arm.com      typedef F function_type;\
191013481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::Result return_type;\
191113481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
191213481Sgiacomo.travaglini@arm.com          args_type;\
191313481Sgiacomo.travaglini@arm.com      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
191413481Sgiacomo.travaglini@arm.com          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
191513481Sgiacomo.travaglini@arm.com          p6##_type gmock_p6, p7##_type gmock_p7, \
191613481Sgiacomo.travaglini@arm.com          p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
191713481Sgiacomo.travaglini@arm.com          p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
191813481Sgiacomo.travaglini@arm.com          p7(gmock_p7), p8(gmock_p8) {}\
191913481Sgiacomo.travaglini@arm.com      virtual return_type Perform(const args_type& args) {\
192013481Sgiacomo.travaglini@arm.com        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
192113481Sgiacomo.travaglini@arm.com            Perform(this, args);\
192213481Sgiacomo.travaglini@arm.com      }\
192313481Sgiacomo.travaglini@arm.com      template <typename arg0_type, typename arg1_type, typename arg2_type, \
192413481Sgiacomo.travaglini@arm.com          typename arg3_type, typename arg4_type, typename arg5_type, \
192513481Sgiacomo.travaglini@arm.com          typename arg6_type, typename arg7_type, typename arg8_type, \
192613481Sgiacomo.travaglini@arm.com          typename arg9_type>\
192713481Sgiacomo.travaglini@arm.com      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
192813481Sgiacomo.travaglini@arm.com          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
192913481Sgiacomo.travaglini@arm.com          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
193013481Sgiacomo.travaglini@arm.com          arg9_type arg9) const;\
193113481Sgiacomo.travaglini@arm.com      p0##_type p0;\
193213481Sgiacomo.travaglini@arm.com      p1##_type p1;\
193313481Sgiacomo.travaglini@arm.com      p2##_type p2;\
193413481Sgiacomo.travaglini@arm.com      p3##_type p3;\
193513481Sgiacomo.travaglini@arm.com      p4##_type p4;\
193613481Sgiacomo.travaglini@arm.com      p5##_type p5;\
193713481Sgiacomo.travaglini@arm.com      p6##_type p6;\
193813481Sgiacomo.travaglini@arm.com      p7##_type p7;\
193913481Sgiacomo.travaglini@arm.com      p8##_type p8;\
194013481Sgiacomo.travaglini@arm.com     private:\
194113481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
194213481Sgiacomo.travaglini@arm.com    };\
194313481Sgiacomo.travaglini@arm.com    template <typename F> operator ::testing::Action<F>() const {\
194413481Sgiacomo.travaglini@arm.com      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
194513481Sgiacomo.travaglini@arm.com          p6, p7, p8));\
194613481Sgiacomo.travaglini@arm.com    }\
194713481Sgiacomo.travaglini@arm.com    p0##_type p0;\
194813481Sgiacomo.travaglini@arm.com    p1##_type p1;\
194913481Sgiacomo.travaglini@arm.com    p2##_type p2;\
195013481Sgiacomo.travaglini@arm.com    p3##_type p3;\
195113481Sgiacomo.travaglini@arm.com    p4##_type p4;\
195213481Sgiacomo.travaglini@arm.com    p5##_type p5;\
195313481Sgiacomo.travaglini@arm.com    p6##_type p6;\
195413481Sgiacomo.travaglini@arm.com    p7##_type p7;\
195513481Sgiacomo.travaglini@arm.com    p8##_type p8;\
195613481Sgiacomo.travaglini@arm.com   private:\
195713481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##ActionP9);\
195813481Sgiacomo.travaglini@arm.com  };\
195913481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
196013481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
196113481Sgiacomo.travaglini@arm.com      typename p6##_type, typename p7##_type, typename p8##_type>\
196213481Sgiacomo.travaglini@arm.com  inline name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, \
196313481Sgiacomo.travaglini@arm.com      p4##_type, p5##_type, p6##_type, p7##_type, \
196413481Sgiacomo.travaglini@arm.com      p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
196513481Sgiacomo.travaglini@arm.com      p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \
196613481Sgiacomo.travaglini@arm.com      p8##_type p8) {\
196713481Sgiacomo.travaglini@arm.com    return name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, \
196813481Sgiacomo.travaglini@arm.com        p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \
196913481Sgiacomo.travaglini@arm.com        p3, p4, p5, p6, p7, p8);\
197013481Sgiacomo.travaglini@arm.com  }\
197113481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
197213481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
197313481Sgiacomo.travaglini@arm.com      typename p6##_type, typename p7##_type, typename p8##_type>\
197413481Sgiacomo.travaglini@arm.com  template <typename F>\
197513481Sgiacomo.travaglini@arm.com  template <typename arg0_type, typename arg1_type, typename arg2_type, \
197613481Sgiacomo.travaglini@arm.com      typename arg3_type, typename arg4_type, typename arg5_type, \
197713481Sgiacomo.travaglini@arm.com      typename arg6_type, typename arg7_type, typename arg8_type, \
197813481Sgiacomo.travaglini@arm.com      typename arg9_type>\
197913481Sgiacomo.travaglini@arm.com  typename ::testing::internal::Function<F>::Result\
198013481Sgiacomo.travaglini@arm.com      name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
198113481Sgiacomo.travaglini@arm.com          p5##_type, p6##_type, p7##_type, \
198213481Sgiacomo.travaglini@arm.com          p8##_type>::gmock_Impl<F>::gmock_PerformImpl(\
198313481Sgiacomo.travaglini@arm.com          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
198413481Sgiacomo.travaglini@arm.com
198513481Sgiacomo.travaglini@arm.com#define ACTION_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)\
198613481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
198713481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
198813481Sgiacomo.travaglini@arm.com      typename p6##_type, typename p7##_type, typename p8##_type, \
198913481Sgiacomo.travaglini@arm.com      typename p9##_type>\
199013481Sgiacomo.travaglini@arm.com  class name##ActionP10 {\
199113481Sgiacomo.travaglini@arm.com   public:\
199213481Sgiacomo.travaglini@arm.com    name##ActionP10(p0##_type gmock_p0, p1##_type gmock_p1, \
199313481Sgiacomo.travaglini@arm.com        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
199413481Sgiacomo.travaglini@arm.com        p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
199513481Sgiacomo.travaglini@arm.com        p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \
199613481Sgiacomo.travaglini@arm.com        p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
199713481Sgiacomo.travaglini@arm.com        p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\
199813481Sgiacomo.travaglini@arm.com    template <typename F>\
199913481Sgiacomo.travaglini@arm.com    class gmock_Impl : public ::testing::ActionInterface<F> {\
200013481Sgiacomo.travaglini@arm.com     public:\
200113481Sgiacomo.travaglini@arm.com      typedef F function_type;\
200213481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::Result return_type;\
200313481Sgiacomo.travaglini@arm.com      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
200413481Sgiacomo.travaglini@arm.com          args_type;\
200513481Sgiacomo.travaglini@arm.com      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
200613481Sgiacomo.travaglini@arm.com          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
200713481Sgiacomo.travaglini@arm.com          p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \
200813481Sgiacomo.travaglini@arm.com          p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
200913481Sgiacomo.travaglini@arm.com          p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
201013481Sgiacomo.travaglini@arm.com          p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\
201113481Sgiacomo.travaglini@arm.com      virtual return_type Perform(const args_type& args) {\
201213481Sgiacomo.travaglini@arm.com        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
201313481Sgiacomo.travaglini@arm.com            Perform(this, args);\
201413481Sgiacomo.travaglini@arm.com      }\
201513481Sgiacomo.travaglini@arm.com      template <typename arg0_type, typename arg1_type, typename arg2_type, \
201613481Sgiacomo.travaglini@arm.com          typename arg3_type, typename arg4_type, typename arg5_type, \
201713481Sgiacomo.travaglini@arm.com          typename arg6_type, typename arg7_type, typename arg8_type, \
201813481Sgiacomo.travaglini@arm.com          typename arg9_type>\
201913481Sgiacomo.travaglini@arm.com      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
202013481Sgiacomo.travaglini@arm.com          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
202113481Sgiacomo.travaglini@arm.com          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
202213481Sgiacomo.travaglini@arm.com          arg9_type arg9) const;\
202313481Sgiacomo.travaglini@arm.com      p0##_type p0;\
202413481Sgiacomo.travaglini@arm.com      p1##_type p1;\
202513481Sgiacomo.travaglini@arm.com      p2##_type p2;\
202613481Sgiacomo.travaglini@arm.com      p3##_type p3;\
202713481Sgiacomo.travaglini@arm.com      p4##_type p4;\
202813481Sgiacomo.travaglini@arm.com      p5##_type p5;\
202913481Sgiacomo.travaglini@arm.com      p6##_type p6;\
203013481Sgiacomo.travaglini@arm.com      p7##_type p7;\
203113481Sgiacomo.travaglini@arm.com      p8##_type p8;\
203213481Sgiacomo.travaglini@arm.com      p9##_type p9;\
203313481Sgiacomo.travaglini@arm.com     private:\
203413481Sgiacomo.travaglini@arm.com      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
203513481Sgiacomo.travaglini@arm.com    };\
203613481Sgiacomo.travaglini@arm.com    template <typename F> operator ::testing::Action<F>() const {\
203713481Sgiacomo.travaglini@arm.com      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
203813481Sgiacomo.travaglini@arm.com          p6, p7, p8, p9));\
203913481Sgiacomo.travaglini@arm.com    }\
204013481Sgiacomo.travaglini@arm.com    p0##_type p0;\
204113481Sgiacomo.travaglini@arm.com    p1##_type p1;\
204213481Sgiacomo.travaglini@arm.com    p2##_type p2;\
204313481Sgiacomo.travaglini@arm.com    p3##_type p3;\
204413481Sgiacomo.travaglini@arm.com    p4##_type p4;\
204513481Sgiacomo.travaglini@arm.com    p5##_type p5;\
204613481Sgiacomo.travaglini@arm.com    p6##_type p6;\
204713481Sgiacomo.travaglini@arm.com    p7##_type p7;\
204813481Sgiacomo.travaglini@arm.com    p8##_type p8;\
204913481Sgiacomo.travaglini@arm.com    p9##_type p9;\
205013481Sgiacomo.travaglini@arm.com   private:\
205113481Sgiacomo.travaglini@arm.com    GTEST_DISALLOW_ASSIGN_(name##ActionP10);\
205213481Sgiacomo.travaglini@arm.com  };\
205313481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
205413481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
205513481Sgiacomo.travaglini@arm.com      typename p6##_type, typename p7##_type, typename p8##_type, \
205613481Sgiacomo.travaglini@arm.com      typename p9##_type>\
205713481Sgiacomo.travaglini@arm.com  inline name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, \
205813481Sgiacomo.travaglini@arm.com      p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
205913481Sgiacomo.travaglini@arm.com      p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
206013481Sgiacomo.travaglini@arm.com      p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \
206113481Sgiacomo.travaglini@arm.com      p9##_type p9) {\
206213481Sgiacomo.travaglini@arm.com    return name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, \
206313481Sgiacomo.travaglini@arm.com        p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \
206413481Sgiacomo.travaglini@arm.com        p1, p2, p3, p4, p5, p6, p7, p8, p9);\
206513481Sgiacomo.travaglini@arm.com  }\
206613481Sgiacomo.travaglini@arm.com  template <typename p0##_type, typename p1##_type, typename p2##_type, \
206713481Sgiacomo.travaglini@arm.com      typename p3##_type, typename p4##_type, typename p5##_type, \
206813481Sgiacomo.travaglini@arm.com      typename p6##_type, typename p7##_type, typename p8##_type, \
206913481Sgiacomo.travaglini@arm.com      typename p9##_type>\
207013481Sgiacomo.travaglini@arm.com  template <typename F>\
207113481Sgiacomo.travaglini@arm.com  template <typename arg0_type, typename arg1_type, typename arg2_type, \
207213481Sgiacomo.travaglini@arm.com      typename arg3_type, typename arg4_type, typename arg5_type, \
207313481Sgiacomo.travaglini@arm.com      typename arg6_type, typename arg7_type, typename arg8_type, \
207413481Sgiacomo.travaglini@arm.com      typename arg9_type>\
207513481Sgiacomo.travaglini@arm.com  typename ::testing::internal::Function<F>::Result\
207613481Sgiacomo.travaglini@arm.com      name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
207713481Sgiacomo.travaglini@arm.com          p5##_type, p6##_type, p7##_type, p8##_type, \
207813481Sgiacomo.travaglini@arm.com          p9##_type>::gmock_Impl<F>::gmock_PerformImpl(\
207913481Sgiacomo.travaglini@arm.com          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
208013481Sgiacomo.travaglini@arm.com
208113481Sgiacomo.travaglini@arm.comnamespace testing {
208213481Sgiacomo.travaglini@arm.com
208313481Sgiacomo.travaglini@arm.com
208413481Sgiacomo.travaglini@arm.com// The ACTION*() macros trigger warning C4100 (unreferenced formal
208513481Sgiacomo.travaglini@arm.com// parameter) in MSVC with -W4.  Unfortunately they cannot be fixed in
208613481Sgiacomo.travaglini@arm.com// the macro definition, as the warnings are generated when the macro
208713481Sgiacomo.travaglini@arm.com// is expanded and macro expansion cannot contain #pragma.  Therefore
208813481Sgiacomo.travaglini@arm.com// we suppress them here.
208913481Sgiacomo.travaglini@arm.com#ifdef _MSC_VER
209013481Sgiacomo.travaglini@arm.com# pragma warning(push)
209113481Sgiacomo.travaglini@arm.com# pragma warning(disable:4100)
209213481Sgiacomo.travaglini@arm.com#endif
209313481Sgiacomo.travaglini@arm.com
209413481Sgiacomo.travaglini@arm.com// Various overloads for InvokeArgument<N>().
209513481Sgiacomo.travaglini@arm.com//
209613481Sgiacomo.travaglini@arm.com// The InvokeArgument<N>(a1, a2, ..., a_k) action invokes the N-th
209713481Sgiacomo.travaglini@arm.com// (0-based) argument, which must be a k-ary callable, of the mock
209813481Sgiacomo.travaglini@arm.com// function, with arguments a1, a2, ..., a_k.
209913481Sgiacomo.travaglini@arm.com//
210013481Sgiacomo.travaglini@arm.com// Notes:
210113481Sgiacomo.travaglini@arm.com//
210213481Sgiacomo.travaglini@arm.com//   1. The arguments are passed by value by default.  If you need to
210313481Sgiacomo.travaglini@arm.com//   pass an argument by reference, wrap it inside ByRef().  For
210413481Sgiacomo.travaglini@arm.com//   example,
210513481Sgiacomo.travaglini@arm.com//
210613481Sgiacomo.travaglini@arm.com//     InvokeArgument<1>(5, string("Hello"), ByRef(foo))
210713481Sgiacomo.travaglini@arm.com//
210813481Sgiacomo.travaglini@arm.com//   passes 5 and string("Hello") by value, and passes foo by
210913481Sgiacomo.travaglini@arm.com//   reference.
211013481Sgiacomo.travaglini@arm.com//
211113481Sgiacomo.travaglini@arm.com//   2. If the callable takes an argument by reference but ByRef() is
211213481Sgiacomo.travaglini@arm.com//   not used, it will receive the reference to a copy of the value,
211313481Sgiacomo.travaglini@arm.com//   instead of the original value.  For example, when the 0-th
211413481Sgiacomo.travaglini@arm.com//   argument of the mock function takes a const string&, the action
211513481Sgiacomo.travaglini@arm.com//
211613481Sgiacomo.travaglini@arm.com//     InvokeArgument<0>(string("Hello"))
211713481Sgiacomo.travaglini@arm.com//
211813481Sgiacomo.travaglini@arm.com//   makes a copy of the temporary string("Hello") object and passes a
211913481Sgiacomo.travaglini@arm.com//   reference of the copy, instead of the original temporary object,
212013481Sgiacomo.travaglini@arm.com//   to the callable.  This makes it easy for a user to define an
212113481Sgiacomo.travaglini@arm.com//   InvokeArgument action from temporary values and have it performed
212213481Sgiacomo.travaglini@arm.com//   later.
212313481Sgiacomo.travaglini@arm.com
212413481Sgiacomo.travaglini@arm.comnamespace internal {
212513481Sgiacomo.travaglini@arm.comnamespace invoke_argument {
212613481Sgiacomo.travaglini@arm.com
212713481Sgiacomo.travaglini@arm.com// Appears in InvokeArgumentAdl's argument list to help avoid
212813481Sgiacomo.travaglini@arm.com// accidental calls to user functions of the same name.
212913481Sgiacomo.travaglini@arm.comstruct AdlTag {};
213013481Sgiacomo.travaglini@arm.com
213113481Sgiacomo.travaglini@arm.com// InvokeArgumentAdl - a helper for InvokeArgument.
213213481Sgiacomo.travaglini@arm.com// The basic overloads are provided here for generic functors.
213313481Sgiacomo.travaglini@arm.com// Overloads for other custom-callables are provided in the
213413481Sgiacomo.travaglini@arm.com// internal/custom/callback-actions.h header.
213513481Sgiacomo.travaglini@arm.com
213613481Sgiacomo.travaglini@arm.comtemplate <typename R, typename F>
213713481Sgiacomo.travaglini@arm.comR InvokeArgumentAdl(AdlTag, F f) {
213813481Sgiacomo.travaglini@arm.com  return f();
213913481Sgiacomo.travaglini@arm.com}
214013481Sgiacomo.travaglini@arm.comtemplate <typename R, typename F, typename A1>
214113481Sgiacomo.travaglini@arm.comR InvokeArgumentAdl(AdlTag, F f, A1 a1) {
214213481Sgiacomo.travaglini@arm.com  return f(a1);
214313481Sgiacomo.travaglini@arm.com}
214413481Sgiacomo.travaglini@arm.comtemplate <typename R, typename F, typename A1, typename A2>
214513481Sgiacomo.travaglini@arm.comR InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2) {
214613481Sgiacomo.travaglini@arm.com  return f(a1, a2);
214713481Sgiacomo.travaglini@arm.com}
214813481Sgiacomo.travaglini@arm.comtemplate <typename R, typename F, typename A1, typename A2, typename A3>
214913481Sgiacomo.travaglini@arm.comR InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3) {
215013481Sgiacomo.travaglini@arm.com  return f(a1, a2, a3);
215113481Sgiacomo.travaglini@arm.com}
215213481Sgiacomo.travaglini@arm.comtemplate <typename R, typename F, typename A1, typename A2, typename A3,
215313481Sgiacomo.travaglini@arm.com    typename A4>
215413481Sgiacomo.travaglini@arm.comR InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4) {
215513481Sgiacomo.travaglini@arm.com  return f(a1, a2, a3, a4);
215613481Sgiacomo.travaglini@arm.com}
215713481Sgiacomo.travaglini@arm.comtemplate <typename R, typename F, typename A1, typename A2, typename A3,
215813481Sgiacomo.travaglini@arm.com    typename A4, typename A5>
215913481Sgiacomo.travaglini@arm.comR InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
216013481Sgiacomo.travaglini@arm.com  return f(a1, a2, a3, a4, a5);
216113481Sgiacomo.travaglini@arm.com}
216213481Sgiacomo.travaglini@arm.comtemplate <typename R, typename F, typename A1, typename A2, typename A3,
216313481Sgiacomo.travaglini@arm.com    typename A4, typename A5, typename A6>
216413481Sgiacomo.travaglini@arm.comR InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
216513481Sgiacomo.travaglini@arm.com  return f(a1, a2, a3, a4, a5, a6);
216613481Sgiacomo.travaglini@arm.com}
216713481Sgiacomo.travaglini@arm.comtemplate <typename R, typename F, typename A1, typename A2, typename A3,
216813481Sgiacomo.travaglini@arm.com    typename A4, typename A5, typename A6, typename A7>
216913481Sgiacomo.travaglini@arm.comR InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
217013481Sgiacomo.travaglini@arm.com    A7 a7) {
217113481Sgiacomo.travaglini@arm.com  return f(a1, a2, a3, a4, a5, a6, a7);
217213481Sgiacomo.travaglini@arm.com}
217313481Sgiacomo.travaglini@arm.comtemplate <typename R, typename F, typename A1, typename A2, typename A3,
217413481Sgiacomo.travaglini@arm.com    typename A4, typename A5, typename A6, typename A7, typename A8>
217513481Sgiacomo.travaglini@arm.comR InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
217613481Sgiacomo.travaglini@arm.com    A7 a7, A8 a8) {
217713481Sgiacomo.travaglini@arm.com  return f(a1, a2, a3, a4, a5, a6, a7, a8);
217813481Sgiacomo.travaglini@arm.com}
217913481Sgiacomo.travaglini@arm.comtemplate <typename R, typename F, typename A1, typename A2, typename A3,
218013481Sgiacomo.travaglini@arm.com    typename A4, typename A5, typename A6, typename A7, typename A8,
218113481Sgiacomo.travaglini@arm.com    typename A9>
218213481Sgiacomo.travaglini@arm.comR InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
218313481Sgiacomo.travaglini@arm.com    A7 a7, A8 a8, A9 a9) {
218413481Sgiacomo.travaglini@arm.com  return f(a1, a2, a3, a4, a5, a6, a7, a8, a9);
218513481Sgiacomo.travaglini@arm.com}
218613481Sgiacomo.travaglini@arm.comtemplate <typename R, typename F, typename A1, typename A2, typename A3,
218713481Sgiacomo.travaglini@arm.com    typename A4, typename A5, typename A6, typename A7, typename A8,
218813481Sgiacomo.travaglini@arm.com    typename A9, typename A10>
218913481Sgiacomo.travaglini@arm.comR InvokeArgumentAdl(AdlTag, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
219013481Sgiacomo.travaglini@arm.com    A7 a7, A8 a8, A9 a9, A10 a10) {
219113481Sgiacomo.travaglini@arm.com  return f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
219213481Sgiacomo.travaglini@arm.com}
219313481Sgiacomo.travaglini@arm.com}  // namespace invoke_argument
219413481Sgiacomo.travaglini@arm.com}  // namespace internal
219513481Sgiacomo.travaglini@arm.com
219613481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(InvokeArgument,
219713481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(int, k),
219813481Sgiacomo.travaglini@arm.com                AND_0_VALUE_PARAMS()) {
219913481Sgiacomo.travaglini@arm.com  using internal::invoke_argument::InvokeArgumentAdl;
220013481Sgiacomo.travaglini@arm.com  return InvokeArgumentAdl<return_type>(
220113481Sgiacomo.travaglini@arm.com      internal::invoke_argument::AdlTag(),
220213481Sgiacomo.travaglini@arm.com      ::testing::get<k>(args));
220313481Sgiacomo.travaglini@arm.com}
220413481Sgiacomo.travaglini@arm.com
220513481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(InvokeArgument,
220613481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(int, k),
220713481Sgiacomo.travaglini@arm.com                AND_1_VALUE_PARAMS(p0)) {
220813481Sgiacomo.travaglini@arm.com  using internal::invoke_argument::InvokeArgumentAdl;
220913481Sgiacomo.travaglini@arm.com  return InvokeArgumentAdl<return_type>(
221013481Sgiacomo.travaglini@arm.com      internal::invoke_argument::AdlTag(),
221113481Sgiacomo.travaglini@arm.com      ::testing::get<k>(args), p0);
221213481Sgiacomo.travaglini@arm.com}
221313481Sgiacomo.travaglini@arm.com
221413481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(InvokeArgument,
221513481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(int, k),
221613481Sgiacomo.travaglini@arm.com                AND_2_VALUE_PARAMS(p0, p1)) {
221713481Sgiacomo.travaglini@arm.com  using internal::invoke_argument::InvokeArgumentAdl;
221813481Sgiacomo.travaglini@arm.com  return InvokeArgumentAdl<return_type>(
221913481Sgiacomo.travaglini@arm.com      internal::invoke_argument::AdlTag(),
222013481Sgiacomo.travaglini@arm.com      ::testing::get<k>(args), p0, p1);
222113481Sgiacomo.travaglini@arm.com}
222213481Sgiacomo.travaglini@arm.com
222313481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(InvokeArgument,
222413481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(int, k),
222513481Sgiacomo.travaglini@arm.com                AND_3_VALUE_PARAMS(p0, p1, p2)) {
222613481Sgiacomo.travaglini@arm.com  using internal::invoke_argument::InvokeArgumentAdl;
222713481Sgiacomo.travaglini@arm.com  return InvokeArgumentAdl<return_type>(
222813481Sgiacomo.travaglini@arm.com      internal::invoke_argument::AdlTag(),
222913481Sgiacomo.travaglini@arm.com      ::testing::get<k>(args), p0, p1, p2);
223013481Sgiacomo.travaglini@arm.com}
223113481Sgiacomo.travaglini@arm.com
223213481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(InvokeArgument,
223313481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(int, k),
223413481Sgiacomo.travaglini@arm.com                AND_4_VALUE_PARAMS(p0, p1, p2, p3)) {
223513481Sgiacomo.travaglini@arm.com  using internal::invoke_argument::InvokeArgumentAdl;
223613481Sgiacomo.travaglini@arm.com  return InvokeArgumentAdl<return_type>(
223713481Sgiacomo.travaglini@arm.com      internal::invoke_argument::AdlTag(),
223813481Sgiacomo.travaglini@arm.com      ::testing::get<k>(args), p0, p1, p2, p3);
223913481Sgiacomo.travaglini@arm.com}
224013481Sgiacomo.travaglini@arm.com
224113481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(InvokeArgument,
224213481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(int, k),
224313481Sgiacomo.travaglini@arm.com                AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) {
224413481Sgiacomo.travaglini@arm.com  using internal::invoke_argument::InvokeArgumentAdl;
224513481Sgiacomo.travaglini@arm.com  return InvokeArgumentAdl<return_type>(
224613481Sgiacomo.travaglini@arm.com      internal::invoke_argument::AdlTag(),
224713481Sgiacomo.travaglini@arm.com      ::testing::get<k>(args), p0, p1, p2, p3, p4);
224813481Sgiacomo.travaglini@arm.com}
224913481Sgiacomo.travaglini@arm.com
225013481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(InvokeArgument,
225113481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(int, k),
225213481Sgiacomo.travaglini@arm.com                AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) {
225313481Sgiacomo.travaglini@arm.com  using internal::invoke_argument::InvokeArgumentAdl;
225413481Sgiacomo.travaglini@arm.com  return InvokeArgumentAdl<return_type>(
225513481Sgiacomo.travaglini@arm.com      internal::invoke_argument::AdlTag(),
225613481Sgiacomo.travaglini@arm.com      ::testing::get<k>(args), p0, p1, p2, p3, p4, p5);
225713481Sgiacomo.travaglini@arm.com}
225813481Sgiacomo.travaglini@arm.com
225913481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(InvokeArgument,
226013481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(int, k),
226113481Sgiacomo.travaglini@arm.com                AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) {
226213481Sgiacomo.travaglini@arm.com  using internal::invoke_argument::InvokeArgumentAdl;
226313481Sgiacomo.travaglini@arm.com  return InvokeArgumentAdl<return_type>(
226413481Sgiacomo.travaglini@arm.com      internal::invoke_argument::AdlTag(),
226513481Sgiacomo.travaglini@arm.com      ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6);
226613481Sgiacomo.travaglini@arm.com}
226713481Sgiacomo.travaglini@arm.com
226813481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(InvokeArgument,
226913481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(int, k),
227013481Sgiacomo.travaglini@arm.com                AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) {
227113481Sgiacomo.travaglini@arm.com  using internal::invoke_argument::InvokeArgumentAdl;
227213481Sgiacomo.travaglini@arm.com  return InvokeArgumentAdl<return_type>(
227313481Sgiacomo.travaglini@arm.com      internal::invoke_argument::AdlTag(),
227413481Sgiacomo.travaglini@arm.com      ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7);
227513481Sgiacomo.travaglini@arm.com}
227613481Sgiacomo.travaglini@arm.com
227713481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(InvokeArgument,
227813481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(int, k),
227913481Sgiacomo.travaglini@arm.com                AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) {
228013481Sgiacomo.travaglini@arm.com  using internal::invoke_argument::InvokeArgumentAdl;
228113481Sgiacomo.travaglini@arm.com  return InvokeArgumentAdl<return_type>(
228213481Sgiacomo.travaglini@arm.com      internal::invoke_argument::AdlTag(),
228313481Sgiacomo.travaglini@arm.com      ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8);
228413481Sgiacomo.travaglini@arm.com}
228513481Sgiacomo.travaglini@arm.com
228613481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(InvokeArgument,
228713481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(int, k),
228813481Sgiacomo.travaglini@arm.com                AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) {
228913481Sgiacomo.travaglini@arm.com  using internal::invoke_argument::InvokeArgumentAdl;
229013481Sgiacomo.travaglini@arm.com  return InvokeArgumentAdl<return_type>(
229113481Sgiacomo.travaglini@arm.com      internal::invoke_argument::AdlTag(),
229213481Sgiacomo.travaglini@arm.com      ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
229313481Sgiacomo.travaglini@arm.com}
229413481Sgiacomo.travaglini@arm.com
229513481Sgiacomo.travaglini@arm.com// Various overloads for ReturnNew<T>().
229613481Sgiacomo.travaglini@arm.com//
229713481Sgiacomo.travaglini@arm.com// The ReturnNew<T>(a1, a2, ..., a_k) action returns a pointer to a new
229813481Sgiacomo.travaglini@arm.com// instance of type T, constructed on the heap with constructor arguments
229913481Sgiacomo.travaglini@arm.com// a1, a2, ..., and a_k. The caller assumes ownership of the returned value.
230013481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(ReturnNew,
230113481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(typename, T),
230213481Sgiacomo.travaglini@arm.com                AND_0_VALUE_PARAMS()) {
230313481Sgiacomo.travaglini@arm.com  return new T();
230413481Sgiacomo.travaglini@arm.com}
230513481Sgiacomo.travaglini@arm.com
230613481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(ReturnNew,
230713481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(typename, T),
230813481Sgiacomo.travaglini@arm.com                AND_1_VALUE_PARAMS(p0)) {
230913481Sgiacomo.travaglini@arm.com  return new T(p0);
231013481Sgiacomo.travaglini@arm.com}
231113481Sgiacomo.travaglini@arm.com
231213481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(ReturnNew,
231313481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(typename, T),
231413481Sgiacomo.travaglini@arm.com                AND_2_VALUE_PARAMS(p0, p1)) {
231513481Sgiacomo.travaglini@arm.com  return new T(p0, p1);
231613481Sgiacomo.travaglini@arm.com}
231713481Sgiacomo.travaglini@arm.com
231813481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(ReturnNew,
231913481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(typename, T),
232013481Sgiacomo.travaglini@arm.com                AND_3_VALUE_PARAMS(p0, p1, p2)) {
232113481Sgiacomo.travaglini@arm.com  return new T(p0, p1, p2);
232213481Sgiacomo.travaglini@arm.com}
232313481Sgiacomo.travaglini@arm.com
232413481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(ReturnNew,
232513481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(typename, T),
232613481Sgiacomo.travaglini@arm.com                AND_4_VALUE_PARAMS(p0, p1, p2, p3)) {
232713481Sgiacomo.travaglini@arm.com  return new T(p0, p1, p2, p3);
232813481Sgiacomo.travaglini@arm.com}
232913481Sgiacomo.travaglini@arm.com
233013481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(ReturnNew,
233113481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(typename, T),
233213481Sgiacomo.travaglini@arm.com                AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) {
233313481Sgiacomo.travaglini@arm.com  return new T(p0, p1, p2, p3, p4);
233413481Sgiacomo.travaglini@arm.com}
233513481Sgiacomo.travaglini@arm.com
233613481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(ReturnNew,
233713481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(typename, T),
233813481Sgiacomo.travaglini@arm.com                AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) {
233913481Sgiacomo.travaglini@arm.com  return new T(p0, p1, p2, p3, p4, p5);
234013481Sgiacomo.travaglini@arm.com}
234113481Sgiacomo.travaglini@arm.com
234213481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(ReturnNew,
234313481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(typename, T),
234413481Sgiacomo.travaglini@arm.com                AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) {
234513481Sgiacomo.travaglini@arm.com  return new T(p0, p1, p2, p3, p4, p5, p6);
234613481Sgiacomo.travaglini@arm.com}
234713481Sgiacomo.travaglini@arm.com
234813481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(ReturnNew,
234913481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(typename, T),
235013481Sgiacomo.travaglini@arm.com                AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) {
235113481Sgiacomo.travaglini@arm.com  return new T(p0, p1, p2, p3, p4, p5, p6, p7);
235213481Sgiacomo.travaglini@arm.com}
235313481Sgiacomo.travaglini@arm.com
235413481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(ReturnNew,
235513481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(typename, T),
235613481Sgiacomo.travaglini@arm.com                AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) {
235713481Sgiacomo.travaglini@arm.com  return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8);
235813481Sgiacomo.travaglini@arm.com}
235913481Sgiacomo.travaglini@arm.com
236013481Sgiacomo.travaglini@arm.comACTION_TEMPLATE(ReturnNew,
236113481Sgiacomo.travaglini@arm.com                HAS_1_TEMPLATE_PARAMS(typename, T),
236213481Sgiacomo.travaglini@arm.com                AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) {
236313481Sgiacomo.travaglini@arm.com  return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
236413481Sgiacomo.travaglini@arm.com}
236513481Sgiacomo.travaglini@arm.com
236613481Sgiacomo.travaglini@arm.com#ifdef _MSC_VER
236713481Sgiacomo.travaglini@arm.com# pragma warning(pop)
236813481Sgiacomo.travaglini@arm.com#endif
236913481Sgiacomo.travaglini@arm.com
237013481Sgiacomo.travaglini@arm.com}  // namespace testing
237113481Sgiacomo.travaglini@arm.com
237213481Sgiacomo.travaglini@arm.com// Include any custom actions added by the local installation.
237313481Sgiacomo.travaglini@arm.com// We must include this header at the end to make sure it can use the
237413481Sgiacomo.travaglini@arm.com// declarations from this file.
237513481Sgiacomo.travaglini@arm.com#include "gmock/internal/custom/gmock-generated-actions.h"
237613481Sgiacomo.travaglini@arm.com
237713481Sgiacomo.travaglini@arm.com#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_
2378