OpenCores
URL https://opencores.org/ocsvn/s80186/s80186/trunk

Subversion Repositories s80186

[/] [s80186/] [trunk/] [vendor/] [googletest/] [googlemock/] [include/] [gmock/] [gmock-generated-matchers.h] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jamieiles
// This file was GENERATED by command:
2
//     pump.py gmock-generated-matchers.h.pump
3
// DO NOT EDIT BY HAND!!!
4
 
5
// Copyright 2008, 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
// Google Mock - a framework for writing C++ mock classes.
35
//
36
// This file implements some commonly used variadic matchers.
37
 
38
#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_
39
#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_
40
 
41
#include <iterator>
42
#include <sstream>
43
#include <string>
44
#include <vector>
45
#include "gmock/gmock-matchers.h"
46
 
47
namespace testing {
48
namespace internal {
49
 
50
// The type of the i-th (0-based) field of Tuple.
51
#define GMOCK_FIELD_TYPE_(Tuple, i) \
52
    typename ::testing::tuple_element<i, Tuple>::type
53
 
54
// TupleFields<Tuple, k0, ..., kn> is for selecting fields from a
55
// tuple of type Tuple.  It has two members:
56
//
57
//   type: a tuple type whose i-th field is the ki-th field of Tuple.
58
//   GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple.
59
//
60
// For example, in class TupleFields<tuple<bool, char, int>, 2, 0>, we have:
61
//
62
//   type is tuple<int, bool>, and
63
//   GetSelectedFields(make_tuple(true, 'a', 42)) is (42, true).
64
 
65
template <class Tuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1,
66
    int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,
67
    int k9 = -1>
68
class TupleFields;
69
 
70
// This generic version is used when there are 10 selectors.
71
template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,
72
    int k7, int k8, int k9>
73
class TupleFields {
74
 public:
75
  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
76
      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
77
      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
78
      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),
79
      GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8),
80
      GMOCK_FIELD_TYPE_(Tuple, k9)> type;
81
  static type GetSelectedFields(const Tuple& t) {
82
    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
83
        get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t), get<k9>(t));
84
  }
85
};
86
 
87
// The following specialization is used for 0 ~ 9 selectors.
88
 
89
template <class Tuple>
90
class TupleFields<Tuple, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
91
 public:
92
  typedef ::testing::tuple<> type;
93
  static type GetSelectedFields(const Tuple& /* t */) {
94
    return type();
95
  }
96
};
97
 
98
template <class Tuple, int k0>
99
class TupleFields<Tuple, k0, -1, -1, -1, -1, -1, -1, -1, -1, -1> {
100
 public:
101
  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0)> type;
102
  static type GetSelectedFields(const Tuple& t) {
103
    return type(get<k0>(t));
104
  }
105
};
106
 
107
template <class Tuple, int k0, int k1>
108
class TupleFields<Tuple, k0, k1, -1, -1, -1, -1, -1, -1, -1, -1> {
109
 public:
110
  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
111
      GMOCK_FIELD_TYPE_(Tuple, k1)> type;
112
  static type GetSelectedFields(const Tuple& t) {
113
    return type(get<k0>(t), get<k1>(t));
114
  }
115
};
116
 
117
template <class Tuple, int k0, int k1, int k2>
118
class TupleFields<Tuple, k0, k1, k2, -1, -1, -1, -1, -1, -1, -1> {
119
 public:
120
  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
121
      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2)> type;
122
  static type GetSelectedFields(const Tuple& t) {
123
    return type(get<k0>(t), get<k1>(t), get<k2>(t));
124
  }
125
};
126
 
127
template <class Tuple, int k0, int k1, int k2, int k3>
128
class TupleFields<Tuple, k0, k1, k2, k3, -1, -1, -1, -1, -1, -1> {
129
 public:
130
  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
131
      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
132
      GMOCK_FIELD_TYPE_(Tuple, k3)> type;
133
  static type GetSelectedFields(const Tuple& t) {
134
    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t));
135
  }
136
};
137
 
138
template <class Tuple, int k0, int k1, int k2, int k3, int k4>
139
class TupleFields<Tuple, k0, k1, k2, k3, k4, -1, -1, -1, -1, -1> {
140
 public:
141
  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
142
      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
143
      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4)> type;
144
  static type GetSelectedFields(const Tuple& t) {
145
    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t));
146
  }
147
};
148
 
149
template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5>
150
class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, -1, -1, -1, -1> {
151
 public:
152
  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
153
      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
154
      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
155
      GMOCK_FIELD_TYPE_(Tuple, k5)> type;
156
  static type GetSelectedFields(const Tuple& t) {
157
    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
158
        get<k5>(t));
159
  }
160
};
161
 
162
template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6>
163
class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, -1, -1, -1> {
164
 public:
165
  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
166
      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
167
      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
168
      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6)> type;
169
  static type GetSelectedFields(const Tuple& t) {
170
    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
171
        get<k5>(t), get<k6>(t));
172
  }
173
};
174
 
175
template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,
176
    int k7>
177
class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, -1, -1> {
178
 public:
179
  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
180
      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
181
      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
182
      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),
183
      GMOCK_FIELD_TYPE_(Tuple, k7)> type;
184
  static type GetSelectedFields(const Tuple& t) {
185
    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
186
        get<k5>(t), get<k6>(t), get<k7>(t));
187
  }
188
};
189
 
190
template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,
191
    int k7, int k8>
192
class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, k8, -1> {
193
 public:
194
  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),
195
      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),
196
      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),
197
      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),
198
      GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8)> type;
199
  static type GetSelectedFields(const Tuple& t) {
200
    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),
201
        get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t));
202
  }
203
};
204
 
205
#undef GMOCK_FIELD_TYPE_
206
 
207
// Implements the Args() matcher.
208
template <class ArgsTuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1,
209
    int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,
210
    int k9 = -1>
211
class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {
212
 public:
213
  // ArgsTuple may have top-level const or reference modifiers.
214
  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(ArgsTuple) RawArgsTuple;
215
  typedef typename internal::TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5,
216
      k6, k7, k8, k9>::type SelectedArgs;
217
  typedef Matcher<const SelectedArgs&> MonomorphicInnerMatcher;
218
 
219
  template <typename InnerMatcher>
220
  explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher)
221
      : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {}
222
 
223
  virtual bool MatchAndExplain(ArgsTuple args,
224
                               MatchResultListener* listener) const {
225
    const SelectedArgs& selected_args = GetSelectedArgs(args);
226
    if (!listener->IsInterested())
227
      return inner_matcher_.Matches(selected_args);
228
 
229
    PrintIndices(listener->stream());
230
    *listener << "are " << PrintToString(selected_args);
231
 
232
    StringMatchResultListener inner_listener;
233
    const bool match = inner_matcher_.MatchAndExplain(selected_args,
234
                                                      &inner_listener);
235
    PrintIfNotEmpty(inner_listener.str(), listener->stream());
236
    return match;
237
  }
238
 
239
  virtual void DescribeTo(::std::ostream* os) const {
240
    *os << "are a tuple ";
241
    PrintIndices(os);
242
    inner_matcher_.DescribeTo(os);
243
  }
244
 
245
  virtual void DescribeNegationTo(::std::ostream* os) const {
246
    *os << "are a tuple ";
247
    PrintIndices(os);
248
    inner_matcher_.DescribeNegationTo(os);
249
  }
250
 
251
 private:
252
  static SelectedArgs GetSelectedArgs(ArgsTuple args) {
253
    return TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5, k6, k7, k8,
254
        k9>::GetSelectedFields(args);
255
  }
256
 
257
  // Prints the indices of the selected fields.
258
  static void PrintIndices(::std::ostream* os) {
259
    *os << "whose fields (";
260
    const int indices[10] = { k0, k1, k2, k3, k4, k5, k6, k7, k8, k9 };
261
    for (int i = 0; i < 10; i++) {
262
      if (indices[i] < 0)
263
        break;
264
 
265
      if (i >= 1)
266
        *os << ", ";
267
 
268
      *os << "#" << indices[i];
269
    }
270
    *os << ") ";
271
  }
272
 
273
  const MonomorphicInnerMatcher inner_matcher_;
274
 
275
  GTEST_DISALLOW_ASSIGN_(ArgsMatcherImpl);
276
};
277
 
278
template <class InnerMatcher, int k0 = -1, int k1 = -1, int k2 = -1,
279
    int k3 = -1, int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1,
280
    int k8 = -1, int k9 = -1>
281
class ArgsMatcher {
282
 public:
283
  explicit ArgsMatcher(const InnerMatcher& inner_matcher)
284
      : inner_matcher_(inner_matcher) {}
285
 
286
  template <typename ArgsTuple>
287
  operator Matcher<ArgsTuple>() const {
288
    return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, k0, k1, k2, k3, k4, k5,
289
        k6, k7, k8, k9>(inner_matcher_));
290
  }
291
 
292
 private:
293
  const InnerMatcher inner_matcher_;
294
 
295
  GTEST_DISALLOW_ASSIGN_(ArgsMatcher);
296
};
297
 
298
// A set of metafunctions for computing the result type of AllOf.
299
// AllOf(m1, ..., mN) returns
300
// AllOfResultN<decltype(m1), ..., decltype(mN)>::type.
301
 
302
// Although AllOf isn't defined for one argument, AllOfResult1 is defined
303
// to simplify the implementation.
304
template <typename M1>
305
struct AllOfResult1 {
306
  typedef M1 type;
307
};
308
 
309
template <typename M1, typename M2>
310
struct AllOfResult2 {
311
  typedef BothOfMatcher<
312
      typename AllOfResult1<M1>::type,
313
      typename AllOfResult1<M2>::type
314
  > type;
315
};
316
 
317
template <typename M1, typename M2, typename M3>
318
struct AllOfResult3 {
319
  typedef BothOfMatcher<
320
      typename AllOfResult1<M1>::type,
321
      typename AllOfResult2<M2, M3>::type
322
  > type;
323
};
324
 
325
template <typename M1, typename M2, typename M3, typename M4>
326
struct AllOfResult4 {
327
  typedef BothOfMatcher<
328
      typename AllOfResult2<M1, M2>::type,
329
      typename AllOfResult2<M3, M4>::type
330
  > type;
331
};
332
 
333
template <typename M1, typename M2, typename M3, typename M4, typename M5>
334
struct AllOfResult5 {
335
  typedef BothOfMatcher<
336
      typename AllOfResult2<M1, M2>::type,
337
      typename AllOfResult3<M3, M4, M5>::type
338
  > type;
339
};
340
 
341
template <typename M1, typename M2, typename M3, typename M4, typename M5,
342
    typename M6>
