1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This file was GENERATED by a script.  DO NOT EDIT BY HAND!!!
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright 2007, Google Inc.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// All rights reserved.
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Redistribution and use in source and binary forms, with or without
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// modification, are permitted provided that the following conditions are
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// met:
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Redistributions of source code must retain the above copyright
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// notice, this list of conditions and the following disclaimer.
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Redistributions in binary form must reproduce the above
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// copyright notice, this list of conditions and the following disclaimer
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in the documentation and/or other materials provided with the
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// distribution.
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Neither the name of Google Inc. nor the names of its
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// contributors may be used to endorse or promote products derived from
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// this software without specific prior written permission.
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Author: wan@google.com (Zhanyong Wan)
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Google Mock - a framework for writing C++ mock classes.
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This file implements some commonly used variadic actions.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gmock/gmock-actions.h"
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gmock/internal/gmock-port.h"
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace testing {
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace internal {
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// InvokeHelper<F> knows how to unpack an N-tuple and invoke an N-ary
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// function or method with the unpacked values, where F is a function
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// type that takes N arguments.
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Result, typename ArgumentTuple>
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass InvokeHelper;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename R>
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass InvokeHelper<R, ::std::tr1::tuple<> > {
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function>
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Invoke(Function function, const ::std::tr1::tuple<>&) {
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function();
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <class Class, typename MethodPtr>
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R InvokeMethod(Class* obj_ptr,
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        MethodPtr method_ptr,
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const ::std::tr1::tuple<>&) {
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return (obj_ptr->*method_ptr)();
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename R, typename A1>
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass InvokeHelper<R, ::std::tr1::tuple<A1> > {
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function>
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Invoke(Function function, const ::std::tr1::tuple<A1>& args) {
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(get<0>(args));
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <class Class, typename MethodPtr>
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R InvokeMethod(Class* obj_ptr,
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        MethodPtr method_ptr,
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const ::std::tr1::tuple<A1>& args) {
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return (obj_ptr->*method_ptr)(get<0>(args));
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename R, typename A1, typename A2>
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass InvokeHelper<R, ::std::tr1::tuple<A1, A2> > {
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function>
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Invoke(Function function, const ::std::tr1::tuple<A1, A2>& args) {
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(get<0>(args), get<1>(args));
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <class Class, typename MethodPtr>
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R InvokeMethod(Class* obj_ptr,
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        MethodPtr method_ptr,
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const ::std::tr1::tuple<A1, A2>& args) {
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args));
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename R, typename A1, typename A2, typename A3>
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3> > {
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function>
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Invoke(Function function, const ::std::tr1::tuple<A1, A2,
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A3>& args) {
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(get<0>(args), get<1>(args), get<2>(args));
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <class Class, typename MethodPtr>
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R InvokeMethod(Class* obj_ptr,
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        MethodPtr method_ptr,
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const ::std::tr1::tuple<A1, A2, A3>& args) {
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args));
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename R, typename A1, typename A2, typename A3, typename A4>
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4> > {
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function>
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3,
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A4>& args) {
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args));
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <class Class, typename MethodPtr>
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R InvokeMethod(Class* obj_ptr,
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        MethodPtr method_ptr,
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const ::std::tr1::tuple<A1, A2, A3, A4>& args) {
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args),
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<3>(args));
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename R, typename A1, typename A2, typename A3, typename A4,
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename A5>
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4, A5> > {
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function>
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, A4,
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A5>& args) {
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args),
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<4>(args));
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <class Class, typename MethodPtr>
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R InvokeMethod(Class* obj_ptr,
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        MethodPtr method_ptr,
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const ::std::tr1::tuple<A1, A2, A3, A4, A5>& args) {
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args),
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<3>(args), get<4>(args));
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename R, typename A1, typename A2, typename A3, typename A4,
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename A5, typename A6>
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4, A5, A6> > {
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function>
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, A4,
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A5, A6>& args) {
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args),
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<4>(args), get<5>(args));
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <class Class, typename MethodPtr>
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R InvokeMethod(Class* obj_ptr,
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        MethodPtr method_ptr,
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const ::std::tr1::tuple<A1, A2, A3, A4, A5, A6>& args) {
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args),
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<3>(args), get<4>(args), get<5>(args));
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename R, typename A1, typename A2, typename A3, typename A4,
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename A5, typename A6, typename A7>
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7> > {
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function>
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, A4,
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A5, A6, A7>& args) {
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args),
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<4>(args), get<5>(args), get<6>(args));
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <class Class, typename MethodPtr>
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R InvokeMethod(Class* obj_ptr,
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        MethodPtr method_ptr,
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const ::std::tr1::tuple<A1, A2, A3, A4, A5, A6,
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            A7>& args) {
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args),
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<3>(args), get<4>(args), get<5>(args), get<6>(args));
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename R, typename A1, typename A2, typename A3, typename A4,
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename A5, typename A6, typename A7, typename A8>
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8> > {
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function>
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, A4,
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A5, A6, A7, A8>& args) {
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args),
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<4>(args), get<5>(args), get<6>(args), get<7>(args));
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <class Class, typename MethodPtr>
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R InvokeMethod(Class* obj_ptr,
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        MethodPtr method_ptr,
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7,
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            A8>& args) {
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args),
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<3>(args), get<4>(args), get<5>(args), get<6>(args), get<7>(args));
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename R, typename A1, typename A2, typename A3, typename A4,
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename A5, typename A6, typename A7, typename A8, typename A9>
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> > {
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function>
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, A4,
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A5, A6, A7, A8, A9>& args) {
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args),
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args));
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <class Class, typename MethodPtr>
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R InvokeMethod(Class* obj_ptr,
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        MethodPtr method_ptr,
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8,
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            A9>& args) {
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args),
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<3>(args), get<4>(args), get<5>(args), get<6>(args), get<7>(args),
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<8>(args));
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename R, typename A1, typename A2, typename A3, typename A4,
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename A5, typename A6, typename A7, typename A8, typename A9,
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename A10>
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass InvokeHelper<R, ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    A10> > {
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function>
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Invoke(Function function, const ::std::tr1::tuple<A1, A2, A3, A4,
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A5, A6, A7, A8, A9, A10>& args) {
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(get<0>(args), get<1>(args), get<2>(args), get<3>(args),
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<9>(args));
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <class Class, typename MethodPtr>
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R InvokeMethod(Class* obj_ptr,
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        MethodPtr method_ptr,
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8,
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            A9, A10>& args) {
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args), get<2>(args),
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<3>(args), get<4>(args), get<5>(args), get<6>(args), get<7>(args),
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<8>(args), get<9>(args));
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// CallableHelper has static methods for invoking "callables",
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// i.e. function pointers and functors.  It uses overloading to
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// provide a uniform interface for invoking different kinds of
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// callables.  In particular, you can use:
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   CallableHelper<R>::Call(callable, a1, a2, ..., an)
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// to invoke an n-ary callable, where R is its return type.  If an
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// argument, say a2, needs to be passed by reference, you should write
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ByRef(a2) instead of a2 in the above expression.
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename R>
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CallableHelper {
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Calls a nullary callable.
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function>
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Call(Function function) { return function(); }
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Calls a unary callable.
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We deliberately pass a1 by value instead of const reference here
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // in case it is a C-string literal.  If we had declared the
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // parameter as 'const A1& a1' and write Call(function, "Hi"), the
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // compiler would've thought A1 is 'char[3]', which causes trouble
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // when you need to copy a value of type A1.  By declaring the
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // parameter as 'A1 a1', the compiler will correctly infer that A1
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is 'const char*' when it sees Call(function, "Hi").
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Since this function is defined inline, the compiler can get rid
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // of the copying of the arguments.  Therefore the performance won't
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // be hurt.
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function, typename A1>
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Call(Function function, A1 a1) { return function(a1); }
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Calls a binary callable.
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function, typename A1, typename A2>
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Call(Function function, A1 a1, A2 a2) {
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(a1, a2);
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Calls a ternary callable.
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function, typename A1, typename A2, typename A3>
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Call(Function function, A1 a1, A2 a2, A3 a3) {
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(a1, a2, a3);
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Calls a 4-ary callable.
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function, typename A1, typename A2, typename A3,
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename A4>
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4) {
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(a1, a2, a3, a4);
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Calls a 5-ary callable.
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function, typename A1, typename A2, typename A3,
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename A4, typename A5>
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(a1, a2, a3, a4, a5);
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Calls a 6-ary callable.
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function, typename A1, typename A2, typename A3,
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename A4, typename A5, typename A6>
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(a1, a2, a3, a4, a5, a6);
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Calls a 7-ary callable.
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function, typename A1, typename A2, typename A3,
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename A4, typename A5, typename A6, typename A7>
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A7 a7) {
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(a1, a2, a3, a4, a5, a6, a7);
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Calls a 8-ary callable.
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function, typename A1, typename A2, typename A3,
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename A4, typename A5, typename A6, typename A7, typename A8>
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A7 a7, A8 a8) {
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(a1, a2, a3, a4, a5, a6, a7, a8);
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Calls a 9-ary callable.
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function, typename A1, typename A2, typename A3,
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename A4, typename A5, typename A6, typename A7, typename A8,
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename A9>
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A7 a7, A8 a8, A9 a9) {
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(a1, a2, a3, a4, a5, a6, a7, a8, a9);
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Calls a 10-ary callable.
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename Function, typename A1, typename A2, typename A3,
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename A4, typename A5, typename A6, typename A7, typename A8,
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename A9, typename A10>
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static R Call(Function function, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6,
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A7 a7, A8 a8, A9 a9, A10 a10) {
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return function(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};  // class CallableHelper
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// An INTERNAL macro for extracting the type of a tuple field.  It's
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// subject to change without notice - DO NOT USE IN USER CODE!
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_FIELD_(Tuple, N) \
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename ::std::tr1::tuple_element<N, Tuple>::type
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::type is the
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// type of an n-ary function whose i-th (1-based) argument type is the
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// k{i}-th (0-based) field of ArgumentTuple, which must be a tuple
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// type, and whose return type is Result.  For example,
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   SelectArgs<int, ::std::tr1::tuple<bool, char, double, long>, 0, 3>::type
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// is int(bool, long).
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::Select(args)
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// returns the selected fields (k1, k2, ..., k_n) of args as a tuple.
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// For example,
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   SelectArgs<int, ::std::tr1::tuple<bool, char, double>, 2, 0>::Select(
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//       ::std::tr1::make_tuple(true, 'a', 2.5))
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// returns ::std::tr1::tuple (2.5, true).
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The numbers in list k1, k2, ..., k_n must be >= 0, where n can be
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in the range [0, 10].  Duplicates are allowed and they don't have
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// to be in an ascending or descending order.
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int k4, int k5, int k6, int k7, int k8, int k9, int k10>
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SelectArgs {
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9),
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k10));
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef typename Function<type>::ArgumentTuple SelectedArgs;
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static SelectedArgs Select(const ArgumentTuple& args) {
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<k8>(args), get<k9>(args), get<k10>(args));
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Result, typename ArgumentTuple>
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SelectArgs<Result, ArgumentTuple,
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Result type();
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef typename Function<type>::ArgumentTuple SelectedArgs;
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static SelectedArgs Select(const ArgumentTuple& /* args */) {
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return SelectedArgs();
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Result, typename ArgumentTuple, int k1>
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SelectArgs<Result, ArgumentTuple,
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 k1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1));
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef typename Function<type>::ArgumentTuple SelectedArgs;
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static SelectedArgs Select(const ArgumentTuple& args) {
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return SelectedArgs(get<k1>(args));
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Result, typename ArgumentTuple, int k1, int k2>
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SelectArgs<Result, ArgumentTuple,
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 k1, k2, -1, -1, -1, -1, -1, -1, -1, -1> {
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k2));
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef typename Function<type>::ArgumentTuple SelectedArgs;
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static SelectedArgs Select(const ArgumentTuple& args) {
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return SelectedArgs(get<k1>(args), get<k2>(args));
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3>
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SelectArgs<Result, ArgumentTuple,
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 k1, k2, k3, -1, -1, -1, -1, -1, -1, -1> {
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3));
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef typename Function<type>::ArgumentTuple SelectedArgs;
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static SelectedArgs Select(const ArgumentTuple& args) {
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args));
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int k4>
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SelectArgs<Result, ArgumentTuple,
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 k1, k2, k3, k4, -1, -1, -1, -1, -1, -1> {
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k4));
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef typename Function<type>::ArgumentTuple SelectedArgs;
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static SelectedArgs Select(const ArgumentTuple& args) {
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<k4>(args));
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int k4, int k5>
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SelectArgs<Result, ArgumentTuple,
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 k1, k2, k3, k4, k5, -1, -1, -1, -1, -1> {
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5));
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef typename Function<type>::ArgumentTuple SelectedArgs;
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static SelectedArgs Select(const ArgumentTuple& args) {
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<k4>(args), get<k5>(args));
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int k4, int k5, int k6>
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SelectArgs<Result, ArgumentTuple,
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 k1, k2, k3, k4, k5, k6, -1, -1, -1, -1> {
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k6));
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef typename Function<type>::ArgumentTuple SelectedArgs;
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static SelectedArgs Select(const ArgumentTuple& args) {
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<k4>(args), get<k5>(args), get<k6>(args));
525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int k4, int k5, int k6, int k7>
530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SelectArgs<Result, ArgumentTuple,
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 k1, k2, k3, k4, k5, k6, k7, -1, -1, -1> {
532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7));
537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef typename Function<type>::ArgumentTuple SelectedArgs;
538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static SelectedArgs Select(const ArgumentTuple& args) {
539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args));
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int k4, int k5, int k6, int k7, int k8>
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SelectArgs<Result, ArgumentTuple,
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 k1, k2, k3, k4, k5, k6, k7, k8, -1, -1> {
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k8));
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef typename Function<type>::ArgumentTuple SelectedArgs;
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static SelectedArgs Select(const ArgumentTuple& args) {
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<k8>(args));
561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Result, typename ArgumentTuple, int k1, int k2, int k3,
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int k4, int k5, int k6, int k7, int k8, int k9>
566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SelectArgs<Result, ArgumentTuple,
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 k1, k2, k3, k4, k5, k6, k7, k8, k9, -1> {
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),
571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),
573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9));
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef typename Function<type>::ArgumentTuple SelectedArgs;
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static SelectedArgs Select(const ArgumentTuple& args) {
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<k8>(args), get<k9>(args));
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#undef GMOCK_FIELD_
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Implements the WithArgs action.
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename InnerAction, int k1 = -1, int k2 = -1, int k3 = -1,
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int k9 = -1, int k10 = -1>
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WithArgsAction {
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit WithArgsAction(const InnerAction& action) : action_(action) {}
592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename F>
594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operator Action<F>() const { return MakeAction(new Impl<F>(action_)); }
595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename F>
598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class Impl : public ActionInterface<F> {
599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typedef typename Function<F>::Result Result;
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typedef typename Function<F>::ArgumentTuple ArgumentTuple;
602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    explicit Impl(const InnerAction& action) : action_(action) {}
604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual Result Perform(const ArgumentTuple& args) {
606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return action_.Perform(SelectArgs<Result, ArgumentTuple, k1, k2, k3, k4,
607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          k5, k6, k7, k8, k9, k10>::Select(args));
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:
611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typedef typename SelectArgs<Result, ArgumentTuple,
612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        k1, k2, k3, k4, k5, k6, k7, k8, k9, k10>::type InnerFunctionType;
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Action<InnerFunctionType> action_;
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const InnerAction action_;
618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GTEST_DISALLOW_ASSIGN_(WithArgsAction);
620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A macro from the ACTION* family (defined later in this file)
623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// defines an action that can be used in a mock function.  Typically,
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// these actions only care about a subset of the arguments of the mock
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// function.  For example, if such an action only uses the second
626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// argument, it can be used in any mock function that takes >= 2
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// arguments where the type of the second argument is compatible.
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Therefore, the action implementation must be prepared to take more
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// arguments than it needs.  The ExcessiveArg type is used to
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// represent those excessive arguments.  In order to keep the compiler
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// error messages tractable, we define it in the testing namespace
633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// instead of testing::internal.  However, this is an INTERNAL TYPE
634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// and subject to change without notice, so a user MUST NOT USE THIS
635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TYPE DIRECTLY.
636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct ExcessiveArg {};
637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A helper class needed for implementing the ACTION* macros.
639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Result, class Impl>
640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ActionHelper {
641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static Result Perform(Impl* impl, const ::std::tr1::tuple<>& args) {
643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return impl->template gmock_PerformImpl<>(args, ExcessiveArg(),
645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ExcessiveArg());
648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename A0>
651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static Result Perform(Impl* impl, const ::std::tr1::tuple<A0>& args) {
652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return impl->template gmock_PerformImpl<A0>(args, get<0>(args),
654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ExcessiveArg());
657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename A0, typename A1>
660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1>& args) {
661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return impl->template gmock_PerformImpl<A0, A1>(args, get<0>(args),
663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<1>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ExcessiveArg());
666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename A0, typename A1, typename A2>
669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2>& args) {
670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
671c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return impl->template gmock_PerformImpl<A0, A1, A2>(args, get<0>(args),
672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<1>(args), get<2>(args), ExcessiveArg(), ExcessiveArg(),
673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ExcessiveArg());
675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
676c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename A0, typename A1, typename A2, typename A3>
678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2,
679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A3>& args) {
680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return impl->template gmock_PerformImpl<A0, A1, A2, A3>(args, get<0>(args),
682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<1>(args), get<2>(args), get<3>(args), ExcessiveArg(),
683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
684c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ExcessiveArg());
685c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
687c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename A0, typename A1, typename A2, typename A3, typename A4>
688c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3,
689c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A4>& args) {
690c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
691c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4>(args,
692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),
693c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
694c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ExcessiveArg());
695c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
696c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
697c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename A0, typename A1, typename A2, typename A3, typename A4,
698c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename A5>
699c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
700c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A5>& args) {
701c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
702c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5>(args,
703c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),
704c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<5>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),
705c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ExcessiveArg());
706c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
707c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
708c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename A0, typename A1, typename A2, typename A3, typename A4,
709c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename A5, typename A6>
710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
711c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A5, A6>& args) {
712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6>(args,
714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),
715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<5>(args), get<6>(args), ExcessiveArg(), ExcessiveArg(),
716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ExcessiveArg());
717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename A0, typename A1, typename A2, typename A3, typename A4,
720c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename A5, typename A6, typename A7>
721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A5, A6, A7>& args) {
723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6,
725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        A7>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),
726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<4>(args), get<5>(args), get<6>(args), get<7>(args), ExcessiveArg(),
727c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ExcessiveArg());
728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename A0, typename A1, typename A2, typename A3, typename A4,
731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename A5, typename A6, typename A7, typename A8>
732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A5, A6, A7, A8>& args) {
734c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
735c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7,
736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        A8>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),
737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),
738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        ExcessiveArg());
739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
741c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename A0, typename A1, typename A2, typename A3, typename A4,
742c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename A5, typename A6, typename A7, typename A8, typename A9>
743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static Result Perform(Impl* impl, const ::std::tr1::tuple<A0, A1, A2, A3, A4,
744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      A5, A6, A7, A8, A9>& args) {
745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    using ::std::tr1::get;
746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7, A8,
747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        A9>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),
748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),
749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        get<9>(args));
750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace internal
754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Various overloads for Invoke().
756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes
758c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the selected arguments of the mock function to an_action and
759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// performs it.  It serves as an adaptor between actions with
760c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// different argument lists.  C++ doesn't support default arguments for
761c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// function templates, so we have to overload it.
762c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <int k1, typename InnerAction>
763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::WithArgsAction<InnerAction, k1>
764c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWithArgs(const InnerAction& action) {
765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::WithArgsAction<InnerAction, k1>(action);
766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <int k1, int k2, typename InnerAction>
769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::WithArgsAction<InnerAction, k1, k2>
770c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWithArgs(const InnerAction& action) {
771c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::WithArgsAction<InnerAction, k1, k2>(action);
772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <int k1, int k2, int k3, typename InnerAction>
775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::WithArgsAction<InnerAction, k1, k2, k3>
776c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWithArgs(const InnerAction& action) {
777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::WithArgsAction<InnerAction, k1, k2, k3>(action);
778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <int k1, int k2, int k3, int k4, typename InnerAction>
781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::WithArgsAction<InnerAction, k1, k2, k3, k4>
782c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWithArgs(const InnerAction& action) {
783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4>(action);
784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <int k1, int k2, int k3, int k4, int k5, typename InnerAction>
787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>
788c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWithArgs(const InnerAction& action) {
789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>(action);
790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerAction>
793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>
794c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWithArgs(const InnerAction& action) {
795c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>(action);
796c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
797c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
798c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7,
799c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename InnerAction>
800c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7>
801c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWithArgs(const InnerAction& action) {
802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6,
803c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      k7>(action);
804c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
805c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename InnerAction>
808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8>
809c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWithArgs(const InnerAction& action) {
810c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7,
811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      k8>(action);
812c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
814c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int k9, typename InnerAction>
816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8, k9>
817c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWithArgs(const InnerAction& action) {
818c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
819c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      k9>(action);
820c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
821c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
822c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int k9, int k10, typename InnerAction>
824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    k9, k10>
826c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWithArgs(const InnerAction& action) {
827c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,
828c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      k9, k10>(action);
829c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
830c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
831c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Creates an action that does actions a1, a2, ..., sequentially in
832c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// each invocation.
833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Action1, typename Action2>
834c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::DoBothAction<Action1, Action2>
835c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochDoAll(Action1 a1, Action2 a2) {
836c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::DoBothAction<Action1, Action2>(a1, a2);
837c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
838c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
839c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Action1, typename Action2, typename Action3>
840c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
841c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Action3> >
842c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochDoAll(Action1 a1, Action2 a2, Action3 a3) {
843c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return DoAll(a1, DoAll(a2, a3));
844c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
845c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
846c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Action1, typename Action2, typename Action3,
847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename Action4>
848c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
849c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    internal::DoBothAction<Action3, Action4> > >
850c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4) {
851c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return DoAll(a1, DoAll(a2, a3, a4));
852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
853c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
854c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Action1, typename Action2, typename Action3,
855c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename Action4, typename Action5>
856c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
857c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    internal::DoBothAction<Action3, internal::DoBothAction<Action4,
858c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Action5> > > >
859c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5) {
860c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return DoAll(a1, DoAll(a2, a3, a4, a5));
861c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
862c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
863c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Action1, typename Action2, typename Action3,
864c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename Action4, typename Action5, typename Action6>
865c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
866c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    internal::DoBothAction<Action3, internal::DoBothAction<Action4,
867c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    internal::DoBothAction<Action5, Action6> > > > >
868c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6) {
869c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return DoAll(a1, DoAll(a2, a3, a4, a5, a6));
870c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
871c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
872c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Action1, typename Action2, typename Action3,
873c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename Action4, typename Action5, typename Action6, typename Action7>
874c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
875c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    internal::DoBothAction<Action3, internal::DoBothAction<Action4,
876c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    internal::DoBothAction<Action5, internal::DoBothAction<Action6,
877c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Action7> > > > > >
878c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
879c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Action7 a7) {
880c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7));
881c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
882c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
883c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Action1, typename Action2, typename Action3,
884c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename Action4, typename Action5, typename Action6, typename Action7,
885c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename Action8>
886c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
887c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    internal::DoBothAction<Action3, internal::DoBothAction<Action4,
888c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    internal::DoBothAction<Action5, internal::DoBothAction<Action6,
889c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    internal::DoBothAction<Action7, Action8> > > > > > >
890c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
891c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Action7 a7, Action8 a8) {
892c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8));
893c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
894c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
895c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Action1, typename Action2, typename Action3,
896c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename Action4, typename Action5, typename Action6, typename Action7,
897c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename Action8, typename Action9>
898c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
899c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    internal::DoBothAction<Action3, internal::DoBothAction<Action4,
900c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    internal::DoBothAction<Action5, internal::DoBothAction<Action6,
901c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    internal::DoBothAction<Action7, internal::DoBothAction<Action8,
902c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Action9> > > > > > > >
903c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
904c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Action7 a7, Action8 a8, Action9 a9) {
905c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9));
906c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
907c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
908c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtemplate <typename Action1, typename Action2, typename Action3,
909c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename Action4, typename Action5, typename Action6, typename Action7,
910c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename Action8, typename Action9, typename Action10>
911c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochinline internal::DoBothAction<Action1, internal::DoBothAction<Action2,
912c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    internal::DoBothAction<Action3, internal::DoBothAction<Action4,
913c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    internal::DoBothAction<Action5, internal::DoBothAction<Action6,
914c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    internal::DoBothAction<Action7, internal::DoBothAction<Action8,
915c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    internal::DoBothAction<Action9, Action10> > > > > > > > >
916c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochDoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,
917c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Action7 a7, Action8 a8, Action9 a9, Action10 a10) {
918c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9, a10));
919c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
920c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
921c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace testing
922c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
923c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The ACTION* family of macros can be used in a namespace scope to
924c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// define custom actions easily.  The syntax:
925c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
926c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   ACTION(name) { statements; }
927c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
928c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// will define an action with the given name that executes the
929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// statements.  The value returned by the statements will be used as
930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the return value of the action.  Inside the statements, you can
931c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// refer to the K-th (0-based) argument of the mock function by
932c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 'argK', and refer to its type by 'argK_type'.  For example:
933c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
934c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   ACTION(IncrementArg1) {
935c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     arg1_type temp = arg1;
936c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     return ++(*temp);
937c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   }
938c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
939c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// allows you to write
940c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
941c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   ...WillOnce(IncrementArg1());
942c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
943c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// You can also refer to the entire argument tuple and its type by
944c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 'args' and 'args_type', and refer to the mock function type and its
945c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// return type by 'function_type' and 'return_type'.
946c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
947c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Note that you don't need to specify the types of the mock function
948c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// arguments.  However rest assured that your code is still type-safe:
949c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// you'll get a compiler error if *arg1 doesn't support the ++
950c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// operator, or if the type of ++(*arg1) isn't compatible with the
951c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// mock function's return type, for example.
952c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
953c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Sometimes you'll want to parameterize the action.   For that you can use
954c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// another macro:
955c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
956c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   ACTION_P(name, param_name) { statements; }
957c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
958c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// For example:
959c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
960c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   ACTION_P(Add, n) { return arg0 + n; }
961c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
962c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// will allow you to write:
963c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
964c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   ...WillOnce(Add(5));
965c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
966c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Note that you don't need to provide the type of the parameter
967c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// either.  If you need to reference the type of a parameter named
968c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 'foo', you can write 'foo_type'.  For example, in the body of
969c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ACTION_P(Add, n) above, you can write 'n_type' to refer to the type
970c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// of 'n'.
971c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
972c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P10 to support
973c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// multi-parameter actions.
974c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
975c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// For the purpose of typing, you can view
976c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
977c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   ACTION_Pk(Foo, p1, ..., pk) { ... }
978c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
979c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// as shorthand for
980c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
981c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   template <typename p1_type, ..., typename pk_type>
982c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   FooActionPk<p1_type, ..., pk_type> Foo(p1_type p1, ..., pk_type pk) { ... }
983c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
984c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// In particular, you can provide the template type arguments
985c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// explicitly when invoking Foo(), as in Foo<long, bool>(5, false);
986c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// although usually you can rely on the compiler to infer the types
987c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// for you automatically.  You can assign the result of expression
988c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Foo(p1, ..., pk) to a variable of type FooActionPk<p1_type, ...,
989c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// pk_type>.  This can be useful when composing actions.
990c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
991c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// You can also overload actions with different numbers of parameters:
992c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
993c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   ACTION_P(Plus, a) { ... }
994c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   ACTION_P2(Plus, a, b) { ... }
995c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
996c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// While it's tempting to always use the ACTION* macros when defining
997c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// a new action, you should also consider implementing ActionInterface
998c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// or using MakePolymorphicAction() instead, especially if you need to
999c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// use the action a lot.  While these approaches require more work,
1000c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// they give you more control on the types of the mock function
1001c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// arguments and the action parameters, which in general leads to
1002c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// better compiler error messages that pay off in the long run.  They
1003c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// also allow overloading actions based on parameter types (as opposed
1004c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// to just based on the number of parameters).
1005c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1006c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// CAVEAT:
1007c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1008c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ACTION*() can only be used in a namespace scope.  The reason is
1009c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// that C++ doesn't yet allow function-local types to be used to
1010c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// instantiate templates.  The up-coming C++0x standard will fix this.
1011c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Once that's done, we'll consider supporting using ACTION*() inside
1012c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// a function.
1013c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1014c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// MORE INFORMATION:
1015c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1016c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// To learn more about using these macros, please search for 'ACTION'
1017c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// on http://code.google.com/p/googlemock/wiki/CookBook.
1018c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1019c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// An internal macro needed for implementing ACTION*().
1020c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\
1021c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const args_type& args GTEST_ATTRIBUTE_UNUSED_,\
1022c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    arg0_type arg0 GTEST_ATTRIBUTE_UNUSED_,\
1023c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    arg1_type arg1 GTEST_ATTRIBUTE_UNUSED_,\
1024c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    arg2_type arg2 GTEST_ATTRIBUTE_UNUSED_,\
1025c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    arg3_type arg3 GTEST_ATTRIBUTE_UNUSED_,\
1026c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    arg4_type arg4 GTEST_ATTRIBUTE_UNUSED_,\
1027c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    arg5_type arg5 GTEST_ATTRIBUTE_UNUSED_,\
1028c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    arg6_type arg6 GTEST_ATTRIBUTE_UNUSED_,\
1029c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    arg7_type arg7 GTEST_ATTRIBUTE_UNUSED_,\
1030c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    arg8_type arg8 GTEST_ATTRIBUTE_UNUSED_,\
1031c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    arg9_type arg9 GTEST_ATTRIBUTE_UNUSED_
1032c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1033c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Sometimes you want to give an action explicit template parameters
1034c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// that cannot be inferred from its value parameters.  ACTION() and
1035c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ACTION_P*() don't support that.  ACTION_TEMPLATE() remedies that
1036c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// and can be viewed as an extension to ACTION() and ACTION_P*().
1037c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1038c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The syntax:
1039c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1040c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   ACTION_TEMPLATE(ActionName,
1041c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//                   HAS_m_TEMPLATE_PARAMS(kind1, name1, ..., kind_m, name_m),
1042c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//                   AND_n_VALUE_PARAMS(p1, ..., p_n)) { statements; }
1043c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1044c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// defines an action template that takes m explicit template
1045c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// parameters and n value parameters.  name_i is the name of the i-th
1046c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// template parameter, and kind_i specifies whether it's a typename,
1047c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// an integral constant, or a template.  p_i is the name of the i-th
1048c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// value parameter.
1049c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1050c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Example:
1051c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1052c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   // DuplicateArg<k, T>(output) converts the k-th argument of the mock
1053c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   // function to type T and copies it to *output.
1054c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   ACTION_TEMPLATE(DuplicateArg,
1055c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//                   HAS_2_TEMPLATE_PARAMS(int, k, typename, T),
1056c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//                   AND_1_VALUE_PARAMS(output)) {
1057c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     *output = T(std::tr1::get<k>(args));
1058c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   }
1059c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   ...
1060c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     int n;
1061c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     EXPECT_CALL(mock, Foo(_, _))
1062c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//         .WillOnce(DuplicateArg<1, unsigned char>(&n));
1063c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1064c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// To create an instance of an action template, write:
1065c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1066c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   ActionName<t1, ..., t_m>(v1, ..., v_n)
1067c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1068c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// where the ts are the template arguments and the vs are the value
1069c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// arguments.  The value argument types are inferred by the compiler.
1070c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// If you want to explicitly specify the value argument types, you can
1071c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// provide additional template arguments:
1072c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1073c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   ActionName<t1, ..., t_m, u1, ..., u_k>(v1, ..., v_n)
1074c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1075c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// where u_i is the desired type of v_i.
1076c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1077c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ACTION_TEMPLATE and ACTION/ACTION_P* can be overloaded on the
1078c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// number of value parameters, but not on the number of template
1079c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// parameters.  Without the restriction, the meaning of the following
1080c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// is unclear:
1081c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1082c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   OverloadedAction<int, bool>(x);
1083c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1084c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Are we using a single-template-parameter action where 'bool' refers
1085c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// to the type of x, or are we using a two-template-parameter action
1086c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// where the compiler is asked to infer the type of x?
1087c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1088c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Implementation notes:
1089c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1090c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// GMOCK_INTERNAL_*_HAS_m_TEMPLATE_PARAMS and
1091c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// GMOCK_INTERNAL_*_AND_n_VALUE_PARAMS are internal macros for
1092c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// implementing ACTION_TEMPLATE.  The main trick we use is to create
1093c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// new macro invocations when expanding a macro.  For example, we have
1094c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1095c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   #define ACTION_TEMPLATE(name, template_params, value_params)
1096c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//       ... GMOCK_INTERNAL_DECL_##template_params ...
1097c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1098c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// which causes ACTION_TEMPLATE(..., HAS_1_TEMPLATE_PARAMS(typename, T), ...)
1099c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// to expand to
1100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//       ... GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(typename, T) ...
1102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Since GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS is a macro, the
1104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// preprocessor will continue to expand it to
1105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//       ... typename T ...
1107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
1108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This technique conforms to the C++ standard and is portable.  It
1109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// allows us to implement action templates using O(N) code, where N is
1110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the maximum number of template/value parameters supported.  Without
1111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// using it, we'd have to devote O(N^2) amount of code to implement all
1112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// combinations of m and n.
1113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Declares the template parameters.
1115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_HAS_1_TEMPLATE_PARAMS(kind0, name0) kind0 name0
1116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \
1117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name1) kind0 name0, kind1 name1
1118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind2, name2) kind0 name0, kind1 name1, kind2 name2
1120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind2, name2, kind3, name3) kind0 name0, kind1 name1, kind2 name2, \
1122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind3 name3
1123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind2, name2, kind3, name3, kind4, name4) kind0 name0, kind1 name1, \
1125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind2 name2, kind3 name3, kind4 name4
1126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind2, name2, kind3, name3, kind4, name4, kind5, name5) kind0 name0, \
1128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5
1129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name6) kind0 name0, kind1 name1, kind2 name2, kind3 name3, kind4 name4, \
1132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind5 name5, kind6 name6
1133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind7, name7) kind0 name0, kind1 name1, kind2 name2, kind3 name3, \
1136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind4 name4, kind5 name5, kind6 name6, kind7 name7
1137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind7, name7, kind8, name8) kind0 name0, kind1 name1, kind2 name2, \
1140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind3 name3, kind4 name4, kind5 name5, kind6 name6, kind7 name7, \
1141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind8 name8
1142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \
1143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name6, kind7, name7, kind8, name8, kind9, name9) kind0 name0, \
1145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind1 name1, kind2 name2, kind3 name3, kind4 name4, kind5 name5, \
1146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind6 name6, kind7 name7, kind8 name8, kind9 name9
1147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Lists the template parameters.
1149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_HAS_1_TEMPLATE_PARAMS(kind0, name0) name0
1150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_HAS_2_TEMPLATE_PARAMS(kind0, name0, kind1, \
1151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name1) name0, name1
1152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_HAS_3_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind2, name2) name0, name1, name2
1154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_HAS_4_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind2, name2, kind3, name3) name0, name1, name2, name3
1156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_HAS_5_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind2, name2, kind3, name3, kind4, name4) name0, name1, name2, name3, \
1158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name4
1159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_HAS_6_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind2, name2, kind3, name3, kind4, name4, kind5, name5) name0, name1, \
1161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name2, name3, name4, name5
1162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_HAS_7_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name6) name0, name1, name2, name3, name4, name5, name6
1165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_HAS_8_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind7, name7) name0, name1, name2, name3, name4, name5, name6, name7
1168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_HAS_9_TEMPLATE_PARAMS(kind0, name0, kind1, name1, \
1169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, name6, \
1170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    kind7, name7, kind8, name8) name0, name1, name2, name3, name4, name5, \
1171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name6, name7, name8
1172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_HAS_10_TEMPLATE_PARAMS(kind0, name0, kind1, \
1173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name1, kind2, name2, kind3, name3, kind4, name4, kind5, name5, kind6, \
1174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name6, kind7, name7, kind8, name8, kind9, name9) name0, name1, name2, \
1175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name3, name4, name5, name6, name7, name8, name9
1176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Declares the types of value parameters.
1178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_TYPE_AND_0_VALUE_PARAMS()
1179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_TYPE_AND_1_VALUE_PARAMS(p0) , typename p0##_type
1180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_TYPE_AND_2_VALUE_PARAMS(p0, p1) , \
1181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename p0##_type, typename p1##_type
1182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , \
1183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename p0##_type, typename p1##_type, typename p2##_type
1184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \
1185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename p0##_type, typename p1##_type, typename p2##_type, \
1186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename p3##_type
1187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \
1188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename p0##_type, typename p1##_type, typename p2##_type, \
1189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename p3##_type, typename p4##_type
1190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \
1191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename p0##_type, typename p1##_type, typename p2##_type, \
1192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename p3##_type, typename p4##_type, typename p5##_type
1193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p6) , typename p0##_type, typename p1##_type, typename p2##_type, \
1195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename p3##_type, typename p4##_type, typename p5##_type, \
1196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename p6##_type
1197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p6, p7) , typename p0##_type, typename p1##_type, typename p2##_type, \
1199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename p3##_type, typename p4##_type, typename p5##_type, \
1200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename p6##_type, typename p7##_type
1201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p6, p7, p8) , typename p0##_type, typename p1##_type, typename p2##_type, \
1203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename p3##_type, typename p4##_type, typename p5##_type, \
1204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename p6##_type, typename p7##_type, typename p8##_type
1205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p6, p7, p8, p9) , typename p0##_type, typename p1##_type, \
1207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename p2##_type, typename p3##_type, typename p4##_type, \
1208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename p5##_type, typename p6##_type, typename p7##_type, \
1209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    typename p8##_type, typename p9##_type
1210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Initializes the value parameters.
1212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_INIT_AND_0_VALUE_PARAMS()\
1213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ()
1214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_INIT_AND_1_VALUE_PARAMS(p0)\
1215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (p0##_type gmock_p0) : p0(gmock_p0)
1216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_INIT_AND_2_VALUE_PARAMS(p0, p1)\
1217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), p1(gmock_p1)
1218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_INIT_AND_3_VALUE_PARAMS(p0, p1, p2)\
1219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (p0##_type gmock_p0, p1##_type gmock_p1, \
1220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2)
1221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_INIT_AND_4_VALUE_PARAMS(p0, p1, p2, p3)\
1222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p3(gmock_p3)
1225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_INIT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)\
1226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), \
1228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p2(gmock_p2), p3(gmock_p3), p4(gmock_p4)
1229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_INIT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)\
1230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p3##_type gmock_p3, p4##_type gmock_p4, \
1232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5)
1234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_INIT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)\
1235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6)
1239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_INIT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)\
1240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), \
1243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
1244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p7(gmock_p7)
1245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_INIT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p7, p8)\
1247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p6##_type gmock_p6, p7##_type gmock_p7, \
1250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
1252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p8(gmock_p8)
1253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_INIT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p7, p8, p9)\
1255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \
1258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
1260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p8(gmock_p8), p9(gmock_p9)
1261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Declares the fields for storing the value parameters.
1263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DEFN_AND_0_VALUE_PARAMS()
1264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DEFN_AND_1_VALUE_PARAMS(p0) p0##_type p0;
1265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DEFN_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0; \
1266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p1##_type p1;
1267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DEFN_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0; \
1268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p1##_type p1; p2##_type p2;
1269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DEFN_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0; \
1270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p1##_type p1; p2##_type p2; p3##_type p3;
1271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DEFN_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \
1272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p4) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4;
1273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DEFN_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \
1274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p5) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \
1275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p5##_type p5;
1276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DEFN_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p6) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \
1278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p5##_type p5; p6##_type p6;
1279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DEFN_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p7) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; p4##_type p4; \
1281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p5##_type p5; p6##_type p6; p7##_type p7;
1282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DEFN_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p7, p8) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \
1284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8;
1285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DEFN_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p7, p8, p9) p0##_type p0; p1##_type p1; p2##_type p2; p3##_type p3; \
1287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p4##_type p4; p5##_type p5; p6##_type p6; p7##_type p7; p8##_type p8; \
1288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p9##_type p9;
1289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Lists the value parameters.
1291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_AND_0_VALUE_PARAMS()
1292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_AND_1_VALUE_PARAMS(p0) p0
1293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_AND_2_VALUE_PARAMS(p0, p1) p0, p1
1294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_AND_3_VALUE_PARAMS(p0, p1, p2) p0, p1, p2
1295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0, p1, p2, p3
1296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) p0, p1, \
1297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p2, p3, p4
1298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) p0, \
1299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p1, p2, p3, p4, p5
1300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p6) p0, p1, p2, p3, p4, p5, p6
1302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p7) p0, p1, p2, p3, p4, p5, p6, p7
1304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p7, p8) p0, p1, p2, p3, p4, p5, p6, p7, p8
1306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p7, p8, p9) p0, p1, p2, p3, p4, p5, p6, p7, p8, p9
1308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Lists the value parameter types.
1310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_TYPE_AND_0_VALUE_PARAMS()
1311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_TYPE_AND_1_VALUE_PARAMS(p0) , p0##_type
1312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_TYPE_AND_2_VALUE_PARAMS(p0, p1) , p0##_type, \
1313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p1##_type
1314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_TYPE_AND_3_VALUE_PARAMS(p0, p1, p2) , p0##_type, \
1315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p1##_type, p2##_type
1316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_TYPE_AND_4_VALUE_PARAMS(p0, p1, p2, p3) , \
1317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p0##_type, p1##_type, p2##_type, p3##_type
1318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_TYPE_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) , \
1319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p0##_type, p1##_type, p2##_type, p3##_type, p4##_type
1320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_TYPE_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) , \
1321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type
1322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_TYPE_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p6) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, \
1324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p6##_type
1325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_TYPE_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p6, p7) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p5##_type, p6##_type, p7##_type
1328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_TYPE_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p6, p7, p8) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p5##_type, p6##_type, p7##_type, p8##_type
1331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_LIST_TYPE_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p6, p7, p8, p9) , p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p5##_type, p6##_type, p7##_type, p8##_type, p9##_type
1334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Declares the value parameters.
1336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_AND_0_VALUE_PARAMS()
1337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_AND_1_VALUE_PARAMS(p0) p0##_type p0
1338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_AND_2_VALUE_PARAMS(p0, p1) p0##_type p0, \
1339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p1##_type p1
1340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_AND_3_VALUE_PARAMS(p0, p1, p2) p0##_type p0, \
1341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p1##_type p1, p2##_type p2
1342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_AND_4_VALUE_PARAMS(p0, p1, p2, p3) p0##_type p0, \
1343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p1##_type p1, p2##_type p2, p3##_type p3
1344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_AND_5_VALUE_PARAMS(p0, p1, p2, p3, \
1345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p4) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4
1346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, \
1347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p5) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \
1348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p5##_type p5
1349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, \
1350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p6) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \
1351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p5##_type p5, p6##_type p6
1352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p7) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, \
1354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p5##_type p5, p6##_type p6, p7##_type p7
1355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p7, p8) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
1357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8
1358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_DECL_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p7, p8, p9) p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
1360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \
1361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p9##_type p9
1362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The suffix of the class template implementing the action template.
1364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_COUNT_AND_0_VALUE_PARAMS()
1365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_COUNT_AND_1_VALUE_PARAMS(p0) P
1366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_COUNT_AND_2_VALUE_PARAMS(p0, p1) P2
1367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_COUNT_AND_3_VALUE_PARAMS(p0, p1, p2) P3
1368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_COUNT_AND_4_VALUE_PARAMS(p0, p1, p2, p3) P4
1369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_COUNT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4) P5
1370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_COUNT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5) P6
1371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_COUNT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6) P7
1372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_COUNT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p7) P8
1374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_COUNT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p7, p8) P9
1376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_INTERNAL_COUNT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \
1377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p7, p8, p9) P10
1378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The name of the class template implementing the action template.
1380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define GMOCK_ACTION_CLASS_(name, value_params)\
1381dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    GTEST_CONCAT_TOKEN_(name##Action, GMOCK_INTERNAL_COUNT_##value_params)
1382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define ACTION_TEMPLATE(name, template_params, value_params)\
1384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <GMOCK_INTERNAL_DECL_##template_params\
1385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            GMOCK_INTERNAL_DECL_TYPE_##value_params>\
1386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class GMOCK_ACTION_CLASS_(name, value_params) {\
1387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:\
1388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GMOCK_ACTION_CLASS_(name, value_params)\
1389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        GMOCK_INTERNAL_INIT_##value_params {}\
1390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F>\
1391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    class gmock_Impl : public ::testing::ActionInterface<F> {\
1392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     public:\
1393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef F function_type;\
1394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::Result return_type;\
1395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          args_type;\
1397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      explicit gmock_Impl GMOCK_INTERNAL_INIT_##value_params {}\
1398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      virtual return_type Perform(const args_type& args) {\
1399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            Perform(this, args);\
1401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }\
1402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      template <typename arg0_type, typename arg1_type, typename arg2_type, \
1403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg3_type, typename arg4_type, typename arg5_type, \
1404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg6_type, typename arg7_type, typename arg8_type, \
1405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg9_type>\
1406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg9_type arg9) const;\
1410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_INTERNAL_DEFN_##value_params\
1411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     private:\
1412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    };\
1414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F> operator ::testing::Action<F>() const {\
1415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return ::testing::Action<F>(\
1416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          new gmock_Impl<F>(GMOCK_INTERNAL_LIST_##value_params));\
1417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }\
1418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GMOCK_INTERNAL_DEFN_##value_params\
1419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:\
1420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GTEST_DISALLOW_ASSIGN_(GMOCK_ACTION_CLASS_(name, value_params));\
1421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };\
1422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <GMOCK_INTERNAL_DECL_##template_params\
1423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            GMOCK_INTERNAL_DECL_TYPE_##value_params>\
1424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  inline GMOCK_ACTION_CLASS_(name, value_params)<\
1425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_INTERNAL_LIST_##template_params\
1426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_INTERNAL_LIST_TYPE_##value_params> name(\
1427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GMOCK_INTERNAL_DECL_##value_params) {\
1428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return GMOCK_ACTION_CLASS_(name, value_params)<\
1429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        GMOCK_INTERNAL_LIST_##template_params\
1430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        GMOCK_INTERNAL_LIST_TYPE_##value_params>(\
1431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            GMOCK_INTERNAL_LIST_##value_params);\
1432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }\
1433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <GMOCK_INTERNAL_DECL_##template_params\
1434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            GMOCK_INTERNAL_DECL_TYPE_##value_params>\
1435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename F>\
1436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename arg0_type, typename arg1_type, typename arg2_type,\
1437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg3_type, typename arg4_type, typename arg5_type,\
1438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg6_type, typename arg7_type, typename arg8_type,\
1439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg9_type>\
1440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typename ::testing::internal::Function<F>::Result\
1441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GMOCK_ACTION_CLASS_(name, value_params)<\
1442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GMOCK_INTERNAL_LIST_##template_params\
1443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GMOCK_INTERNAL_LIST_TYPE_##value_params>::gmock_Impl<F>::\
1444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              gmock_PerformImpl(\
1445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define ACTION(name)\
1448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class name##Action {\
1449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:\
1450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name##Action() {}\
1451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F>\
1452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    class gmock_Impl : public ::testing::ActionInterface<F> {\
1453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     public:\
1454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef F function_type;\
1455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::Result return_type;\
1456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          args_type;\
1458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gmock_Impl() {}\
1459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      virtual return_type Perform(const args_type& args) {\
1460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            Perform(this, args);\
1462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }\
1463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      template <typename arg0_type, typename arg1_type, typename arg2_type, \
1464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg3_type, typename arg4_type, typename arg5_type, \
1465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg6_type, typename arg7_type, typename arg8_type, \
1466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg9_type>\
1467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg9_type arg9) const;\
1471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     private:\
1472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    };\
1474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F> operator ::testing::Action<F>() const {\
1475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return ::testing::Action<F>(new gmock_Impl<F>());\
1476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }\
1477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:\
1478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GTEST_DISALLOW_ASSIGN_(name##Action);\
1479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };\
1480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  inline name##Action name() {\
1481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return name##Action();\
1482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }\
1483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename F>\
1484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename arg0_type, typename arg1_type, typename arg2_type, \
1485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg3_type, typename arg4_type, typename arg5_type, \
1486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg6_type, typename arg7_type, typename arg8_type, \
1487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg9_type>\
1488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typename ::testing::internal::Function<F>::Result\
1489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      name##Action::gmock_Impl<F>::gmock_PerformImpl(\
1490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define ACTION_P(name, p0)\
1493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type>\
1494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class name##ActionP {\
1495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:\
1496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name##ActionP(p0##_type gmock_p0) : p0(gmock_p0) {}\
1497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F>\
1498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    class gmock_Impl : public ::testing::ActionInterface<F> {\
1499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     public:\
1500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef F function_type;\
1501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::Result return_type;\
1502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          args_type;\
1504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      explicit gmock_Impl(p0##_type gmock_p0) : p0(gmock_p0) {}\
1505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      virtual return_type Perform(const args_type& args) {\
1506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            Perform(this, args);\
1508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }\
1509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      template <typename arg0_type, typename arg1_type, typename arg2_type, \
1510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg3_type, typename arg4_type, typename arg5_type, \
1511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg6_type, typename arg7_type, typename arg8_type, \
1512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg9_type>\
1513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg9_type arg9) const;\
1517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p0##_type p0;\
1518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     private:\
1519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    };\
1521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F> operator ::testing::Action<F>() const {\
1522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return ::testing::Action<F>(new gmock_Impl<F>(p0));\
1523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }\
1524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p0##_type p0;\
1525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:\
1526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GTEST_DISALLOW_ASSIGN_(name##ActionP);\
1527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };\
1528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type>\
1529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  inline name##ActionP<p0##_type> name(p0##_type p0) {\
1530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return name##ActionP<p0##_type>(p0);\
1531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }\
1532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type>\
1533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename F>\
1534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename arg0_type, typename arg1_type, typename arg2_type, \
1535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg3_type, typename arg4_type, typename arg5_type, \
1536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg6_type, typename arg7_type, typename arg8_type, \
1537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg9_type>\
1538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typename ::testing::internal::Function<F>::Result\
1539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      name##ActionP<p0##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define ACTION_P2(name, p0, p1)\
1543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type>\
1544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class name##ActionP2 {\
1545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:\
1546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name##ActionP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \
1547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p1(gmock_p1) {}\
1548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F>\
1549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    class gmock_Impl : public ::testing::ActionInterface<F> {\
1550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     public:\
1551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef F function_type;\
1552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::Result return_type;\
1553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          args_type;\
1555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \
1556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p1(gmock_p1) {}\
1557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      virtual return_type Perform(const args_type& args) {\
1558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            Perform(this, args);\
1560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }\
1561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      template <typename arg0_type, typename arg1_type, typename arg2_type, \
1562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg3_type, typename arg4_type, typename arg5_type, \
1563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg6_type, typename arg7_type, typename arg8_type, \
1564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg9_type>\
1565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg9_type arg9) const;\
1569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p0##_type p0;\
1570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p1##_type p1;\
1571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     private:\
1572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    };\
1574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F> operator ::testing::Action<F>() const {\
1575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1));\
1576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }\
1577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p0##_type p0;\
1578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p1##_type p1;\
1579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:\
1580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GTEST_DISALLOW_ASSIGN_(name##ActionP2);\
1581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };\
1582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type>\
1583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  inline name##ActionP2<p0##_type, p1##_type> name(p0##_type p0, \
1584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p1##_type p1) {\
1585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return name##ActionP2<p0##_type, p1##_type>(p0, p1);\
1586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }\
1587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type>\
1588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename F>\
1589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename arg0_type, typename arg1_type, typename arg2_type, \
1590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg3_type, typename arg4_type, typename arg5_type, \
1591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg6_type, typename arg7_type, typename arg8_type, \
1592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg9_type>\
1593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typename ::testing::internal::Function<F>::Result\
1594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      name##ActionP2<p0##_type, p1##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define ACTION_P3(name, p0, p1, p2)\
1598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type>\
1599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class name##ActionP3 {\
1600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:\
1601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name##ActionP3(p0##_type gmock_p0, p1##_type gmock_p1, \
1602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\
1603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F>\
1604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    class gmock_Impl : public ::testing::ActionInterface<F> {\
1605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     public:\
1606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef F function_type;\
1607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::Result return_type;\
1608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          args_type;\
1610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, \
1611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\
1612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      virtual return_type Perform(const args_type& args) {\
1613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            Perform(this, args);\
1615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }\
1616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      template <typename arg0_type, typename arg1_type, typename arg2_type, \
1617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg3_type, typename arg4_type, typename arg5_type, \
1618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg6_type, typename arg7_type, typename arg8_type, \
1619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg9_type>\
1620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg9_type arg9) const;\
1624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p0##_type p0;\
1625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p1##_type p1;\
1626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p2##_type p2;\
1627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     private:\
1628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    };\
1630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F> operator ::testing::Action<F>() const {\
1631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2));\
1632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }\
1633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p0##_type p0;\
1634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p1##_type p1;\
1635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p2##_type p2;\
1636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:\
1637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GTEST_DISALLOW_ASSIGN_(name##ActionP3);\
1638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };\
1639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type>\
1640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  inline name##ActionP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \
1641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p1##_type p1, p2##_type p2) {\
1642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return name##ActionP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\
1643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }\
1644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type>\
1645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename F>\
1646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename arg0_type, typename arg1_type, typename arg2_type, \
1647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg3_type, typename arg4_type, typename arg5_type, \
1648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg6_type, typename arg7_type, typename arg8_type, \
1649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg9_type>\
1650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typename ::testing::internal::Function<F>::Result\
1651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      name##ActionP3<p0##_type, p1##_type, \
1652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p2##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define ACTION_P4(name, p0, p1, p2, p3)\
1656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type>\
1658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class name##ActionP4 {\
1659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:\
1660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name##ActionP4(p0##_type gmock_p0, p1##_type gmock_p1, \
1661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \
1662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p2(gmock_p2), p3(gmock_p3) {}\
1663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F>\
1664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    class gmock_Impl : public ::testing::ActionInterface<F> {\
1665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     public:\
1666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef F function_type;\
1667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::Result return_type;\
1668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          args_type;\
1670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1671c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p3(gmock_p3) {}\
1673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      virtual return_type Perform(const args_type& args) {\
1674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            Perform(this, args);\
1676c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }\
1677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      template <typename arg0_type, typename arg1_type, typename arg2_type, \
1678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg3_type, typename arg4_type, typename arg5_type, \
1679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg6_type, typename arg7_type, typename arg8_type, \
1680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg9_type>\
1681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1684c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg9_type arg9) const;\
1685c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p0##_type p0;\
1686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p1##_type p1;\
1687c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p2##_type p2;\
1688c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p3##_type p3;\
1689c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     private:\
1690c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1691c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    };\
1692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F> operator ::testing::Action<F>() const {\
1693c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3));\
1694c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }\
1695c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p0##_type p0;\
1696c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p1##_type p1;\
1697c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p2##_type p2;\
1698c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p3##_type p3;\
1699c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:\
1700c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GTEST_DISALLOW_ASSIGN_(name##ActionP4);\
1701c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };\
1702c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1703c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type>\
1704c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  inline name##ActionP4<p0##_type, p1##_type, p2##_type, \
1705c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
1706c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p3##_type p3) {\
1707c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return name##ActionP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, p1, \
1708c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p2, p3);\
1709c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }\
1710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1711c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type>\
1712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename F>\
1713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename arg0_type, typename arg1_type, typename arg2_type, \
1714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg3_type, typename arg4_type, typename arg5_type, \
1715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg6_type, typename arg7_type, typename arg8_type, \
1716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg9_type>\
1717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typename ::testing::internal::Function<F>::Result\
1718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      name##ActionP4<p0##_type, p1##_type, p2##_type, \
1719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p3##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1720c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define ACTION_P5(name, p0, p1, p2, p3, p4)\
1723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type, typename p4##_type>\
1725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class name##ActionP5 {\
1726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:\
1727c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name##ActionP5(p0##_type gmock_p0, p1##_type gmock_p1, \
1728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p2##_type gmock_p2, p3##_type gmock_p3, \
1729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p3(gmock_p3), p4(gmock_p4) {}\
1731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F>\
1732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    class gmock_Impl : public ::testing::ActionInterface<F> {\
1733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     public:\
1734c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef F function_type;\
1735c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::Result return_type;\
1736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          args_type;\
1738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p3##_type gmock_p3, p4##_type gmock_p4) : p0(gmock_p0), \
1740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4) {}\
1741c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      virtual return_type Perform(const args_type& args) {\
1742c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            Perform(this, args);\
1744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }\
1745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      template <typename arg0_type, typename arg1_type, typename arg2_type, \
1746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg3_type, typename arg4_type, typename arg5_type, \
1747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg6_type, typename arg7_type, typename arg8_type, \
1748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg9_type>\
1749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg9_type arg9) const;\
1753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p0##_type p0;\
1754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p1##_type p1;\
1755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p2##_type p2;\
1756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p3##_type p3;\
1757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p4##_type p4;\
1758c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     private:\
1759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1760c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    };\
1761c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F> operator ::testing::Action<F>() const {\
1762c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4));\
1763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }\
1764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p0##_type p0;\
1765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p1##_type p1;\
1766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p2##_type p2;\
1767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p3##_type p3;\
1768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p4##_type p4;\
1769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:\
1770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GTEST_DISALLOW_ASSIGN_(name##ActionP5);\
1771c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };\
1772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type, typename p4##_type>\
1774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  inline name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
1776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p4##_type p4) {\
1777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p4##_type>(p0, p1, p2, p3, p4);\
1779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }\
1780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type, typename p4##_type>\
1782c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename F>\
1783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename arg0_type, typename arg1_type, typename arg2_type, \
1784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg3_type, typename arg4_type, typename arg5_type, \
1785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg6_type, typename arg7_type, typename arg8_type, \
1786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg9_type>\
1787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typename ::testing::internal::Function<F>::Result\
1788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      name##ActionP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p4##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define ACTION_P6(name, p0, p1, p2, p3, p4, p5)\
1793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1794c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type, typename p4##_type, typename p5##_type>\
1795c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class name##ActionP6 {\
1796c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:\
1797c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name##ActionP6(p0##_type gmock_p0, p1##_type gmock_p1, \
1798c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1799c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1800c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\
1801c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F>\
1802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    class gmock_Impl : public ::testing::ActionInterface<F> {\
1803c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     public:\
1804c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef F function_type;\
1805c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::Result return_type;\
1806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          args_type;\
1808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1809c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p3##_type gmock_p3, p4##_type gmock_p4, \
1810c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {}\
1812c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      virtual return_type Perform(const args_type& args) {\
1813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1814c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            Perform(this, args);\
1815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }\
1816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      template <typename arg0_type, typename arg1_type, typename arg2_type, \
1817c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg3_type, typename arg4_type, typename arg5_type, \
1818c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg6_type, typename arg7_type, typename arg8_type, \
1819c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg9_type>\
1820c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1821c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1822c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg9_type arg9) const;\
1824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p0##_type p0;\
1825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p1##_type p1;\
1826c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p2##_type p2;\
1827c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p3##_type p3;\
1828c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p4##_type p4;\
1829c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p5##_type p5;\
1830c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     private:\
1831c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1832c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    };\
1833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F> operator ::testing::Action<F>() const {\
1834c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5));\
1835c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }\
1836c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p0##_type p0;\
1837c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p1##_type p1;\
1838c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p2##_type p2;\
1839c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p3##_type p3;\
1840c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p4##_type p4;\
1841c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p5##_type p5;\
1842c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:\
1843c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GTEST_DISALLOW_ASSIGN_(name##ActionP6);\
1844c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };\
1845c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1846c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type, typename p4##_type, typename p5##_type>\
1847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  inline name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, \
1848c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
1849c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p3##_type p3, p4##_type p4, p5##_type p5) {\
1850c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, \
1851c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\
1852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }\
1853c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1854c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type, typename p4##_type, typename p5##_type>\
1855c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename F>\
1856c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename arg0_type, typename arg1_type, typename arg2_type, \
1857c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg3_type, typename arg4_type, typename arg5_type, \
1858c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg6_type, typename arg7_type, typename arg8_type, \
1859c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg9_type>\
1860c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typename ::testing::internal::Function<F>::Result\
1861c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      name##ActionP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1862c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p5##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1863c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1864c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1865c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define ACTION_P7(name, p0, p1, p2, p3, p4, p5, p6)\
1866c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1867c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type, typename p4##_type, typename p5##_type, \
1868c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p6##_type>\
1869c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class name##ActionP7 {\
1870c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:\
1871c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name##ActionP7(p0##_type gmock_p0, p1##_type gmock_p1, \
1872c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1873c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \
1874c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \
1875c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p6(gmock_p6) {}\
1876c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F>\
1877c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    class gmock_Impl : public ::testing::ActionInterface<F> {\
1878c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     public:\
1879c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef F function_type;\
1880c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::Result return_type;\
1881c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1882c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          args_type;\
1883c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1884c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1885c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1886c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\
1887c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      virtual return_type Perform(const args_type& args) {\
1888c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1889c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            Perform(this, args);\
1890c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }\
1891c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      template <typename arg0_type, typename arg1_type, typename arg2_type, \
1892c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg3_type, typename arg4_type, typename arg5_type, \
1893c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg6_type, typename arg7_type, typename arg8_type, \
1894c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg9_type>\
1895c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1896c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1897c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1898c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg9_type arg9) const;\
1899c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p0##_type p0;\
1900c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p1##_type p1;\
1901c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p2##_type p2;\
1902c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p3##_type p3;\
1903c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p4##_type p4;\
1904c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p5##_type p5;\
1905c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p6##_type p6;\
1906c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     private:\
1907c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1908c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    };\
1909c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F> operator ::testing::Action<F>() const {\
1910c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
1911c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p6));\
1912c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }\
1913c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p0##_type p0;\
1914c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p1##_type p1;\
1915c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p2##_type p2;\
1916c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p3##_type p3;\
1917c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p4##_type p4;\
1918c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p5##_type p5;\
1919c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p6##_type p6;\
1920c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:\
1921c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GTEST_DISALLOW_ASSIGN_(name##ActionP7);\
1922c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };\
1923c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1924c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type, typename p4##_type, typename p5##_type, \
1925c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p6##_type>\
1926c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  inline name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, \
1927c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \
1928c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
1929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p6##_type p6) {\
1930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, \
1931c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\
1932c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }\
1933c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1934c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type, typename p4##_type, typename p5##_type, \
1935c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p6##_type>\
1936c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename F>\
1937c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename arg0_type, typename arg1_type, typename arg2_type, \
1938c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg3_type, typename arg4_type, typename arg5_type, \
1939c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg6_type, typename arg7_type, typename arg8_type, \
1940c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg9_type>\
1941c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typename ::testing::internal::Function<F>::Result\
1942c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      name##ActionP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1943c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p5##_type, p6##_type>::gmock_Impl<F>::gmock_PerformImpl(\
1944c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
1945c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1946c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define ACTION_P8(name, p0, p1, p2, p3, p4, p5, p6, p7)\
1947c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1948c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type, typename p4##_type, typename p5##_type, \
1949c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p6##_type, typename p7##_type>\
1950c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class name##ActionP8 {\
1951c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:\
1952c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name##ActionP8(p0##_type gmock_p0, p1##_type gmock_p1, \
1953c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1954c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p5##_type gmock_p5, p6##_type gmock_p6, \
1955c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1956c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
1957c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p7(gmock_p7) {}\
1958c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F>\
1959c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    class gmock_Impl : public ::testing::ActionInterface<F> {\
1960c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     public:\
1961c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef F function_type;\
1962c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::Result return_type;\
1963c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
1964c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          args_type;\
1965c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1966c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1967c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p6##_type gmock_p6, p7##_type gmock_p7) : p0(gmock_p0), \
1968c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), \
1969c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\
1970c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      virtual return_type Perform(const args_type& args) {\
1971c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
1972c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            Perform(this, args);\
1973c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }\
1974c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      template <typename arg0_type, typename arg1_type, typename arg2_type, \
1975c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg3_type, typename arg4_type, typename arg5_type, \
1976c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg6_type, typename arg7_type, typename arg8_type, \
1977c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg9_type>\
1978c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
1979c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
1980c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
1981c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg9_type arg9) const;\
1982c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p0##_type p0;\
1983c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p1##_type p1;\
1984c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p2##_type p2;\
1985c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p3##_type p3;\
1986c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p4##_type p4;\
1987c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p5##_type p5;\
1988c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p6##_type p6;\
1989c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p7##_type p7;\
1990c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     private:\
1991c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1992c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    };\
1993c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F> operator ::testing::Action<F>() const {\
1994c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
1995c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p6, p7));\
1996c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }\
1997c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p0##_type p0;\
1998c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p1##_type p1;\
1999c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p2##_type p2;\
2000c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p3##_type p3;\
2001c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p4##_type p4;\
2002c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p5##_type p5;\
2003c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p6##_type p6;\
2004c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p7##_type p7;\
2005c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:\
2006c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GTEST_DISALLOW_ASSIGN_(name##ActionP8);\
2007c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };\
2008c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2009c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type, typename p4##_type, typename p5##_type, \
2010c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p6##_type, typename p7##_type>\
2011c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  inline name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, \
2012c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \
2013c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
2014c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p6##_type p6, p7##_type p7) {\
2015c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, \
2016c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \
2017c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p6, p7);\
2018c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }\
2019c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2020c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type, typename p4##_type, typename p5##_type, \
2021c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p6##_type, typename p7##_type>\
2022c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename F>\
2023c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename arg0_type, typename arg1_type, typename arg2_type, \
2024c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg3_type, typename arg4_type, typename arg5_type, \
2025c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg6_type, typename arg7_type, typename arg8_type, \
2026c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg9_type>\
2027c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typename ::testing::internal::Function<F>::Result\
2028c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      name##ActionP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
2029c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p5##_type, p6##_type, \
2030c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p7##_type>::gmock_Impl<F>::gmock_PerformImpl(\
2031c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
2032c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2033c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define ACTION_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8)\
2034c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2035c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type, typename p4##_type, typename p5##_type, \
2036c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p6##_type, typename p7##_type, typename p8##_type>\
2037c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class name##ActionP9 {\
2038c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:\
2039c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name##ActionP9(p0##_type gmock_p0, p1##_type gmock_p1, \
2040c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
2041c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
2042c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
2043c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
2044c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p8(gmock_p8) {}\
2045c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F>\
2046c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    class gmock_Impl : public ::testing::ActionInterface<F> {\
2047c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     public:\
2048c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef F function_type;\
2049c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::Result return_type;\
2050c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
2051c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          args_type;\
2052c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
2053c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
2054c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p6##_type gmock_p6, p7##_type gmock_p7, \
2055c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
2056c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
2057c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p7(gmock_p7), p8(gmock_p8) {}\
2058c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      virtual return_type Perform(const args_type& args) {\
2059c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
2060c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            Perform(this, args);\
2061c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }\
2062c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      template <typename arg0_type, typename arg1_type, typename arg2_type, \
2063c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg3_type, typename arg4_type, typename arg5_type, \
2064c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg6_type, typename arg7_type, typename arg8_type, \
2065c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg9_type>\
2066c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
2067c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
2068c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
2069c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg9_type arg9) const;\
2070c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p0##_type p0;\
2071c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p1##_type p1;\
2072c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p2##_type p2;\
2073c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p3##_type p3;\
2074c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p4##_type p4;\
2075c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p5##_type p5;\
2076c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p6##_type p6;\
2077c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p7##_type p7;\
2078c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p8##_type p8;\
2079c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     private:\
2080c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
2081c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    };\
2082c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F> operator ::testing::Action<F>() const {\
2083c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
2084c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p6, p7, p8));\
2085c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }\
2086c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p0##_type p0;\
2087c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p1##_type p1;\
2088c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p2##_type p2;\
2089c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p3##_type p3;\
2090c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p4##_type p4;\
2091c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p5##_type p5;\
2092c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p6##_type p6;\
2093c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p7##_type p7;\
2094c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p8##_type p8;\
2095c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:\
2096c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GTEST_DISALLOW_ASSIGN_(name##ActionP9);\
2097c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };\
2098c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2099c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type, typename p4##_type, typename p5##_type, \
2100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p6##_type, typename p7##_type, typename p8##_type>\
2101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  inline name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, \
2102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p4##_type, p5##_type, p6##_type, p7##_type, \
2103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
2104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \
2105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p8##_type p8) {\
2106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, \
2107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \
2108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p3, p4, p5, p6, p7, p8);\
2109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }\
2110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type, typename p4##_type, typename p5##_type, \
2112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p6##_type, typename p7##_type, typename p8##_type>\
2113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename F>\
2114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename arg0_type, typename arg1_type, typename arg2_type, \
2115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg3_type, typename arg4_type, typename arg5_type, \
2116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg6_type, typename arg7_type, typename arg8_type, \
2117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg9_type>\
2118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typename ::testing::internal::Function<F>::Result\
2119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      name##ActionP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
2120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p5##_type, p6##_type, p7##_type, \
2121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p8##_type>::gmock_Impl<F>::gmock_PerformImpl(\
2122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
2123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define ACTION_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)\
2125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type, typename p4##_type, typename p5##_type, \
2127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p6##_type, typename p7##_type, typename p8##_type, \
2128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p9##_type>\
2129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class name##ActionP10 {\
2130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:\
2131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    name##ActionP10(p0##_type gmock_p0, p1##_type gmock_p1, \
2132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
2133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
2134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \
2135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
2136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\
2137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F>\
2138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    class gmock_Impl : public ::testing::ActionInterface<F> {\
2139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     public:\
2140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef F function_type;\
2141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::Result return_type;\
2142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typedef typename ::testing::internal::Function<F>::ArgumentTuple\
2143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          args_type;\
2144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
2145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
2146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \
2147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
2148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
2149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {}\
2150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      virtual return_type Perform(const args_type& args) {\
2151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\
2152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            Perform(this, args);\
2153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }\
2154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      template <typename arg0_type, typename arg1_type, typename arg2_type, \
2155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg3_type, typename arg4_type, typename arg5_type, \
2156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg6_type, typename arg7_type, typename arg8_type, \
2157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          typename arg9_type>\
2158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \
2159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \
2160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \
2161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          arg9_type arg9) const;\
2162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p0##_type p0;\
2163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p1##_type p1;\
2164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p2##_type p2;\
2165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p3##_type p3;\
2166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p4##_type p4;\
2167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p5##_type p5;\
2168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p6##_type p6;\
2169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p7##_type p7;\
2170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p8##_type p8;\
2171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p9##_type p9;\
2172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     private:\
2173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
2174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    };\
2175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    template <typename F> operator ::testing::Action<F>() const {\
2176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return ::testing::Action<F>(new gmock_Impl<F>(p0, p1, p2, p3, p4, p5, \
2177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p6, p7, p8, p9));\
2178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }\
2179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p0##_type p0;\
2180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p1##_type p1;\
2181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p2##_type p2;\
2182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p3##_type p3;\
2183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p4##_type p4;\
2184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p5##_type p5;\
2185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p6##_type p6;\
2186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p7##_type p7;\
2187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p8##_type p8;\
2188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p9##_type p9;\
2189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:\
2190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GTEST_DISALLOW_ASSIGN_(name##ActionP10);\
2191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };\
2192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type, typename p4##_type, typename p5##_type, \
2194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p6##_type, typename p7##_type, typename p8##_type, \
2195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p9##_type>\
2196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  inline name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, \
2197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
2198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
2199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \
2200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      p9##_type p9) {\
2201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, \
2202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \
2203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        p1, p2, p3, p4, p5, p6, p7, p8, p9);\
2204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }\
2205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p3##_type, typename p4##_type, typename p5##_type, \
2207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p6##_type, typename p7##_type, typename p8##_type, \
2208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename p9##_type>\
2209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename F>\
2210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  template <typename arg0_type, typename arg1_type, typename arg2_type, \
2211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg3_type, typename arg4_type, typename arg5_type, \
2212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg6_type, typename arg7_type, typename arg8_type, \
2213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      typename arg9_type>\
2214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typename ::testing::internal::Function<F>::Result\
2215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      name##ActionP10<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
2216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p5##_type, p6##_type, p7##_type, p8##_type, \
2217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p9##_type>::gmock_Impl<F>::gmock_PerformImpl(\
2218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
2219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(wan@google.com): move the following to a different .h file
2221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// such that we don't have to run 'pump' every time the code is
2222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// updated.
2223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace testing {
2224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The ACTION*() macros trigger warning C4100 (unreferenced formal
2226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// parameter) in MSVC with -W4.  Unfortunately they cannot be fixed in
2227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the macro definition, as the warnings are generated when the macro
2228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// is expanded and macro expansion cannot contain #pragma.  Therefore
2229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// we suppress them here.
2230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifdef _MSC_VER
2231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# pragma warning(push)
2232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# pragma warning(disable:4100)
2233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
2234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Various overloads for InvokeArgument<N>().
2236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
2237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The InvokeArgument<N>(a1, a2, ..., a_k) action invokes the N-th
2238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (0-based) argument, which must be a k-ary callable, of the mock
2239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// function, with arguments a1, a2, ..., a_k.
2240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
2241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Notes:
2242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
2243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   1. The arguments are passed by value by default.  If you need to
2244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   pass an argument by reference, wrap it inside ByRef().  For
2245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   example,
2246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
2247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     InvokeArgument<1>(5, string("Hello"), ByRef(foo))
2248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
2249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   passes 5 and string("Hello") by value, and passes foo by
2250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   reference.
2251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
2252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   2. If the callable takes an argument by reference but ByRef() is
2253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   not used, it will receive the reference to a copy of the value,
2254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   instead of the original value.  For example, when the 0-th
2255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   argument of the mock function takes a const string&, the action
2256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
2257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     InvokeArgument<0>(string("Hello"))
2258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
2259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   makes a copy of the temporary string("Hello") object and passes a
2260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   reference of the copy, instead of the original temporary object,
2261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   to the callable.  This makes it easy for a user to define an
2262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   InvokeArgument action from temporary values and have it performed
2263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   later.
2264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2265c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(InvokeArgument,
2266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(int, k),
2267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_0_VALUE_PARAMS()) {
2268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::CallableHelper<return_type>::Call(
2269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ::std::tr1::get<k>(args));
2270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2272c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(InvokeArgument,
2273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(int, k),
2274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_1_VALUE_PARAMS(p0)) {
2275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::CallableHelper<return_type>::Call(
2276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ::std::tr1::get<k>(args), p0);
2277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2279c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(InvokeArgument,
2280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(int, k),
2281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_2_VALUE_PARAMS(p0, p1)) {
2282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::CallableHelper<return_type>::Call(
2283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ::std::tr1::get<k>(args), p0, p1);
2284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2286c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(InvokeArgument,
2287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(int, k),
2288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_3_VALUE_PARAMS(p0, p1, p2)) {
2289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::CallableHelper<return_type>::Call(
2290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ::std::tr1::get<k>(args), p0, p1, p2);
2291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2293c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(InvokeArgument,
2294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(int, k),
2295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_4_VALUE_PARAMS(p0, p1, p2, p3)) {
2296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::CallableHelper<return_type>::Call(
2297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ::std::tr1::get<k>(args), p0, p1, p2, p3);
2298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2300c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(InvokeArgument,
2301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(int, k),
2302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) {
2303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::CallableHelper<return_type>::Call(
2304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ::std::tr1::get<k>(args), p0, p1, p2, p3, p4);
2305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2307c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(InvokeArgument,
2308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(int, k),
2309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) {
2310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::CallableHelper<return_type>::Call(
2311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5);
2312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2314c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(InvokeArgument,
2315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(int, k),
2316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) {
2317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::CallableHelper<return_type>::Call(
2318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6);
2319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2321c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(InvokeArgument,
2322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(int, k),
2323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) {
2324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::CallableHelper<return_type>::Call(
2325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7);
2326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2328c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(InvokeArgument,
2329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(int, k),
2330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) {
2331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::CallableHelper<return_type>::Call(
2332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8);
2333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2335c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(InvokeArgument,
2336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(int, k),
2337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) {
2338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return internal::CallableHelper<return_type>::Call(
2339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ::std::tr1::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
2340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Various overloads for ReturnNew<T>().
2343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
2344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The ReturnNew<T>(a1, a2, ..., a_k) action returns a pointer to a new
2345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// instance of type T, constructed on the heap with constructor arguments
2346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// a1, a2, ..., and a_k. The caller assumes ownership of the returned value.
2347c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(ReturnNew,
2348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(typename, T),
2349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_0_VALUE_PARAMS()) {
2350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new T();
2351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2353c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(ReturnNew,
2354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(typename, T),
2355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_1_VALUE_PARAMS(p0)) {
2356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new T(p0);
2357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2359c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(ReturnNew,
2360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(typename, T),
2361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_2_VALUE_PARAMS(p0, p1)) {
2362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new T(p0, p1);
2363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2365c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(ReturnNew,
2366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(typename, T),
2367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_3_VALUE_PARAMS(p0, p1, p2)) {
2368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new T(p0, p1, p2);
2369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2371c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(ReturnNew,
2372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(typename, T),
2373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_4_VALUE_PARAMS(p0, p1, p2, p3)) {
2374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new T(p0, p1, p2, p3);
2375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2377c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(ReturnNew,
2378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(typename, T),
2379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)) {
2380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new T(p0, p1, p2, p3, p4);
2381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2383c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(ReturnNew,
2384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(typename, T),
2385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)) {
2386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new T(p0, p1, p2, p3, p4, p5);
2387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2389c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(ReturnNew,
2390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(typename, T),
2391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)) {
2392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new T(p0, p1, p2, p3, p4, p5, p6);
2393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2395c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(ReturnNew,
2396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(typename, T),
2397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)) {
2398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new T(p0, p1, p2, p3, p4, p5, p6, p7);
2399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2401c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(ReturnNew,
2402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(typename, T),
2403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8)) {
2404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8);
2405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2407c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_TEMPLATE(ReturnNew,
2408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                HAS_1_TEMPLATE_PARAMS(typename, T),
2409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)) {
2410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return new T(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);
2411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
2412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifdef _MSC_VER
2414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen# pragma warning(pop)
2415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
2416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace testing
2418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_
2420