blob: 1b52dceb47e87b0b690fa63b181aaac5af67d324 [file] [log] [blame]
shiqiane35fdd92008-12-10 05:08:54 +00001// This file was GENERATED by a script. DO NOT EDIT BY HAND!!!
2
3// Copyright 2007, Google Inc.
4// All rights reserved.
5//
6// Redistribution and use in source and binary forms, with or without
7// modification, are permitted provided that the following conditions are
8// met:
9//
10// * Redistributions of source code must retain the above copyright
11// notice, this list of conditions and the following disclaimer.
12// * Redistributions in binary form must reproduce the above
13// copyright notice, this list of conditions and the following disclaimer
14// in the documentation and/or other materials provided with the
15// distribution.
16// * Neither the name of Google Inc. nor the names of its
17// contributors may be used to endorse or promote products derived from
18// this software without specific prior written permission.
19//
20// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31//
32// Author: wan@google.com (Zhanyong Wan)
33
34// Google Mock - a framework for writing C++ mock classes.
35//
36// This file contains template meta-programming utility classes needed
37// for implementing Google Mock.
38
39#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_
40#define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_
41
zhanyong.wan53e08c42010-09-14 05:38:21 +000042#include "gmock/internal/gmock-port.h"
shiqiane35fdd92008-12-10 05:08:54 +000043
44namespace testing {
45
46template <typename T>
47class Matcher;
48
49namespace internal {
50
51// An IgnoredValue object can be implicitly constructed from ANY value.
52// This is used in implementing the IgnoreResult(a) action.
53class IgnoredValue {
54 public:
55 // This constructor template allows any value to be implicitly
56 // converted to IgnoredValue. The object has no data member and
57 // doesn't try to remember anything about the argument. We
58 // deliberately omit the 'explicit' keyword in order to allow the
59 // conversion to be implicit.
60 template <typename T>
61 IgnoredValue(const T&) {}
62};
63
64// MatcherTuple<T>::type is a tuple type where each field is a Matcher
65// for the corresponding field in tuple type T.
66template <typename Tuple>
67struct MatcherTuple;
68
69template <>
70struct MatcherTuple< ::std::tr1::tuple<> > {
71 typedef ::std::tr1::tuple< > type;
72};
73
74template <typename A1>
75struct MatcherTuple< ::std::tr1::tuple<A1> > {
76 typedef ::std::tr1::tuple<Matcher<A1> > type;
77};
78
79template <typename A1, typename A2>
80struct MatcherTuple< ::std::tr1::tuple<A1, A2> > {
81 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2> > type;
82};
83
84template <typename A1, typename A2, typename A3>
85struct MatcherTuple< ::std::tr1::tuple<A1, A2, A3> > {
86 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3> > type;
87};
88
89template <typename A1, typename A2, typename A3, typename A4>
90struct MatcherTuple< ::std::tr1::tuple<A1, A2, A3, A4> > {
91 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>,
92 Matcher<A4> > type;
93};
94
95template <typename A1, typename A2, typename A3, typename A4, typename A5>
96struct MatcherTuple< ::std::tr1::tuple<A1, A2, A3, A4, A5> > {
97 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,
98 Matcher<A5> > type;
99};
100
101template <typename A1, typename A2, typename A3, typename A4, typename A5,
102 typename A6>
103struct MatcherTuple< ::std::tr1::tuple<A1, A2, A3, A4, A5, A6> > {
104 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,
105 Matcher<A5>, Matcher<A6> > type;
106};
107
108template <typename A1, typename A2, typename A3, typename A4, typename A5,
109 typename A6, typename A7>
110struct MatcherTuple< ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7> > {
111 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,
112 Matcher<A5>, Matcher<A6>, Matcher<A7> > type;
113};
114
115template <typename A1, typename A2, typename A3, typename A4, typename A5,
116 typename A6, typename A7, typename A8>
117struct MatcherTuple< ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8> > {
118 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,
119 Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8> > type;
120};
121
122template <typename A1, typename A2, typename A3, typename A4, typename A5,
123 typename A6, typename A7, typename A8, typename A9>
124struct MatcherTuple< ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> > {
125 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,
126 Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8>, Matcher<A9> > type;
127};
128
129template <typename A1, typename A2, typename A3, typename A4, typename A5,
130 typename A6, typename A7, typename A8, typename A9, typename A10>
131struct MatcherTuple< ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,
132 A10> > {
133 typedef ::std::tr1::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,
134 Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8>, Matcher<A9>,
135 Matcher<A10> > type;
136};
137
138// Template struct Function<F>, where F must be a function type, contains
139// the following typedefs:
140//
141// Result: the function's return type.
142// ArgumentN: the type of the N-th argument, where N starts with 1.
143// ArgumentTuple: the tuple type consisting of all parameters of F.
144// ArgumentMatcherTuple: the tuple type consisting of Matchers for all
145// parameters of F.
146// MakeResultVoid: the function type obtained by substituting void
147// for the return type of F.
148// MakeResultIgnoredValue:
149// the function type obtained by substituting Something
150// for the return type of F.
151template <typename F>
152struct Function;
153
154template <typename R>
155struct Function<R()> {
156 typedef R Result;
157 typedef ::std::tr1::tuple<> ArgumentTuple;
158 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
159 typedef void MakeResultVoid();
160 typedef IgnoredValue MakeResultIgnoredValue();
161};
162
163template <typename R, typename A1>
164struct Function<R(A1)>
165 : Function<R()> {
166 typedef A1 Argument1;
167 typedef ::std::tr1::tuple<A1> ArgumentTuple;
168 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
169 typedef void MakeResultVoid(A1);
170 typedef IgnoredValue MakeResultIgnoredValue(A1);
171};
172
173template <typename R, typename A1, typename A2>
174struct Function<R(A1, A2)>
175 : Function<R(A1)> {
176 typedef A2 Argument2;
177 typedef ::std::tr1::tuple<A1, A2> ArgumentTuple;
178 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
179 typedef void MakeResultVoid(A1, A2);
180 typedef IgnoredValue MakeResultIgnoredValue(A1, A2);
181};
182
183template <typename R, typename A1, typename A2, typename A3>
184struct Function<R(A1, A2, A3)>
185 : Function<R(A1, A2)> {
186 typedef A3 Argument3;
187 typedef ::std::tr1::tuple<A1, A2, A3> ArgumentTuple;
188 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
189 typedef void MakeResultVoid(A1, A2, A3);
190 typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3);
191};
192
193template <typename R, typename A1, typename A2, typename A3, typename A4>
194struct Function<R(A1, A2, A3, A4)>
195 : Function<R(A1, A2, A3)> {
196 typedef A4 Argument4;
197 typedef ::std::tr1::tuple<A1, A2, A3, A4> ArgumentTuple;
198 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
199 typedef void MakeResultVoid(A1, A2, A3, A4);
200 typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4);
201};
202
203template <typename R, typename A1, typename A2, typename A3, typename A4,
204 typename A5>
205struct Function<R(A1, A2, A3, A4, A5)>
206 : Function<R(A1, A2, A3, A4)> {
207 typedef A5 Argument5;
208 typedef ::std::tr1::tuple<A1, A2, A3, A4, A5> ArgumentTuple;
209 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
210 typedef void MakeResultVoid(A1, A2, A3, A4, A5);
211 typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5);
212};
213
214template <typename R, typename A1, typename A2, typename A3, typename A4,
215 typename A5, typename A6>
216struct Function<R(A1, A2, A3, A4, A5, A6)>
217 : Function<R(A1, A2, A3, A4, A5)> {
218 typedef A6 Argument6;
219 typedef ::std::tr1::tuple<A1, A2, A3, A4, A5, A6> ArgumentTuple;
220 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
221 typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6);
222 typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6);
223};
224
225template <typename R, typename A1, typename A2, typename A3, typename A4,
226 typename A5, typename A6, typename A7>
227struct Function<R(A1, A2, A3, A4, A5, A6, A7)>
228 : Function<R(A1, A2, A3, A4, A5, A6)> {
229 typedef A7 Argument7;
230 typedef ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7> ArgumentTuple;
231 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
232 typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7);
233 typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7);
234};
235
236template <typename R, typename A1, typename A2, typename A3, typename A4,
237 typename A5, typename A6, typename A7, typename A8>
238struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8)>
239 : Function<R(A1, A2, A3, A4, A5, A6, A7)> {
240 typedef A8 Argument8;
241 typedef ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8> ArgumentTuple;
242 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
243 typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8);
244 typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8);
245};
246
247template <typename R, typename A1, typename A2, typename A3, typename A4,
248 typename A5, typename A6, typename A7, typename A8, typename A9>
249struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)>
250 : Function<R(A1, A2, A3, A4, A5, A6, A7, A8)> {
251 typedef A9 Argument9;
252 typedef ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> ArgumentTuple;
253 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
254 typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8, A9);
255 typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8,
256 A9);
257};
258
259template <typename R, typename A1, typename A2, typename A3, typename A4,
260 typename A5, typename A6, typename A7, typename A8, typename A9,
261 typename A10>
262struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)>
263 : Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> {
264 typedef A10 Argument10;
265 typedef ::std::tr1::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,
266 A10> ArgumentTuple;
267 typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;
268 typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);
269 typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8,
270 A9, A10);
271};
272
273} // namespace internal
274
275} // namespace testing
276
277#endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_