343
struct AllOfResult6 {
344
  typedef BothOfMatcher<
345
      typename AllOfResult3<M1, M2, M3>::type,
346
      typename AllOfResult3<M4, M5, M6>::type
347
  > type;
348
};
349
 
350
template <typename M1, typename M2, typename M3, typename M4, typename M5,
351
    typename M6, typename M7>
352
struct AllOfResult7 {
353
  typedef BothOfMatcher<
354
      typename AllOfResult3<M1, M2, M3>::type,
355
      typename AllOfResult4<M4, M5, M6, M7>::type
356
  > type;
357
};
358
 
359
template <typename M1, typename M2, typename M3, typename M4, typename M5,
360
    typename M6, typename M7, typename M8>
361
struct AllOfResult8 {
362
  typedef BothOfMatcher<
363
      typename AllOfResult4<M1, M2, M3, M4>::type,
364
      typename AllOfResult4<M5, M6, M7, M8>::type
365
  > type;
366
};
367
 
368
template <typename M1, typename M2, typename M3, typename M4, typename M5,
369
    typename M6, typename M7, typename M8, typename M9>
370
struct AllOfResult9 {
371
  typedef BothOfMatcher<
372
      typename AllOfResult4<M1, M2, M3, M4>::type,
373
      typename AllOfResult5<M5, M6, M7, M8, M9>::type
374
  > type;
375
};
376
 
377
template <typename M1, typename M2, typename M3, typename M4, typename M5,
378
    typename M6, typename M7, typename M8, typename M9, typename M10>
379
struct AllOfResult10 {
380
  typedef BothOfMatcher<
381
      typename AllOfResult5<M1, M2, M3, M4, M5>::type,
382
      typename AllOfResult5<M6, M7, M8, M9, M10>::type
383
  > type;
384
};
385
 
386
// A set of metafunctions for computing the result type of AnyOf.
387
// AnyOf(m1, ..., mN) returns
388
// AnyOfResultN<decltype(m1), ..., decltype(mN)>::type.
389
 
390
// Although AnyOf isn't defined for one argument, AnyOfResult1 is defined
391
// to simplify the implementation.
392
template <typename M1>
393
struct AnyOfResult1 {
394
  typedef M1 type;
395
};
396
 
397
template <typename M1, typename M2>
398
struct AnyOfResult2 {
399
  typedef EitherOfMatcher<
400
      typename AnyOfResult1<M1>::type,
401
      typename AnyOfResult1<M2>::type
402
  > type;
403
};
404
 
405
template <typename M1, typename M2, typename M3>
406
struct AnyOfResult3 {
407
  typedef EitherOfMatcher<
408
      typename AnyOfResult1<M1>::type,
409
      typename AnyOfResult2<M2, M3>::type
410
  > type;
411
};
412
 
413
template <typename M1, typename M2, typename M3, typename M4>
414
struct AnyOfResult4 {
415
  typedef EitherOfMatcher<
416
      typename AnyOfResult2<M1, M2>::type,
417
      typename AnyOfResult2<M3, M4>::type
418
  > type;
419
};
420
 
421
template <typename M1, typename M2, typename M3, typename M4, typename M5>
422
struct AnyOfResult5 {
423
  typedef EitherOfMatcher<
424
      typename AnyOfResult2<M1, M2>::type,
425
      typename AnyOfResult3<M3, M4, M5>::type
426
  > type;
427
};
428
 
429
template <typename M1, typename M2, typename M3, typename M4, typename M5,
430
    typename M6>
431
struct AnyOfResult6 {
432
  typedef EitherOfMatcher<
433
      typename AnyOfResult3<M1, M2, M3>::type,
434
      typename AnyOfResult3<M4, M5, M6>::type
435
  > type;
436
};
437
 
438
template <typename M1, typename M2, typename M3, typename M4, typename M5,
439
    typename M6, typename M7>
440
struct AnyOfResult7 {
441
  typedef EitherOfMatcher<
442
      typename AnyOfResult3<M1, M2, M3>::type,
443
      typename AnyOfResult4<M4, M5, M6, M7>::type
444
  > type;
445
};
446
 
447
template <typename M1, typename M2, typename M3, typename M4, typename M5,
448
    typename M6, typename M7, typename M8>
449
struct AnyOfResult8 {
450
  typedef EitherOfMatcher<
451
      typename AnyOfResult4<M1, M2, M3, M4>::type,
452
      typename AnyOfResult4<M5, M6, M7, M8>::type
453
  > type;
454
};
455
 
456
template <typename M1, typename M2, typename M3, typename M4, typename M5,
457
    typename M6, typename M7, typename M8, typename M9>
458
struct AnyOfResult9 {
459
  typedef EitherOfMatcher<
460
      typename AnyOfResult4<M1, M2, M3, M4>::type,
461
      typename AnyOfResult5<M5, M6, M7, M8, M9>::type
462
  > type;
463
};
464
 
465
template <typename M1, typename M2, typename M3, typename M4, typename M5,
466
    typename M6, typename M7, typename M8, typename M9, typename M10>
467
struct AnyOfResult10 {
468
  typedef EitherOfMatcher<
469
      typename AnyOfResult5<M1, M2, M3, M4, M5>::type,
470
      typename AnyOfResult5<M6, M7, M8, M9, M10>::type
471
  > type;
472
};
473
 
474
}  // namespace internal
475
 
476
// Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected
477
// fields of it matches a_matcher.  C++ doesn't support default
478
// arguments for function templates, so we have to overload it.
479
template <typename InnerMatcher>
480
inline internal::ArgsMatcher<InnerMatcher>
481
Args(const InnerMatcher& matcher) {
482
  return internal::ArgsMatcher<InnerMatcher>(matcher);
483
}
484
 
485
template <int k1, typename InnerMatcher>
486
inline internal::ArgsMatcher<InnerMatcher, k1>
487
Args(const InnerMatcher& matcher) {
488
  return internal::ArgsMatcher<InnerMatcher, k1>(matcher);
489
}
490
 
491
template <int k1, int k2, typename InnerMatcher>
492
inline internal::ArgsMatcher<InnerMatcher, k1, k2>
493
Args(const InnerMatcher& matcher) {
494
  return internal::ArgsMatcher<InnerMatcher, k1, k2>(matcher);
495
}
496
 
497
template <int k1, int k2, int k3, typename InnerMatcher>
498
inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3>
499
Args(const InnerMatcher& matcher) {
500
  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3>(matcher);
501
}
502
 
503
template <int k1, int k2, int k3, int k4, typename InnerMatcher>
504
inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>
505
Args(const InnerMatcher& matcher) {
506
  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>(matcher);
507
}
508
 
509
template <int k1, int k2, int k3, int k4, int k5, typename InnerMatcher>
510
inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>
511
Args(const InnerMatcher& matcher) {
512
  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>(matcher);
513
}
514
 
515
template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerMatcher>
516
inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>
517
Args(const InnerMatcher& matcher) {
518
  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>(matcher);
519
}
520
 
521
template <int k1, int k2, int k3, int k4, int k5, int k6, int k7,
522
    typename InnerMatcher>
523
inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7>
524
Args(const InnerMatcher& matcher) {
525
  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6,
526
      k7>(matcher);
527
}
528
 
529
template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
530
    typename InnerMatcher>
531
inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8>
532
Args(const InnerMatcher& matcher) {
533
  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7,
534
      k8>(matcher);
535
}
536
 
537
template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
538
    int k9, typename InnerMatcher>
539
inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9>
540
Args(const InnerMatcher& matcher) {
541
  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8,
542
      k9>(matcher);
543
}
544
 
545
template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,
546
    int k9, int k10, typename InnerMatcher>
547
inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9,
548
    k10>
549
Args(const InnerMatcher& matcher) {
550
  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8,
551
      k9, k10>(matcher);
552
}
553
 
554
// ElementsAre(e_1, e_2, ... e_n) matches an STL-style container with
555
// n elements, where the i-th element in the container must
556
// match the i-th argument in the list.  Each argument of
557
// ElementsAre() can be either a value or a matcher.  We support up to
558
// 10 arguments.
559
//
560
// The use of DecayArray in the implementation allows ElementsAre()
561
// to accept string literals, whose type is const char[N], but we
562
// want to treat them as const char*.
563
//
564
// NOTE: Since ElementsAre() cares about the order of the elements, it
565
// must not be used with containers whose elements's order is
566
// undefined (e.g. hash_map).
567
 
568
inline internal::ElementsAreMatcher<
569
    ::testing::tuple<> >
570
ElementsAre() {
571
  typedef ::testing::tuple<> Args;
572
  return internal::ElementsAreMatcher<Args>(Args());
573
}
574
 
575
template <typename T1>
576
inline internal::ElementsAreMatcher<
577
    ::testing::tuple<
578
        typename internal::DecayArray<T1>::type> >
579
ElementsAre(const T1& e1) {
580
  typedef ::testing::tuple<
581
      typename internal::DecayArray<T1>::type> Args;
582
  return internal::ElementsAreMatcher<Args>(Args(e1));
583
}
584
 
585
template <typename T1, typename T2>
586
inline internal::ElementsAreMatcher<
587
    ::testing::tuple<
588
        typename internal::DecayArray<T1>::type,
589
        typename internal::DecayArray<T2>::type> >
590
ElementsAre(const T1& e1, const T2& e2) {
591
  typedef ::testing::tuple<
592
      typename internal::DecayArray<T1>::type,
593
      typename internal::DecayArray<T2>::type> Args;
594
  return internal::ElementsAreMatcher<Args>(Args(e1, e2));
595
}
596
 
597
template <typename T1, typename T2, typename T3>
598
inline internal::ElementsAreMatcher<
599
    ::testing::tuple<
600
        typename internal::DecayArray<T1>::type,
601
        typename internal::DecayArray<T2>::type,
602
        typename internal::DecayArray<T3>::type> >
603
ElementsAre(const T1& e1, const T2& e2, const T3& e3) {
604
  typedef ::testing::tuple<
605
      typename internal::DecayArray<T1>::type,
606
      typename internal::DecayArray<T2>::type,
607
      typename internal::DecayArray<T3>::type> Args;
608
  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3));
609
}
610
 
611
template <typename T1, typename T2, typename T3, typename T4>
612
inline internal::ElementsAreMatcher<
613
    ::testing::tuple<
614
        typename internal::DecayArray<T1>::type,
615
        typename internal::DecayArray<T2>::type,
616
        typename internal::DecayArray<T3>::type,
617
        typename internal::DecayArray<T4>::type> >
