gmock-matchers.h revision e2e8ba401d198d1a8304c652e997505609b62696
1155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Copyright 2007, Google Inc.
2155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// All rights reserved.
3155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//
4155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Redistribution and use in source and binary forms, with or without
5155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// modification, are permitted provided that the following conditions are
6155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// met:
7155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//
8155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//     * Redistributions of source code must retain the above copyright
9155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// notice, this list of conditions and the following disclaimer.
10155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//     * Redistributions in binary form must reproduce the above
11155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// copyright notice, this list of conditions and the following disclaimer
12155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// in the documentation and/or other materials provided with the
13155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// distribution.
14155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//     * Neither the name of Google Inc. nor the names of its
15155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// contributors may be used to endorse or promote products derived from
16155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// this software without specific prior written permission.
17155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//
18155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
212f47b2755faffaa1a011ddeb8527bd9c99bb6106Rebecca Silberstein// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
221f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein//
30878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// Author: wan@google.com (Zhanyong Wan)
31878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein
32eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande// Google Mock - a framework for writing C++ mock classes.
33eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande//
34090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande// This file implements some commonly used argument matchers.  More
35eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande// matchers can be defined by the user implementing the
36eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande// MatcherInterface<T> interface if necessary.
37eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande
38eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
39eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande#define GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
40eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande
41eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande#include <algorithm>
42eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande#include <limits>
43eee1d479d8d402a2e78e2f143e957030cfc77749Vinit Deshpande#include <ostream>  // NOLINT
449086afccf6938a49eb9a2cd248917c1cb0943942vandwalle#include <sstream>
45bdac915b98217c63284b47a7925f0719c8e40844Wei Wang#include <string>
46bdac915b98217c63284b47a7925f0719c8e40844Wei Wang#include <vector>
47155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
48155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include <gmock/internal/gmock-internal-utils.h>
49155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include <gmock/internal/gmock-port.h>
50155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#include <gtest/gtest.h>
51155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
52155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandenamespace testing {
53dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov
54155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// To implement a matcher Foo for type T, define:
55f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao//   1. a class FooMatcherImpl that implements the
56155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//      MatcherInterface<T> interface, and
57155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//   2. a factory function that creates a Matcher<T> object from a
58155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//      FooMatcherImpl*.
59653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhne//
609846078598c3468f8813dbfa58238a1846bd81efSanket Padawe// The two-level delegation design makes it possible to allow a user
61155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// to write "v" instead of "Eq(v)" where a Matcher is expected, which
62653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhne// is impossible if we pass matchers by pointers.  It also eases
63e487a4648dd41881e754f1224aaedead78a0777dSky Faber// ownership management as Matcher objects can now be copied like
6484d962ec8f487f824214744498bba505a6db0c59Randy Pan// plain values.
653ecf5a032e94b6538a56f94a5b33e50cbc464007Jaewan Kim
668be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele// MatchResultListener is an abstract class.  Its << operator can be
678be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele// used by a matcher to explain why a value matches or doesn't match.
688be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele//
698be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele// TODO(wan@google.com): add method
708be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele//   bool InterestedInWhy(bool result) const;
718be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele// to indicate whether the listener is interested in why the match
728be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele// result is 'result'.
738be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kaleleclass MatchResultListener {
740025465e311fe9504cd79610523a1b8171995accRebecca Silberstein public:
756c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein  // Creates a listener object with the given underlying ostream.  The
763ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu  // listener does not own the ostream.
773ecf5a032e94b6538a56f94a5b33e50cbc464007Jaewan Kim  explicit MatchResultListener(::std::ostream* os) : stream_(os) {}
78c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski  virtual ~MatchResultListener() = 0;  // Makes this class abstract.
79155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
80e660aa2b9c9ca3a5c7903c37571ca7b91feb4ccfFyodor Kupolov  // Streams x to the underlying ostream; does nothing if the ostream
81c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski  // is NULL.
82155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  template <typename T>
83155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  MatchResultListener& operator<<(const T& x) {
8440abf54c81c5624641543d86e1d7ab21ebe30175Paul Stewart    if (stream_ != NULL)
85155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      *stream_ << x;
863ecf5a032e94b6538a56f94a5b33e50cbc464007Jaewan Kim    return *this;
8703b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn  }
88dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov
89155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Returns the underlying ostream.
90c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski  ::std::ostream* stream() { return stream_; }
91155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
92fd5470391e5342daa38d00b68ccbccfeacbe6d33Alexandra Gherghina  // Returns true iff the listener is interested in an explanation of
93155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // the match result.  A matcher's MatchAndExplain() method can use
94155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // this information to avoid generating the explanation when no one
95bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  // intends to hear it.
96bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  bool IsInterested() const { return stream_ != NULL; }
97992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle
98155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private:
99155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  ::std::ostream* const stream_;
10087ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein
101f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener);
10298e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande};
103090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande
1048be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kaleleinline MatchResultListener::~MatchResultListener() {
1058be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele}
106d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu
107f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao// The implementation of a matcher.
108868b692e6faa9ec3c8dd0cd42d4302082e28b992Sohani Raotemplate <typename T>
1098be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kaleleclass MatcherInterface {
110155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public:
111155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  virtual ~MatcherInterface() {}
1128be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele
113155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Returns true iff the matcher matches x; also explains the match
114155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // result to 'listener', in the form of a non-restrictive relative
115155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // clause ("which ...", "whose ...", etc) that describes x.  For
116155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // example, the MatchAndExplain() method of the Pointee(...) matcher
1178be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele  // should generate an explanation like "which points to ...".
118a1edc185d46d85e04930a5e12b465de9fea64afeJan Nordqvist  //
11931891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist  // You should override this method when defining a new matcher.
12031891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist  //
12131891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist  // It's the responsibility of the caller (Google Mock) to guarantee
12231891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist  // that 'listener' is not NULL.  This helps to simplify a matcher's
12331891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist  // implementation when it doesn't care about the performance, as it
12431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist  // can talk to 'listener' without checking its validity first.
125155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // However, in order to implement dummy listeners efficiently,
12631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist  // listener->stream() may be NULL.
12787ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein  virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0;
128155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
129003b695597a1f010724662fbf4ac76953a71e3b8Rebecca Silberstein  // Describes this matcher to an ostream.  The function should print
130155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // a verb phrase that describes the property a value matching this
131155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // matcher should have.  The subject of the verb phrase is the value
132155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // being matched.  For example, the DescribeTo() method of the Gt(7)
133155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // matcher prints "is greater than 7".
134155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  virtual void DescribeTo(::std::ostream* os) const = 0;
135155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
136155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Describes the negation of this matcher to an ostream.  For
13779a4204d12f32d2f6a4dfc8500f5e74718cabb8dVinit Deshpande  // example, if the description of this matcher is "is greater than
138155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // 7", the negated description could be "is not greater than 7".
139f22d23092ab37286a5ef9d257d5bb32c421d2669vandwalle  // You are not required to override this when implementing
14070b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle  // MatcherInterface, but it is highly advised so that your matcher
141155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // can produce good error messages.
14284ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart  virtual void DescribeNegationTo(::std::ostream* os) const {
14384ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart    *os << "not (";
14484ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart    DescribeTo(os);
14584ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart    *os << ")";
14684ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart  }
147bdac915b98217c63284b47a7925f0719c8e40844Wei Wang};
148bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
149bdac915b98217c63284b47a7925f0719c8e40844Wei Wangnamespace internal {
150bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
151bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// A match result listener that ignores the explanation.
152bdac915b98217c63284b47a7925f0719c8e40844Wei Wangclass DummyMatchResultListener : public MatchResultListener {
153bdac915b98217c63284b47a7925f0719c8e40844Wei Wang public:
154155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  DummyMatchResultListener() : MatchResultListener(NULL) {}
155155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
156155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private:
1570091305175e8c6fe7fc6d01efb9d405961db4ac7Ningyuan Wang  GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener);
158bdac915b98217c63284b47a7925f0719c8e40844Wei Wang};
159bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
160155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// A match result listener that forwards the explanation to a given
16103b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn// ostream.  The difference between this and MatchResultListener is
162155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// that the former is concrete.
163f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scottclass StreamMatchResultListener : public MatchResultListener {
164bdac915b98217c63284b47a7925f0719c8e40844Wei Wang public:
165d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang  explicit StreamMatchResultListener(::std::ostream* os)
166bdac915b98217c63284b47a7925f0719c8e40844Wei Wang      : MatchResultListener(os) {}
167ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle
168ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle private:
169ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener);
170cee93a796f42939b2d4f2e3e5491c3d951694662Joe LaPenna};
171cee93a796f42939b2d4f2e3e5491c3d951694662Joe LaPenna
172155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// A match result listener that stores the explanation in a string.
173155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass StringMatchResultListener : public MatchResultListener {
174155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public:
175155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  StringMatchResultListener() : MatchResultListener(&ss_) {}
1761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne
1771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne  // Returns the explanation heard so far.
1782bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsu  internal::string str() const { return ss_.str(); }
1792bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsu
1802bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsu private:
181637a86ffb3a036a4f26a471378b57d8817f35c25Glen Kuhne  ::std::stringstream ss_;
182ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius
183ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius  GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener);
184ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius};
185bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
186bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// An internal class for implementing Matcher<T>, which will derive
1876c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein// from it.  We put functionalities common to all Matcher<T>
188bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// specializations here to avoid code duplication.
189f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Raotemplate <typename T>
190bdac915b98217c63284b47a7925f0719c8e40844Wei Wangclass MatcherBase {
191155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public:
192155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Returns true iff the matcher matches x; also explains the match
193155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // result to 'listener'.
194155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  bool MatchAndExplain(T x, MatchResultListener* listener) const {
195155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return impl_->MatchAndExplain(x, listener);
196dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov  }
197f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao
198dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov  // Returns true iff this matcher matches x.
199868b692e6faa9ec3c8dd0cd42d4302082e28b992Sohani Rao  bool Matches(T x) const {
200868b692e6faa9ec3c8dd0cd42d4302082e28b992Sohani Rao    DummyMatchResultListener dummy;
20187ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein    return MatchAndExplain(x, &dummy);
20287ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein  }
20387ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein
20487ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein  // Describes this matcher to an ostream.
205a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); }
206a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein
20787ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein  // Describes the negation of this matcher to an ostream.
208155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  void DescribeNegationTo(::std::ostream* os) const {
2090c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein    impl_->DescribeNegationTo(os);
2100c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein  }
2110c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein
2120c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein  // Explains why x matches, or doesn't match, the matcher.
2130c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein  void ExplainMatchResultTo(T x, ::std::ostream* os) const {
2140c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein    StreamMatchResultListener listener(os);
2150c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein    MatchAndExplain(x, &listener);
2160c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein  }
2170c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein
2180c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein protected:
2190c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein  MatcherBase() {}
2200c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein
2210c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein  // Constructs a matcher from its implementation.
2220c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein  explicit MatcherBase(const MatcherInterface<T>* impl)
2230c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein      : impl_(impl) {}
2240c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein
225155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  virtual ~MatcherBase() {}
226155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
227f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao private:
228155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // shared_ptr (util/gtl/shared_ptr.h) and linked_ptr have similar
229f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  // interfaces.  The former dynamically allocates a chunk of memory
230f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  // to hold the reference count, while the latter tracks all
231155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // references using a circular linked list without allocating
232155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // memory.  It has been observed that linked_ptr performs better in
233155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // typical scenarios.  However, shared_ptr can out-perform
234155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // linked_ptr when there are many more uses of the copy constructor
235f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  // than the default constructor.
236155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  //
237155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // If performance becomes a problem, we should see if using
238155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // shared_ptr helps.
239155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  ::testing::internal::linked_ptr<const MatcherInterface<T> > impl_;
240155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande};
241155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
242155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}  // namespace internal
243155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
244155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// A Matcher<T> is a copyable and IMMUTABLE (except by assignment)
245155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// object that can check whether a value of type T matches.  The
246155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// implementation of Matcher<T> is just a linked_ptr to const
247155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// MatcherInterface<T>, so copying is fairly cheap.  Don't inherit
248155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// from Matcher!
249155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename T>
250155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass Matcher : public internal::MatcherBase<T> {
251155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public:
252155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Constructs a null matcher.  Needed for storing Matcher objects in
253155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // STL containers.
254155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  Matcher() {}
255155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
256155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Constructs a matcher from its implementation.
257155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  explicit Matcher(const MatcherInterface<T>* impl)
258f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao      : internal::MatcherBase<T>(impl) {}
259155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
260155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Implicit constructor here allows people to write
261155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes
2621316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang  Matcher(T value);  // NOLINT
263155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande};
264155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2651316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang// The following two specializations allow the user to write str
2661316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang// instead of Eq(str) and "foo" instead of Eq("foo") when a string
2671316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang// matcher is expected.
2681316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wangtemplate <>
2691316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wangclass Matcher<const internal::string&>
270d03a9283285bb7adef6c687eb3a91fa4a8c4b502Vinit Deshpande    : public internal::MatcherBase<const internal::string&> {
2711316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang public:
2721316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang  Matcher() {}
27364c98f4afda6c7970c5d563580165a308d5e7c15Jason Monk
274155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  explicit Matcher(const MatcherInterface<const internal::string&>* impl)
275155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      : internal::MatcherBase<const internal::string&>(impl) {}
2761316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang
2771316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang  // Allows the user to write str instead of Eq(str) sometimes, where
2781316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang  // str is a string object.
2791316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang  Matcher(const internal::string& s);  // NOLINT
2801316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang
2811316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang  // Allows the user to write "foo" instead of Eq("foo") sometimes.
2821316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang  Matcher(const char* s);  // NOLINT
2831316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang};
2841316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang
2851316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wangtemplate <>
2861316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wangclass Matcher<internal::string>
2871316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang    : public internal::MatcherBase<internal::string> {
2881316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang public:
2891316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang  Matcher() {}
2901316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang
2911316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang  explicit Matcher(const MatcherInterface<internal::string>* impl)
2921316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang      : internal::MatcherBase<internal::string>(impl) {}
2931316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang
2941316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang  // Allows the user to write str instead of Eq(str) sometimes, where
2951316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang  // str is a string object.
296155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  Matcher(const internal::string& s);  // NOLINT
297155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
298155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Allows the user to write "foo" instead of Eq("foo") sometimes.
2991316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang  Matcher(const char* s);  // NOLINT
3001316bfba023da3371bbc590ab2edee19c9475c03Ningyuan Wang};
301155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
302155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// The PolymorphicMatcher class template makes it easy to implement a
303155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// polymorphic matcher (i.e. a matcher that can match values of more
304155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// than one type, e.g. Eq(n) and NotNull()).
305bace539f9cdc4ffb521c8251dd1c56073e805cd4Bartosz Fabianowski//
306002ea67f42b0f69a8c9fa4719391f9476567b762Sky Faber// To define a polymorphic matcher, a user should provide an Impl
307155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// class that has a DescribeTo() method and a DescribeNegationTo()
308155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// method, and define a member function (or member function template)
309155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//
310155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//   bool MatchAndExplain(const Value& value,
311155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//                        MatchResultListener* listener) const;
312155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//
313155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// See the definition of NotNull() for a complete example.
314155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <class Impl>
315155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass PolymorphicMatcher {
316155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public:
317155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {}
318155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
319155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Returns a mutable reference to the underlying matcher
320155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // implementation object.
321c35d728a15e9270f5642ef79f5245c89d749285fSky Faber  Impl& mutable_impl() { return impl_; }
322e1d14389cd77b0757ba3533b122cf00ad65e2099Paul Stewart
3238fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley  // Returns an immutable reference to the underlying matcher
324155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // implementation object.
325c35d728a15e9270f5642ef79f5245c89d749285fSky Faber  const Impl& impl() const { return impl_; }
326155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
327155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  template <typename T>
328155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  operator Matcher<T>() const {
329155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return Matcher<T>(new MonomorphicImpl<T>(impl_));
330155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
331155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
332155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private:
333155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  template <typename T>
334155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  class MonomorphicImpl : public MatcherInterface<T> {
335155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande   public:
336155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {}
337155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
338f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    virtual void DescribeTo(::std::ostream* os) const {
339155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      impl_.DescribeTo(os);
340155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
341f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao
342f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    virtual void DescribeNegationTo(::std::ostream* os) const {
343da918df16e03ee19be62343313d954027d3eb3abRebecca Silberstein      impl_.DescribeNegationTo(os);
344155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
345155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
346155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
347155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      return impl_.MatchAndExplain(x, listener);
348155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
349f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao
350155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande   private:
351155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    const Impl impl_;
352155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
353155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    GTEST_DISALLOW_ASSIGN_(MonomorphicImpl);
354155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  };
355155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
356155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  Impl impl_;
357155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
358155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  GTEST_DISALLOW_ASSIGN_(PolymorphicMatcher);
359155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande};
360155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
361155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Creates a matcher from its implementation.  This is easier to use
362155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// than the Matcher<T> constructor as it doesn't require you to
363155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// explicitly write the template argument, e.g.
364155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//
365155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//   MakeMatcher(foo);
366155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// vs
367155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//   Matcher<const string&>(foo);
368155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename T>
369155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeinline Matcher<T> MakeMatcher(const MatcherInterface<T>* impl) {
370155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  return Matcher<T>(impl);
371155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande};
372155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
373155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Creates a polymorphic matcher from its implementation.  This is
374155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// easier to use than the PolymorphicMatcher<Impl> constructor as it
375155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// doesn't require you to explicitly write the template argument, e.g.
376155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//
3772a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein//   MakePolymorphicMatcher(foo);
37861312e14a088a9487d4db64f08285162476e870fPaul Stewart// vs
379155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//   PolymorphicMatcher<TypeOfFoo>(foo);
380da918df16e03ee19be62343313d954027d3eb3abRebecca Silbersteintemplate <class Impl>
381155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeinline PolymorphicMatcher<Impl> MakePolymorphicMatcher(const Impl& impl) {
382da918df16e03ee19be62343313d954027d3eb3abRebecca Silberstein  return PolymorphicMatcher<Impl>(impl);
383bdac915b98217c63284b47a7925f0719c8e40844Wei Wang}
384fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silberstein
385fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silberstein// In order to be safe and clear, casting between different matcher
386637a86ffb3a036a4f26a471378b57d8817f35c25Glen Kuhne// types is done explicitly via MatcherCast<T>(m), which takes a
387fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silberstein// matcher m and returns a Matcher<T>.  It compiles only when T can be
3883871ff67f4a6970f1831fc8951392746c9e2bfa2Rebecca Silberstein// statically converted to the argument type of m.
389fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silbersteintemplate <typename T, typename M>
390fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca SilbersteinMatcher<T> MatcherCast(M m);
391155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
392fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silberstein// Implements SafeMatcherCast().
393fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silberstein//
394fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silberstein// We use an intermediate class to do the actual safe casting as Nokia's
395bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// Symbian compiler cannot decide between
396fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silberstein// template <T, M> ... (M) and
397cee93a796f42939b2d4f2e3e5491c3d951694662Joe LaPenna// template <T, U> ... (const Matcher<U>&)
398fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silberstein// for function templates but can for member function templates.
39961312e14a088a9487d4db64f08285162476e870fPaul Stewarttemplate <typename T>
400fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silbersteinclass SafeMatcherCastImpl {
401f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao public:
402f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  // This overload handles polymorphic matchers only since monomorphic
403f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  // matchers are handled by the next one.
404fca64fc16ec43befde2e7ac7c3bfd84ced1f7778Rebecca Silberstein  template <typename M>
4053204fb9682242a7b5a749489076c66d448c42577Roshan Pius  static inline Matcher<T> Cast(M polymorphic_matcher) {
406dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov    return Matcher<T>(polymorphic_matcher);
407dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov  }
408dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov
409868b692e6faa9ec3c8dd0cd42d4302082e28b992Sohani Rao  // This overload handles monomorphic matchers.
410f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  //
411f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  // In general, if type T can be implicitly converted to type U, we can
412bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  // safely convert a Matcher<U> to a Matcher<T> (i.e. Matcher is
413bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  // contravariant): just keep a copy of the original Matcher<U>, convert the
414bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  // argument from type T to U, and then pass it to the underlying Matcher<U>.
415003b695597a1f010724662fbf4ac76953a71e3b8Rebecca Silberstein  // The only exception is when U is a reference and T is not, as the
41687ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein  // underlying Matcher<U> may be interested in the argument's address, which
41700ec8bf178ba4abee4ee8bbc6eb09c9fcd986a89Rebecca Silberstein  // is not preserved in the conversion from T to U.
4181c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde  template <typename U>
4191c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde  static inline Matcher<T> Cast(const Matcher<U>& matcher) {
4201c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde    // Enforce that T can be implicitly converted to U.
421f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    GTEST_COMPILE_ASSERT_((internal::ImplicitlyConvertible<T, U>::value),
422f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao                          T_must_be_implicitly_convertible_to_U);
423f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    // Enforce that we are not converting a non-reference type T to a reference
424f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    // type U.
425f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    GTEST_COMPILE_ASSERT_(
426f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao        internal::is_reference<T>::value || !internal::is_reference<U>::value,
427f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao        cannot_convert_non_referentce_arg_to_reference);
42836f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein    // In case both T and U are arithmetic types, enforce that the
429f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    // conversion is not lossy.
43036f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein    typedef GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T)) RawT;
43136f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein    typedef GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(U)) RawU;
43236f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein    const bool kTIsOther = GMOCK_KIND_OF_(RawT) == internal::kOther;
43336f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein    const bool kUIsOther = GMOCK_KIND_OF_(RawU) == internal::kOther;
4341c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde    GTEST_COMPILE_ASSERT_(
43536f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein        kTIsOther || kUIsOther ||
4361c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde        (internal::LosslessArithmeticConvertible<RawT, RawU>::value),
4371c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde        conversion_of_arithmetic_types_must_be_lossless);
43836f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein    return MatcherCast<T>(matcher);
43936f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein  }
44036f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein};
44136f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein
44236f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silbersteintemplate <typename T, typename M>
44336f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silbersteininline Matcher<T> SafeMatcherCast(const M& polymorphic_matcher) {
44436f52ffb5fd16c89f022dead27d8df9e51874160Rebecca Silberstein  return SafeMatcherCastImpl<T>::Cast(polymorphic_matcher);
4451c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde}
4461c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde
4471c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde// A<T>() returns a matcher that matches any value of type T.
448155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename T>
449155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit DeshpandeMatcher<T> A();
450bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
451155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION
452155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// and MUST NOT BE USED IN USER CODE!!!
453155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandenamespace internal {
454155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
455155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// If the explanation is not empty, prints it to the ostream.
456155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeinline void PrintIfNotEmpty(const internal::string& explanation,
457155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                            std::ostream* os) {
45898e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande  if (explanation != "" && os != NULL) {
45998e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande    *os << ", " << explanation;
460d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang  }
46198e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande}
462155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
463155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Matches the value against the given matcher, prints the value and explains
464155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// the match result to the listener. Returns the match result.
465155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 'listener' must not be NULL.
46698e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande// Value cannot be passed by const reference, because some matchers take a
46798e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande// non-const argument.
46898e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpandetemplate <typename Value, typename T>
46998e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpandebool MatchPrintAndExplain(Value& value, const Matcher<T>& matcher,
47098e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande                          MatchResultListener* listener) {
471a7bf9d90d68a4833cc3c64da98024167931c4b1epkanwar  if (!listener->IsInterested()) {
472fdce524fd05844c996cf1c5c0c102a87fde8e32cVinit Deshpande    // If the listener is not interested, we do not need to construct the
4733c8094ab45f3320dbe45e6460c5d62dcc24ce7aeMitchell Wills    // inner explanation.
47498e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande    return matcher.Matches(value);
475d02611ce4158fda6c2d14ee13ad7f9553f416d21Ningyuan Wang  }
4763c8094ab45f3320dbe45e6460c5d62dcc24ce7aeMitchell Wills
4773c8094ab45f3320dbe45e6460c5d62dcc24ce7aeMitchell Wills  StringMatchResultListener inner_listener;
4783c8094ab45f3320dbe45e6460c5d62dcc24ce7aeMitchell Wills  const bool match = matcher.MatchAndExplain(value, &inner_listener);
47998e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande
48098e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande  UniversalPrint(value, listener->stream());
48198e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande  PrintIfNotEmpty(inner_listener.str(), listener->stream());
48298e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande
48398e43e5f48a4c87343fc311feda4fa5489948822Vinit Deshpande  return match;
484878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein}
485878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein
486878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// An internal helper class for doing compile-time loop on a tuple's
487878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// fields.
4881f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silbersteintemplate <size_t N>
489878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silbersteinclass TuplePrefix {
490878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein public:
491878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  // TuplePrefix<N>::Matches(matcher_tuple, value_tuple) returns true
492878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  // iff the first N fields of matcher_tuple matches the first N
493878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  // fields of value_tuple, respectively.
4942f47b2755faffaa1a011ddeb8527bd9c99bb6106Rebecca Silberstein  template <typename MatcherTuple, typename ValueTuple>
4952f47b2755faffaa1a011ddeb8527bd9c99bb6106Rebecca Silberstein  static bool Matches(const MatcherTuple& matcher_tuple,
4961f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein                      const ValueTuple& value_tuple) {
4971f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein    using ::std::tr1::get;
4981f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein    return TuplePrefix<N - 1>::Matches(matcher_tuple, value_tuple)
499878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein        && get<N - 1>(matcher_tuple).Matches(get<N - 1>(value_tuple));
500878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  }
501878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein
502878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  // TuplePrefix<N>::ExplainMatchFailuresTo(matchers, values, os)
503155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // describes failures in matching the first N fields of matchers
504155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // against the first N fields of values.  If there is no failure,
505155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // nothing will be streamed to os.
506155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  template <typename MatcherTuple, typename ValueTuple>
507faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee  static void ExplainMatchFailuresTo(const MatcherTuple& matchers,
50803b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn                                     const ValueTuple& values,
509155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                                     ::std::ostream* os) {
510d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    using ::std::tr1::tuple_element;
511d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius    using ::std::tr1::get;
512d84fd37259c6e956d0f00c261f573dfa319acb91Roshan Pius
5131c28bb29cb19367d5e3bdbe6d8558d0fd4b8f33eVinit Deshapnde    // First, describes failures in the first N - 1 fields.
514155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    TuplePrefix<N - 1>::ExplainMatchFailuresTo(matchers, values, os);
515155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
516155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    // Then describes the failure (if any) in the (N - 1)-th (0-based)
517dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov    // field.
518dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov    typename tuple_element<N - 1, MatcherTuple>::type matcher =
519dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov        get<N - 1>(matchers);
520dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov    typedef typename tuple_element<N - 1, ValueTuple>::type Value;
521dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov    Value value = get<N - 1>(values);
522dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov    StringMatchResultListener listener;
523dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov    if (!matcher.MatchAndExplain(value, &listener)) {
524155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      // TODO(wan): include in the message the name of the parameter
525155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      // as used in MOCK_METHOD*() when possible.
526bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski      *os << "  Expected arg #" << N - 1 << ": ";
527bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski      get<N - 1>(matchers).DescribeTo(os);
528bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski      *os << "\n           Actual: ";
529bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski      // We remove the reference in type Value to prevent the
5303bc487aa49deecbc358ee819e0dd4b2534412281Roshan Pius      // universal printer from printing the address of value, which
5313bc487aa49deecbc358ee819e0dd4b2534412281Roshan Pius      // isn't interesting to the user most of the time.  The
5323bc487aa49deecbc358ee819e0dd4b2534412281Roshan Pius      // matcher's MatchAndExplain() method handles the case when
5333bc487aa49deecbc358ee819e0dd4b2534412281Roshan Pius      // the address is interesting.
5343bc487aa49deecbc358ee819e0dd4b2534412281Roshan Pius      internal::UniversalPrint(value, os);
5353bc487aa49deecbc358ee819e0dd4b2534412281Roshan Pius      PrintIfNotEmpty(listener.str(), os);
5363bc487aa49deecbc358ee819e0dd4b2534412281Roshan Pius      *os << "\n";
537bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
538155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
539a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng};
540a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng
541155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// The base case.
542a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zhengtemplate <>
543a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zhengclass TuplePrefix<0> {
544bdac915b98217c63284b47a7925f0719c8e40844Wei Wang public:
545155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  template <typename MatcherTuple, typename ValueTuple>
5468fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley  static bool Matches(const MatcherTuple& /* matcher_tuple */,
547bdac915b98217c63284b47a7925f0719c8e40844Wei Wang                      const ValueTuple& /* value_tuple */) {
548155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return true;
549bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  }
550f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao
551bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  template <typename MatcherTuple, typename ValueTuple>
552bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  static void ExplainMatchFailuresTo(const MatcherTuple& /* matchers */,
553bdac915b98217c63284b47a7925f0719c8e40844Wei Wang                                     const ValueTuple& /* values */,
554bdac915b98217c63284b47a7925f0719c8e40844Wei Wang                                     ::std::ostream* /* os */) {}
555bdac915b98217c63284b47a7925f0719c8e40844Wei Wang};
556bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
557bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// TupleMatches(matcher_tuple, value_tuple) returns true iff all
558bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// matchers in matcher_tuple match the corresponding fields in
559bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// value_tuple.  It is a compiler error if matcher_tuple and
560bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// value_tuple have different number of fields or incompatible field
561bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// types.
562bdac915b98217c63284b47a7925f0719c8e40844Wei Wangtemplate <typename MatcherTuple, typename ValueTuple>
5631227b49a94f33844ad0606b48b591bea4d27b08eVinit Deshpandebool TupleMatches(const MatcherTuple& matcher_tuple,
5646c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein                  const ValueTuple& value_tuple) {
5656c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein  using ::std::tr1::tuple_size;
5666c11cd5d6ff04afdf1bbbc99a850025d46c7bdc9Rebecca Silberstein  // Makes sure that matcher_tuple and value_tuple have the same
56703b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn  // number of fields.
56849dfc6768889a33eb67102b16faf21667af2a60dVinit Deshpande  GTEST_COMPILE_ASSERT_(tuple_size<MatcherTuple>::value ==
56949dfc6768889a33eb67102b16faf21667af2a60dVinit Deshpande                        tuple_size<ValueTuple>::value,
570691fb51e7ac5e4d0b91a4719cd0ed10a8c212e50Vinit Deshpande                        matcher_and_value_have_different_numbers_of_fields);
571bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  return TuplePrefix<tuple_size<ValueTuple>::value>::
572bdac915b98217c63284b47a7925f0719c8e40844Wei Wang      Matches(matcher_tuple, value_tuple);
573bdac915b98217c63284b47a7925f0719c8e40844Wei Wang}
574bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
575bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// Describes failures in matching matchers against values.  If there
57603b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn// is no failure, nothing will be streamed to os.
57703b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborntemplate <typename MatcherTuple, typename ValueTuple>
57803b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackbornvoid ExplainMatchFailureTupleTo(const MatcherTuple& matchers,
57903b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn                                const ValueTuple& values,
580a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng                                ::std::ostream* os) {
581a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng  using ::std::tr1::tuple_size;
582a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng  TuplePrefix<tuple_size<MatcherTuple>::value>::ExplainMatchFailuresTo(
583a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng      matchers, values, os);
584a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng}
585a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng
586a0009d14075b5345b8f916c3fb3f2260c938cb9dYuhao Zheng// The MatcherCastImpl class template is a helper for implementing
587155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// MatcherCast().  We need this helper in order to partially
588155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// specialize the implementation of MatcherCast() (C++ allows
589155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// class/struct templates to be partially specialized, but not
590155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// function templates.).
591155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
592155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// This general version is used when MatcherCast()'s argument is a
59348444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills// polymorphic matcher (i.e. something that can be converted to a
59448444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Wills// Matcher but is not one yet; for example, Eq(value)).
59548444cb4214a48a3a0bf4bbb93945c2aa68c9980Mitchell Willstemplate <typename T, typename M>
596ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalleclass MatcherCastImpl {
597ebb7e0cb4572f73325a749539d589ebdefb8635cvandwalle public:
598155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  static Matcher<T> Cast(M polymorphic_matcher) {
599155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return Matcher<T>(polymorphic_matcher);
600bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  }
601bdac915b98217c63284b47a7925f0719c8e40844Wei Wang};
602bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
603bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// This more specialized version is used when MatcherCast()'s argument
604bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// is already a Matcher.  This only compiles when type T can be
605bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// statically converted to type U.
606bdac915b98217c63284b47a7925f0719c8e40844Wei Wangtemplate <typename T, typename U>
607bdac915b98217c63284b47a7925f0719c8e40844Wei Wangclass MatcherCastImpl<T, Matcher<U> > {
608bdac915b98217c63284b47a7925f0719c8e40844Wei Wang public:
609bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  static Matcher<T> Cast(const Matcher<U>& source_matcher) {
610bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    return Matcher<T>(new Impl(source_matcher));
611bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  }
612bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
613bdac915b98217c63284b47a7925f0719c8e40844Wei Wang private:
614bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  class Impl : public MatcherInterface<T> {
615bdac915b98217c63284b47a7925f0719c8e40844Wei Wang   public:
616bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    explicit Impl(const Matcher<U>& source_matcher)
617bdac915b98217c63284b47a7925f0719c8e40844Wei Wang        : source_matcher_(source_matcher) {}
618bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
619bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    // We delegate the matching logic to the source matcher.
620bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
621bdac915b98217c63284b47a7925f0719c8e40844Wei Wang      return source_matcher_.MatchAndExplain(static_cast<U>(x), listener);
622bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    }
623bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
624bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    virtual void DescribeTo(::std::ostream* os) const {
625bdac915b98217c63284b47a7925f0719c8e40844Wei Wang      source_matcher_.DescribeTo(os);
626bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    }
627bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
628bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    virtual void DescribeNegationTo(::std::ostream* os) const {
629bdac915b98217c63284b47a7925f0719c8e40844Wei Wang      source_matcher_.DescribeNegationTo(os);
630bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    }
631bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
632bdac915b98217c63284b47a7925f0719c8e40844Wei Wang   private:
633bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    const Matcher<U> source_matcher_;
634bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
635bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    GTEST_DISALLOW_ASSIGN_(Impl);
636bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  };
637bdac915b98217c63284b47a7925f0719c8e40844Wei Wang};
638bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
6398fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley// This even more specialized version is used for efficiently casting
640ba3f5bc64ef27f2ec0d3eae3f53c633ea9e66268Amin Shaikh// a matcher to its own type.
641f3f4029b3ac41da4cc6a1bc22bae47c750a47048Andres Moralestemplate <typename T>
642ba3f5bc64ef27f2ec0d3eae3f53c633ea9e66268Amin Shaikhclass MatcherCastImpl<T, Matcher<T> > {
643ba3f5bc64ef27f2ec0d3eae3f53c633ea9e66268Amin Shaikh public:
644f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  static Matcher<T> Cast(const Matcher<T>& matcher) { return matcher; }
645ba3f5bc64ef27f2ec0d3eae3f53c633ea9e66268Amin Shaikh};
6463f7ef65ab71619040032aee96b5599849881d6fdAndres Morales
6473f7ef65ab71619040032aee96b5599849881d6fdAndres Morales// Implements A<T>().
6481227b49a94f33844ad0606b48b591bea4d27b08eVinit Deshpandetemplate <typename T>
6491227b49a94f33844ad0606b48b591bea4d27b08eVinit Deshpandeclass AnyMatcherImpl : public MatcherInterface<T> {
6501227b49a94f33844ad0606b48b591bea4d27b08eVinit Deshpande public:
65103b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn  virtual bool MatchAndExplain(
65203b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn      T /* x */, MatchResultListener* /* listener */) const { return true; }
6531227b49a94f33844ad0606b48b591bea4d27b08eVinit Deshpande  virtual void DescribeTo(::std::ostream* os) const { *os << "is anything"; }
65403b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn  virtual void DescribeNegationTo(::std::ostream* os) const {
65503b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn    // This is mostly for completeness' safe, as it's not very useful
65603b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn    // to write Not(A<bool>()).  However we cannot completely rule out
65703b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn    // such a possibility, and it doesn't hurt to be prepared.
65803b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn    *os << "never matches";
65903b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn  }
66003b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn};
66103b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn
66203b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn// Implements _, a matcher that matches any value of any
66303b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn// type.  This is a polymorphic matcher, so we need a template type
66403b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn// conversion operator to make it appearing as a Matcher<T> for any
66503b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn// type T.
66603b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackbornclass AnythingMatcher {
667bdac915b98217c63284b47a7925f0719c8e40844Wei Wang public:
668bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  template <typename T>
66903b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn  operator Matcher<T>() const { return A<T>(); }
67003b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn};
67103b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn
672cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein// Implements a matcher that compares a given value with a
673cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein// pre-supplied value using one of the ==, <=, <, etc, operators.  The
674cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein// two values being compared don't have to have the same type.
675cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein//
676cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein// The matcher defined here is polymorphic (for example, Eq(5) can be
677edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein// used to match an int, a short, a double, etc).  Therefore we use
678edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein// a template type conversion operator in the implementation.
679edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein//
680edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein// We define this as a macro in order to eliminate duplicated source
681edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein// code.
682155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//
683155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// The following template definition assumes that the Rhs parameter is
684a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande// a "bare" type (i.e. neither 'const T' nor 'T&').
685155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#define GMOCK_IMPLEMENT_COMPARISON_MATCHER_( \
686155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    name, op, relation, negated_relation) \
687155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  template <typename Rhs> class name##Matcher { \
688155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande   public: \
68931891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    explicit name##Matcher(const Rhs& rhs) : rhs_(rhs) {} \
6909086afccf6938a49eb9a2cd248917c1cb0943942vandwalle    template <typename Lhs> \
691155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    operator Matcher<Lhs>() const { \
6929086afccf6938a49eb9a2cd248917c1cb0943942vandwalle      return MakeMatcher(new Impl<Lhs>(rhs_)); \
6939086afccf6938a49eb9a2cd248917c1cb0943942vandwalle    } \
6949086afccf6938a49eb9a2cd248917c1cb0943942vandwalle   private: \
695155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    template <typename Lhs> \
696155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    class Impl : public MatcherInterface<Lhs> { \
6979878c61bbd81176561991be025af44efc67332feWenchao Tong     public: \
6989878c61bbd81176561991be025af44efc67332feWenchao Tong      explicit Impl(const Rhs& rhs) : rhs_(rhs) {} \
6999878c61bbd81176561991be025af44efc67332feWenchao Tong      virtual bool MatchAndExplain(\
7009878c61bbd81176561991be025af44efc67332feWenchao Tong          Lhs lhs, MatchResultListener* /* listener */) const { \
7019878c61bbd81176561991be025af44efc67332feWenchao Tong        return lhs op rhs_; \
702155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      } \
703155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      virtual void DescribeTo(::std::ostream* os) const { \
704a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande        *os << relation  " "; \
705155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        UniversalPrint(rhs_, os); \
706155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      } \
707155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      virtual void DescribeNegationTo(::std::ostream* os) const { \
708155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        *os << negated_relation  " "; \
709155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        UniversalPrint(rhs_, os); \
710155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      } \
711155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande     private: \
712155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      Rhs rhs_; \
713155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      GTEST_DISALLOW_ASSIGN_(Impl); \
714155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }; \
715155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    Rhs rhs_; \
716155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    GTEST_DISALLOW_ASSIGN_(name##Matcher); \
717155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
718155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
719155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Implements Eq(v), Ge(v), Gt(v), Le(v), Lt(v), and Ne(v)
7202fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein// respectively.
7212fd9436184ea37a297f2abd5e884d30d0014b620Rebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Eq, ==, "is equal to", "isn't equal to");
7222fd9436184ea37a297f2abd5e884d30d0014b620Rebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ge, >=, "is >=", "isn't >=");
7232fd9436184ea37a297f2abd5e884d30d0014b620Rebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Gt, >, "is >", "isn't >");
724de6ff4c1fc87364efc5fa15de31325b4450548b0Rebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Le, <=, "is <=", "isn't <=");
725de6ff4c1fc87364efc5fa15de31325b4450548b0Rebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Lt, <, "is <", "isn't <");
726de6ff4c1fc87364efc5fa15de31325b4450548b0Rebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ne, !=, "isn't equal to", "is equal to");
727de6ff4c1fc87364efc5fa15de31325b4450548b0Rebecca Silberstein
728de6ff4c1fc87364efc5fa15de31325b4450548b0Rebecca Silberstein#undef GMOCK_IMPLEMENT_COMPARISON_MATCHER_
729de6ff4c1fc87364efc5fa15de31325b4450548b0Rebecca Silberstein
730155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Implements the polymorphic IsNull() matcher, which matches any raw or smart
731155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// pointer that is NULL.
732155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass IsNullMatcher {
733155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public:
734155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  template <typename Pointer>
735155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  bool MatchAndExplain(const Pointer& p,
7368fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley                       MatchResultListener* /* listener */) const {
737dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov    return GetRawPointer(p) == NULL;
738dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov  }
739155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
740155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  void DescribeTo(::std::ostream* os) const { *os << "is NULL"; }
74105d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein  void DescribeNegationTo(::std::ostream* os) const {
74205d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein    *os << "isn't NULL";
74305d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein  }
74405d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein};
74505d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein
74605d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein// Implements the polymorphic NotNull() matcher, which matches any raw or smart
74705d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein// pointer that is not NULL.
748de6ff4c1fc87364efc5fa15de31325b4450548b0Rebecca Silbersteinclass NotNullMatcher {
74905d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein public:
75005d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein  template <typename Pointer>
75105d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein  bool MatchAndExplain(const Pointer& p,
75205d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein                       MatchResultListener* /* listener */) const {
75305d6ff7612ee795daf3a6fd0ee5a99e01c7a8685Rebecca Silberstein    return GetRawPointer(p) != NULL;
754155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
755155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
756155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  void DescribeTo(::std::ostream* os) const { *os << "isn't NULL"; }
757155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  void DescribeNegationTo(::std::ostream* os) const {
758155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    *os << "is NULL";
759155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
760155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande};
761155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
762155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Ref(variable) matches any argument that is a reference to
763155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// 'variable'.  This matcher is polymorphic as it can match any
764155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// super type of the type of 'variable'.
765155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//
766155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// The RefMatcher template class implements Ref(variable).  It can
767155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// only be instantiated with a reference type.  This prevents a user
768dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov// from mistakenly using Ref(x) to match a non-reference function
769dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov// argument.  For example, the following will righteously cause a
770dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov// compiler error:
771dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov//
772dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov//   int n;
773dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov//   Matcher<int> m1 = Ref(n);   // This won't compile.
77402938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov//   Matcher<int&> m2 = Ref(n);  // This will compile.
775dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganovtemplate <typename T>
776dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganovclass RefMatcher;
777dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov
778dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganovtemplate <typename T>
779dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganovclass RefMatcher<T&> {
780dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov  // Google Mock is a generic framework and thus needs to support
78102938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov  // mocking any function types, including those that take non-const
782dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov  // reference arguments.  Therefore the template parameter T (and
783dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov  // Super below) can be instantiated to either a const type or a
784dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov  // non-const type.
785dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov public:
786dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov  // RefMatcher() takes a T& instead of const T&, as we want the
787dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov  // compiler to catch using Ref(const_value) as a matcher for a
788155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // non-const reference.
789155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  explicit RefMatcher(T& x) : object_(x) {}  // NOLINT
790155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
791155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  template <typename Super>
792155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  operator Matcher<Super&>() const {
793155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    // By passing object_ (type T&) to Impl(), which expects a Super&,
794155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    // we make sure that Super is a super type of T.  In particular,
795155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    // this catches using Ref(const_value) as a matcher for a
796155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    // non-const reference, as you cannot implicitly convert a const
797155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    // reference to a non-const reference.
798155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return MakeMatcher(new Impl<Super>(object_));
799155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
8008fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley
801155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private:
802155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  template <typename Super>
803f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  class Impl : public MatcherInterface<Super&> {
804155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande   public:
805155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    explicit Impl(Super& x) : object_(x) {}  // NOLINT
806155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
807155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    // MatchAndExplain() takes a Super& (as opposed to const Super&)
808155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    // in order to match the interface MatcherInterface<Super&>.
809155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    virtual bool MatchAndExplain(
810155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        Super& x, MatchResultListener* listener) const {
811155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      *listener << "which is located @" << static_cast<const void*>(&x);
812155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      return &x == &object_;
8138fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley    }
814155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
815328fc5407927799843c11f2b767a8cf47b89f366Robert Greenwalt    virtual void DescribeTo(::std::ostream* os) const {
8163871ff67f4a6970f1831fc8951392746c9e2bfa2Rebecca Silberstein      *os << "references the variable ";
817f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao      UniversalPrinter<Super&>::Print(object_, os);
818f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    }
819f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao
820f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scott    virtual void DescribeNegationTo(::std::ostream* os) const {
82113cddb5337418359eb5f9bebd0504fbc5c47fc41Julia Reynolds      *os << "does not reference the variable ";
82213cddb5337418359eb5f9bebd0504fbc5c47fc41Julia Reynolds      UniversalPrinter<Super&>::Print(object_, os);
823155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
824d03a9283285bb7adef6c687eb3a91fa4a8c4b502Vinit Deshpande
8251f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein   private:
8261f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein    const Super& object_;
8271f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein
828155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    GTEST_DISALLOW_ASSIGN_(Impl);
829155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  };
830155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
831155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  T& object_;
832155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
833155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  GTEST_DISALLOW_ASSIGN_(RefMatcher);
834155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande};
835155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
836155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Polymorphic helper functions for narrow and wide string matchers.
837155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeinline bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs) {
838155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  return String::CaseInsensitiveCStringEquals(lhs, rhs);
839155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande}
840155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
8418fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wileyinline bool CaseInsensitiveCStringEquals(const wchar_t* lhs,
842155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                                         const wchar_t* rhs) {
843155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  return String::CaseInsensitiveWideCStringEquals(lhs, rhs);
844f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao}
845155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
846155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// String comparison for narrow or wide strings that can have embedded NUL
847155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// characters.
848155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename StringType>
849c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silbersteinbool CaseInsensitiveStringEquals(const StringType& s1,
850c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein                                 const StringType& s2) {
851c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein  // Are the heads equal?
852c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein  if (!CaseInsensitiveCStringEquals(s1.c_str(), s2.c_str())) {
853c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein    return false;
854c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein  }
855c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein
856c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein  // Skip the equal heads.
857c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein  const typename StringType::value_type nul = 0;
858c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein  const size_t i1 = s1.find(nul), i2 = s2.find(nul);
859c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein
860c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein  // Are we at the end of either s1 or s2?
861c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein  if (i1 == StringType::npos || i2 == StringType::npos) {
862c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein    return i1 == i2;
863c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein  }
864c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein
865a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  // Are the tails equal?
866a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  return CaseInsensitiveStringEquals(s1.substr(i1 + 1), s2.substr(i2 + 1));
867a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein}
868a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein
869a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein// String matchers.
870003b695597a1f010724662fbf4ac76953a71e3b8Rebecca Silberstein
871a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein// Implements equality-based string matchers like StrEq, StrCaseNe, and etc.
872a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silbersteintemplate <typename StringType>
873a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silbersteinclass StrEqualityMatcher {
874a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein public:
875a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  typedef typename StringType::const_pointer ConstCharPointer;
876a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein
877a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  StrEqualityMatcher(const StringType& str, bool expect_eq,
878a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein                     bool case_sensitive)
879a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein      : string_(str), expect_eq_(expect_eq), case_sensitive_(case_sensitive) {}
880a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein
881a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  // When expect_eq_ is true, returns true iff s is equal to string_;
882a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  // otherwise returns true iff s is not equal to string_.
883a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  bool MatchAndExplain(ConstCharPointer s,
884a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein                       MatchResultListener* listener) const {
885a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    if (s == NULL) {
886a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein      return !expect_eq_;
887a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    }
888a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    return MatchAndExplain(StringType(s), listener);
889a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  }
890a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein
891a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  bool MatchAndExplain(const StringType& s,
892a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein                       MatchResultListener* /* listener */) const {
893a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    const bool eq = case_sensitive_ ? s == string_ :
894a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein        CaseInsensitiveStringEquals(s, string_);
895a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    return expect_eq_ == eq;
896a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  }
897a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein
898a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  void DescribeTo(::std::ostream* os) const {
899a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    DescribeToHelper(expect_eq_, os);
900a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  }
901a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein
902a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  void DescribeNegationTo(::std::ostream* os) const {
903a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    DescribeToHelper(!expect_eq_, os);
904a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  }
905a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein
906a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein private:
907a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  void DescribeToHelper(bool expect_eq, ::std::ostream* os) const {
908a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    *os << (expect_eq ? "is " : "isn't ");
909a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    *os << "equal to ";
910a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    if (!case_sensitive_) {
911a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein      *os << "(ignoring case) ";
912a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    }
913a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    UniversalPrint(string_, os);
914a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  }
915a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein
916a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  const StringType string_;
917a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  const bool expect_eq_;
918a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  const bool case_sensitive_;
919a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein
920a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  GTEST_DISALLOW_ASSIGN_(StrEqualityMatcher);
921a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein};
922c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein
923c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein// Implements the polymorphic HasSubstr(substring) matcher, which
924c9aab08c8e0eb78f8da4e1ffe962b09a9cf0a8a1Rebecca Silberstein// can be used as a Matcher<T> as long as T can be converted to a
925edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein// string.
926aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silbersteintemplate <typename StringType>
927edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silbersteinclass HasSubstrMatcher {
928edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein public:
929edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein  typedef typename StringType::const_pointer ConstCharPointer;
930edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein
931edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein  explicit HasSubstrMatcher(const StringType& substring)
932edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein      : substring_(substring) {}
933edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein
934edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein  // These overloaded methods allow HasSubstr(substring) to be used as a
935edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein  // Matcher<T> as long as T can be converted to string.  Returns true
936edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein  // iff s contains substring_ as a substring.
9371f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein  bool MatchAndExplain(ConstCharPointer s,
9381f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein                       MatchResultListener* listener) const {
9391f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein    return s != NULL && MatchAndExplain(StringType(s), listener);
9401f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein  }
9411f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein
9421f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein  bool MatchAndExplain(const StringType& s,
943a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein                       MatchResultListener* /* listener */) const {
9441f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein    return s.find(substring_) != StringType::npos;
9451f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein  }
946edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein
947edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein  // Describes what this matcher matches.
94887ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein  void DescribeTo(::std::ostream* os) const {
94987ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein    *os << "has substring ";
95087ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein    UniversalPrint(substring_, os);
95187ac618aa0ccfe488c4601d7d26cfc9a9ef71785Rebecca Silberstein  }
952edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein
953edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein  void DescribeNegationTo(::std::ostream* os) const {
954edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein    *os << "has no substring ";
955edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein    UniversalPrint(substring_, os);
956edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein  }
957edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein
9581f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein private:
9591f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein  const StringType substring_;
960edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein
961edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein  GTEST_DISALLOW_ASSIGN_(HasSubstrMatcher);
962edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein};
963edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein
964edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein// Implements the polymorphic StartsWith(substring) matcher, which
965edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein// can be used as a Matcher<T> as long as T can be converted to a
966edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein// string.
967edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silbersteintemplate <typename StringType>
968edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silbersteinclass StartsWithMatcher {
969edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein public:
970edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein  typedef typename StringType::const_pointer ConstCharPointer;
971edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein
972edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein  explicit StartsWithMatcher(const StringType& prefix) : prefix_(prefix) {
973edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein  }
974edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein
975edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein  // These overloaded methods allow StartsWith(prefix) to be used as a
9761f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein  // Matcher<T> as long as T can be converted to string.  Returns true
9771f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein  // iff s starts with prefix_.
9781f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein  bool MatchAndExplain(ConstCharPointer s,
979edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein                       MatchResultListener* listener) const {
980edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein    return s != NULL && MatchAndExplain(StringType(s), listener);
9811f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein  }
9821f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein
9831f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein  bool MatchAndExplain(const StringType& s,
9841f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein                       MatchResultListener* /* listener */) const {
9851f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein    return s.length() >= prefix_.length() &&
9861f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein        s.substr(0, prefix_.length()) == prefix_;
9871f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein  }
988edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein
9891f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein  void DescribeTo(::std::ostream* os) const {
9901f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein    *os << "starts with ";
991edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein    UniversalPrint(prefix_, os);
992edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein  }
993edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein
994edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein  void DescribeNegationTo(::std::ostream* os) const {
995edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein    *os << "doesn't start with ";
996edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein    UniversalPrint(prefix_, os);
997edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein  }
998edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein
999edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein private:
1000edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein  const StringType prefix_;
1001edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein
1002edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein  GTEST_DISALLOW_ASSIGN_(StartsWithMatcher);
1003edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein};
1004edabcd4004fe1ad46e58ee973906913cc3edc79eRebecca Silberstein
1005878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// Implements the polymorphic EndsWith(substring) matcher, which
1006878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// can be used as a Matcher<T> as long as T can be converted to a
10072f47b2755faffaa1a011ddeb8527bd9c99bb6106Rebecca Silberstein// string.
10081f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silbersteintemplate <typename StringType>
1009878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silbersteinclass EndsWithMatcher {
1010878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein public:
10112f47b2755faffaa1a011ddeb8527bd9c99bb6106Rebecca Silberstein  typedef typename StringType::const_pointer ConstCharPointer;
10121f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein
1013878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  explicit EndsWithMatcher(const StringType& suffix) : suffix_(suffix) {}
1014878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein
1015878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  // These overloaded methods allow EndsWith(suffix) to be used as a
1016878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  // Matcher<T> as long as T can be converted to string.  Returns true
1017878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  // iff s ends with suffix_.
1018878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  bool MatchAndExplain(ConstCharPointer s,
1019878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein                       MatchResultListener* listener) const {
1020878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein    return s != NULL && MatchAndExplain(StringType(s), listener);
1021878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  }
1022878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein
1023878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  bool MatchAndExplain(const StringType& s,
1024878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein                       MatchResultListener* /* listener */) const {
1025878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein    return s.length() >= suffix_.length() &&
1026878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein        s.substr(s.length() - suffix_.length()) == suffix_;
1027a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  }
1028a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein
1029a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  void DescribeTo(::std::ostream* os) const {
1030878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein    *os << "ends with ";
1031878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein    UniversalPrint(suffix_, os);
1032878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  }
1033878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein
1034878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  void DescribeNegationTo(::std::ostream* os) const {
1035878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein    *os << "doesn't end with ";
1036878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein    UniversalPrint(suffix_, os);
1037a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  }
1038a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein
1039a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein private:
1040a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  const StringType suffix_;
1041a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein
1042a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  GTEST_DISALLOW_ASSIGN_(EndsWithMatcher);
1043a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein};
1044a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein
1045a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein// Implements polymorphic matchers MatchesRegex(regex) and
1046a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein// ContainsRegex(regex), which can be used as a Matcher<T> as long as
1047a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein// T can be converted to a string.
1048a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silbersteinclass MatchesRegexMatcher {
1049878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein public:
1050878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  MatchesRegexMatcher(const RE* regex, bool full_match)
1051878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein      : regex_(regex), full_match_(full_match) {}
1052878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein
1053878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  // These overloaded methods allow MatchesRegex(regex) to be used as
1054878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  // a Matcher<T> as long as T can be converted to string.  Returns
1055878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  // true iff s matches regular expression regex.  When full_match_ is
1056878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  // true, a full match is done; otherwise a partial match is done.
1057878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  bool MatchAndExplain(const char* s,
1058878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein                       MatchResultListener* listener) const {
1059878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein    return s != NULL && MatchAndExplain(internal::string(s), listener);
1060878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  }
1061878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein
1062878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  bool MatchAndExplain(const internal::string& s,
1063878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein                       MatchResultListener* /* listener */) const {
1064878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein    return full_match_ ? RE::FullMatch(s, *regex_) :
1065878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein        RE::PartialMatch(s, *regex_);
10661f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein  }
1067878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein
1068878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  void DescribeTo(::std::ostream* os) const {
1069878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein    *os << (full_match_ ? "matches" : "contains")
1070878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein        << " regular expression ";
1071878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein    UniversalPrinter<internal::string>::Print(regex_->pattern(), os);
1072878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  }
1073878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein
1074878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  void DescribeNegationTo(::std::ostream* os) const {
1075878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein    *os << "doesn't " << (full_match_ ? "match" : "contain")
1076878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein        << " regular expression ";
1077878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein    UniversalPrinter<internal::string>::Print(regex_->pattern(), os);
1078878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  }
1079878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein
1080878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein private:
1081878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  const internal::linked_ptr<const RE> regex_;
1082878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  const bool full_match_;
1083878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein
1084878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  GTEST_DISALLOW_ASSIGN_(MatchesRegexMatcher);
1085878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein};
10861f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein
1087878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// Implements a matcher that compares the two fields of a 2-tuple
1088878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// using one of the ==, <=, <, etc, operators.  The two fields being
1089878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// compared don't have to have the same type.
1090878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein//
1091878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// The matcher defined here is polymorphic (for example, Eq() can be
1092878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// used to match a tuple<int, short>, a tuple<const long&, double>,
1093878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// etc).  Therefore we use a template type conversion operator in the
1094878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// implementation.
1095878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein//
1096878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// We define this as a macro in order to eliminate duplicated source
1097878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// code.
1098878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein#define GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(name, op) \
1099878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  class name##2Matcher { \
1100878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein   public: \
1101878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein    template <typename T1, typename T2> \
1102878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein    operator Matcher<const ::std::tr1::tuple<T1, T2>&>() const { \
1103878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein      return MakeMatcher(new Impl<T1, T2>); \
1104878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein    } \
1105878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein   private: \
1106878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein    template <typename T1, typename T2> \
1107878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein    class Impl : public MatcherInterface<const ::std::tr1::tuple<T1, T2>&> { \
1108878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein     public: \
1109878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein      virtual bool MatchAndExplain( \
1110878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein          const ::std::tr1::tuple<T1, T2>& args, \
1111878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein          MatchResultListener* /* listener */) const { \
1112878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein        return ::std::tr1::get<0>(args) op ::std::tr1::get<1>(args); \
1113878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein      } \
1114878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein      virtual void DescribeTo(::std::ostream* os) const { \
1115878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein        *os << "are a pair (x, y) where x " #op " y"; \
1116878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein      } \
1117878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein      virtual void DescribeNegationTo(::std::ostream* os) const { \
1118878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein        *os << "are a pair (x, y) where x " #op " y is false"; \
1119878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein      } \
1120878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein    }; \
1121878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein  }
1122878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein
11230025465e311fe9504cd79610523a1b8171995accRebecca Silberstein// Implements Eq(), Ge(), Gt(), Le(), Lt(), and Ne() respectively.
11240025465e311fe9504cd79610523a1b8171995accRebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Eq, ==);
11250025465e311fe9504cd79610523a1b8171995accRebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Ge, >=);
11260025465e311fe9504cd79610523a1b8171995accRebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Gt, >);
11270025465e311fe9504cd79610523a1b8171995accRebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Le, <=);
11280025465e311fe9504cd79610523a1b8171995accRebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Lt, <);
11290025465e311fe9504cd79610523a1b8171995accRebecca SilbersteinGMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Ne, !=);
1130aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein
1131aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein#undef GMOCK_IMPLEMENT_COMPARISON2_MATCHER_
1132aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein
1133aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein// Implements the Not(...) matcher for a particular argument type T.
11340f257d8ab5787450bdd24119ad809ffdfd29f98dRebecca Silberstein// We do not nest it inside the NotMatcher class template, as that
1135aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein// will prevent different instantiations of NotMatcher from sharing
11360025465e311fe9504cd79610523a1b8171995accRebecca Silberstein// the same NotMatcherImpl<T> class.
1137aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silbersteintemplate <typename T>
1138aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silbersteinclass NotMatcherImpl : public MatcherInterface<T> {
1139aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein public:
1140aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein  explicit NotMatcherImpl(const Matcher<T>& matcher)
1141aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein      : matcher_(matcher) {}
1142aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein
1143aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein  virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
11440f257d8ab5787450bdd24119ad809ffdfd29f98dRebecca Silberstein    return !matcher_.MatchAndExplain(x, listener);
11452fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein  }
11462fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein
11472fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein  virtual void DescribeTo(::std::ostream* os) const {
1148a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein    matcher_.DescribeNegationTo(os);
11492fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein  }
11502fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein
11510f257d8ab5787450bdd24119ad809ffdfd29f98dRebecca Silberstein  virtual void DescribeNegationTo(::std::ostream* os) const {
11522fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein    matcher_.DescribeTo(os);
11532fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein  }
11542fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein
11552fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein private:
11562fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein  const Matcher<T> matcher_;
11570025465e311fe9504cd79610523a1b8171995accRebecca Silberstein
11580025465e311fe9504cd79610523a1b8171995accRebecca Silberstein  GTEST_DISALLOW_ASSIGN_(NotMatcherImpl);
11590025465e311fe9504cd79610523a1b8171995accRebecca Silberstein};
11600025465e311fe9504cd79610523a1b8171995accRebecca Silberstein
11610025465e311fe9504cd79610523a1b8171995accRebecca Silberstein// Implements the Not(m) matcher, which matches a value that doesn't
1162a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silberstein// match matcher m.
1163a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silbersteintemplate <typename InnerMatcher>
1164a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silbersteinclass NotMatcher {
1165a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silberstein public:
1166a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silberstein  explicit NotMatcher(InnerMatcher matcher) : matcher_(matcher) {}
1167a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silberstein
1168a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silberstein  // This template type conversion operator allows Not(m) to be used
1169a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silberstein  // to match any type m can match.
1170a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silberstein  template <typename T>
1171a6e534fc17203d535ec786b25aad9ff65afdbbeaRebecca Silberstein  operator Matcher<T>() const {
1172a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein    return Matcher<T>(new NotMatcherImpl<T>(SafeMatcherCast<T>(matcher_)));
11732fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein  }
1174a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein
1175a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein private:
1176a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein  InnerMatcher matcher_;
1177a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein
1178a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  GTEST_DISALLOW_ASSIGN_(NotMatcher);
1179a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein};
1180a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein
1181a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein// Implements the AllOf(m1, m2) matcher for a particular argument type
1182a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein// T. We do not nest it inside the BothOfMatcher class template, as
1183a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein// that will prevent different instantiations of BothOfMatcher from
1184a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein// sharing the same BothOfMatcherImpl<T> class.
1185a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silbersteintemplate <typename T>
1186a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silbersteinclass BothOfMatcherImpl : public MatcherInterface<T> {
1187a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein public:
1188a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  BothOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2)
1189a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein      : matcher1_(matcher1), matcher2_(matcher2) {}
1190a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein
1191a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  virtual void DescribeTo(::std::ostream* os) const {
1192a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    *os << "(";
1193a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    matcher1_.DescribeTo(os);
1194a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein    *os << ") and (";
1195a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    matcher2_.DescribeTo(os);
1196a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein    *os << ")";
1197a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  }
1198a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein
1199a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein  virtual void DescribeNegationTo(::std::ostream* os) const {
1200a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    *os << "(";
1201a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    matcher1_.DescribeNegationTo(os);
1202a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    *os << ") or (";
1203a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein    matcher2_.DescribeNegationTo(os);
1204a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein    *os << ")";
1205a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein  }
1206a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein
12071f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein  virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
1208a42d526f8a53b25c58062fed33db5fedda8ceee1Rebecca Silberstein    // If either matcher1_ or matcher2_ doesn't match x, we only need
1209b09edccf2056d1106da4b901e1e8b26841a02a61Rebecca Silberstein    // to explain why one of them fails.
1210a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein    StringMatchResultListener listener1;
1211a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein    if (!matcher1_.MatchAndExplain(x, &listener1)) {
1212a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein      *listener << listener1.str();
1213aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein      return false;
1214aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein    }
1215aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein
1216aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein    StringMatchResultListener listener2;
1217aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein    if (!matcher2_.MatchAndExplain(x, &listener2)) {
1218aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein      *listener << listener2.str();
1219aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein      return false;
1220aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein    }
1221aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein
1222aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein    // Otherwise we need to explain why *both* of them match.
12232fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein    const internal::string s1 = listener1.str();
12242fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein    const internal::string s2 = listener2.str();
12252fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein
1226a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein    if (s1 == "") {
12272fd9436184ea37a297f2abd5e884d30d0014b620Rebecca Silberstein      *listener << s2;
1228a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein    } else {
1229b09edccf2056d1106da4b901e1e8b26841a02a61Rebecca Silberstein      *listener << s1;
1230a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein      if (s2 != "") {
1231a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein        *listener << ", and " << s2;
1232a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein      }
1233a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein    }
1234a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein    return true;
1235a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein  }
1236a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein
1237a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein private:
1238a2cbd2429606052cf6f2306c54f8c590d7a55174Rebecca Silberstein  const Matcher<T> matcher1_;
1239aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein  const Matcher<T> matcher2_;
1240aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein
1241aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein  GTEST_DISALLOW_ASSIGN_(BothOfMatcherImpl);
12420c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein};
12430c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein
12440c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein// Used for implementing the AllOf(m_1, ..., m_n) matcher, which
1245878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein// matches a value that matches all of the matchers m_1, ..., and m_n.
12460c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silbersteintemplate <typename Matcher1, typename Matcher2>
12470c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silbersteinclass BothOfMatcher {
1248878e0cccd652ea556680b9cc101b01142e9ad919Rebecca Silberstein public:
12490c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein  BothOfMatcher(Matcher1 matcher1, Matcher2 matcher2)
12500c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein      : matcher1_(matcher1), matcher2_(matcher2) {}
12510c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein
12520c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein  // This template type conversion operator allows a
12530c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein  // BothOfMatcher<Matcher1, Matcher2> object to match any type that
12540c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein  // both Matcher1 and Matcher2 can match.
1255a39790ac184ea4b5fb5422c06d0aea0f03fbc6dbRebecca Silberstein  template <typename T>
12560c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein  operator Matcher<T>() const {
12570c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein    return Matcher<T>(new BothOfMatcherImpl<T>(SafeMatcherCast<T>(matcher1_),
12580c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein                                               SafeMatcherCast<T>(matcher2_)));
12590c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein  }
12600c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein
12610c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein private:
12620c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein  Matcher1 matcher1_;
12630c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein  Matcher2 matcher2_;
12640c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein
12650c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein  GTEST_DISALLOW_ASSIGN_(BothOfMatcher);
12660c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein};
12670c96f88c6d9f031ab76392cdb1255bd249212ad3Rebecca Silberstein
1268aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein// Implements the AnyOf(m1, m2) matcher for a particular argument type
1269aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein// T.  We do not nest it inside the AnyOfMatcher class template, as
1270cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein// that will prevent different instantiations of AnyOfMatcher from
1271cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein// sharing the same EitherOfMatcherImpl<T> class.
1272aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silbersteintemplate <typename T>
1273aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silbersteinclass EitherOfMatcherImpl : public MatcherInterface<T> {
1274aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein public:
1275aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein  EitherOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2)
1276aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein      : matcher1_(matcher1), matcher2_(matcher2) {}
1277aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein
1278aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein  virtual void DescribeTo(::std::ostream* os) const {
1279aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein    *os << "(";
1280aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein    matcher1_.DescribeTo(os);
1281aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein    *os << ") or (";
1282cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein    matcher2_.DescribeTo(os);
1283cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein    *os << ")";
1284cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein  }
1285cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein
1286cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein  virtual void DescribeNegationTo(::std::ostream* os) const {
1287aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein    *os << "(";
1288aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein    matcher1_.DescribeNegationTo(os);
1289aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein    *os << ") and (";
1290aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein    matcher2_.DescribeNegationTo(os);
1291aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein    *os << ")";
1292aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein  }
1293aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein
1294aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein  virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
1295cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein    // If either matcher1_ or matcher2_ matches x, we just need to
1296cd1587091a7a9c0b175fc64f33b6f17e62215829Rebecca Silberstein    // explain why *one* of them matches.
1297aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein    StringMatchResultListener listener1;
1298aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein    if (matcher1_.MatchAndExplain(x, &listener1)) {
1299aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein      *listener << listener1.str();
1300aaa03cbbf831e3518d849d0742539fdf39f0627cRebecca Silberstein      return true;
1301155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
1302155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
13035c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein    StringMatchResultListener listener2;
13045c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein    if (matcher2_.MatchAndExplain(x, &listener2)) {
1305155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      *listener << listener2.str();
13068fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley      return true;
1307155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
1308155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
13095c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein    // Otherwise we need to explain why *both* of them fail.
13105c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein    const internal::string s1 = listener1.str();
13115c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein    const internal::string s2 = listener2.str();
13125c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein
13135c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein    if (s1 == "") {
13145c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein      *listener << s2;
13155c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein    } else {
13165c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein      *listener << s1;
1317155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      if (s2 != "") {
1318155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        *listener << ", and " << s2;
1319155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      }
1320155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
1321155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return false;
1322155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
13235c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein
1324155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private:
13258fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley  const Matcher<T> matcher1_;
1326155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  const Matcher<T> matcher2_;
1327155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
13285c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein  GTEST_DISALLOW_ASSIGN_(EitherOfMatcherImpl);
13295c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein};
13305c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein
13315c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein// Used for implementing the AnyOf(m_1, ..., m_n) matcher, which
13325c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein// matches a value that matches at least one of the matchers m_1, ...,
13335c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silberstein// and m_n.
13345c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silbersteintemplate <typename Matcher1, typename Matcher2>
13355c5e8b347d32f7bf5bb1e6f40b1e350f1e9fb0f3Rebecca Silbersteinclass EitherOfMatcher {
1336155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public:
1337155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  EitherOfMatcher(Matcher1 matcher1, Matcher2 matcher2)
1338d03a9283285bb7adef6c687eb3a91fa4a8c4b502Vinit Deshpande      : matcher1_(matcher1), matcher2_(matcher2) {}
1339155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1340155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // This template type conversion operator allows a
1341155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // EitherOfMatcher<Matcher1, Matcher2> object to match any type that
1342155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // both Matcher1 and Matcher2 can match.
1343155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  template <typename T>
1344155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  operator Matcher<T>() const {
1345155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return Matcher<T>(new EitherOfMatcherImpl<T>(
13468fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley        SafeMatcherCast<T>(matcher1_), SafeMatcherCast<T>(matcher2_)));
1347155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
13488fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley
1349155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private:
1350155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  Matcher1 matcher1_;
1351f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  Matcher2 matcher2_;
1352155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1353155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  GTEST_DISALLOW_ASSIGN_(EitherOfMatcher);
1354155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande};
1355155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1356155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Used for implementing Truly(pred), which turns a predicate into a
1357155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// matcher.
13588fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wileytemplate <typename Predicate>
1359155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass TrulyMatcher {
1360155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public:
1361f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  explicit TrulyMatcher(Predicate pred) : predicate_(pred) {}
1362155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1363155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // This method template allows Truly(pred) to be used as a matcher
1364155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // for type T where T is the argument type of predicate 'pred'.  The
1365155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // argument is passed by reference as the predicate may be
1366155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // interested in the address of the argument.
1367155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  template <typename T>
13688fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley  bool MatchAndExplain(T& x,  // NOLINT
1369155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                       MatchResultListener* /* listener */) const {
1370155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#if GTEST_OS_WINDOWS
1371f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    // MSVC warns about converting a value into bool (warning 4800).
1372155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#pragma warning(push)          // Saves the current warning state.
1373155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#pragma warning(disable:4800)  // Temporarily disables warning 4800.
1374155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#endif  // GTEST_OS_WINDOWS
1375155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return predicate_(x);
1376155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#if GTEST_OS_WINDOWS
1377155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande#pragma warning(pop)           // Restores the warning state.
13788fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley#endif  // GTEST_OS_WINDOWS
1379155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
1380155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1381f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  void DescribeTo(::std::ostream* os) const {
1382155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    *os << "satisfies the given predicate";
1383155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
1384155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1385155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  void DescribeNegationTo(::std::ostream* os) const {
1386048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande    *os << "doesn't satisfy the given predicate";
1387a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande  }
13888fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley
1389048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande private:
1390a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande  Predicate predicate_;
1391f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao
1392a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande  GTEST_DISALLOW_ASSIGN_(TrulyMatcher);
1393048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande};
1394a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande
1395a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande// Used for implementing Matches(matcher), which turns a matcher into
1396048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande// a predicate.
1397a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandetemplate <typename M>
1398a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpandeclass MatcherAsPredicate {
1399a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande public:
1400c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski  explicit MatcherAsPredicate(M matcher) : matcher_(matcher) {}
1401c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski
1402c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski  // This template operator() allows Matches(m) to be used as a
1403f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  // predicate on type T where m is a matcher on type T.
1404c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski  //
1405c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski  // The argument x is passed by reference instead of by value, as
1406c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski  // some matcher may be interested in its address (e.g. as in
1407c48fd721a9a3273f0faa927d93caad4c9832af7dAdam Lesinski  // Matches(Ref(n))(x)).
1408a632d8a6edd350c7644b593b18eceaa5b368505bVinit Deshpande  template <typename T>
140994a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski  bool operator()(const T& x) const {
1410200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle    // We let matcher_ commit to a particular type here instead of
14118fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley    // when the MatcherAsPredicate object was constructed.  This
1412048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande    // allows us to write Matches(m) where m is a polymorphic matcher
1413200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle    // (e.g. Eq(5)).
1414f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    //
14151f8f2971309aee4de9c35723f6fbca6fcab9a3beMitchell Wills    // If we write Matcher<T>(matcher_).Matches(x) here, it won't
14161f8f2971309aee4de9c35723f6fbca6fcab9a3beMitchell Wills    // compile when matcher_ has type Matcher<const T&>; if we write
14171f8f2971309aee4de9c35723f6fbca6fcab9a3beMitchell Wills    // Matcher<const T&>(matcher_).Matches(x) here, it won't compile
1418200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle    // when matcher_ has type Matcher<T>; if we just write
1419200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle    // matcher_.Matches(x), it won't compile when matcher_ is
1420200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle    // polymorphic, e.g. Eq(5).
1421048dc8df2bd9394979dbb090b0cfe8d6627d23e3Vinit Deshpande    //
1422200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle    // MatcherCast<const T&>() is necessary for making the code work
142394a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski    // in all of the above situations.
142494a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski    return MatcherCast<const T&>(matcher_).Matches(x);
142594a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski  }
142694a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski
142794a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski private:
142894a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski  M matcher_;
142994a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski
143094a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski  GTEST_DISALLOW_ASSIGN_(MatcherAsPredicate);
143194a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski};
143294a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski
143394a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski// For implementing ASSERT_THAT() and EXPECT_THAT().  The template
14349c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Pius// argument M must be a type that can be converted to a matcher.
14359c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Piustemplate <typename M>
14369c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Piusclass PredicateFormatterFromMatcher {
14379c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Pius public:
14389c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Pius  explicit PredicateFormatterFromMatcher(const M& m) : matcher_(m) {}
14399c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Pius
14409c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Pius  // This template () operator allows a PredicateFormatterFromMatcher
14419c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Pius  // object to act as a predicate-formatter suitable for using with
14429c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Pius  // Google Test's EXPECT_PRED_FORMAT1() macro.
14439c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Pius  template <typename T>
1444a1514cb347fccf11566e5172ed71030c695d2abdRoshan Pius  AssertionResult operator()(const char* value_text, const T& x) const {
144594a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski    // We convert matcher_ to a Matcher<const T&> *now* instead of
144694a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski    // when the PredicateFormatterFromMatcher object was constructed,
144794a2dd090b7d3823058b7a69cf4653d5663708cdAdam Lesinski    // as matcher_ may be polymorphic (e.g. NotNull()) and we won't
1448d76cdd8e08476ad5025f07a5d77a8d8f920a0721Adam Lesinski    // know which type to instantiate it to until we actually see the
1449d76cdd8e08476ad5025f07a5d77a8d8f920a0721Adam Lesinski    // type of x here.
145070b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle    //
145170b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle    // We write MatcherCast<const T&>(matcher_) instead of
145270b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle    // Matcher<const T&>(matcher_), as the latter won't compile when
145370b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle    // matcher_ has type Matcher<T> (e.g. An<int>()).
145470b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle    const Matcher<const T&> matcher = MatcherCast<const T&>(matcher_);
145570b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle    StringMatchResultListener listener;
145670b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle    if (MatchPrintAndExplain(x, matcher, &listener))
14579c8892ebd2ec5340785f6b787805fdc6088069d7Roshan Pius      return AssertionSuccess();
145870b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle
145970b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle    ::std::stringstream ss;
146070b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle    ss << "Value of: " << value_text << "\n"
1461f9946f5663f2d7a9a69cb8b7e82a4ef8b1825c48Mitchell Wills       << "Expected: ";
146270b75cda33a05e8b6e6724ed08e4e72f6fee0471Pierre Vandwalle    matcher.DescribeTo(&ss);
146384a11a3d54b7c6f043dcf7a874b7c0d45709677aPierre Vandwalle    ss << "\n  Actual: " << listener.str();
1464200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle    return AssertionFailure() << ss.str();
1465bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  }
1466200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle
1467a1514cb347fccf11566e5172ed71030c695d2abdRoshan Pius private:
1468200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle  const M matcher_;
14691f8f2971309aee4de9c35723f6fbca6fcab9a3beMitchell Wills
14701f8f2971309aee4de9c35723f6fbca6fcab9a3beMitchell Wills  GTEST_DISALLOW_ASSIGN_(PredicateFormatterFromMatcher);
14711f8f2971309aee4de9c35723f6fbca6fcab9a3beMitchell Wills};
14721f8f2971309aee4de9c35723f6fbca6fcab9a3beMitchell Wills
14731f8f2971309aee4de9c35723f6fbca6fcab9a3beMitchell Wills// A helper function for converting a matcher to a predicate-formatter
1474200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle// without the user needing to explicitly write the type.  This is
1475200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle// used for implementing ASSERT_THAT() and EXPECT_THAT().
1476200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalletemplate <typename M>
1477200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalleinline PredicateFormatterFromMatcher<M>
1478200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalleMakePredicateFormatterFromMatcher(const M& matcher) {
1479200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle  return PredicateFormatterFromMatcher<M>(matcher);
1480200e8ee5097134010a6edee8d031bb02ff7eeb5avandwalle}
1481155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1482155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Implements the polymorphic floating point equality matcher, which
1483155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// matches two float values using ULP-based approximation.  The
14848fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley// template is meant to be instantiated with FloatType being either
1485f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao// float or double.
1486155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename FloatType>
1487f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Raoclass FloatingEqMatcher {
1488155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public:
1489f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao  // Constructor for FloatingEqMatcher.
1490f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao  // The matcher's input will be compared with rhs.  The matcher treats two
1491f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao  // NANs as equal if nan_eq_nan is true.  Otherwise, under IEEE standards,
1492f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao  // equality comparisons between NANs will always return false.
1493f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao  FloatingEqMatcher(FloatType rhs, bool nan_eq_nan) :
1494155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    rhs_(rhs), nan_eq_nan_(nan_eq_nan) {}
1495155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1496155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Implements floating point equality matcher as a Matcher<T>.
1497f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao  template <typename T>
1498155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  class Impl : public MatcherInterface<T> {
1499155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande   public:
1500155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    Impl(FloatType rhs, bool nan_eq_nan) :
15019878c61bbd81176561991be025af44efc67332feWenchao Tong      rhs_(rhs), nan_eq_nan_(nan_eq_nan) {}
15029878c61bbd81176561991be025af44efc67332feWenchao Tong
15039878c61bbd81176561991be025af44efc67332feWenchao Tong    virtual bool MatchAndExplain(T value,
15048fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley                                 MatchResultListener* /* listener */) const {
1505f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao      const FloatingPoint<FloatType> lhs(value), rhs(rhs_);
15069878c61bbd81176561991be025af44efc67332feWenchao Tong
15079878c61bbd81176561991be025af44efc67332feWenchao Tong      // Compares NaNs first, if nan_eq_nan_ is true.
1508f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao      if (nan_eq_nan_ && lhs.is_nan()) {
15099878c61bbd81176561991be025af44efc67332feWenchao Tong        return rhs.is_nan();
1510f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao      }
1511f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao
1512f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao      return lhs.AlmostEquals(rhs);
1513f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao    }
1514f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao
15159878c61bbd81176561991be025af44efc67332feWenchao Tong    virtual void DescribeTo(::std::ostream* os) const {
15169878c61bbd81176561991be025af44efc67332feWenchao Tong      // os->precision() returns the previously set precision, which we
15179878c61bbd81176561991be025af44efc67332feWenchao Tong      // store to restore the ostream to its original configuration
1518f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao      // after outputting.
15199878c61bbd81176561991be025af44efc67332feWenchao Tong      const ::std::streamsize old_precision = os->precision(
15209878c61bbd81176561991be025af44efc67332feWenchao Tong          ::std::numeric_limits<FloatType>::digits10 + 2);
15219878c61bbd81176561991be025af44efc67332feWenchao Tong      if (FloatingPoint<FloatType>(rhs_).is_nan()) {
15229af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu        if (nan_eq_nan_) {
15239af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu          *os << "is NaN";
1524ccbe820337a230f0827f734aca2c51a244a0837fVinit Deshpande        } else {
1525ccbe820337a230f0827f734aca2c51a244a0837fVinit Deshpande          *os << "never matches";
1526ccbe820337a230f0827f734aca2c51a244a0837fVinit Deshpande        }
15278fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley      } else {
1528ccbe820337a230f0827f734aca2c51a244a0837fVinit Deshpande        *os << "is approximately " << rhs_;
1529ccbe820337a230f0827f734aca2c51a244a0837fVinit Deshpande      }
1530f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao      os->precision(old_precision);
15319af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu    }
15329af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu
15339af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu    virtual void DescribeNegationTo(::std::ostream* os) const {
15349af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu      // As before, get original precision.
1535ccbe820337a230f0827f734aca2c51a244a0837fVinit Deshpande      const ::std::streamsize old_precision = os->precision(
1536ccbe820337a230f0827f734aca2c51a244a0837fVinit Deshpande          ::std::numeric_limits<FloatType>::digits10 + 2);
1537ccbe820337a230f0827f734aca2c51a244a0837fVinit Deshpande      if (FloatingPoint<FloatType>(rhs_).is_nan()) {
1538ccbe820337a230f0827f734aca2c51a244a0837fVinit Deshpande        if (nan_eq_nan_) {
1539155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande          *os << "isn't NaN";
1540155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        } else {
1541155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande          *os << "is anything";
1542155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        }
15438fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley      } else {
1544155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        *os << "isn't approximately " << rhs_;
1545155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      }
1546f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao      // Restore original precision.
15478be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele      os->precision(old_precision);
1548d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu    }
1549d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu
1550d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu   private:
1551d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu    const FloatType rhs_;
1552d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu    const bool nan_eq_nan_;
1553d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu
1554d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu    GTEST_DISALLOW_ASSIGN_(Impl);
1555d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu  };
155631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
1557d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu  // The following 3 type conversion operators allow FloatEq(rhs) and
1558d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu  // NanSensitiveFloatEq(rhs) to be used as a Matcher<float>, a
1559d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu  // Matcher<const float&>, or a Matcher<float&>, but nothing else.
1560d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu  // (While Google's C++ coding style doesn't allow arguments passed
1561d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu  // by non-const reference, we may see them in code not conforming to
1562d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu  // the style.  Therefore Google Mock needs to support them.)
1563d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu  operator Matcher<FloatType>() const {
1564d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu    return MakeMatcher(new Impl<FloatType>(rhs_, nan_eq_nan_));
1565d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu  }
1566d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu
1567d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu  operator Matcher<const FloatType&>() const {
1568d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu    return MakeMatcher(new Impl<const FloatType&>(rhs_, nan_eq_nan_));
1569d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu  }
1570d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu
157131891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist  operator Matcher<FloatType&>() const {
1572d35cddaf72ba0d679143fa07e07df330c6893574Peter Qiu    return MakeMatcher(new Impl<FloatType&>(rhs_, nan_eq_nan_));
1573992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle  }
157431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist private:
1575992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle  const FloatType rhs_;
1576992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle  const bool nan_eq_nan_;
1577992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle
1578992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle  GTEST_DISALLOW_ASSIGN_(FloatingEqMatcher);
1579992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle};
1580992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle
1581992ae00f25a9cc22cf5db3261bd7e72927069cf7vandwalle// Implements the Pointee(m) matcher for matching a pointer whose
1582155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// pointee matches matcher m.  The pointer can be either raw or smart.
1583155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename InnerMatcher>
1584155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass PointeeMatcher {
1585155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public:
1586155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  explicit PointeeMatcher(const InnerMatcher& matcher) : matcher_(matcher) {}
1587155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1588155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // This type conversion operator template allows Pointee(m) to be
1589155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // used as a matcher for any pointer type whose pointee type is
1590155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // compatible with the inner matcher, where type Pointer can be
1591155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // either a raw pointer or a smart pointer.
1592155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  //
1593155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // The reason we do this instead of relying on
159431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist  // MakePolymorphicMatcher() is that the latter is not flexible
159531891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist  // enough for implementing the DescribeTo() method of Pointee().
159631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist  template <typename Pointer>
159731891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist  operator Matcher<Pointer>() const {
159831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    return MakeMatcher(new Impl<Pointer>(matcher_));
159931891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist  }
160031891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
160131891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist private:
160231891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist  // The monomorphic implementation that works for a particular pointer type.
160331891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist  template <typename Pointer>
160431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist  class Impl : public MatcherInterface<Pointer> {
160531891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist   public:
160631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    typedef typename PointeeOf<GTEST_REMOVE_CONST_(  // NOLINT
160731891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        GTEST_REMOVE_REFERENCE_(Pointer))>::type Pointee;
160831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
1609155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    explicit Impl(const InnerMatcher& matcher)
1610155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        : matcher_(MatcherCast<const Pointee&>(matcher)) {}
1611155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1612155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    virtual void DescribeTo(::std::ostream* os) const {
1613155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      *os << "points to a value that ";
16148fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley      matcher_.DescribeTo(os);
1615155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
1616155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1617f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    virtual void DescribeNegationTo(::std::ostream* os) const {
1618f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao      *os << "does not point to a value that ";
1619155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      matcher_.DescribeTo(os);
1620155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
1621155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1622155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    virtual bool MatchAndExplain(Pointer pointer,
1623155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                                 MatchResultListener* listener) const {
1624155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      if (GetRawPointer(pointer) == NULL)
1625155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        return false;
1626155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1627155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      *listener << "which points to ";
1628155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      return MatchPrintAndExplain(*pointer, matcher_, listener);
1629155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
1630155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1631155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande   private:
1632155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    const Matcher<const Pointee&> matcher_;
1633155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
16348fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley    GTEST_DISALLOW_ASSIGN_(Impl);
1635155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  };
1636155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1637f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  const InnerMatcher matcher_;
1638f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao
1639f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  GTEST_DISALLOW_ASSIGN_(PointeeMatcher);
1640f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao};
1641f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao
1642155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Implements the Field() matcher for matching a field (i.e. member
1643155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// variable) of an object.
1644155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename Class, typename FieldType>
1645155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass FieldMatcher {
1646155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public:
1647155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  FieldMatcher(FieldType Class::*field,
1648155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande               const Matcher<const FieldType&>& matcher)
1649155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      : field_(field), matcher_(matcher) {}
1650155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1651155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  void DescribeTo(::std::ostream* os) const {
1652155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    *os << "is an object whose given field ";
1653155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    matcher_.DescribeTo(os);
1654155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
1655155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1656155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  void DescribeNegationTo(::std::ostream* os) const {
16578fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley    *os << "is an object whose given field ";
1658155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    matcher_.DescribeNegationTo(os);
1659155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
1660f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao
1661f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  template <typename T>
1662f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  bool MatchAndExplain(const T& value, MatchResultListener* listener) const {
1663155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return MatchAndExplainImpl(
1664155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        typename ::testing::internal::
1665155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande            is_pointer<GTEST_REMOVE_CONST_(T)>::type(),
1666155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        value, listener);
1667155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
1668155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1669155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private:
1670155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // The first argument of MatchAndExplainImpl() is needed to help
1671155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Symbian's C++ compiler choose which overload to use.  Its type is
1672155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // true_type iff the Field() matcher is used to match a pointer.
1673155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj,
1674155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                           MatchResultListener* listener) const {
16758fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley    *listener << "whose given field is ";
1676155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return MatchPrintAndExplain(obj.*field_, matcher_, listener);
1677155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
1678f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao
1679155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p,
1680155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                           MatchResultListener* listener) const {
1681155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    if (p == NULL)
1682155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      return false;
1683155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1684155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    *listener << "which points to an object ";
1685155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    // Since *p has a field, it must be a class/struct/union type and
1686155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    // thus cannot be a pointer.  Therefore we pass false_type() as
1687155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    // the first argument.
1688155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return MatchAndExplainImpl(false_type(), *p, listener);
1689155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
1690155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
16918fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley  const FieldType Class::*field_;
1692155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  const Matcher<const FieldType&> matcher_;
1693155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1694155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  GTEST_DISALLOW_ASSIGN_(FieldMatcher);
1695155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande};
1696155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1697868b692e6faa9ec3c8dd0cd42d4302082e28b992Sohani Rao// Implements the Property() matcher for matching a property
1698868b692e6faa9ec3c8dd0cd42d4302082e28b992Sohani Rao// (i.e. return value of a getter method) of an object.
16991ecb0083490436303cdb89bc4c46b6743ea0afa8Sky Fabertemplate <typename Class, typename PropertyType>
17001ecb0083490436303cdb89bc4c46b6743ea0afa8Sky Faberclass PropertyMatcher {
1701d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca Silberstein public:
1702d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca Silberstein  // The property may have a reference type, so 'const PropertyType&'
1703d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca Silberstein  // may cause double references and fail to compile.  That's why we
1704d94a62ffdf0e7f282948109d05d96e682eb32eefRebecca Silberstein  // need GTEST_REFERENCE_TO_CONST, which works regardless of
1705155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // PropertyType being a reference or not.
1706155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  typedef GTEST_REFERENCE_TO_CONST_(PropertyType) RefToConstProperty;
1707155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1708155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  PropertyMatcher(PropertyType (Class::*property)() const,
1709155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                  const Matcher<RefToConstProperty>& matcher)
17101d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist      : property_(property), matcher_(matcher) {}
1711d28cfdde236d3d7c72f0c57ca7f18622b16d421aPeter Qiu
17123ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu  void DescribeTo(::std::ostream* os) const {
17133ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu    *os << "is an object whose given property ";
17143ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu    matcher_.DescribeTo(os);
17153ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu  }
17163ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu
1717d28cfdde236d3d7c72f0c57ca7f18622b16d421aPeter Qiu  void DescribeNegationTo(::std::ostream* os) const {
17184781e9e2904824ef1fbf8a0cf75e89fa957d6a92Peter Qiu    *os << "is an object whose given property ";
1719f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    matcher_.DescribeNegationTo(os);
17209af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu  }
17219af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu
17229af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu  template <typename T>
17239af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu  bool MatchAndExplain(const T&value, MatchResultListener* listener) const {
172407816a4745b8030911869ceb58fa735e47834fe4Peter Qiu    return MatchAndExplainImpl(
172507816a4745b8030911869ceb58fa735e47834fe4Peter Qiu        typename ::testing::internal::
17263ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu            is_pointer<GTEST_REMOVE_CONST_(T)>::type(),
17273ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu        value, listener);
17283ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu  }
17293ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu
17303ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu private:
17313ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu  // The first argument of MatchAndExplainImpl() is needed to help
17323ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu  // Symbian's C++ compiler choose which overload to use.  Its type is
17333ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu  // true_type iff the Property() matcher is used to match a pointer.
17343ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu  bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj,
17353ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu                           MatchResultListener* listener) const {
17364781e9e2904824ef1fbf8a0cf75e89fa957d6a92Peter Qiu    *listener << "whose given property is ";
1737f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    // Cannot pass the return value (for example, int) to MatchPrintAndExplain,
17389af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu    // which takes a non-const reference as argument.
17399af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu    RefToConstProperty result = (obj.*property_)();
17409af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu    return MatchPrintAndExplain(result, matcher_, listener);
17419af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu  }
1742dd97694345f47ba6a952c1162e7dcdd66fb72060Peter Qiu
17433ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu  bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p,
17443ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu                           MatchResultListener* listener) const {
17453ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu    if (p == NULL)
17463ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu      return false;
17473ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu
1748d28cfdde236d3d7c72f0c57ca7f18622b16d421aPeter Qiu    *listener << "which points to an object ";
1749d28cfdde236d3d7c72f0c57ca7f18622b16d421aPeter Qiu    // Since *p has a property method, it must be a class/struct/union
1750d28cfdde236d3d7c72f0c57ca7f18622b16d421aPeter Qiu    // type and thus cannot be a pointer.  Therefore we pass
17513ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu    // false_type() as the first argument.
17523ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu    return MatchAndExplainImpl(false_type(), *p, listener);
17533ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu  }
17544781e9e2904824ef1fbf8a0cf75e89fa957d6a92Peter Qiu
1755f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  PropertyType (Class::*property_)() const;
17569af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu  const Matcher<RefToConstProperty> matcher_;
17579af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu
17589af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu  GTEST_DISALLOW_ASSIGN_(PropertyMatcher);
17599af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu};
1760dd97694345f47ba6a952c1162e7dcdd66fb72060Peter Qiu
17613ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu// Type traits specifying various features of different functors for ResultOf.
17623ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu// The default template specifies features for functor objects.
17633ebf0b17fd1cdd3a0ef22d9e199c1686c01dcc9fPeter Qiu// Functor classes have to typedef argument_type and result_type
17642e814680f4dd27a5f825afab189843582235cedcJan Nordqvist// to be compatible with ResultOf.
17652e814680f4dd27a5f825afab189843582235cedcJan Nordqvisttemplate <typename Functor>
17662e814680f4dd27a5f825afab189843582235cedcJan Nordqviststruct CallableTraits {
17672e814680f4dd27a5f825afab189843582235cedcJan Nordqvist  typedef typename Functor::result_type ResultType;
17688fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley  typedef Functor StorageType;
17692e814680f4dd27a5f825afab189843582235cedcJan Nordqvist
177083b8a3d25eb4991277d8ec3720bc1f3d821166b6Peter Qiu  static void CheckIsValid(Functor /* functor */) {}
1771f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  template <typename T>
17729af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu  static ResultType Invoke(Functor f, T arg) { return f(arg); }
17739af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu};
17749af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu
17759af7a553d86c910a14410ddecea6fb9422c41cdbPeter Qiu// Specialization for function pointers.
17762e814680f4dd27a5f825afab189843582235cedcJan Nordqvisttemplate <typename ArgType, typename ResType>
17772e814680f4dd27a5f825afab189843582235cedcJan Nordqviststruct CallableTraits<ResType(*)(ArgType)> {
17781d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist  typedef ResType ResultType;
17792e814680f4dd27a5f825afab189843582235cedcJan Nordqvist  typedef ResType(*StorageType)(ArgType);
17802e814680f4dd27a5f825afab189843582235cedcJan Nordqvist
17812e814680f4dd27a5f825afab189843582235cedcJan Nordqvist  static void CheckIsValid(ResType(*f)(ArgType)) {
17822e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    GTEST_CHECK_(f != NULL)
17832e814680f4dd27a5f825afab189843582235cedcJan Nordqvist        << "NULL function pointer is passed into ResultOf().";
17848fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley  }
17852e814680f4dd27a5f825afab189843582235cedcJan Nordqvist  template <typename T>
1786f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  static ResType Invoke(ResType(*f)(ArgType), T arg) {
17872e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    return (*f)(arg);
17881d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist  }
17891d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist};
17902e814680f4dd27a5f825afab189843582235cedcJan Nordqvist
17912e814680f4dd27a5f825afab189843582235cedcJan Nordqvist// Implements the ResultOf() matcher for matching a return value of a
17922e814680f4dd27a5f825afab189843582235cedcJan Nordqvist// unary function of an object.
17932e814680f4dd27a5f825afab189843582235cedcJan Nordqvisttemplate <typename Callable>
17942e814680f4dd27a5f825afab189843582235cedcJan Nordqvistclass ResultOfMatcher {
17958fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley public:
17962e814680f4dd27a5f825afab189843582235cedcJan Nordqvist  typedef typename CallableTraits<Callable>::ResultType ResultType;
1797f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao
17982e814680f4dd27a5f825afab189843582235cedcJan Nordqvist  ResultOfMatcher(Callable callable, const Matcher<ResultType>& matcher)
17991d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist      : callable_(callable), matcher_(matcher) {
18001d5cd3938f9191184cd9aea3059a3b62bf3a0372Jan Nordqvist    CallableTraits<Callable>::CheckIsValid(callable_);
1801fd5470391e5342daa38d00b68ccbccfeacbe6d33Alexandra Gherghina  }
1802155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1803155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  template <typename T>
1804155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  operator Matcher<T>() const {
1805155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return Matcher<T>(new Impl<T>(callable_, matcher_));
1806155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
18078fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley
1808155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private:
1809155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  typedef typename CallableTraits<Callable>::StorageType CallableStorageType;
1810f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao
1811155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  template <typename T>
1812155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  class Impl : public MatcherInterface<T> {
1813155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande   public:
1814155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    Impl(CallableStorageType callable, const Matcher<ResultType>& matcher)
1815155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        : callable_(callable), matcher_(matcher) {}
1816155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1817155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    virtual void DescribeTo(::std::ostream* os) const {
1818155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      *os << "is mapped by the given callable to a value that ";
1819155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      matcher_.DescribeTo(os);
1820155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
1821155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1822155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    virtual void DescribeNegationTo(::std::ostream* os) const {
1823155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      *os << "is mapped by the given callable to a value that ";
1824155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      matcher_.DescribeNegationTo(os);
1825155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
1826155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1827155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    virtual bool MatchAndExplain(T obj, MatchResultListener* listener) const {
18288fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley      *listener << "which is mapped by the given callable to ";
1829155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      // Cannot pass the return value (for example, int) to
1830155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      // MatchPrintAndExplain, which takes a non-const reference as argument.
1831155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      ResultType result =
18329c22c8ea193360f50ad490368ca6a11af0684362Robert Greenwalt          CallableTraits<Callable>::template Invoke<T>(callable_, obj);
1833f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao      return MatchPrintAndExplain(result, matcher_, listener);
1834155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
1835586197ab0ed6d1c9d76c7b461a19ab8733ce9b3aNingyuan Wang
1836586197ab0ed6d1c9d76c7b461a19ab8733ce9b3aNingyuan Wang   private:
1837155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    // Functors often define operator() as non-const method even though
1838155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    // they are actualy stateless. But we need to use them even when
183980d14d67a956e6c69433470aaa73100898166efaxinhe    // 'this' is a const pointer. It's the user's responsibility not to
184080d14d67a956e6c69433470aaa73100898166efaxinhe    // use stateful callables with ResultOf(), which does't guarantee
184137b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang    // how many times the callable will be invoked.
184237b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang    mutable CallableStorageType callable_;
184337b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang    const Matcher<ResultType> matcher_;
184480d14d67a956e6c69433470aaa73100898166efaxinhe
18458fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley    GTEST_DISALLOW_ASSIGN_(Impl);
184680d14d67a956e6c69433470aaa73100898166efaxinhe  };  // class Impl
184780d14d67a956e6c69433470aaa73100898166efaxinhe
1848f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  const CallableStorageType callable_;
184937b06cd7aae7fe27cfaf1d95cc9901548765406bNingyuan Wang  const Matcher<ResultType> matcher_;
185080d14d67a956e6c69433470aaa73100898166efaxinhe
185180d14d67a956e6c69433470aaa73100898166efaxinhe  GTEST_DISALLOW_ASSIGN_(ResultOfMatcher);
1852155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande};
18538fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley
1854155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Implements an equality matcher for any STL-style container whose elements
1855155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// support ==. This matcher is like Eq(), but its failure explanations provide
1856f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao// more detailed information that is useful when the container is used as a set.
1857155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// The failure message reports elements that are in one of the operands but not
1858155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// the other. The failure messages do not report duplicate or out-of-order
1859155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// elements in the containers (which don't properly matter to sets, but can
1860155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// occur if the containers are vectors or lists, for example).
1861155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande//
1862155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Uses the container's const_iterator, value_type, operator ==,
1863155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// begin(), and end().
1864155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename Container>
1865155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass ContainerEqMatcher {
1866155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public:
18678fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley  typedef internal::StlContainerView<Container> View;
18688fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley  typedef typename View::type StlContainer;
1869155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  typedef typename View::const_reference StlContainerReference;
1870155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1871f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  // We make a copy of rhs in case the elements in it are modified
1872155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // after this matcher is created.
1873155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  explicit ContainerEqMatcher(const Container& rhs) : rhs_(View::Copy(rhs)) {
1874155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    // Makes sure the user doesn't instantiate this class template
18753b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti    // with a const or reference type.
18763b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti    testing::StaticAssertTypeEq<Container,
18773b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti        GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(Container))>();
18783b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti  }
1879155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
18803b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti  void DescribeTo(::std::ostream* os) const {
18813b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti    *os << "equals ";
18823b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti    UniversalPrint(rhs_, os);
1883155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
18843b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti  void DescribeNegationTo(::std::ostream* os) const {
1885155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    *os << "does not equal ";
18863b26801d62a06475b722bbf29cba7f48f376654eLorenzo Colitti    UniversalPrint(rhs_, os);
1887155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
1888155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1889155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  template <typename LhsContainer>
1890155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  bool MatchAndExplain(const LhsContainer& lhs,
1891155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                       MatchResultListener* listener) const {
1892155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    // GTEST_REMOVE_CONST_() is needed to work around an MSVC 8.0 bug
1893155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    // that causes LhsContainer to be a const type sometimes.
1894155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    typedef internal::StlContainerView<GTEST_REMOVE_CONST_(LhsContainer)>
1895155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        LhsView;
18962af03130d7f85823223b8591dc52858d851b301dMitchell Wills    typedef typename LhsView::type LhsStlContainer;
18972af03130d7f85823223b8591dc52858d851b301dMitchell Wills    StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);
18982af03130d7f85823223b8591dc52858d851b301dMitchell Wills    if (lhs_stl_container == rhs_)
1899155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      return true;
1900155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1901155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    ::std::ostream* const os = listener->stream();
1902155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    if (os != NULL) {
1903155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      // Something is different. Check for extra values first.
1904155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      bool printed_header = false;
1905155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      for (typename LhsStlContainer::const_iterator it =
1906155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande               lhs_stl_container.begin();
1907155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande           it != lhs_stl_container.end(); ++it) {
1908155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        if (internal::ArrayAwareFind(rhs_.begin(), rhs_.end(), *it) ==
1909155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande            rhs_.end()) {
1910155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande          if (printed_header) {
1911155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande            *os << ", ";
1912155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande          } else {
1913155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande            *os << "which has these unexpected elements: ";
1914155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande            printed_header = true;
1915155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande          }
1916155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande          UniversalPrint(*it, os);
1917155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        }
1918155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      }
1919155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1920155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      // Now check for missing values.
1921155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      bool printed_header2 = false;
1922155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      for (typename StlContainer::const_iterator it = rhs_.begin();
1923155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande           it != rhs_.end(); ++it) {
1924155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        if (internal::ArrayAwareFind(
1925155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                lhs_stl_container.begin(), lhs_stl_container.end(), *it) ==
1926155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande            lhs_stl_container.end()) {
1927155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande          if (printed_header2) {
1928155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande            *os << ", ";
1929155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande          } else {
1930155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande            *os << (printed_header ? ",\nand" : "which")
1931155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                << " doesn't have these expected elements: ";
1932155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande            printed_header2 = true;
1933155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande          }
1934155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande          UniversalPrint(*it, os);
1935155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        }
1936155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      }
1937155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
1938155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1939155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return false;
1940155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
1941155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1942155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private:
1943155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  const StlContainer rhs_;
1944155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1945155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  GTEST_DISALLOW_ASSIGN_(ContainerEqMatcher);
1946155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande};
1947155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1948155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Holds the logic common to ContainsMatcherImpl and EachMatcherImpl.
1949155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename Container>
1950155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass QuantifierMatcherImpl : public MatcherInterface<Container> {
1951155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public:
1952155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  typedef GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(Container)) RawContainer;
1953155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  typedef StlContainerView<RawContainer> View;
1954155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  typedef typename View::type StlContainer;
1955155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  typedef typename View::const_reference StlContainerReference;
1956155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  typedef typename StlContainer::value_type Element;
1957155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1958155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  template <typename InnerMatcher>
1959155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  explicit QuantifierMatcherImpl(InnerMatcher inner_matcher)
1960155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      : inner_matcher_(
1961155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande           testing::SafeMatcherCast<const Element&>(inner_matcher)) {}
1962155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1963155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Checks whether:
1964155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // * All elements in the container match, if all_elements_should_match.
1965155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // * Any element in the container matches, if !all_elements_should_match.
1966155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  bool MatchAndExplainImpl(bool all_elements_should_match,
1967155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                           Container container,
1968155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                           MatchResultListener* listener) const {
1969155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    StlContainerReference stl_container = View::ConstReference(container);
1970155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    size_t i = 0;
1971155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    for (typename StlContainer::const_iterator it = stl_container.begin();
1972155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande         it != stl_container.end(); ++it, ++i) {
1973155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      StringMatchResultListener inner_listener;
1974155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      const bool matches = inner_matcher_.MatchAndExplain(*it, &inner_listener);
1975155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1976155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      if (matches != all_elements_should_match) {
1977155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        *listener << "whose element #" << i
1978155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                  << (matches ? " matches" : " doesn't match");
19798fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley        PrintIfNotEmpty(inner_listener.str(), listener->stream());
1980155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        return !all_elements_should_match;
19818e6144b4059fc2117be23d7222893bc57a33f64dJon Larimer      }
19828e6144b4059fc2117be23d7222893bc57a33f64dJon Larimer    }
19838e6144b4059fc2117be23d7222893bc57a33f64dJon Larimer    return all_elements_should_match;
1984f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  }
1985155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1986155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande protected:
1987155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  const Matcher<const Element&> inner_matcher_;
1988155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
1989155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  GTEST_DISALLOW_ASSIGN_(QuantifierMatcherImpl);
1990155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande};
1991155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
19928fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley// Implements Contains(element_matcher) for the given argument type Container.
1993155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Symmetric to EachMatcherImpl.
1994f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Raotemplate <typename Container>
1995f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Raoclass ContainsMatcherImpl : public QuantifierMatcherImpl<Container> {
1996f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao public:
1997f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  template <typename InnerMatcher>
19988e6144b4059fc2117be23d7222893bc57a33f64dJon Larimer  explicit ContainsMatcherImpl(InnerMatcher inner_matcher)
19998e6144b4059fc2117be23d7222893bc57a33f64dJon Larimer      : QuantifierMatcherImpl<Container>(inner_matcher) {}
20008e6144b4059fc2117be23d7222893bc57a33f64dJon Larimer
20018e6144b4059fc2117be23d7222893bc57a33f64dJon Larimer  // Describes what this matcher does.
2002155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  virtual void DescribeTo(::std::ostream* os) const {
2003155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    *os << "contains at least one element that ";
2004155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    this->inner_matcher_.DescribeTo(os);
2005155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
2006155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2007155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  virtual void DescribeNegationTo(::std::ostream* os) const {
2008155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    *os << "doesn't contain any element that ";
20098fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley    this->inner_matcher_.DescribeTo(os);
2010155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
2011155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2012155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  virtual bool MatchAndExplain(Container container,
2013f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao                               MatchResultListener* listener) const {
2014155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return this->MatchAndExplainImpl(false, container, listener);
2015155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
2016155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
20172ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle private:
20182ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle  GTEST_DISALLOW_ASSIGN_(ContainsMatcherImpl);
20192ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle};
20208fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley
20212ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle// Implements Each(element_matcher) for the given argument type Container.
20222ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle// Symmetric to ContainsMatcherImpl.
20232ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalletemplate <typename Container>
2024f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Raoclass EachMatcherImpl : public QuantifierMatcherImpl<Container> {
20252ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle public:
20262ce99b40c36ed0352b31aa85d5f9383d5f0506f5vandwalle  template <typename InnerMatcher>
2027155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  explicit EachMatcherImpl(InnerMatcher inner_matcher)
2028155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      : QuantifierMatcherImpl<Container>(inner_matcher) {}
2029155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2030155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Describes what this matcher does.
2031155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  virtual void DescribeTo(::std::ostream* os) const {
2032155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    *os << "only contains elements that ";
2033155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    this->inner_matcher_.DescribeTo(os);
2034155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
2035155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2036155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  virtual void DescribeNegationTo(::std::ostream* os) const {
2037155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    *os << "contains some element that ";
2038155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    this->inner_matcher_.DescribeNegationTo(os);
2039155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
2040155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2041155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  virtual bool MatchAndExplain(Container container,
2042155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                               MatchResultListener* listener) const {
2043155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    return this->MatchAndExplainImpl(true, container, listener);
2044155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
2045155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2046155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande private:
2047155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  GTEST_DISALLOW_ASSIGN_(EachMatcherImpl);
2048090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande};
2049090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande
2050090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande// Implements polymorphic Contains(element_matcher).
205103b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborntemplate <typename M>
205203b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackbornclass ContainsMatcher {
2053155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public:
2054155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  explicit ContainsMatcher(M m) : inner_matcher_(m) {}
2055155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2056155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  template <typename Container>
205702938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov  operator Matcher<Container>() const {
2058dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov    return MakeMatcher(new ContainsMatcherImpl<Container>(inner_matcher_));
2059dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov  }
2060dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov
2061dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov private:
2062dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov  const M inner_matcher_;
2063dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov
2064dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov  GTEST_DISALLOW_ASSIGN_(ContainsMatcher);
2065dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov};
2066dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov
2067dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov// Implements polymorphic Each(element_matcher).
2068dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganovtemplate <typename M>
2069dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganovclass EachMatcher {
2070dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov public:
2071dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov  explicit EachMatcher(M m) : inner_matcher_(m) {}
2072dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov
207302938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov  template <typename Container>
207402938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov  operator Matcher<Container>() const {
207502938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov    return MakeMatcher(new EachMatcherImpl<Container>(inner_matcher_));
207602938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov  }
207702938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov
207802938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov private:
207902938a0a735da7fafaaed84e31e1aa93cdf80a56Ivan Podogov  const M inner_matcher_;
2080dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov
2081dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov  GTEST_DISALLOW_ASSIGN_(EachMatcher);
2082dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov};
2083dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov
2084dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov// Implements Key(inner_matcher) for the given argument pair type.
2085155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Key(inner_matcher) matches an std::pair whose 'first' field matches
2086155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// inner_matcher.  For example, Contains(Key(Ge(5))) can be used to match an
2087155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// std::map that contains at least one element whose key is >= 5.
2088155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename PairType>
2089155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass KeyMatcherImpl : public MatcherInterface<PairType> {
2090155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public:
2091155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  typedef GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(PairType)) RawPairType;
2092155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  typedef typename RawPairType::first_type KeyType;
2093155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2094155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  template <typename InnerMatcher>
2095155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  explicit KeyMatcherImpl(InnerMatcher inner_matcher)
20966232408a5fc660b2d8642d56747e05c15c6255b8Rebecca Silberstein      : inner_matcher_(
2097155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande          testing::SafeMatcherCast<const KeyType&>(inner_matcher)) {
2098155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  }
2099bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
2100bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  // Returns true iff 'key_value.first' (the key) matches the inner matcher.
2101bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  virtual bool MatchAndExplain(PairType key_value,
2102bdac915b98217c63284b47a7925f0719c8e40844Wei Wang                               MatchResultListener* listener) const {
2103bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    StringMatchResultListener inner_listener;
2104bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    const bool match = inner_matcher_.MatchAndExplain(key_value.first,
2105bdac915b98217c63284b47a7925f0719c8e40844Wei Wang                                                      &inner_listener);
2106bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    const internal::string explanation = inner_listener.str();
2107bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    if (explanation != "") {
2108bdac915b98217c63284b47a7925f0719c8e40844Wei Wang      *listener << "whose first field is a value " << explanation;
2109bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    }
2110bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    return match;
2111bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  }
2112bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
2113bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  // Describes what this matcher does.
2114bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  virtual void DescribeTo(::std::ostream* os) const {
2115bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    *os << "has a key that ";
2116bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    inner_matcher_.DescribeTo(os);
2117bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  }
2118bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
2119bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  // Describes what the negation of this matcher does.
2120bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  virtual void DescribeNegationTo(::std::ostream* os) const {
2121bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    *os << "doesn't have a key that ";
2122bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    inner_matcher_.DescribeTo(os);
2123bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  }
2124bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
2125bdac915b98217c63284b47a7925f0719c8e40844Wei Wang private:
2126bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  const Matcher<const KeyType&> inner_matcher_;
2127bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
2128bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  GTEST_DISALLOW_ASSIGN_(KeyMatcherImpl);
2129bdac915b98217c63284b47a7925f0719c8e40844Wei Wang};
2130bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
2131bdac915b98217c63284b47a7925f0719c8e40844Wei Wang// Implements polymorphic Key(matcher_for_key).
2132bdac915b98217c63284b47a7925f0719c8e40844Wei Wangtemplate <typename M>
2133bdac915b98217c63284b47a7925f0719c8e40844Wei Wangclass KeyMatcher {
2134bdac915b98217c63284b47a7925f0719c8e40844Wei Wang public:
2135bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  explicit KeyMatcher(M m) : matcher_for_key_(m) {}
2136bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
2137bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  template <typename PairType>
2138bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  operator Matcher<PairType>() const {
2139bdac915b98217c63284b47a7925f0719c8e40844Wei Wang    return MakeMatcher(new KeyMatcherImpl<PairType>(matcher_for_key_));
2140bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  }
2141bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
2142bdac915b98217c63284b47a7925f0719c8e40844Wei Wang private:
2143bdac915b98217c63284b47a7925f0719c8e40844Wei Wang  const M matcher_for_key_;
2144bdac915b98217c63284b47a7925f0719c8e40844Wei Wang
2145155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  GTEST_DISALLOW_ASSIGN_(KeyMatcher);
2146155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande};
2147155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2148155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Implements Pair(first_matcher, second_matcher) for the given argument pair
2149155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// type with its two matchers. See Pair() function below.
2150155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandetemplate <typename PairType>
2151155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpandeclass PairMatcherImpl : public MatcherInterface<PairType> {
2152155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande public:
2153155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  typedef GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(PairType)) RawPairType;
2154155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  typedef typename RawPairType::first_type FirstType;
2155155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  typedef typename RawPairType::second_type SecondType;
215603b70b37a8a20cb92d860b5015f6762dcb5e75ccDianne Hackborn
2157090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande  template <typename FirstMatcher, typename SecondMatcher>
2158090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande  PairMatcherImpl(FirstMatcher first_matcher, SecondMatcher second_matcher)
2159090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande      : first_matcher_(
2160090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande            testing::SafeMatcherCast<const FirstType&>(first_matcher)),
2161090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande        second_matcher_(
2162090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande            testing::SafeMatcherCast<const SecondType&>(second_matcher)) {
2163090aa74f2d36010abba6563a39c87ab7ba8a7473Vinit Deshpande  }
2164155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2165155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Describes what this matcher does.
2166155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  virtual void DescribeTo(::std::ostream* os) const {
2167faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee    *os << "has a first field that ";
2168e487a4648dd41881e754f1224aaedead78a0777dSky Faber    first_matcher_.DescribeTo(os);
2169e487a4648dd41881e754f1224aaedead78a0777dSky Faber    *os << ", and has a second field that ";
2170faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee    second_matcher_.DescribeTo(os);
2171faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee  }
2172e487a4648dd41881e754f1224aaedead78a0777dSky Faber
2173e487a4648dd41881e754f1224aaedead78a0777dSky Faber  // Describes what the negation of this matcher does.
2174faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee  virtual void DescribeNegationTo(::std::ostream* os) const {
2175faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee    *os << "has a first field that ";
2176faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee    first_matcher_.DescribeNegationTo(os);
2177faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee    *os << ", or has a second field that ";
2178faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee    second_matcher_.DescribeNegationTo(os);
2179faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee  }
2180faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee
2181faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee  // Returns true iff 'a_pair.first' matches first_matcher and 'a_pair.second'
2182faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee  // matches second_matcher.
2183faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee  virtual bool MatchAndExplain(PairType a_pair,
2184faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee                               MatchResultListener* listener) const {
2185faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee    if (!listener->IsInterested()) {
2186faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee      // If the listener is not interested, we don't need to construct the
2187faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee      // explanation.
2188faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee      return first_matcher_.Matches(a_pair.first) &&
2189faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee             second_matcher_.Matches(a_pair.second);
2190faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee    }
2191faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee    StringMatchResultListener first_inner_listener;
2192e487a4648dd41881e754f1224aaedead78a0777dSky Faber    if (!first_matcher_.MatchAndExplain(a_pair.first,
2193e487a4648dd41881e754f1224aaedead78a0777dSky Faber                                        &first_inner_listener)) {
2194e487a4648dd41881e754f1224aaedead78a0777dSky Faber      *listener << "whose first field does not match";
2195faa2ce7f93eef2c436796fb1ea3574e2d1412491Robin Lee      PrintIfNotEmpty(first_inner_listener.str(), listener->stream());
2196e487a4648dd41881e754f1224aaedead78a0777dSky Faber      return false;
2197e487a4648dd41881e754f1224aaedead78a0777dSky Faber    }
2198155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    StringMatchResultListener second_inner_listener;
2199155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    if (!second_matcher_.MatchAndExplain(a_pair.second,
2200155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                                         &second_inner_listener)) {
2201155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      *listener << "whose second field does not match";
2202155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      PrintIfNotEmpty(second_inner_listener.str(), listener->stream());
2203155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      return false;
2204155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    }
2205155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    ExplainSuccess(first_inner_listener.str(), second_inner_listener.str(),
2206155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande                   listener);
2207031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne    return true;
220811638f348ba45f9f417928e79b81186cef76c561Glen Kuhne  }
220911638f348ba45f9f417928e79b81186cef76c561Glen Kuhne
221011638f348ba45f9f417928e79b81186cef76c561Glen Kuhne private:
2211031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne  void ExplainSuccess(const internal::string& first_explanation,
2212675de6070a3c1980fcc99bc6863b2689bfeb0271Lorenzo Colitti                      const internal::string& second_explanation,
2213675de6070a3c1980fcc99bc6863b2689bfeb0271Lorenzo Colitti                      MatchResultListener* listener) const {
2214675de6070a3c1980fcc99bc6863b2689bfeb0271Lorenzo Colitti    *listener << "whose both fields match";
2215675de6070a3c1980fcc99bc6863b2689bfeb0271Lorenzo Colitti    if (first_explanation != "") {
2216031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne      *listener << ", where the first field is a value " << first_explanation;
2217031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne    }
221884ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart    if (second_explanation != "") {
221984ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart      *listener << ", ";
222084ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart      if (first_explanation != "") {
222184ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart        *listener << "and ";
222284ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart      } else {
222384ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart        *listener << "where ";
222484ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart      }
222584ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart      *listener << "the second field is a value " << second_explanation;
222684ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart    }
222784ee4726383fd968ab43caf120d15d9f47a51a54Paul Stewart  }
222811638f348ba45f9f417928e79b81186cef76c561Glen Kuhne
222911638f348ba45f9f417928e79b81186cef76c561Glen Kuhne  const Matcher<const FirstType&> first_matcher_;
223011638f348ba45f9f417928e79b81186cef76c561Glen Kuhne  const Matcher<const SecondType&> second_matcher_;
2231031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne
2232031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne  GTEST_DISALLOW_ASSIGN_(PairMatcherImpl);
223311638f348ba45f9f417928e79b81186cef76c561Glen Kuhne};
223411638f348ba45f9f417928e79b81186cef76c561Glen Kuhne
223511638f348ba45f9f417928e79b81186cef76c561Glen Kuhne// Implements polymorphic Pair(first_matcher, second_matcher).
223611638f348ba45f9f417928e79b81186cef76c561Glen Kuhnetemplate <typename FirstMatcher, typename SecondMatcher>
2237cee93a796f42939b2d4f2e3e5491c3d951694662Joe LaPennaclass PairMatcher {
223811638f348ba45f9f417928e79b81186cef76c561Glen Kuhne public:
223911638f348ba45f9f417928e79b81186cef76c561Glen Kuhne  PairMatcher(FirstMatcher first_matcher, SecondMatcher second_matcher)
224011638f348ba45f9f417928e79b81186cef76c561Glen Kuhne      : first_matcher_(first_matcher), second_matcher_(second_matcher) {}
22412a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein
22422a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein  template <typename PairType>
224361312e14a088a9487d4db64f08285162476e870fPaul Stewart  operator Matcher<PairType> () const {
224411638f348ba45f9f417928e79b81186cef76c561Glen Kuhne    return MakeMatcher(
224511638f348ba45f9f417928e79b81186cef76c561Glen Kuhne        new PairMatcherImpl<PairType>(
22463c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne            first_matcher_, second_matcher_));
22473c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne  }
22483c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne
224911638f348ba45f9f417928e79b81186cef76c561Glen Kuhne private:
22503204fb9682242a7b5a749489076c66d448c42577Roshan Pius  const FirstMatcher first_matcher_;
22513204fb9682242a7b5a749489076c66d448c42577Roshan Pius  const SecondMatcher second_matcher_;
225211638f348ba45f9f417928e79b81186cef76c561Glen Kuhne
2253155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  GTEST_DISALLOW_ASSIGN_(PairMatcher);
2254155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande};
22558fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley
2256155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande// Implements ElementsAre() and ElementsAreArray().
2257f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Raotemplate <typename Container>
2258f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Raoclass ElementsAreMatcherImpl : public MatcherInterface<Container> {
2259f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao public:
22602a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein  typedef GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(Container)) RawContainer;
2261155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  typedef internal::StlContainerView<RawContainer> View;
2262155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  typedef typename View::type StlContainer;
2263155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  typedef typename View::const_reference StlContainerReference;
22642a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein  typedef typename StlContainer::value_type Element;
2265155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2266155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Constructs the matcher from a sequence of element values or
22678fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley  // element matchers.
22682a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein  template <typename InputIter>
2269f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  ElementsAreMatcherImpl(InputIter first, size_t a_count) {
22702a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein    matchers_.reserve(a_count);
2271155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    InputIter it = first;
2272155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    for (size_t i = 0; i != a_count; ++i, ++it) {
22738fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley      matchers_.push_back(MatcherCast<const Element&>(*it));
22742a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein    }
2275f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  }
22762a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein
22772a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein  // Describes what this matcher does.
22782a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein  virtual void DescribeTo(::std::ostream* os) const {
2279155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    if (count() == 0) {
22802a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein      *os << "is empty";
2281155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    } else if (count() == 1) {
2282155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      *os << "has 1 element that ";
22838fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley      matchers_[0].DescribeTo(os);
2284155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    } else {
2285155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      *os << "has " << Elements(count()) << " where\n";
2286f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao      for (size_t i = 0; i != count(); ++i) {
228761312e14a088a9487d4db64f08285162476e870fPaul Stewart        *os << "element #" << i << " ";
2288155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        matchers_[i].DescribeTo(os);
2289155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        if (i + 1 < count()) {
22908fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley          *os << ",\n";
2291155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande        }
2292155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      }
2293f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    }
229461312e14a088a9487d4db64f08285162476e870fPaul Stewart  }
2295155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2296155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  // Describes what the negation of this matcher does.
22978fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley  virtual void DescribeNegationTo(::std::ostream* os) const {
2298155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    if (count() == 0) {
2299155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      *os << "isn't empty";
2300f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao      return;
230161312e14a088a9487d4db64f08285162476e870fPaul Stewart    }
2302155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande
2303155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande    *os << "doesn't have " << Elements(count()) << ", or\n";
23048fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley    for (size_t i = 0; i != count(); ++i) {
2305155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      *os << "element #" << i << " ";
2306155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      matchers_[i].DescribeNegationTo(os);
2307f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao      if (i + 1 < count()) {
230861312e14a088a9487d4db64f08285162476e870fPaul Stewart        *os << ", or\n";
2309155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande      }
23109ae6b45c038fa74a9e7285ef4834551dd93da332Yuhao Zheng    }
23118fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley  }
2312ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle
2313ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle  virtual bool MatchAndExplain(Container container,
2314f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao                               MatchResultListener* listener) const {
2315f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    StlContainerReference stl_container = View::ConstReference(container);
2316f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    const size_t actual_count = stl_container.size();
231700ec8bf178ba4abee4ee8bbc6eb09c9fcd986a89Rebecca Silberstein    if (actual_count != count()) {
231800ec8bf178ba4abee4ee8bbc6eb09c9fcd986a89Rebecca Silberstein      // The element count doesn't match.  If the container is empty,
231900ec8bf178ba4abee4ee8bbc6eb09c9fcd986a89Rebecca Silberstein      // there's no need to explain anything as Google Mock already
232000ec8bf178ba4abee4ee8bbc6eb09c9fcd986a89Rebecca Silberstein      // prints the empty container.  Otherwise we just need to show
232100ec8bf178ba4abee4ee8bbc6eb09c9fcd986a89Rebecca Silberstein      // how many elements there actually are.
2322da918df16e03ee19be62343313d954027d3eb3abRebecca Silberstein      if (actual_count != 0) {
2323ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle        *listener << "which has " << Elements(actual_count);
23242a7c2bec5d307a9e52de429c6303b7df9de900dcRebecca Silberstein      }
232561312e14a088a9487d4db64f08285162476e870fPaul Stewart      return false;
232675727af748e2b53baf365139ecfa7bf87a449d04Rebecca Silberstein    }
232700ec8bf178ba4abee4ee8bbc6eb09c9fcd986a89Rebecca Silberstein
2328e33b3346b262507ef2361d50a89d16bef69d9a57Sohani Rao    typename StlContainer::const_iterator it = stl_container.begin();
2329ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle    // explanations[i] is the explanation of the element at index i.
2330ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle    std::vector<internal::string> explanations(count());
23318fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley    for (size_t i = 0; i != count();  ++it, ++i) {
2332ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle      StringMatchResultListener s;
2333ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle      if (matchers_[i].MatchAndExplain(*it, &s)) {
2334f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao        explanations[i] = s.str();
233500ec8bf178ba4abee4ee8bbc6eb09c9fcd986a89Rebecca Silberstein      } else {
233600ec8bf178ba4abee4ee8bbc6eb09c9fcd986a89Rebecca Silberstein        // The container has the right size but the i-th element
2337ed9938883ae2dade81c8be6cd6ceaef3febd5239vandwalle        // doesn't match its expectation.
2338c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle        *listener << "whose element #" << i << " doesn't match";
23398fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley        PrintIfNotEmpty(s.str(), listener->stream());
2340c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle        return false;
2341c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle      }
2342f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    }
2343f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao
2344f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    // Every element matches its expectation.  We need to explain why
2345f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    // (the obvious ones can be skipped).
2346c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle    bool reason_printed = false;
2347c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle    for (size_t i = 0; i != count(); ++i) {
2348c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle      const internal::string& s = explanations[i];
23498fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley      if (!s.empty()) {
2350c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle        if (reason_printed) {
2351c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle          *listener << ",\nand ";
2352f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao        }
2353c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle        *listener << "whose element #" << i << " matches, " << s;
2354c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle        reason_printed = true;
2355c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle      }
23568fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley    }
2357c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle
2358c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle    return true;
2359f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  }
2360f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao
2361f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao private:
2362c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle  static Message Elements(size_t count) {
2363c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle    return Message() << count << (count == 1 ? " element" : " elements");
2364c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle  }
23658fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley
2366c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle  size_t count() const { return matchers_.size(); }
2367c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle  std::vector<Matcher<const Element&> > matchers_;
2368f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao
2369c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle  GTEST_DISALLOW_ASSIGN_(ElementsAreMatcherImpl);
2370c6f06c628ee3583b60ff31a7da442e0ac7b26d97vandwalle};
2371c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle
23728fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley// Implements ElementsAre() of 0 arguments.
237343eba5ba17a9af5d9a050a4ba5e12e93c92f722dSamuel Tanclass ElementsAreMatcher0 {
2374a8647b8cb29de22765062714cb265247234c3d32xinhe public:
2375f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  ElementsAreMatcher0() {}
2376f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao
2377f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  template <typename Container>
237843eba5ba17a9af5d9a050a4ba5e12e93c92f722dSamuel Tan  operator Matcher<Container>() const {
2379e2614ba1b774529ee68cc4ac189f7492cff89db3Pierre Vandwalle    typedef GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(Container))
2380e2614ba1b774529ee68cc4ac189f7492cff89db3Pierre Vandwalle        RawContainer;
23818fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley    typedef typename internal::StlContainerView<RawContainer>::type::value_type
2382a8647b8cb29de22765062714cb265247234c3d32xinhe        Element;
2383e2614ba1b774529ee68cc4ac189f7492cff89db3Pierre Vandwalle
2384f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao    const Matcher<const Element&>* const matchers = NULL;
2385a8647b8cb29de22765062714cb265247234c3d32xinhe    return MakeMatcher(new ElementsAreMatcherImpl<Container>(matchers, 0));
2386e2614ba1b774529ee68cc4ac189f7492cff89db3Pierre Vandwalle  }
2387b0b0cc202b7d7aaad7b3f69d73e9b58ea2968b05Pierre Vandwalle};
2388c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle
23898fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley// Implements ElementsAreArray().
2390c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalletemplate <typename T>
2391c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalleclass ElementsAreArrayMatcher {
2392c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle public:
2393f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao  ElementsAreArrayMatcher(const T* first, size_t count) :
2394c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle      first_(first), count_(count) {}
2395c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle
2396c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle  template <typename Container>
2397c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle  operator Matcher<Container>() const {
2398c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle    typedef GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(Container))
2399c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle        RawContainer;
2400c298087de50ea56c31a4ade7ee1e83b313bb63c7vandwalle    typedef typename internal::StlContainerView<RawContainer>::type::value_type
2401b8671cfafc2830ebddeafcfb2d91f2b39b19019bStuart Scott        Element;
24028fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley
2403b8671cfafc2830ebddeafcfb2d91f2b39b19019bStuart Scott    return MakeMatcher(new ElementsAreMatcherImpl<Container>(first_, count_));
2404b8671cfafc2830ebddeafcfb2d91f2b39b19019bStuart Scott  }
2405f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao
2406f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scott private:
2407f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scott  const T* const first_;
2408f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scott  const size_t count_;
2409b8671cfafc2830ebddeafcfb2d91f2b39b19019bStuart Scott
2410f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scott  GTEST_DISALLOW_ASSIGN_(ElementsAreArrayMatcher);
24111f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein};
24121f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein
24131f6626d7488bba014b42bab8bbcd4720694df485Rebecca Silberstein// Constants denoting interpolations in a matcher description string.
2414f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scottconst int kTupleInterpolation = -1;    // "%(*)s"
2415f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scottconst int kPercentInterpolation = -2;  // "%%"
2416f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scottconst int kInvalidInterpolation = -3;  // "%" followed by invalid text
2417f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scott
2418dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov// Records the location and content of an interpolation.
2419dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganovstruct Interpolation {
2420dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov  Interpolation(const char* start, const char* end, int param)
2421dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov      : start_pos(start), end_pos(end), param_index(param) {}
2422dcf967aa402a4ab1a79c727aea934b8013c1fa6aSvetoslav Ganov
2423f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scott  // Points to the start of the interpolation (the '%' character).
2424f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao  const char* start_pos;
2425f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao  // Points to the first character after the interpolation.
2426f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao  const char* end_pos;
2427f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao  // 0-based index of the interpolated matcher parameter;
2428f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao  // kTupleInterpolation for "%(*)s"; kPercentInterpolation for "%%".
2429f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao  int param_index;
2430f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao};
2431f384821f8979152ba83ec70614a59094c838c8c6zhangshuxiao
2432f9d866f1b4e93593b3411886fd71e729f4a5a205Stuart Scotttypedef ::std::vector<Interpolation> Interpolations;
2433b8671cfafc2830ebddeafcfb2d91f2b39b19019bStuart Scott
2434b8671cfafc2830ebddeafcfb2d91f2b39b19019bStuart Scott// Parses a matcher description string and returns a vector of
2435b8671cfafc2830ebddeafcfb2d91f2b39b19019bStuart Scott// interpolations that appear in the string; generates non-fatal
24368be2ac8cec40a2000715849b627642bdc87c10b3Shirish Kalele// failures iff 'description' is an invalid matcher description.
24374d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande// 'param_names' is a NULL-terminated array of parameter names in the
243831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// order they appear in the MATCHER_P*() parameter list.
24394d381bc39f5263effdae73ec99065eb299b806caVinit DeshpandeInterpolations ValidateMatcherDescription(
24404d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande    const char* param_names[], const char* description);
24414d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande
24424d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande// Returns the actual matcher description, given the matcher name,
244331891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// user-supplied description template string, interpolations in the
244431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// string, and the printed values of the matcher parameters.
244531891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqviststring FormatMatcherDescription(
244631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    const char* matcher_name, const char* description,
24474d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande    const Interpolations& interp, const Strings& param_values);
244831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
244931891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist}  // namespace internal
245031891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
24514d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande// Implements MatcherCast().
24524d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandetemplate <typename T, typename M>
24534d381bc39f5263effdae73ec99065eb299b806caVinit Deshpandeinline Matcher<T> MatcherCast(M matcher) {
245431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist  return internal::MatcherCastImpl<T, M>::Cast(matcher);
24554d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande}
24564d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande
245731891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// _ is a matcher that matches anything of any type.
24584d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande//
24594d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande// This definition is fine as:
24604d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande//
246131891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist//   1. The C++ standard permits using the name _ in a namespace that
24624d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande//      is not the global namespace or ::std.
24634d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande//   2. The AnythingMatcher class has no data member or constructor,
2464653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhne//      so it's OK to create global variables of this type.
2465653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhne//   3. c-style has approved of using _ in this case.
2466653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhneconst internal::AnythingMatcher _ = {};
2467653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhne// Creates a matcher that matches any value of the given type T.
2468653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhnetemplate <typename T>
2469653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhneinline Matcher<T> A() { return MakeMatcher(new internal::AnyMatcherImpl<T>()); }
2470653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhne
2471653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhne// Creates a matcher that matches any value of the given type T.
2472653cd53f0906a90fbf5b1d9d0bd30917043d1bfcGlen Kuhnetemplate <typename T>
24734aef3283bf78e233a11fa34af2c7c38362879625Jan Nordqvistinline Matcher<T> An() { return A<T>(); }
24744aef3283bf78e233a11fa34af2c7c38362879625Jan Nordqvist
24754d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande// Creates a polymorphic matcher that matches anything equal to x.
24768fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wiley// Note: if the parameter of Eq() were declared as const T&, Eq("foo")
24779846078598c3468f8813dbfa58238a1846bd81efSanket Padawe// wouldn't compile.
24789846078598c3468f8813dbfa58238a1846bd81efSanket Padawetemplate <typename T>
2479f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Raoinline internal::EqMatcher<T> Eq(T x) { return internal::EqMatcher<T>(x); }
24809846078598c3468f8813dbfa58238a1846bd81efSanket Padawe
24819846078598c3468f8813dbfa58238a1846bd81efSanket Padawe// Constructs a Matcher<T> from a 'value' of type T.  The constructed
24829846078598c3468f8813dbfa58238a1846bd81efSanket Padawe// matcher matches any value that's equal to 'value'.
248331891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvisttemplate <typename T>
248431891afce40b903ada9b24ec12e3648ae6aa27b2Jan NordqvistMatcher<T>::Matcher(T value) { *this = Eq(value); }
248531891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
248631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// Creates a monomorphic matcher that matches anything with type Lhs
248731891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// and equal to rhs.  A user may need to use this instead of Eq(...)
248831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// in order to resolve an overloading ambiguity.
248931891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist//
249031891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// TypedEq<T>(x) is just a convenient short-hand for Matcher<T>(Eq(x))
249131891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist// or Matcher<T>(x), but more readable than the latter.
249231891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist//
24934d381bc39f5263effdae73ec99065eb299b806caVinit Deshpande// We could define similar monomorphic matchers for other comparison
2494cd0af1c9ddcac881f49c815fb9da45433eb50736Vinit Deshpande// operations (e.g. TypedLt, TypedGe, and etc), but decided not to do
24952bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsu// it yet as those are used much less than Eq() in practice.  A user
24962bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsu// can always write Matcher<T>(Lt(5)) to be explicit about the type,
24972bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsu// for example.
24982bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsutemplate <typename Lhs, typename Rhs>
24992bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsuinline Matcher<Lhs> TypedEq(const Rhs& rhs) { return Eq(rhs); }
25002bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsu
25012bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsu// Creates a polymorphic matcher that matches anything >= x.
25022bfc67c9893c0a525b224d68dd73a74212b0c29fArthur Hsutemplate <typename Rhs>
2503c065315c23f78ec462a56aec1aaa4e2a34549b8dFyodor Kupolovinline internal::GeMatcher<Rhs> Ge(Rhs x) {
2504466158a6669d51541ce6c5c4e04a71dad36cdb4eRandy Pan  return internal::GeMatcher<Rhs>(x);
2505466158a6669d51541ce6c5c4e04a71dad36cdb4eRandy Pan}
2506466158a6669d51541ce6c5c4e04a71dad36cdb4eRandy Pan
2507466158a6669d51541ce6c5c4e04a71dad36cdb4eRandy Pan// Creates a polymorphic matcher that matches anything > x.
25088fcd1fe86ddc3056e1a26e69bc68f148ae0e9ddcChristopher Wileytemplate <typename Rhs>
2509466158a6669d51541ce6c5c4e04a71dad36cdb4eRandy Paninline internal::GtMatcher<Rhs> Gt(Rhs x) {
2510466158a6669d51541ce6c5c4e04a71dad36cdb4eRandy Pan  return internal::GtMatcher<Rhs>(x);
2511f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao}
2512f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao
2513f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao// Creates a polymorphic matcher that matches anything <= x.
2514466158a6669d51541ce6c5c4e04a71dad36cdb4eRandy Pantemplate <typename Rhs>
2515466158a6669d51541ce6c5c4e04a71dad36cdb4eRandy Paninline internal::LeMatcher<Rhs> Le(Rhs x) {
2516ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius  return internal::LeMatcher<Rhs>(x);
2517ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius}
2518ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius
25193031903d4a68659350994571525fc86a47c02dd0Roshan Pius// Creates a polymorphic matcher that matches anything < x.
2520ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Piustemplate <typename Rhs>
2521ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Piusinline internal::LtMatcher<Rhs> Lt(Rhs x) {
2522ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius  return internal::LtMatcher<Rhs>(x);
2523ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius}
2524f1a0272c0fb3f11bc338e97481d8cb73cfe74641Roshan Pius
2525f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao// Creates a polymorphic matcher that matches anything != x.
2526ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Piustemplate <typename Rhs>
2527ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Piusinline internal::NeMatcher<Rhs> Ne(Rhs x) {
2528ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius  return internal::NeMatcher<Rhs>(x);
2529ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius}
2530ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius
25313204fb9682242a7b5a749489076c66d448c42577Roshan Pius// Creates a polymorphic matcher that matches any NULL pointer.
2532ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Piusinline PolymorphicMatcher<internal::IsNullMatcher > IsNull() {
2533ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius  return MakePolymorphicMatcher(internal::IsNullMatcher());
25343204fb9682242a7b5a749489076c66d448c42577Roshan Pius}
25353204fb9682242a7b5a749489076c66d448c42577Roshan Pius
25363204fb9682242a7b5a749489076c66d448c42577Roshan Pius// Creates a polymorphic matcher that matches any non-NULL pointer.
25373204fb9682242a7b5a749489076c66d448c42577Roshan Pius// This is convenient as Not(NULL) doesn't compile (the compiler
2538ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius// thinks that that expression is comparing a pointer with an integer).
2539ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Piusinline PolymorphicMatcher<internal::NotNullMatcher > NotNull() {
2540ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius  return MakePolymorphicMatcher(internal::NotNullMatcher());
25413031903d4a68659350994571525fc86a47c02dd0Roshan Pius}
25423031903d4a68659350994571525fc86a47c02dd0Roshan Pius
25433031903d4a68659350994571525fc86a47c02dd0Roshan Pius// Creates a polymorphic matcher that matches any argument that
25443031903d4a68659350994571525fc86a47c02dd0Roshan Pius// references variable x.
25453031903d4a68659350994571525fc86a47c02dd0Roshan Piustemplate <typename T>
25463031903d4a68659350994571525fc86a47c02dd0Roshan Piusinline internal::RefMatcher<T&> Ref(T& x) {  // NOLINT
25473031903d4a68659350994571525fc86a47c02dd0Roshan Pius  return internal::RefMatcher<T&>(x);
25483031903d4a68659350994571525fc86a47c02dd0Roshan Pius}
25493031903d4a68659350994571525fc86a47c02dd0Roshan Pius
25503031903d4a68659350994571525fc86a47c02dd0Roshan Pius// Creates a matcher that matches any double argument approximately
25513031903d4a68659350994571525fc86a47c02dd0Roshan Pius// equal to rhs, where two NANs are considered unequal.
25523031903d4a68659350994571525fc86a47c02dd0Roshan Piusinline internal::FloatingEqMatcher<double> DoubleEq(double rhs) {
25533031903d4a68659350994571525fc86a47c02dd0Roshan Pius  return internal::FloatingEqMatcher<double>(rhs, false);
25543031903d4a68659350994571525fc86a47c02dd0Roshan Pius}
25553031903d4a68659350994571525fc86a47c02dd0Roshan Pius
25563031903d4a68659350994571525fc86a47c02dd0Roshan Pius// Creates a matcher that matches any double argument approximately
25573031903d4a68659350994571525fc86a47c02dd0Roshan Pius// equal to rhs, including NaN values when rhs is NaN.
25583031903d4a68659350994571525fc86a47c02dd0Roshan Piusinline internal::FloatingEqMatcher<double> NanSensitiveDoubleEq(double rhs) {
25593031903d4a68659350994571525fc86a47c02dd0Roshan Pius  return internal::FloatingEqMatcher<double>(rhs, true);
25603031903d4a68659350994571525fc86a47c02dd0Roshan Pius}
25613031903d4a68659350994571525fc86a47c02dd0Roshan Pius
25623031903d4a68659350994571525fc86a47c02dd0Roshan Pius// Creates a matcher that matches any float argument approximately
2563ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius// equal to rhs, where two NANs are considered unequal.
2564e3831b70d4a8a967fe8df5496d542a432692c434Roshan Piusinline internal::FloatingEqMatcher<float> FloatEq(float rhs) {
2565ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius  return internal::FloatingEqMatcher<float>(rhs, false);
2566ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius}
2567ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius
2568ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius// Creates a matcher that matches any double argument approximately
2569f1a0272c0fb3f11bc338e97481d8cb73cfe74641Roshan Pius// equal to rhs, including NaN values when rhs is NaN.
2570f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Raoinline internal::FloatingEqMatcher<float> NanSensitiveFloatEq(float rhs) {
2571ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius  return internal::FloatingEqMatcher<float>(rhs, true);
2572ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius}
2573ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius
2574ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius// Creates a matcher that matches a pointer (raw or smart) that points
2575ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius// to a value that matches inner_matcher.
25763204fb9682242a7b5a749489076c66d448c42577Roshan Piustemplate <typename InnerMatcher>
2577ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Piusinline internal::PointeeMatcher<InnerMatcher> Pointee(
2578ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius    const InnerMatcher& inner_matcher) {
25793031903d4a68659350994571525fc86a47c02dd0Roshan Pius  return internal::PointeeMatcher<InnerMatcher>(inner_matcher);
25803204fb9682242a7b5a749489076c66d448c42577Roshan Pius}
2581ff9686aec5b6ee21e01556899fb13ab55915f3c0Roshan Pius
2582e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius// Creates a matcher that matches an object whose given field matches
2583e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius// 'matcher'.  For example,
2584e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius//   Field(&Foo::number, Ge(5))
2585e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius// matches a Foo object x iff x.number >= 5.
2586e3831b70d4a8a967fe8df5496d542a432692c434Roshan Piustemplate <typename Class, typename FieldType, typename FieldMatcher>
2587e3831b70d4a8a967fe8df5496d542a432692c434Roshan Piusinline PolymorphicMatcher<
2588e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius  internal::FieldMatcher<Class, FieldType> > Field(
2589e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius    FieldType Class::*field, const FieldMatcher& matcher) {
2590e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius  return MakePolymorphicMatcher(
2591f1a0272c0fb3f11bc338e97481d8cb73cfe74641Roshan Pius      internal::FieldMatcher<Class, FieldType>(
2592f2fdf411925ad172b5e0b25b0c6df880256691d4Sohani Rao          field, MatcherCast<const FieldType&>(matcher)));
2593e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius  // The call to MatcherCast() is required for supporting inner
2594e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius  // matchers of compatible types.  For example, it allows
2595e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius  //   Field(&Foo::bar, m)
2596e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius  // to compile where bar is an int32 and m is a matcher for int64.
2597e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius}
25983204fb9682242a7b5a749489076c66d448c42577Roshan Pius
2599e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius// Creates a matcher that matches an object whose given property
2600e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius// matches 'matcher'.  For example,
2601e3831b70d4a8a967fe8df5496d542a432692c434Roshan Pius//   Property(&Foo::str, StartsWith("hi"))
26023031903d4a68659350994571525fc86a47c02dd0Roshan Pius// matches a Foo object x iff x.str() starts with "hi".
26033204fb9682242a7b5a749489076c66d448c42577Roshan Piustemplate <typename Class, typename PropertyType, typename PropertyMatcher>
2604e3831b70d4a8a967fe8df5496d542a432692c434Roshan Piusinline PolymorphicMatcher<
2605155b9d09ef9b8ead3ca617afdd91e74070d3f0cbVinit Deshpande  internal::PropertyMatcher<Class, PropertyType> > Property(
2606    PropertyType (Class::*property)() const, const PropertyMatcher& matcher) {
2607  return MakePolymorphicMatcher(
2608      internal::PropertyMatcher<Class, PropertyType>(
2609          property,
2610          MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher)));
2611  // The call to MatcherCast() is required for supporting inner
2612  // matchers of compatible types.  For example, it allows
2613  //   Property(&Foo::bar, m)
2614  // to compile where bar() returns an int32 and m is a matcher for int64.
2615}
2616
2617// Creates a matcher that matches an object iff the result of applying
2618// a callable to x matches 'matcher'.
2619// For example,
2620//   ResultOf(f, StartsWith("hi"))
2621// matches a Foo object x iff f(x) starts with "hi".
2622// callable parameter can be a function, function pointer, or a functor.
2623// Callable has to satisfy the following conditions:
2624//   * It is required to keep no state affecting the results of
2625//     the calls on it and make no assumptions about how many calls
2626//     will be made. Any state it keeps must be protected from the
2627//     concurrent access.
2628//   * If it is a function object, it has to define type result_type.
2629//     We recommend deriving your functor classes from std::unary_function.
2630template <typename Callable, typename ResultOfMatcher>
2631internal::ResultOfMatcher<Callable> ResultOf(
2632    Callable callable, const ResultOfMatcher& matcher) {
2633  return internal::ResultOfMatcher<Callable>(
2634          callable,
2635          MatcherCast<typename internal::CallableTraits<Callable>::ResultType>(
2636              matcher));
2637  // The call to MatcherCast() is required for supporting inner
2638  // matchers of compatible types.  For example, it allows
2639  //   ResultOf(Function, m)
2640  // to compile where Function() returns an int32 and m is a matcher for int64.
2641}
2642
2643// String matchers.
2644
2645// Matches a string equal to str.
2646inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> >
2647    StrEq(const internal::string& str) {
2648  return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>(
2649      str, true, true));
2650}
2651
2652// Matches a string not equal to str.
2653inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> >
2654    StrNe(const internal::string& str) {
2655  return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>(
2656      str, false, true));
2657}
2658
2659// Matches a string equal to str, ignoring case.
2660inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> >
2661    StrCaseEq(const internal::string& str) {
2662  return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>(
2663      str, true, false));
2664}
2665
2666// Matches a string not equal to str, ignoring case.
2667inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> >
2668    StrCaseNe(const internal::string& str) {
2669  return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>(
2670      str, false, false));
2671}
2672
2673// Creates a matcher that matches any string, std::string, or C string
2674// that contains the given substring.
2675inline PolymorphicMatcher<internal::HasSubstrMatcher<internal::string> >
2676    HasSubstr(const internal::string& substring) {
2677  return MakePolymorphicMatcher(internal::HasSubstrMatcher<internal::string>(
2678      substring));
2679}
2680
2681// Matches a string that starts with 'prefix' (case-sensitive).
2682inline PolymorphicMatcher<internal::StartsWithMatcher<internal::string> >
2683    StartsWith(const internal::string& prefix) {
2684  return MakePolymorphicMatcher(internal::StartsWithMatcher<internal::string>(
2685      prefix));
2686}
2687
2688// Matches a string that ends with 'suffix' (case-sensitive).
2689inline PolymorphicMatcher<internal::EndsWithMatcher<internal::string> >
2690    EndsWith(const internal::string& suffix) {
2691  return MakePolymorphicMatcher(internal::EndsWithMatcher<internal::string>(
2692      suffix));
2693}
2694
2695// Matches a string that fully matches regular expression 'regex'.
2696// The matcher takes ownership of 'regex'.
2697inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(
2698    const internal::RE* regex) {
2699  return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true));
2700}
2701inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(
2702    const internal::string& regex) {
2703  return MatchesRegex(new internal::RE(regex));
2704}
2705
2706// Matches a string that contains regular expression 'regex'.
2707// The matcher takes ownership of 'regex'.
2708inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(
2709    const internal::RE* regex) {
2710  return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false));
2711}
2712inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(
2713    const internal::string& regex) {
2714  return ContainsRegex(new internal::RE(regex));
2715}
2716
2717#if GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING
2718// Wide string matchers.
2719
2720// Matches a string equal to str.
2721inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
2722    StrEq(const internal::wstring& str) {
2723  return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
2724      str, true, true));
2725}
2726
2727// Matches a string not equal to str.
2728inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
2729    StrNe(const internal::wstring& str) {
2730  return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
2731      str, false, true));
2732}
2733
2734// Matches a string equal to str, ignoring case.
2735inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
2736    StrCaseEq(const internal::wstring& str) {
2737  return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
2738      str, true, false));
2739}
2740
2741// Matches a string not equal to str, ignoring case.
2742inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
2743    StrCaseNe(const internal::wstring& str) {
2744  return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
2745      str, false, false));
2746}
2747
2748// Creates a matcher that matches any wstring, std::wstring, or C wide string
2749// that contains the given substring.
2750inline PolymorphicMatcher<internal::HasSubstrMatcher<internal::wstring> >
2751    HasSubstr(const internal::wstring& substring) {
2752  return MakePolymorphicMatcher(internal::HasSubstrMatcher<internal::wstring>(
2753      substring));
2754}
2755
2756// Matches a string that starts with 'prefix' (case-sensitive).
2757inline PolymorphicMatcher<internal::StartsWithMatcher<internal::wstring> >
2758    StartsWith(const internal::wstring& prefix) {
2759  return MakePolymorphicMatcher(internal::StartsWithMatcher<internal::wstring>(
2760      prefix));
2761}
2762
2763// Matches a string that ends with 'suffix' (case-sensitive).
2764inline PolymorphicMatcher<internal::EndsWithMatcher<internal::wstring> >
2765    EndsWith(const internal::wstring& suffix) {
2766  return MakePolymorphicMatcher(internal::EndsWithMatcher<internal::wstring>(
2767      suffix));
2768}
2769
2770#endif  // GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING
2771
2772// Creates a polymorphic matcher that matches a 2-tuple where the
2773// first field == the second field.
2774inline internal::Eq2Matcher Eq() { return internal::Eq2Matcher(); }
2775
2776// Creates a polymorphic matcher that matches a 2-tuple where the
2777// first field >= the second field.
2778inline internal::Ge2Matcher Ge() { return internal::Ge2Matcher(); }
2779
2780// Creates a polymorphic matcher that matches a 2-tuple where the
2781// first field > the second field.
2782inline internal::Gt2Matcher Gt() { return internal::Gt2Matcher(); }
2783
2784// Creates a polymorphic matcher that matches a 2-tuple where the
2785// first field <= the second field.
2786inline internal::Le2Matcher Le() { return internal::Le2Matcher(); }
2787
2788// Creates a polymorphic matcher that matches a 2-tuple where the
2789// first field < the second field.
2790inline internal::Lt2Matcher Lt() { return internal::Lt2Matcher(); }
2791
2792// Creates a polymorphic matcher that matches a 2-tuple where the
2793// first field != the second field.
2794inline internal::Ne2Matcher Ne() { return internal::Ne2Matcher(); }
2795
2796// Creates a matcher that matches any value of type T that m doesn't
2797// match.
2798template <typename InnerMatcher>
2799inline internal::NotMatcher<InnerMatcher> Not(InnerMatcher m) {
2800  return internal::NotMatcher<InnerMatcher>(m);
2801}
2802
2803// Creates a matcher that matches any value that matches all of the
2804// given matchers.
2805//
2806// For now we only support up to 5 matchers.  Support for more
2807// matchers can be added as needed, or the user can use nested
2808// AllOf()s.
2809template <typename Matcher1, typename Matcher2>
2810inline internal::BothOfMatcher<Matcher1, Matcher2>
2811AllOf(Matcher1 m1, Matcher2 m2) {
2812  return internal::BothOfMatcher<Matcher1, Matcher2>(m1, m2);
2813}
2814
2815template <typename Matcher1, typename Matcher2, typename Matcher3>
2816inline internal::BothOfMatcher<Matcher1,
2817           internal::BothOfMatcher<Matcher2, Matcher3> >
2818AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) {
2819  return AllOf(m1, AllOf(m2, m3));
2820}
2821
2822template <typename Matcher1, typename Matcher2, typename Matcher3,
2823          typename Matcher4>
2824inline internal::BothOfMatcher<Matcher1,
2825           internal::BothOfMatcher<Matcher2,
2826               internal::BothOfMatcher<Matcher3, Matcher4> > >
2827AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) {
2828  return AllOf(m1, AllOf(m2, m3, m4));
2829}
2830
2831template <typename Matcher1, typename Matcher2, typename Matcher3,
2832          typename Matcher4, typename Matcher5>
2833inline internal::BothOfMatcher<Matcher1,
2834           internal::BothOfMatcher<Matcher2,
2835               internal::BothOfMatcher<Matcher3,
2836                   internal::BothOfMatcher<Matcher4, Matcher5> > > >
2837AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) {
2838  return AllOf(m1, AllOf(m2, m3, m4, m5));
2839}
2840
2841// Creates a matcher that matches any value that matches at least one
2842// of the given matchers.
2843//
2844// For now we only support up to 5 matchers.  Support for more
2845// matchers can be added as needed, or the user can use nested
2846// AnyOf()s.
2847template <typename Matcher1, typename Matcher2>
2848inline internal::EitherOfMatcher<Matcher1, Matcher2>
2849AnyOf(Matcher1 m1, Matcher2 m2) {
2850  return internal::EitherOfMatcher<Matcher1, Matcher2>(m1, m2);
2851}
2852
2853template <typename Matcher1, typename Matcher2, typename Matcher3>
2854inline internal::EitherOfMatcher<Matcher1,
2855           internal::EitherOfMatcher<Matcher2, Matcher3> >
2856AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) {
2857  return AnyOf(m1, AnyOf(m2, m3));
2858}
2859
2860template <typename Matcher1, typename Matcher2, typename Matcher3,
2861          typename Matcher4>
2862inline internal::EitherOfMatcher<Matcher1,
2863           internal::EitherOfMatcher<Matcher2,
2864               internal::EitherOfMatcher<Matcher3, Matcher4> > >
2865AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) {
2866  return AnyOf(m1, AnyOf(m2, m3, m4));
2867}
2868
2869template <typename Matcher1, typename Matcher2, typename Matcher3,
2870          typename Matcher4, typename Matcher5>
2871inline internal::EitherOfMatcher<Matcher1,
2872           internal::EitherOfMatcher<Matcher2,
2873               internal::EitherOfMatcher<Matcher3,
2874                   internal::EitherOfMatcher<Matcher4, Matcher5> > > >
2875AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) {
2876  return AnyOf(m1, AnyOf(m2, m3, m4, m5));
2877}
2878
2879// Returns a matcher that matches anything that satisfies the given
2880// predicate.  The predicate can be any unary function or functor
2881// whose return type can be implicitly converted to bool.
2882template <typename Predicate>
2883inline PolymorphicMatcher<internal::TrulyMatcher<Predicate> >
2884Truly(Predicate pred) {
2885  return MakePolymorphicMatcher(internal::TrulyMatcher<Predicate>(pred));
2886}
2887
2888// Returns a matcher that matches an equal container.
2889// This matcher behaves like Eq(), but in the event of mismatch lists the
2890// values that are included in one container but not the other. (Duplicate
2891// values and order differences are not explained.)
2892template <typename Container>
2893inline PolymorphicMatcher<internal::ContainerEqMatcher<  // NOLINT
2894                            GTEST_REMOVE_CONST_(Container)> >
2895    ContainerEq(const Container& rhs) {
2896  // This following line is for working around a bug in MSVC 8.0,
2897  // which causes Container to be a const type sometimes.
2898  typedef GTEST_REMOVE_CONST_(Container) RawContainer;
2899  return MakePolymorphicMatcher(
2900      internal::ContainerEqMatcher<RawContainer>(rhs));
2901}
2902
2903// Matches an STL-style container or a native array that contains at
2904// least one element matching the given value or matcher.
2905//
2906// Examples:
2907//   ::std::set<int> page_ids;
2908//   page_ids.insert(3);
2909//   page_ids.insert(1);
2910//   EXPECT_THAT(page_ids, Contains(1));
2911//   EXPECT_THAT(page_ids, Contains(Gt(2)));
2912//   EXPECT_THAT(page_ids, Not(Contains(4)));
2913//
2914//   ::std::map<int, size_t> page_lengths;
2915//   page_lengths[1] = 100;
2916//   EXPECT_THAT(page_lengths,
2917//               Contains(::std::pair<const int, size_t>(1, 100)));
2918//
2919//   const char* user_ids[] = { "joe", "mike", "tom" };
2920//   EXPECT_THAT(user_ids, Contains(Eq(::std::string("tom"))));
2921template <typename M>
2922inline internal::ContainsMatcher<M> Contains(M matcher) {
2923  return internal::ContainsMatcher<M>(matcher);
2924}
2925
2926// Matches an STL-style container or a native array that contains only
2927// elements matching the given value or matcher.
2928//
2929// Each(m) is semantically equivalent to Not(Contains(Not(m))). Only
2930// the messages are different.
2931//
2932// Examples:
2933//   ::std::set<int> page_ids;
2934//   // Each(m) matches an empty container, regardless of what m is.
2935//   EXPECT_THAT(page_ids, Each(Eq(1)));
2936//   EXPECT_THAT(page_ids, Each(Eq(77)));
2937//
2938//   page_ids.insert(3);
2939//   EXPECT_THAT(page_ids, Each(Gt(0)));
2940//   EXPECT_THAT(page_ids, Not(Each(Gt(4))));
2941//   page_ids.insert(1);
2942//   EXPECT_THAT(page_ids, Not(Each(Lt(2))));
2943//
2944//   ::std::map<int, size_t> page_lengths;
2945//   page_lengths[1] = 100;
2946//   page_lengths[2] = 200;
2947//   page_lengths[3] = 300;
2948//   EXPECT_THAT(page_lengths, Not(Each(Pair(1, 100))));
2949//   EXPECT_THAT(page_lengths, Each(Key(Le(3))));
2950//
2951//   const char* user_ids[] = { "joe", "mike", "tom" };
2952//   EXPECT_THAT(user_ids, Not(Each(Eq(::std::string("tom")))));
2953template <typename M>
2954inline internal::EachMatcher<M> Each(M matcher) {
2955  return internal::EachMatcher<M>(matcher);
2956}
2957
2958// Key(inner_matcher) matches an std::pair whose 'first' field matches
2959// inner_matcher.  For example, Contains(Key(Ge(5))) can be used to match an
2960// std::map that contains at least one element whose key is >= 5.
2961template <typename M>
2962inline internal::KeyMatcher<M> Key(M inner_matcher) {
2963  return internal::KeyMatcher<M>(inner_matcher);
2964}
2965
2966// Pair(first_matcher, second_matcher) matches a std::pair whose 'first' field
2967// matches first_matcher and whose 'second' field matches second_matcher.  For
2968// example, EXPECT_THAT(map_type, ElementsAre(Pair(Ge(5), "foo"))) can be used
2969// to match a std::map<int, string> that contains exactly one element whose key
2970// is >= 5 and whose value equals "foo".
2971template <typename FirstMatcher, typename SecondMatcher>
2972inline internal::PairMatcher<FirstMatcher, SecondMatcher>
2973Pair(FirstMatcher first_matcher, SecondMatcher second_matcher) {
2974  return internal::PairMatcher<FirstMatcher, SecondMatcher>(
2975      first_matcher, second_matcher);
2976}
2977
2978// Returns a predicate that is satisfied by anything that matches the
2979// given matcher.
2980template <typename M>
2981inline internal::MatcherAsPredicate<M> Matches(M matcher) {
2982  return internal::MatcherAsPredicate<M>(matcher);
2983}
2984
2985// Returns true iff the value matches the matcher.
2986template <typename T, typename M>
2987inline bool Value(const T& value, M matcher) {
2988  return testing::Matches(matcher)(value);
2989}
2990
2991// Matches the value against the given matcher and explains the match
2992// result to listener.
2993template <typename T, typename M>
2994inline bool ExplainMatchResult(
2995    M matcher, const T& value, MatchResultListener* listener) {
2996  return SafeMatcherCast<const T&>(matcher).MatchAndExplain(value, listener);
2997}
2998
2999// AllArgs(m) is a synonym of m.  This is useful in
3000//
3001//   EXPECT_CALL(foo, Bar(_, _)).With(AllArgs(Eq()));
3002//
3003// which is easier to read than
3004//
3005//   EXPECT_CALL(foo, Bar(_, _)).With(Eq());
3006template <typename InnerMatcher>
3007inline InnerMatcher AllArgs(const InnerMatcher& matcher) { return matcher; }
3008
3009// These macros allow using matchers to check values in Google Test
3010// tests.  ASSERT_THAT(value, matcher) and EXPECT_THAT(value, matcher)
3011// succeed iff the value matches the matcher.  If the assertion fails,
3012// the value and the description of the matcher will be printed.
3013#define ASSERT_THAT(value, matcher) ASSERT_PRED_FORMAT1(\
3014    ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)
3015#define EXPECT_THAT(value, matcher) EXPECT_PRED_FORMAT1(\
3016    ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)
3017
3018}  // namespace testing
3019
3020#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
3021