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