618
ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4) {
619
  typedef ::testing::tuple<
620
      typename internal::DecayArray<T1>::type,
621
      typename internal::DecayArray<T2>::type,
622
      typename internal::DecayArray<T3>::type,
623
      typename internal::DecayArray<T4>::type> Args;
624
  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4));
625
}
626
 
627
template <typename T1, typename T2, typename T3, typename T4, typename T5>
628
inline internal::ElementsAreMatcher<
629
    ::testing::tuple<
630
        typename internal::DecayArray<T1>::type,
631
        typename internal::DecayArray<T2>::type,
632
        typename internal::DecayArray<T3>::type,
633
        typename internal::DecayArray<T4>::type,
634
        typename internal::DecayArray<T5>::type> >
635
ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
636
    const T5& e5) {
637
  typedef ::testing::tuple<
638
      typename internal::DecayArray<T1>::type,
639
      typename internal::DecayArray<T2>::type,
640
      typename internal::DecayArray<T3>::type,
641
      typename internal::DecayArray<T4>::type,
642
      typename internal::DecayArray<T5>::type> Args;
643
  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5));
644
}
645
 
646
template <typename T1, typename T2, typename T3, typename T4, typename T5,
647
    typename T6>
648
inline internal::ElementsAreMatcher<
649
    ::testing::tuple<
650
        typename internal::DecayArray<T1>::type,
651
        typename internal::DecayArray<T2>::type,
652
        typename internal::DecayArray<T3>::type,
653
        typename internal::DecayArray<T4>::type,
654
        typename internal::DecayArray<T5>::type,
655
        typename internal::DecayArray<T6>::type> >
656
ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
657
    const T5& e5, const T6& e6) {
658
  typedef ::testing::tuple<
659
      typename internal::DecayArray<T1>::type,
660
      typename internal::DecayArray<T2>::type,
661
      typename internal::DecayArray<T3>::type,
662
      typename internal::DecayArray<T4>::type,
663
      typename internal::DecayArray<T5>::type,
664
      typename internal::DecayArray<T6>::type> Args;
665
  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6));
666
}
667
 
668
template <typename T1, typename T2, typename T3, typename T4, typename T5,
669
    typename T6, typename T7>
670
inline internal::ElementsAreMatcher<
671
    ::testing::tuple<
672
        typename internal::DecayArray<T1>::type,
673
        typename internal::DecayArray<T2>::type,
674
        typename internal::DecayArray<T3>::type,
675
        typename internal::DecayArray<T4>::type,
676
        typename internal::DecayArray<T5>::type,
677
        typename internal::DecayArray<T6>::type,
678
        typename internal::DecayArray<T7>::type> >
679
ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
680
    const T5& e5, const T6& e6, const T7& e7) {
681
  typedef ::testing::tuple<
682
      typename internal::DecayArray<T1>::type,
683
      typename internal::DecayArray<T2>::type,
684
      typename internal::DecayArray<T3>::type,
685
      typename internal::DecayArray<T4>::type,
686
      typename internal::DecayArray<T5>::type,
687
      typename internal::DecayArray<T6>::type,
688
      typename internal::DecayArray<T7>::type> Args;
689
  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7));
690
}
691
 
692
template <typename T1, typename T2, typename T3, typename T4, typename T5,
693
    typename T6, typename T7, typename T8>
694
inline internal::ElementsAreMatcher<
695
    ::testing::tuple<
696
        typename internal::DecayArray<T1>::type,
697
        typename internal::DecayArray<T2>::type,
698
        typename internal::DecayArray<T3>::type,
699
        typename internal::DecayArray<T4>::type,
700
        typename internal::DecayArray<T5>::type,
701
        typename internal::DecayArray<T6>::type,
702
        typename internal::DecayArray<T7>::type,
703
        typename internal::DecayArray<T8>::type> >
704
ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
705
    const T5& e5, const T6& e6, const T7& e7, const T8& e8) {
706
  typedef ::testing::tuple<
707
      typename internal::DecayArray<T1>::type,
708
      typename internal::DecayArray<T2>::type,
709
      typename internal::DecayArray<T3>::type,
710
      typename internal::DecayArray<T4>::type,
711
      typename internal::DecayArray<T5>::type,
712
      typename internal::DecayArray<T6>::type,
713
      typename internal::DecayArray<T7>::type,
714
      typename internal::DecayArray<T8>::type> Args;
715
  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7,
716
      e8));
717
}
718
 
719
template <typename T1, typename T2, typename T3, typename T4, typename T5,
720
    typename T6, typename T7, typename T8, typename T9>
721
inline internal::ElementsAreMatcher<
722
    ::testing::tuple<
723
        typename internal::DecayArray<T1>::type,
724
        typename internal::DecayArray<T2>::type,
725
        typename internal::DecayArray<T3>::type,
726
        typename internal::DecayArray<T4>::type,
727
        typename internal::DecayArray<T5>::type,
728
        typename internal::DecayArray<T6>::type,
729
        typename internal::DecayArray<T7>::type,
730
        typename internal::DecayArray<T8>::type,
731
        typename internal::DecayArray<T9>::type> >
732
ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
733
    const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) {
734
  typedef ::testing::tuple<
735
      typename internal::DecayArray<T1>::type,
736
      typename internal::DecayArray<T2>::type,
737
      typename internal::DecayArray<T3>::type,
738
      typename internal::DecayArray<T4>::type,
739
      typename internal::DecayArray<T5>::type,
740
      typename internal::DecayArray<T6>::type,
741
      typename internal::DecayArray<T7>::type,
742
      typename internal::DecayArray<T8>::type,
743
      typename internal::DecayArray<T9>::type> Args;
744
  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7,
745
      e8, e9));
746
}
747
 
748
template <typename T1, typename T2, typename T3, typename T4, typename T5,
749
    typename T6, typename T7, typename T8, typename T9, typename T10>
750
inline internal::ElementsAreMatcher<
751
    ::testing::tuple<
752
        typename internal::DecayArray<T1>::type,
753
        typename internal::DecayArray<T2>::type,
754
        typename internal::DecayArray<T3>::type,
755
        typename internal::DecayArray<T4>::type,
756
        typename internal::DecayArray<T5>::type,
757
        typename internal::DecayArray<T6>::type,
758
        typename internal::DecayArray<T7>::type,
759
        typename internal::DecayArray<T8>::type,
760
        typename internal::DecayArray<T9>::type,
761
        typename internal::DecayArray<T10>::type> >
762
ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
763
    const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9,
764
    const T10& e10) {
765
  typedef ::testing::tuple<
766
      typename internal::DecayArray<T1>::type,
767
      typename internal::DecayArray<T2>::type,
768
      typename internal::DecayArray<T3>::type,
769
      typename internal::DecayArray<T4>::type,
770
      typename internal::DecayArray<T5>::type,
771
      typename internal::DecayArray<T6>::type,
772
      typename internal::DecayArray<T7>::type,
773
      typename internal::DecayArray<T8>::type,
774
      typename internal::DecayArray<T9>::type,
775
      typename internal::DecayArray<T10>::type> Args;
776
  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7,
777
      e8, e9, e10));
778
}
779
 
780
// UnorderedElementsAre(e_1, e_2, ..., e_n) is an ElementsAre extension
781
// that matches n elements in any order.  We support up to n=10 arguments.
782
 
783
inline internal::UnorderedElementsAreMatcher<
784
    ::testing::tuple<> >
785
UnorderedElementsAre() {
786
  typedef ::testing::tuple<> Args;
787
  return internal::UnorderedElementsAreMatcher<Args>(Args());
788
}
789
 
790
template <typename T1>
791
inline internal::UnorderedElementsAreMatcher<
792
    ::testing::tuple<
793
        typename internal::DecayArray<T1>::type> >
794
UnorderedElementsAre(const T1& e1) {
795
  typedef ::testing::tuple<
796
      typename internal::DecayArray<T1>::type> Args;
797
  return internal::UnorderedElementsAreMatcher<Args>(Args(e1));
798
}
799
 
800
template <typename T1, typename T2>
801
inline internal::UnorderedElementsAreMatcher<
802
    ::testing::tuple<
803
        typename internal::DecayArray<T1>::type,
804
        typename internal::DecayArray<T2>::type> >
805
UnorderedElementsAre(const T1& e1, const T2& e2) {
806
  typedef ::testing::tuple<
807
      typename internal::DecayArray<T1>::type,
808
      typename internal::DecayArray<T2>::type> Args;
809
  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2));
810
}
811
 
812
template <typename T1, typename T2, typename T3>
813
inline internal::UnorderedElementsAreMatcher<
814
    ::testing::tuple<
815
        typename internal::DecayArray<T1>::type,
816
        typename internal::DecayArray<T2>::type,
817
        typename internal::DecayArray<T3>::type> >
818
UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3) {
819
  typedef ::testing::tuple<
820
      typename internal::DecayArray<T1>::type,
821
      typename internal::DecayArray<T2>::type,
822
      typename internal::DecayArray<T3>::type> Args;
823
  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3));
824
}
825
 
826
template <typename T1, typename T2, typename T3, typename T4>
827
inline internal::UnorderedElementsAreMatcher<
828
    ::testing::tuple<
829
        typename internal::DecayArray<T1>::type,
830
        typename internal::DecayArray<T2>::type,
831
        typename internal::DecayArray<T3>::type,
832
        typename internal::DecayArray<T4>::type> >
833
UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4) {
834
  typedef ::testing::tuple<
835
      typename internal::DecayArray<T1>::type,
836
      typename internal::DecayArray<T2>::type,
837
      typename internal::DecayArray<T3>::type,
838
      typename internal::DecayArray<T4>::type> Args;
839
  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4));
840
}
841
 
842
template <typename T1, typename T2, typename T3, typename T4, typename T5>
843
inline internal::UnorderedElementsAreMatcher<
844
    ::testing::tuple<
845
        typename internal::DecayArray<T1>::type,
846
        typename internal::DecayArray<T2>::type,
847
        typename internal::DecayArray<T3>::type,
848
        typename internal::DecayArray<T4>::type,
849
        typename internal::DecayArray<T5>::type> >
850
UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
851
    const T5& e5) {
852
  typedef ::testing::tuple<
853
      typename internal::DecayArray<T1>::type,
854
      typename internal::DecayArray<T2>::type,
855
      typename internal::DecayArray<T3>::type,
856
      typename internal::DecayArray<T4>::type,
857
      typename internal::DecayArray<T5>::type> Args;
858
  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5));
859
}
860
 
861
template <typename T1, typename T2, typename T3, typename T4, typename T5,
862
    typename T6>
863
inline internal::UnorderedElementsAreMatcher<
864
    ::testing::tuple<
865
        typename internal::DecayArray<T1>::type,
866
        typename internal::DecayArray<T2>::type,
867
        typename internal::DecayArray<T3>::type,
868
        typename internal::DecayArray<T4>::type,
869
        typename internal::DecayArray<T5>::type,
870
        typename internal::DecayArray<T6>::type> >
871
UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
872
    const T5& e5, const T6& e6) {
873
  typedef ::testing::tuple<
874
      typename internal::DecayArray<T1>::type,
875
      typename internal::DecayArray<T2>::type,
876
      typename internal::DecayArray<T3>::type,
877
      typename internal::DecayArray<T4>::type,
878
      typename internal::DecayArray<T5>::type,
879
      typename internal::DecayArray<T6>::type> Args;
880
  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,
881
      e6));
882
}
883
 
884
template <typename T1, typename T2, typename T3, typename T4, typename T5,
885
    typename T6, typename T7>
886
inline internal::UnorderedElementsAreMatcher<
887
    ::testing::tuple<
888
        typename internal::DecayArray<T1>::type,
889
        typename internal::DecayArray<T2>::type,
890
        typename internal::DecayArray<T3>::type,
891
        typename internal::DecayArray<T4>::type,
892
        typename internal::DecayArray<T5>::type,
893
        typename internal::DecayArray<T6>::type,
894
        typename internal::DecayArray<T7>::type> >
895
UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
896
    const T5& e5, const T6& e6, const T7& e7) {
897
  typedef ::testing::tuple<
898
      typename internal::DecayArray<T1>::type,
899
      typename internal::DecayArray<T2>::type,
900
      typename internal::DecayArray<T3>::type,
901
      typename internal::DecayArray<T4>::type,
902
      typename internal::DecayArray<T5>::type,
903
      typename internal::DecayArray<T6>::type,
904
      typename internal::DecayArray<T7>::type> Args;
905
  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,
906
      e6, e7));
907
}
908
 
909
template <typename T1, typename T2, typename T3, typename T4, typename T5,
910
    typename T6, typename T7, typename T8>
911
inline internal::UnorderedElementsAreMatcher<
912
    ::testing::tuple<
913
        typename internal::DecayArray<T1>::type,
914
        typename internal::DecayArray<T2>::type,
915
        typename internal::DecayArray<T3>::type,
916
        typename internal::DecayArray<T4>::type,
917
        typename internal::DecayArray<T5>::type,
918
        typename internal::DecayArray<T6>::type,
919
        typename internal::DecayArray<T7>::type,
920
        typename internal::DecayArray<T8>::type> >
921
UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
922
    const T5& e5, const T6& e6, const T7& e7, const T8& e8) {
923
  typedef ::testing::tuple<
924
      typename internal::DecayArray<T1>::type,
925
      typename internal::DecayArray<T2>::type,
926
      typename internal::DecayArray<T3>::type,
927
      typename internal::DecayArray<T4>::type,
928
      typename internal::DecayArray<T5>::type,
929
      typename internal::DecayArray<T6>::type,
930
      typename internal::DecayArray<T7>::type,
931
      typename internal::DecayArray<T8>::type> Args;
932
  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,
933
      e6, e7, e8));
934
}
935
 
936
template <typename T1, typename T2, typename T3, typename T4, typename T5,
937
    typename T6, typename T7, typename T8, typename T9>
938
inline internal::UnorderedElementsAreMatcher<
939
    ::testing::tuple<
940
        typename internal::DecayArray<T1>::type,
941
        typename internal::DecayArray<T2>::type,
942
        typename internal::DecayArray<T3>::type,
943
        typename internal::DecayArray<T4>::type,
944
        typename internal::DecayArray<T5>::type,
945
        typename internal::DecayArray<T6>::type,
946
        typename internal::DecayArray<T7>::type,
947
        typename internal::DecayArray<T8>::type,
948
        typename internal::DecayArray<T9>::type> >
949
UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
950
    const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) {
951
  typedef ::testing::tuple<
952
      typename internal::DecayArray<T1>::type,
953
      typename internal::DecayArray<T2>::type,
954
      typename internal::DecayArray<T3>::type,
955
      typename internal::DecayArray<T4>::type,
956
      typename internal::DecayArray<T5>::type,
957
      typename internal::DecayArray<T6>::type,
958
      typename internal::DecayArray<T7>::type,
959
      typename internal::DecayArray<T8>::type,
960
      typename internal::DecayArray<T9>::type> Args;
961
  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,
962
      e6, e7, e8, e9));
963
}
964
 
965
template <typename T1, typename T2, typename T3, typename T4, typename T5,
966
    typename T6, typename T7, typename T8, typename T9, typename T10>
967
inline internal::UnorderedElementsAreMatcher<
968
    ::testing::tuple<
969
        typename internal::DecayArray<T1>::type,
970
        typename internal::DecayArray<T2>::type,
971
        typename internal::DecayArray<T3>::type,
972
        typename internal::DecayArray<T4>::type,
973
        typename internal::DecayArray<T5>::type,
974
        typename internal::DecayArray<T6>::type,
975
        typename internal::DecayArray<T7>::type,
976
        typename internal::DecayArray<T8>::type,
977
        typename internal::DecayArray<T9>::type,
978
        typename internal::DecayArray<T10>::type> >
979
UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,
980
    const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9,
981
    const T10& e10) {
982
  typedef ::testing::tuple<
983
      typename internal::DecayArray<T1>::type,
984
      typename internal::DecayArray<T2>::type,
985
      typename internal::DecayArray<T3>::type,
986
      typename internal::DecayArray<T4>::type,
987
      typename internal::DecayArray<T5>::type,
988
      typename internal::DecayArray<T6>::type,
989
      typename internal::DecayArray<T7>::type,
990
      typename internal::DecayArray<T8>::type,
991
      typename internal::DecayArray<T9>::type,
992
      typename internal::DecayArray<T10>::type> Args;
993
  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,
994
      e6, e7, e8, e9, e10));
995
}
996
 
997
// AllOf(m1, m2, ..., mk) matches any value that matches all of the given
998
// sub-matchers.  AllOf is called fully qualified to prevent ADL from firing.
999
 
1000
template <typename M1, typename M2>
1001
inline typename internal::AllOfResult2<M1, M2>::type
1002
AllOf(M1 m1, M2 m2) {
1003
  return typename internal::AllOfResult2<M1, M2>::type(
1004
      m1,
1005
      m2);
1006
}
1007
 
1008
template <typename M1, typename M2, typename M3>
1009
inline typename internal::AllOfResult3<M1, M2, M3>::type
1010
AllOf(M1 m1, M2 m2, M3 m3) {
1011
  return typename internal::AllOfResult3<M1, M2, M3>::type(
1012
      m1,
1013
      ::testing::AllOf(m2, m3));
1014
}
1015
 
1016
template <typename M1, typename M2, typename M3, typename M4>
1017
inline typename internal::AllOfResult4<M1, M2, M3, M4>::type
1018
AllOf(M1 m1, M2 m2, M3 m3, M4 m4) {
1019
  return typename internal::AllOfResult4<M1, M2, M3, M4>::type(
1020
      ::testing::AllOf(m1, m2),
1021
      ::testing::AllOf(m3, m4));
1022
}
1023
 
1024
template <typename M1, typename M2, typename M3, typename M4, typename M5>
1025
inline typename internal::AllOfResult5<M1, M2, M3, M4, M5>::type
1026
AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) {
1027
  return typename internal::AllOfResult5<M1, M2, M3, M4, M5>::type(
1028
      ::testing::AllOf(m1, m2),
1029
      ::testing::AllOf(m3, m4, m5));
1030
}
1031
 
1032
template <typename M1, typename M2, typename M3, typename M4, typename M5,
1033
    typename M6>
1034
inline typename internal::AllOfResult6<M1, M2, M3, M4, M5, M6>::type
1035
AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) {
1036
  return typename internal::AllOfResult6<M1, M2, M3, M4, M5, M6>::type(
1037
      ::testing::AllOf(m1, m2, m3),
1038
      ::testing::AllOf(m4, m5, m6));
1039
}
1040
 
1041
template <typename M1, typename M2, typename M3, typename M4, typename M5,
1042
    typename M6, typename M7>
1043
inline typename internal::AllOfResult7<M1, M2, M3, M4, M5, M6, M7>::type
1044
AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) {
1045
  return typename internal::AllOfResult7<M1, M2, M3, M4, M5, M6, M7>::type(
1046
      ::testing::AllOf(m1, m2, m3),
1047
      ::testing::AllOf(m4, m5, m6, m7));
1048
}
1049
 
1050
template <typename M1, typename M2, typename M3, typename M4, typename M5,
1051
    typename M6, typename M7, typename M8>
1052
inline typename internal::AllOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type
1053
AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) {
1054
  return typename internal::AllOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type(
1055
      ::testing::AllOf(m1, m2, m3, m4),
1056
      ::testing::AllOf(m5, m6, m7, m8));
1057
}
1058
 
1059
template <typename M1, typename M2, typename M3, typename M4, typename M5,
1060
    typename M6, typename M7, typename M8, typename M9>
1061
inline typename internal::AllOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, M9>::type
1062
AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) {
1063
  return typename internal::AllOfResult9<M1, M2, M3, M4, M5, M6, M7, M8,
1064
      M9>::type(
1065
      ::testing::AllOf(m1, m2, m3, m4),
1066
      ::testing::AllOf(m5, m6, m7, m8, m9));
1067
}
1068
 
1069
template <typename M1, typename M2, typename M3, typename M4, typename M5,
1070
    typename M6, typename M7, typename M8, typename M9, typename M10>
1071
inline typename internal::AllOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
1072
    M10>::type
1073
AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {
1074
  return typename internal::AllOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
1075
      M10>::type(
1076
      ::testing::AllOf(m1, m2, m3, m4, m5),
1077
      ::testing::AllOf(m6, m7, m8, m9, m10));
1078
}
1079
 
1080
// AnyOf(m1, m2, ..., mk) matches any value that matches any of the given
1081
// sub-matchers.  AnyOf is called fully qualified to prevent ADL from firing.
1082
 
1083
template <typename M1, typename M2>
1084
inline typename internal::AnyOfResult2<M1, M2>::type
1085
AnyOf(M1 m1, M2 m2) {
1086
  return typename internal::AnyOfResult2<M1, M2>::type(
1087
      m1,
1088
      m2);
1089
}
1090
 
1091
template <typename M1, typename M2, typename M3>
1092
inline typename internal::AnyOfResult3<M1, M2, M3>::type
1093
AnyOf(M1 m1, M2 m2, M3 m3) {
1094
  return typename internal::AnyOfResult3<M1, M2, M3>::type(
1095
      m1,
1096
      ::testing::AnyOf(m2, m3));
1097
}
1098
 
1099
template <typename M1, typename M2, typename M3, typename M4>
1100
inline typename internal::AnyOfResult4<M1, M2, M3, M4>::type
1101
AnyOf(M1 m1, M2 m2, M3 m3, M4 m4) {
1102
  return typename internal::AnyOfResult4<M1, M2, M3, M4>::type(
1103
      ::testing::AnyOf(m1, m2),
1104
      ::testing::AnyOf(m3, m4));
1105
}
1106
 
1107
template <typename M1, typename M2, typename M3, typename M4, typename M5>
1108
inline typename internal::AnyOfResult5<M1, M2, M3, M4, M5>::type
1109
AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) {
1110
  return typename internal::AnyOfResult5<M1, M2, M3, M4, M5>::type(
1111
      ::testing::AnyOf(m1, m2),
1112
      ::testing::AnyOf(m3, m4, m5));
1113
}
1114
 
1115
template <typename M1, typename M2, typename M3, typename M4, typename M5,
1116
    typename M6>
1117
inline typename internal::AnyOfResult6<M1, M2, M3, M4, M5, M6>::type
1118
AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) {
1119
  return typename internal::AnyOfResult6<M1, M2, M3, M4, M5, M6>::type(
1120
      ::testing::AnyOf(m1, m2, m3),
1121
      ::testing::AnyOf(m4, m5, m6));
1122
}
1123
 
1124
template <typename M1, typename M2, typename M3, typename M4, typename M5,
1125
    typename M6, typename M7>
1126
inline typename internal::AnyOfResult7<M1, M2, M3, M4, M5, M6, M7>::type
1127
AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) {
1128
  return typename internal::AnyOfResult7<M1, M2, M3, M4, M5, M6, M7>::type(
1129
      ::testing::AnyOf(m1, m2, m3),
1130
      ::testing::AnyOf(m4, m5, m6, m7));
1131
}
1132
 
1133
template <typename M1, typename M2, typename M3, typename M4, typename M5,
1134
    typename M6, typename M7, typename M8>
1135
inline typename internal::AnyOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type
1136
AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) {
1137
  return typename internal::AnyOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type(
1138
      ::testing::AnyOf(m1, m2, m3, m4),
1139
      ::testing::AnyOf(m5, m6, m7, m8));
1140
}
1141
 
1142
template <typename M1, typename M2, typename M3, typename M4, typename M5,
1143
    typename M6, typename M7, typename M8, typename M9>
1144
inline typename internal::AnyOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, M9>::type
1145
AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) {
1146
  return typename internal::AnyOfResult9<M1, M2, M3, M4, M5, M6, M7, M8,
1147
      M9>::type(
1148
      ::testing::AnyOf(m1, m2, m3, m4),
1149
      ::testing::AnyOf(m5, m6, m7, m8, m9));
1150
}
1151
 
1152
template <typename M1, typename M2, typename M3, typename M4, typename M5,
1153
    typename M6, typename M7, typename M8, typename M9, typename M10>
1154
inline typename internal::AnyOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
1155
    M10>::type
1156
AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {
1157
  return typename internal::AnyOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,
1158
      M10>::type(
1159
      ::testing::AnyOf(m1, m2, m3, m4, m5),
1160
      ::testing::AnyOf(m6, m7, m8, m9, m10));
1161
}
1162
 
1163
}  // namespace testing
1164
 
1165
 
1166
// The MATCHER* family of macros can be used in a namespace scope to
1167
// define custom matchers easily.
1168
//
1169
// Basic Usage
1170
// ===========
1171
//
1172
// The syntax
1173
//
1174
//   MATCHER(name, description_string) { statements; }
1175
//
1176
// defines a matcher with the given name that executes the statements,
1177
// which must return a bool to indicate if the match succeeds.  Inside
1178
// the statements, you can refer to the value being matched by 'arg',
1179
// and refer to its type by 'arg_type'.
1180
//
1181
// The description string documents what the matcher does, and is used
1182
// to generate the failure message when the match fails.  Since a
1183
// MATCHER() is usually defined in a header file shared by multiple
1184
// C++ source files, we require the description to be a C-string
1185
// literal to avoid possible side effects.  It can be empty, in which
1186
// case we'll use the sequence of words in the matcher name as the
1187
// description.
1188
//
1189
// For example:
1190
//
1191
//   MATCHER(IsEven, "") { return (arg % 2) == 0; }
1192
//
1193
// allows you to write
1194
//
1195
//   // Expects mock_foo.Bar(n) to be called where n is even.
1196
//   EXPECT_CALL(mock_foo, Bar(IsEven()));
1197
//
1198
// or,
1199
//
1200
//   // Verifies that the value of some_expression is even.
1201
//   EXPECT_THAT(some_expression, IsEven());
1202
//
1203
// If the above assertion fails, it will print something like:
1204
//
1205
//   Value of: some_expression
1206
//   Expected: is even
1207
//     Actual: 7
1208
//
1209
// where the description "is even" is automatically calculated from the
1210
// matcher name IsEven.
1211
//
1212
// Argument Type
1213
// =============
1214
//
1215
// Note that the type of the value being matched (arg_type) is
1216
// determined by the context in which you use the matcher and is
1217
// supplied to you by the compiler, so you don't need to worry about
1218
// declaring it (nor can you).  This allows the matcher to be
1219
// polymorphic.  For example, IsEven() can be used to match any type
1220
// where the value of "(arg % 2) == 0" can be implicitly converted to
1221
// a bool.  In the "Bar(IsEven())" example above, if method Bar()
1222
// takes an int, 'arg_type' will be int; if it takes an unsigned long,
1223
// 'arg_type' will be unsigned long; and so on.
1224
//
1225
// Parameterizing Matchers
1226
// =======================
1227
//
1228
// Sometimes you'll want to parameterize the matcher.  For that you
1229
// can use another macro:
1230
//
1231
//   MATCHER_P(name, param_name, description_string) { statements; }
1232
//
1233
// For example:
1234
//
1235
//   MATCHER_P(HasAbsoluteValue, value, "") { return abs(arg) == value; }
1236
//
1237
// will allow you to write:
1238
//
1239
//   EXPECT_THAT(Blah("a"), HasAbsoluteValue(n));
1240
//
1241
// which may lead to this message (assuming n is 10):
1242
//
1243
//   Value of: Blah("a")
1244
//   Expected: has absolute value 10
1245
//     Actual: -9
1246
//
1247
// Note that both the matcher description and its parameter are
1248
// printed, making the message human-friendly.
1249
//
1250
// In the matcher definition body, you can write 'foo_type' to
1251
// reference the type of a parameter named 'foo'.  For example, in the
1252
// body of MATCHER_P(HasAbsoluteValue, value) above, you can write
1253
// 'value_type' to refer to the type of 'value'.
1254
//
1255
// We also provide MATCHER_P2, MATCHER_P3, ..., up to MATCHER_P10 to
1256
// support multi-parameter matchers.
1257
//
1258
// Describing Parameterized Matchers
1259
// =================================
1260
//
1261
// The last argument to MATCHER*() is a string-typed expression.  The
1262
// expression can reference all of the matcher's parameters and a
1263
// special bool-typed variable named 'negation'.  When 'negation' is
1264
// false, the expression should evaluate to the matcher's description;
1265
// otherwise it should evaluate to the description of the negation of
1266
// the matcher.  For example,
1267
//
1268
//   using testing::PrintToString;
1269
//
1270
//   MATCHER_P2(InClosedRange, low, hi,
1271
//       string(negation ? "is not" : "is") + " in range [" +
1272
//       PrintToString(low) + ", " + PrintToString(hi) + "]") {
1273
//     return low <= arg && arg <= hi;
1274
//   }
1275
//   ...
1276
//   EXPECT_THAT(3, InClosedRange(4, 6));
1277
//   EXPECT_THAT(3, Not(InClosedRange(2, 4)));
1278
//
1279
// would generate two failures that contain the text:
1280
//
1281
//   Expected: is in range [4, 6]
1282
//   ...
1283
//   Expected: is not in range [2, 4]
1284
//
1285
// If you specify "" as the description, the failure message will
1286
// contain the sequence of words in the matcher name followed by the
1287
// parameter values printed as a tuple.  For example,
1288
//
1289
//   MATCHER_P2(InClosedRange, low, hi, "") { ... }
1290
//   ...
1291
//   EXPECT_THAT(3, InClosedRange(4, 6));
1292
//   EXPECT_THAT(3, Not(InClosedRange(2, 4)));
1293
//
1294
// would generate two failures that contain the text:
1295
//
1296
//   Expected: in closed range (4, 6)
1297
//   ...
1298
//   Expected: not (in closed range (2, 4))
1299
//
1300
// Types of Matcher Parameters
1301
// ===========================
1302
//
1303
// For the purpose of typing, you can view
1304
//
1305
//   MATCHER_Pk(Foo, p1, ..., pk, description_string) { ... }
1306
//
1307
// as shorthand for
1308
//
1309
//   template <typename p1_type, ..., typename pk_type>
1310
//   FooMatcherPk<p1_type, ..., pk_type>
1311
//   Foo(p1_type p1, ..., pk_type pk) { ... }
1312
//
1313
// When you write Foo(v1, ..., vk), the compiler infers the types of
1314
// the parameters v1, ..., and vk for you.  If you are not happy with
1315
// the result of the type inference, you can specify the types by
1316
// explicitly instantiating the template, as in Foo<long, bool>(5,
1317
// false).  As said earlier, you don't get to (or need to) specify
1318
// 'arg_type' as that's determined by the context in which the matcher
1319
// is used.  You can assign the result of expression Foo(p1, ..., pk)
1320
// to a variable of type FooMatcherPk<p1_type, ..., pk_type>.  This
1321
// can be useful when composing matchers.
1322
//
1323
// While you can instantiate a matcher template with reference types,
1324
// passing the parameters by pointer usually makes your code more
1325
// readable.  If, however, you still want to pass a parameter by
1326
// reference, be aware that in the failure message generated by the
1327
// matcher you will see the value of the referenced object but not its
1328
// address.
1329
//
1330
// Explaining Match Results
1331
// ========================
1332
//
1333
// Sometimes the matcher description alone isn't enough to explain why
1334
// the match has failed or succeeded.  For example, when expecting a
1335
// long string, it can be very helpful to also print the diff between
1336
// the expected string and the actual one.  To achieve that, you can
1337
// optionally stream additional information to a special variable
1338
// named result_listener, whose type is a pointer to class
1339
// MatchResultListener:
1340
//
1341
//   MATCHER_P(EqualsLongString, str, "") {
1342
//     if (arg == str) return true;
1343
//
1344
//     *result_listener << "the difference: "
1345
///                     << DiffStrings(str, arg);
1346
//     return false;
1347
//   }
1348
//
1349
// Overloading Matchers
1350
// ====================
1351
//
1352
// You can overload matchers with different numbers of parameters:
1353
//
1354
//   MATCHER_P(Blah, a, description_string1) { ... }
1355
//   MATCHER_P2(Blah, a, b, description_string2) { ... }
1356
//
1357
// Caveats
1358
// =======
1359
//
1360
// When defining a new matcher, you should also consider implementing
1361
// MatcherInterface or using MakePolymorphicMatcher().  These
1362
// approaches require more work than the MATCHER* macros, but also
1363
// give you more control on the types of the value being matched and
1364
// the matcher parameters, which may leads to better compiler error
1365
// messages when the matcher is used wrong.  They also allow
1366
// overloading matchers based on parameter types (as opposed to just
1367
// based on the number of parameters).
1368
//
1369
// MATCHER*() can only be used in a namespace scope.  The reason is
1370
// that C++ doesn't yet allow function-local types to be used to
1371
// instantiate templates.  The up-coming C++0x standard will fix this.
1372
// Once that's done, we'll consider supporting using MATCHER*() inside
1373
// a function.
1374
//
1375
// More Information
1376
// ================
1377
//
1378
// To learn more about using these macros, please search for 'MATCHER'
1379
// on http://code.google.com/p/googlemock/wiki/CookBook.
1380
 
1381
#define MATCHER(name, description)\
1382
  class name##Matcher {\
1383
   public:\
1384
    template <typename arg_type>\
1385
    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1386
     public:\
1387
      gmock_Impl()\
1388
           {}\
1389
      virtual bool MatchAndExplain(\
1390
          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
1391
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
1392
        *gmock_os << FormatDescription(false);\
1393
      }\
1394
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
1395
        *gmock_os << FormatDescription(true);\
1396
      }\
1397
     private:\
1398
      ::testing::internal::string FormatDescription(bool negation) const {\
1399
        const ::testing::internal::string gmock_description = (description);\
1400
        if (!gmock_description.empty())\
1401
          return gmock_description;\
1402
        return ::testing::internal::FormatMatcherDescription(\
1403
            negation, #name, \
1404
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
1405
                ::testing::tuple<>()));\
1406
      }\
1407
      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1408
    };\
1409
    template <typename arg_type>\
1410
    operator ::testing::Matcher<arg_type>() const {\
1411
      return ::testing::Matcher<arg_type>(\
1412
          new gmock_Impl<arg_type>());\
1413
    }\
1414
    name##Matcher() {\
1415
    }\
1416
   private:\
1417
    GTEST_DISALLOW_ASSIGN_(name##Matcher);\
1418
  };\
1419
  inline name##Matcher name() {\
1420
    return name##Matcher();\
1421
  }\
1422
  template <typename arg_type>\
1423
  bool name##Matcher::gmock_Impl<arg_type>::MatchAndExplain(\
1424
      arg_type arg, \
1425
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
1426
          const
1427
 
1428
#define MATCHER_P(name, p0, description)\
1429
  template <typename p0##_type>\
1430
  class name##MatcherP {\
1431
   public:\
1432
    template <typename arg_type>\
1433
    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1434
     public:\
1435
      explicit gmock_Impl(p0##_type gmock_p0)\
1436
           : p0(gmock_p0) {}\
1437
      virtual bool MatchAndExplain(\
1438
          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
1439
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
1440
        *gmock_os << FormatDescription(false);\
1441
      }\
1442
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
1443
        *gmock_os << FormatDescription(true);\
1444
      }\
1445
      p0##_type p0;\
1446
     private:\
1447
      ::testing::internal::string FormatDescription(bool negation) const {\
1448
        const ::testing::internal::string gmock_description = (description);\
1449
        if (!gmock_description.empty())\
1450
          return gmock_description;\
1451
        return ::testing::internal::FormatMatcherDescription(\
1452
            negation, #name, \
1453
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
1454
                ::testing::tuple<p0##_type>(p0)));\
1455
      }\
1456
      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1457
    };\
1458
    template <typename arg_type>\
1459
    operator ::testing::Matcher<arg_type>() const {\
1460
      return ::testing::Matcher<arg_type>(\
1461
          new gmock_Impl<arg_type>(p0));\
1462
    }\
1463
    explicit name##MatcherP(p0##_type gmock_p0) : p0(gmock_p0) {\
1464
    }\
1465
    p0##_type p0;\
1466
   private:\
1467
    GTEST_DISALLOW_ASSIGN_(name##MatcherP);\
1468
  };\
1469
  template <typename p0##_type>\
1470
  inline name##MatcherP<p0##_type> name(p0##_type p0) {\
1471
    return name##MatcherP<p0##_type>(p0);\
1472
  }\
1473
  template <typename p0##_type>\
1474
  template <typename arg_type>\
1475
  bool name##MatcherP<p0##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
1476
      arg_type arg, \
1477
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
1478
          const
1479
 
1480
#define MATCHER_P2(name, p0, p1, description)\
1481
  template <typename p0##_type, typename p1##_type>\
1482
  class name##MatcherP2 {\
1483
   public:\
1484
    template <typename arg_type>\
1485
    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1486
     public:\
1487
      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1)\
1488
           : p0(gmock_p0), p1(gmock_p1) {}\
1489
      virtual bool MatchAndExplain(\
1490
          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
1491
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
1492
        *gmock_os << FormatDescription(false);\
1493
      }\
1494
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
1495
        *gmock_os << FormatDescription(true);\
1496
      }\
1497
      p0##_type p0;\
1498
      p1##_type p1;\
1499
     private:\
1500
      ::testing::internal::string FormatDescription(bool negation) const {\
1501
        const ::testing::internal::string gmock_description = (description);\
1502
        if (!gmock_description.empty())\
1503
          return gmock_description;\
1504
        return ::testing::internal::FormatMatcherDescription(\
1505
            negation, #name, \
1506
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
1507
                ::testing::tuple<p0##_type, p1##_type>(p0, p1)));\
1508
      }\
1509
      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1510
    };\
1511
    template <typename arg_type>\
1512
    operator ::testing::Matcher<arg_type>() const {\
1513
      return ::testing::Matcher<arg_type>(\
1514
          new gmock_Impl<arg_type>(p0, p1));\
1515
    }\
1516
    name##MatcherP2(p0##_type gmock_p0, p1##_type gmock_p1) : p0(gmock_p0), \
1517
        p1(gmock_p1) {\
1518
    }\
1519
    p0##_type p0;\
1520
    p1##_type p1;\
1521
   private:\
1522
    GTEST_DISALLOW_ASSIGN_(name##MatcherP2);\
1523
  };\
1524
  template <typename p0##_type, typename p1##_type>\
1525
  inline name##MatcherP2<p0##_type, p1##_type> name(p0##_type p0, \
1526
      p1##_type p1) {\
1527
    return name##MatcherP2<p0##_type, p1##_type>(p0, p1);\
1528
  }\
1529
  template <typename p0##_type, typename p1##_type>\
1530
  template <typename arg_type>\
1531
  bool name##MatcherP2<p0##_type, \
1532
      p1##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
1533
      arg_type arg, \
1534
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
1535
          const
1536
 
1537
#define MATCHER_P3(name, p0, p1, p2, description)\
1538
  template <typename p0##_type, typename p1##_type, typename p2##_type>\
1539
  class name##MatcherP3 {\
1540
   public:\
1541
    template <typename arg_type>\
1542
    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1543
     public:\
1544
      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2)\
1545
           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {}\
1546
      virtual bool MatchAndExplain(\
1547
          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
1548
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
1549
        *gmock_os << FormatDescription(false);\
1550
      }\
1551
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
1552
        *gmock_os << FormatDescription(true);\
1553
      }\
1554
      p0##_type p0;\
1555
      p1##_type p1;\
1556
      p2##_type p2;\
1557
     private:\
1558
      ::testing::internal::string FormatDescription(bool negation) const {\
1559
        const ::testing::internal::string gmock_description = (description);\
1560
        if (!gmock_description.empty())\
1561
          return gmock_description;\
1562
        return ::testing::internal::FormatMatcherDescription(\
1563
            negation, #name, \
1564
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
1565
                ::testing::tuple<p0##_type, p1##_type, p2##_type>(p0, p1, \
1566
                    p2)));\
1567
      }\
1568
      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1569
    };\
1570
    template <typename arg_type>\
1571
    operator ::testing::Matcher<arg_type>() const {\
1572
      return ::testing::Matcher<arg_type>(\
1573
          new gmock_Impl<arg_type>(p0, p1, p2));\
1574
    }\
1575
    name##MatcherP3(p0##_type gmock_p0, p1##_type gmock_p1, \
1576
        p2##_type gmock_p2) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2) {\
1577
    }\
1578
    p0##_type p0;\
1579
    p1##_type p1;\
1580
    p2##_type p2;\
1581
   private:\
1582
    GTEST_DISALLOW_ASSIGN_(name##MatcherP3);\
1583
  };\
1584
  template <typename p0##_type, typename p1##_type, typename p2##_type>\
1585
  inline name##MatcherP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \
1586
      p1##_type p1, p2##_type p2) {\
1587
    return name##MatcherP3<p0##_type, p1##_type, p2##_type>(p0, p1, p2);\
1588
  }\
1589
  template <typename p0##_type, typename p1##_type, typename p2##_type>\
1590
  template <typename arg_type>\
1591
  bool name##MatcherP3<p0##_type, p1##_type, \
1592
      p2##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
1593
      arg_type arg, \
1594
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
1595
          const
1596
 
1597
#define MATCHER_P4(name, p0, p1, p2, p3, description)\
1598
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1599
      typename p3##_type>\
1600
  class name##MatcherP4 {\
1601
   public:\
1602
    template <typename arg_type>\
1603
    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1604
     public:\
1605
      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1606
          p3##_type gmock_p3)\
1607
           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3) {}\
1608
      virtual bool MatchAndExplain(\
1609
          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
1610
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
1611
        *gmock_os << FormatDescription(false);\
1612
      }\
1613
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
1614
        *gmock_os << FormatDescription(true);\
1615
      }\
1616
      p0##_type p0;\
1617
      p1##_type p1;\
1618
      p2##_type p2;\
1619
      p3##_type p3;\
1620
     private:\
1621
      ::testing::internal::string FormatDescription(bool negation) const {\
1622
        const ::testing::internal::string gmock_description = (description);\
1623
        if (!gmock_description.empty())\
1624
          return gmock_description;\
1625
        return ::testing::internal::FormatMatcherDescription(\
1626
            negation, #name, \
1627
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
1628
                ::testing::tuple<p0##_type, p1##_type, p2##_type, \
1629
                    p3##_type>(p0, p1, p2, p3)));\
1630
      }\
1631
      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1632
    };\
1633
    template <typename arg_type>\
1634
    operator ::testing::Matcher<arg_type>() const {\
1635
      return ::testing::Matcher<arg_type>(\
1636
          new gmock_Impl<arg_type>(p0, p1, p2, p3));\
1637
    }\
1638
    name##MatcherP4(p0##_type gmock_p0, p1##_type gmock_p1, \
1639
        p2##_type gmock_p2, p3##_type gmock_p3) : p0(gmock_p0), p1(gmock_p1), \
1640
        p2(gmock_p2), p3(gmock_p3) {\
1641
    }\
1642
    p0##_type p0;\
1643
    p1##_type p1;\
1644
    p2##_type p2;\
1645
    p3##_type p3;\
1646
   private:\
1647
    GTEST_DISALLOW_ASSIGN_(name##MatcherP4);\
1648
  };\
1649
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1650
      typename p3##_type>\
1651
  inline name##MatcherP4<p0##_type, p1##_type, p2##_type, \
1652
      p3##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
1653
      p3##_type p3) {\
1654
    return name##MatcherP4<p0##_type, p1##_type, p2##_type, p3##_type>(p0, \
1655
        p1, p2, p3);\
1656
  }\
1657
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1658
      typename p3##_type>\
1659
  template <typename arg_type>\
1660
  bool name##MatcherP4<p0##_type, p1##_type, p2##_type, \
1661
      p3##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
1662
      arg_type arg, \
1663
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
1664
          const
1665
 
1666
#define MATCHER_P5(name, p0, p1, p2, p3, p4, description)\
1667
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1668
      typename p3##_type, typename p4##_type>\
1669
  class name##MatcherP5 {\
1670
   public:\
1671
    template <typename arg_type>\
1672
    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1673
     public:\
1674
      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1675
          p3##_type gmock_p3, p4##_type gmock_p4)\
1676
           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
1677
               p4(gmock_p4) {}\
1678
      virtual bool MatchAndExplain(\
1679
          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
1680
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
1681
        *gmock_os << FormatDescription(false);\
1682
      }\
1683
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
1684
        *gmock_os << FormatDescription(true);\
1685
      }\
1686
      p0##_type p0;\
1687
      p1##_type p1;\
1688
      p2##_type p2;\
1689
      p3##_type p3;\
1690
      p4##_type p4;\
1691
     private:\
1692
      ::testing::internal::string FormatDescription(bool negation) const {\
1693
        const ::testing::internal::string gmock_description = (description);\
1694
        if (!gmock_description.empty())\
1695
          return gmock_description;\
1696
        return ::testing::internal::FormatMatcherDescription(\
1697
            negation, #name, \
1698
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
1699
                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
1700
                    p4##_type>(p0, p1, p2, p3, p4)));\
1701
      }\
1702
      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1703
    };\
1704
    template <typename arg_type>\
1705
    operator ::testing::Matcher<arg_type>() const {\
1706
      return ::testing::Matcher<arg_type>(\
1707
          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4));\
1708
    }\
1709
    name##MatcherP5(p0##_type gmock_p0, p1##_type gmock_p1, \
1710
        p2##_type gmock_p2, p3##_type gmock_p3, \
1711
        p4##_type gmock_p4) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1712
        p3(gmock_p3), p4(gmock_p4) {\
1713
    }\
1714
    p0##_type p0;\
1715
    p1##_type p1;\
1716
    p2##_type p2;\
1717
    p3##_type p3;\
1718
    p4##_type p4;\
1719
   private:\
1720
    GTEST_DISALLOW_ASSIGN_(name##MatcherP5);\
1721
  };\
1722
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1723
      typename p3##_type, typename p4##_type>\
1724
  inline name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1725
      p4##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
1726
      p4##_type p4) {\
1727
    return name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1728
        p4##_type>(p0, p1, p2, p3, p4);\
1729
  }\
1730
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1731
      typename p3##_type, typename p4##_type>\
1732
  template <typename arg_type>\
1733
  bool name##MatcherP5<p0##_type, p1##_type, p2##_type, p3##_type, \
1734
      p4##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
1735
      arg_type arg, \
1736
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
1737
          const
1738
 
1739
#define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description)\
1740
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1741
      typename p3##_type, typename p4##_type, typename p5##_type>\
1742
  class name##MatcherP6 {\
1743
   public:\
1744
    template <typename arg_type>\
1745
    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1746
     public:\
1747
      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1748
          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5)\
1749
           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
1750
               p4(gmock_p4), p5(gmock_p5) {}\
1751
      virtual bool MatchAndExplain(\
1752
          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
1753
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
1754
        *gmock_os << FormatDescription(false);\
1755
      }\
1756
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
1757
        *gmock_os << FormatDescription(true);\
1758
      }\
1759
      p0##_type p0;\
1760
      p1##_type p1;\
1761
      p2##_type p2;\
1762
      p3##_type p3;\
1763
      p4##_type p4;\
1764
      p5##_type p5;\
1765
     private:\
1766
      ::testing::internal::string FormatDescription(bool negation) const {\
1767
        const ::testing::internal::string gmock_description = (description);\
1768
        if (!gmock_description.empty())\
1769
          return gmock_description;\
1770
        return ::testing::internal::FormatMatcherDescription(\
1771
            negation, #name, \
1772
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
1773
                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
1774
                    p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5)));\
1775
      }\
1776
      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1777
    };\
1778
    template <typename arg_type>\
1779
    operator ::testing::Matcher<arg_type>() const {\
1780
      return ::testing::Matcher<arg_type>(\
1781
          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5));\
1782
    }\
1783
    name##MatcherP6(p0##_type gmock_p0, p1##_type gmock_p1, \
1784
        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1785
        p5##_type gmock_p5) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1786
        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5) {\
1787
    }\
1788
    p0##_type p0;\
1789
    p1##_type p1;\
1790
    p2##_type p2;\
1791
    p3##_type p3;\
1792
    p4##_type p4;\
1793
    p5##_type p5;\
1794
   private:\
1795
    GTEST_DISALLOW_ASSIGN_(name##MatcherP6);\
1796
  };\
1797
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1798
      typename p3##_type, typename p4##_type, typename p5##_type>\
1799
  inline name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \
1800
      p4##_type, p5##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, \
1801
      p3##_type p3, p4##_type p4, p5##_type p5) {\
1802
    return name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, \
1803
        p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5);\
1804
  }\
1805
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1806
      typename p3##_type, typename p4##_type, typename p5##_type>\
1807
  template <typename arg_type>\
1808
  bool name##MatcherP6<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1809
      p5##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
1810
      arg_type arg, \
1811
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
1812
          const
1813
 
1814
#define MATCHER_P7(name, p0, p1, p2, p3, p4, p5, p6, description)\
1815
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1816
      typename p3##_type, typename p4##_type, typename p5##_type, \
1817
      typename p6##_type>\
1818
  class name##MatcherP7 {\
1819
   public:\
1820
    template <typename arg_type>\
1821
    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1822
     public:\
1823
      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1824
          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1825
          p6##_type gmock_p6)\
1826
           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
1827
               p4(gmock_p4), p5(gmock_p5), p6(gmock_p6) {}\
1828
      virtual bool MatchAndExplain(\
1829
          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
1830
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
1831
        *gmock_os << FormatDescription(false);\
1832
      }\
1833
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
1834
        *gmock_os << FormatDescription(true);\
1835
      }\
1836
      p0##_type p0;\
1837
      p1##_type p1;\
1838
      p2##_type p2;\
1839
      p3##_type p3;\
1840
      p4##_type p4;\
1841
      p5##_type p5;\
1842
      p6##_type p6;\
1843
     private:\
1844
      ::testing::internal::string FormatDescription(bool negation) const {\
1845
        const ::testing::internal::string gmock_description = (description);\
1846
        if (!gmock_description.empty())\
1847
          return gmock_description;\
1848
        return ::testing::internal::FormatMatcherDescription(\
1849
            negation, #name, \
1850
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
1851
                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
1852
                    p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, \
1853
                    p6)));\
1854
      }\
1855
      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1856
    };\
1857
    template <typename arg_type>\
1858
    operator ::testing::Matcher<arg_type>() const {\
1859
      return ::testing::Matcher<arg_type>(\
1860
          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6));\
1861
    }\
1862
    name##MatcherP7(p0##_type gmock_p0, p1##_type gmock_p1, \
1863
        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1864
        p5##_type gmock_p5, p6##_type gmock_p6) : p0(gmock_p0), p1(gmock_p1), \
1865
        p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), \
1866
        p6(gmock_p6) {\
1867
    }\
1868
    p0##_type p0;\
1869
    p1##_type p1;\
1870
    p2##_type p2;\
1871
    p3##_type p3;\
1872
    p4##_type p4;\
1873
    p5##_type p5;\
1874
    p6##_type p6;\
1875
   private:\
1876
    GTEST_DISALLOW_ASSIGN_(name##MatcherP7);\
1877
  };\
1878
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1879
      typename p3##_type, typename p4##_type, typename p5##_type, \
1880
      typename p6##_type>\
1881
  inline name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \
1882
      p4##_type, p5##_type, p6##_type> name(p0##_type p0, p1##_type p1, \
1883
      p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
1884
      p6##_type p6) {\
1885
    return name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, \
1886
        p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, p6);\
1887
  }\
1888
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1889
      typename p3##_type, typename p4##_type, typename p5##_type, \
1890
      typename p6##_type>\
1891
  template <typename arg_type>\
1892
  bool name##MatcherP7<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1893
      p5##_type, p6##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
1894
      arg_type arg, \
1895
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
1896
          const
1897
 
1898
#define MATCHER_P8(name, p0, p1, p2, p3, p4, p5, p6, p7, description)\
1899
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1900
      typename p3##_type, typename p4##_type, typename p5##_type, \
1901
      typename p6##_type, typename p7##_type>\
1902
  class name##MatcherP8 {\
1903
   public:\
1904
    template <typename arg_type>\
1905
    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1906
     public:\
1907
      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1908
          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1909
          p6##_type gmock_p6, p7##_type gmock_p7)\
1910
           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
1911
               p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7) {}\
1912
      virtual bool MatchAndExplain(\
1913
          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
1914
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
1915
        *gmock_os << FormatDescription(false);\
1916
      }\
1917
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
1918
        *gmock_os << FormatDescription(true);\
1919
      }\
1920
      p0##_type p0;\
1921
      p1##_type p1;\
1922
      p2##_type p2;\
1923
      p3##_type p3;\
1924
      p4##_type p4;\
1925
      p5##_type p5;\
1926
      p6##_type p6;\
1927
      p7##_type p7;\
1928
     private:\
1929
      ::testing::internal::string FormatDescription(bool negation) const {\
1930
        const ::testing::internal::string gmock_description = (description);\
1931
        if (!gmock_description.empty())\
1932
          return gmock_description;\
1933
        return ::testing::internal::FormatMatcherDescription(\
1934
            negation, #name, \
1935
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
1936
                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
1937
                    p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, \
1938
                    p3, p4, p5, p6, p7)));\
1939
      }\
1940
      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
1941
    };\
1942
    template <typename arg_type>\
1943
    operator ::testing::Matcher<arg_type>() const {\
1944
      return ::testing::Matcher<arg_type>(\
1945
          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7));\
1946
    }\
1947
    name##MatcherP8(p0##_type gmock_p0, p1##_type gmock_p1, \
1948
        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
1949
        p5##_type gmock_p5, p6##_type gmock_p6, \
1950
        p7##_type gmock_p7) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
1951
        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
1952
        p7(gmock_p7) {\
1953
    }\
1954
    p0##_type p0;\
1955
    p1##_type p1;\
1956
    p2##_type p2;\
1957
    p3##_type p3;\
1958
    p4##_type p4;\
1959
    p5##_type p5;\
1960
    p6##_type p6;\
1961
    p7##_type p7;\
1962
   private:\
1963
    GTEST_DISALLOW_ASSIGN_(name##MatcherP8);\
1964
  };\
1965
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1966
      typename p3##_type, typename p4##_type, typename p5##_type, \
1967
      typename p6##_type, typename p7##_type>\
1968
  inline name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \
1969
      p4##_type, p5##_type, p6##_type, p7##_type> name(p0##_type p0, \
1970
      p1##_type p1, p2##_type p2, p3##_type p3, p4##_type p4, p5##_type p5, \
1971
      p6##_type p6, p7##_type p7) {\
1972
    return name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, \
1973
        p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, p3, p4, p5, \
1974
        p6, p7);\
1975
  }\
1976
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1977
      typename p3##_type, typename p4##_type, typename p5##_type, \
1978
      typename p6##_type, typename p7##_type>\
1979
  template <typename arg_type>\
1980
  bool name##MatcherP8<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
1981
      p5##_type, p6##_type, \
1982
      p7##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
1983
      arg_type arg, \
1984
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
1985
          const
1986
 
1987
#define MATCHER_P9(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, description)\
1988
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
1989
      typename p3##_type, typename p4##_type, typename p5##_type, \
1990
      typename p6##_type, typename p7##_type, typename p8##_type>\
1991
  class name##MatcherP9 {\
1992
   public:\
1993
    template <typename arg_type>\
1994
    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
1995
     public:\
1996
      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
1997
          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
1998
          p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8)\
1999
           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
2000
               p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
2001
               p8(gmock_p8) {}\
2002
      virtual bool MatchAndExplain(\
2003
          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
2004
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
2005
        *gmock_os << FormatDescription(false);\
2006
      }\
2007
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
2008
        *gmock_os << FormatDescription(true);\
2009
      }\
2010
      p0##_type p0;\
2011
      p1##_type p1;\
2012
      p2##_type p2;\
2013
      p3##_type p3;\
2014
      p4##_type p4;\
2015
      p5##_type p5;\
2016
      p6##_type p6;\
2017
      p7##_type p7;\
2018
      p8##_type p8;\
2019
     private:\
2020
      ::testing::internal::string FormatDescription(bool negation) const {\
2021
        const ::testing::internal::string gmock_description = (description);\
2022
        if (!gmock_description.empty())\
2023
          return gmock_description;\
2024
        return ::testing::internal::FormatMatcherDescription(\
2025
            negation, #name, \
2026
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
2027
                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
2028
                    p4##_type, p5##_type, p6##_type, p7##_type, \
2029
                    p8##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8)));\
2030
      }\
2031
      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
2032
    };\
2033
    template <typename arg_type>\
2034
    operator ::testing::Matcher<arg_type>() const {\
2035
      return ::testing::Matcher<arg_type>(\
2036
          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8));\
2037
    }\
2038
    name##MatcherP9(p0##_type gmock_p0, p1##_type gmock_p1, \
2039
        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
2040
        p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
2041
        p8##_type gmock_p8) : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), \
2042
        p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
2043
        p8(gmock_p8) {\
2044
    }\
2045
    p0##_type p0;\
2046
    p1##_type p1;\
2047
    p2##_type p2;\
2048
    p3##_type p3;\
2049
    p4##_type p4;\
2050
    p5##_type p5;\
2051
    p6##_type p6;\
2052
    p7##_type p7;\
2053
    p8##_type p8;\
2054
   private:\
2055
    GTEST_DISALLOW_ASSIGN_(name##MatcherP9);\
2056
  };\
2057
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2058
      typename p3##_type, typename p4##_type, typename p5##_type, \
2059
      typename p6##_type, typename p7##_type, typename p8##_type>\
2060
  inline name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \
2061
      p4##_type, p5##_type, p6##_type, p7##_type, \
2062
      p8##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
2063
      p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, \
2064
      p8##_type p8) {\
2065
    return name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, \
2066
        p4##_type, p5##_type, p6##_type, p7##_type, p8##_type>(p0, p1, p2, \
2067
        p3, p4, p5, p6, p7, p8);\
2068
  }\
2069
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2070
      typename p3##_type, typename p4##_type, typename p5##_type, \
2071
      typename p6##_type, typename p7##_type, typename p8##_type>\
2072
  template <typename arg_type>\
2073
  bool name##MatcherP9<p0##_type, p1##_type, p2##_type, p3##_type, p4##_type, \
2074
      p5##_type, p6##_type, p7##_type, \
2075
      p8##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
2076
      arg_type arg, \
2077
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
2078
          const
2079
 
2080
#define MATCHER_P10(name, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, description)\
2081
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2082
      typename p3##_type, typename p4##_type, typename p5##_type, \
2083
      typename p6##_type, typename p7##_type, typename p8##_type, \
2084
      typename p9##_type>\
2085
  class name##MatcherP10 {\
2086
   public:\
2087
    template <typename arg_type>\
2088
    class gmock_Impl : public ::testing::MatcherInterface<arg_type> {\
2089
     public:\
2090
      gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \
2091
          p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \
2092
          p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \
2093
          p9##_type gmock_p9)\
2094
           : p0(gmock_p0), p1(gmock_p1), p2(gmock_p2), p3(gmock_p3), \
2095
               p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), p7(gmock_p7), \
2096
               p8(gmock_p8), p9(gmock_p9) {}\
2097
      virtual bool MatchAndExplain(\
2098
          arg_type arg, ::testing::MatchResultListener* result_listener) const;\
2099
      virtual void DescribeTo(::std::ostream* gmock_os) const {\
2100
        *gmock_os << FormatDescription(false);\
2101
      }\
2102
      virtual void DescribeNegationTo(::std::ostream* gmock_os) const {\
2103
        *gmock_os << FormatDescription(true);\
2104
      }\
2105
      p0##_type p0;\
2106
      p1##_type p1;\
2107
      p2##_type p2;\
2108
      p3##_type p3;\
2109
      p4##_type p4;\
2110
      p5##_type p5;\
2111
      p6##_type p6;\
2112
      p7##_type p7;\
2113
      p8##_type p8;\
2114
      p9##_type p9;\
2115
     private:\
2116
      ::testing::internal::string FormatDescription(bool negation) const {\
2117
        const ::testing::internal::string gmock_description = (description);\
2118
        if (!gmock_description.empty())\
2119
          return gmock_description;\
2120
        return ::testing::internal::FormatMatcherDescription(\
2121
            negation, #name, \
2122
            ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\
2123
                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \
2124
                    p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
2125
                    p9##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)));\
2126
      }\
2127
      GTEST_DISALLOW_ASSIGN_(gmock_Impl);\
2128
    };\
2129
    template <typename arg_type>\
2130
    operator ::testing::Matcher<arg_type>() const {\
2131
      return ::testing::Matcher<arg_type>(\
2132
          new gmock_Impl<arg_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9));\
2133
    }\
2134
    name##MatcherP10(p0##_type gmock_p0, p1##_type gmock_p1, \
2135
        p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \
2136
        p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \
2137
        p8##_type gmock_p8, p9##_type gmock_p9) : p0(gmock_p0), p1(gmock_p1), \
2138
        p2(gmock_p2), p3(gmock_p3), p4(gmock_p4), p5(gmock_p5), p6(gmock_p6), \
2139
        p7(gmock_p7), p8(gmock_p8), p9(gmock_p9) {\
2140
    }\
2141
    p0##_type p0;\
2142
    p1##_type p1;\
2143
    p2##_type p2;\
2144
    p3##_type p3;\
2145
    p4##_type p4;\
2146
    p5##_type p5;\
2147
    p6##_type p6;\
2148
    p7##_type p7;\
2149
    p8##_type p8;\
2150
    p9##_type p9;\
2151
   private:\
2152
    GTEST_DISALLOW_ASSIGN_(name##MatcherP10);\
2153
  };\
2154
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2155
      typename p3##_type, typename p4##_type, typename p5##_type, \
2156
      typename p6##_type, typename p7##_type, typename p8##_type, \
2157
      typename p9##_type>\
2158
  inline name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
2159
      p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
2160
      p9##_type> name(p0##_type p0, p1##_type p1, p2##_type p2, p3##_type p3, \
2161
      p4##_type p4, p5##_type p5, p6##_type p6, p7##_type p7, p8##_type p8, \
2162
      p9##_type p9) {\
2163
    return name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
2164
        p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, p9##_type>(p0, \
2165
        p1, p2, p3, p4, p5, p6, p7, p8, p9);\
2166
  }\
2167
  template <typename p0##_type, typename p1##_type, typename p2##_type, \
2168
      typename p3##_type, typename p4##_type, typename p5##_type, \
2169
      typename p6##_type, typename p7##_type, typename p8##_type, \
2170
      typename p9##_type>\
2171
  template <typename arg_type>\
2172
  bool name##MatcherP10<p0##_type, p1##_type, p2##_type, p3##_type, \
2173
      p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \
2174
      p9##_type>::gmock_Impl<arg_type>::MatchAndExplain(\
2175
      arg_type arg, \
2176
      ::testing::MatchResultListener* result_listener GTEST_ATTRIBUTE_UNUSED_)\
2177
          const
2178
 
2179
#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_MATCHERS_H_

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.