Home | History | Annotate | Download | only in gmock
      1 // Copyright 2007, Google Inc.
      2 // All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are
      6 // met:
      7 //
      8 //     * Redistributions of source code must retain the above copyright
      9 // notice, this list of conditions and the following disclaimer.
     10 //     * Redistributions in binary form must reproduce the above
     11 // copyright notice, this list of conditions and the following disclaimer
     12 // in the documentation and/or other materials provided with the
     13 // distribution.
     14 //     * Neither the name of Google Inc. nor the names of its
     15 // contributors may be used to endorse or promote products derived from
     16 // this software without specific prior written permission.
     17 //
     18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29 //
     30 // Author: wan (at) google.com (Zhanyong Wan)
     31 
     32 // Google Mock - a framework for writing C++ mock classes.
     33 //
     34 // This file implements some commonly used argument matchers.  More
     35 // matchers can be defined by the user implementing the
     36 // MatcherInterface<T> interface if necessary.
     37 
     38 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
     39 #define GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
     40 
     41 #include <math.h>
     42 #include <algorithm>
     43 #include <iterator>
     44 #include <limits>
     45 #include <ostream>  // NOLINT
     46 #include <sstream>
     47 #include <string>
     48 #include <utility>
     49 #include <vector>
     50 
     51 #include "gmock/internal/gmock-internal-utils.h"
     52 #include "gmock/internal/gmock-port.h"
     53 #include "gtest/gtest.h"
     54 
     55 #if GTEST_LANG_CXX11
     56 #include <initializer_list>  // NOLINT -- must be after gtest.h
     57 #endif
     58 
     59 namespace testing {
     60 
     61 // To implement a matcher Foo for type T, define:
     62 //   1. a class FooMatcherImpl that implements the
     63 //      MatcherInterface<T> interface, and
     64 //   2. a factory function that creates a Matcher<T> object from a
     65 //      FooMatcherImpl*.
     66 //
     67 // The two-level delegation design makes it possible to allow a user
     68 // to write "v" instead of "Eq(v)" where a Matcher is expected, which
     69 // is impossible if we pass matchers by pointers.  It also eases
     70 // ownership management as Matcher objects can now be copied like
     71 // plain values.
     72 
     73 // MatchResultListener is an abstract class.  Its << operator can be
     74 // used by a matcher to explain why a value matches or doesn't match.
     75 //
     76 // TODO(wan (at) google.com): add method
     77 //   bool InterestedInWhy(bool result) const;
     78 // to indicate whether the listener is interested in why the match
     79 // result is 'result'.
     80 class MatchResultListener {
     81  public:
     82   // Creates a listener object with the given underlying ostream.  The
     83   // listener does not own the ostream, and does not dereference it
     84   // in the constructor or destructor.
     85   explicit MatchResultListener(::std::ostream* os) : stream_(os) {}
     86   virtual ~MatchResultListener() = 0;  // Makes this class abstract.
     87 
     88   // Streams x to the underlying ostream; does nothing if the ostream
     89   // is NULL.
     90   template <typename T>
     91   MatchResultListener& operator<<(const T& x) {
     92     if (stream_ != NULL)
     93       *stream_ << x;
     94     return *this;
     95   }
     96 
     97   // Returns the underlying ostream.
     98   ::std::ostream* stream() { return stream_; }
     99 
    100   // Returns true iff the listener is interested in an explanation of
    101   // the match result.  A matcher's MatchAndExplain() method can use
    102   // this information to avoid generating the explanation when no one
    103   // intends to hear it.
    104   bool IsInterested() const { return stream_ != NULL; }
    105 
    106  private:
    107   ::std::ostream* const stream_;
    108 
    109   GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener);
    110 };
    111 
    112 inline MatchResultListener::~MatchResultListener() {
    113 }
    114 
    115 // An instance of a subclass of this knows how to describe itself as a
    116 // matcher.
    117 class MatcherDescriberInterface {
    118  public:
    119   virtual ~MatcherDescriberInterface() {}
    120 
    121   // Describes this matcher to an ostream.  The function should print
    122   // a verb phrase that describes the property a value matching this
    123   // matcher should have.  The subject of the verb phrase is the value
    124   // being matched.  For example, the DescribeTo() method of the Gt(7)
    125   // matcher prints "is greater than 7".
    126   virtual void DescribeTo(::std::ostream* os) const = 0;
    127 
    128   // Describes the negation of this matcher to an ostream.  For
    129   // example, if the description of this matcher is "is greater than
    130   // 7", the negated description could be "is not greater than 7".
    131   // You are not required to override this when implementing
    132   // MatcherInterface, but it is highly advised so that your matcher
    133   // can produce good error messages.
    134   virtual void DescribeNegationTo(::std::ostream* os) const {
    135     *os << "not (";
    136     DescribeTo(os);
    137     *os << ")";
    138   }
    139 };
    140 
    141 // The implementation of a matcher.
    142 template <typename T>
    143 class MatcherInterface : public MatcherDescriberInterface {
    144  public:
    145   // Returns true iff the matcher matches x; also explains the match
    146   // result to 'listener' if necessary (see the next paragraph), in
    147   // the form of a non-restrictive relative clause ("which ...",
    148   // "whose ...", etc) that describes x.  For example, the
    149   // MatchAndExplain() method of the Pointee(...) matcher should
    150   // generate an explanation like "which points to ...".
    151   //
    152   // Implementations of MatchAndExplain() should add an explanation of
    153   // the match result *if and only if* they can provide additional
    154   // information that's not already present (or not obvious) in the
    155   // print-out of x and the matcher's description.  Whether the match
    156   // succeeds is not a factor in deciding whether an explanation is
    157   // needed, as sometimes the caller needs to print a failure message
    158   // when the match succeeds (e.g. when the matcher is used inside
    159   // Not()).
    160   //
    161   // For example, a "has at least 10 elements" matcher should explain
    162   // what the actual element count is, regardless of the match result,
    163   // as it is useful information to the reader; on the other hand, an
    164   // "is empty" matcher probably only needs to explain what the actual
    165   // size is when the match fails, as it's redundant to say that the
    166   // size is 0 when the value is already known to be empty.
    167   //
    168   // You should override this method when defining a new matcher.
    169   //
    170   // It's the responsibility of the caller (Google Mock) to guarantee
    171   // that 'listener' is not NULL.  This helps to simplify a matcher's
    172   // implementation when it doesn't care about the performance, as it
    173   // can talk to 'listener' without checking its validity first.
    174   // However, in order to implement dummy listeners efficiently,
    175   // listener->stream() may be NULL.
    176   virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0;
    177 
    178   // Inherits these methods from MatcherDescriberInterface:
    179   //   virtual void DescribeTo(::std::ostream* os) const = 0;
    180   //   virtual void DescribeNegationTo(::std::ostream* os) const;
    181 };
    182 
    183 // A match result listener that stores the explanation in a string.
    184 class StringMatchResultListener : public MatchResultListener {
    185  public:
    186   StringMatchResultListener() : MatchResultListener(&ss_) {}
    187 
    188   // Returns the explanation accumulated so far.
    189   internal::string str() const { return ss_.str(); }
    190 
    191   // Clears the explanation accumulated so far.
    192   void Clear() { ss_.str(""); }
    193 
    194  private:
    195   ::std::stringstream ss_;
    196 
    197   GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener);
    198 };
    199 
    200 namespace internal {
    201 
    202 // A match result listener that ignores the explanation.
    203 class DummyMatchResultListener : public MatchResultListener {
    204  public:
    205   DummyMatchResultListener() : MatchResultListener(NULL) {}
    206 
    207  private:
    208   GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener);
    209 };
    210 
    211 // A match result listener that forwards the explanation to a given
    212 // ostream.  The difference between this and MatchResultListener is
    213 // that the former is concrete.
    214 class StreamMatchResultListener : public MatchResultListener {
    215  public:
    216   explicit StreamMatchResultListener(::std::ostream* os)
    217       : MatchResultListener(os) {}
    218 
    219  private:
    220   GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener);
    221 };
    222 
    223 // An internal class for implementing Matcher<T>, which will derive
    224 // from it.  We put functionalities common to all Matcher<T>
    225 // specializations here to avoid code duplication.
    226 template <typename T>
    227 class MatcherBase {
    228  public:
    229   // Returns true iff the matcher matches x; also explains the match
    230   // result to 'listener'.
    231   bool MatchAndExplain(T x, MatchResultListener* listener) const {
    232     return impl_->MatchAndExplain(x, listener);
    233   }
    234 
    235   // Returns true iff this matcher matches x.
    236   bool Matches(T x) const {
    237     DummyMatchResultListener dummy;
    238     return MatchAndExplain(x, &dummy);
    239   }
    240 
    241   // Describes this matcher to an ostream.
    242   void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); }
    243 
    244   // Describes the negation of this matcher to an ostream.
    245   void DescribeNegationTo(::std::ostream* os) const {
    246     impl_->DescribeNegationTo(os);
    247   }
    248 
    249   // Explains why x matches, or doesn't match, the matcher.
    250   void ExplainMatchResultTo(T x, ::std::ostream* os) const {
    251     StreamMatchResultListener listener(os);
    252     MatchAndExplain(x, &listener);
    253   }
    254 
    255   // Returns the describer for this matcher object; retains ownership
    256   // of the describer, which is only guaranteed to be alive when
    257   // this matcher object is alive.
    258   const MatcherDescriberInterface* GetDescriber() const {
    259     return impl_.get();
    260   }
    261 
    262  protected:
    263   MatcherBase() {}
    264 
    265   // Constructs a matcher from its implementation.
    266   explicit MatcherBase(const MatcherInterface<T>* impl)
    267       : impl_(impl) {}
    268 
    269   virtual ~MatcherBase() {}
    270 
    271  private:
    272   // shared_ptr (util/gtl/shared_ptr.h) and linked_ptr have similar
    273   // interfaces.  The former dynamically allocates a chunk of memory
    274   // to hold the reference count, while the latter tracks all
    275   // references using a circular linked list without allocating
    276   // memory.  It has been observed that linked_ptr performs better in
    277   // typical scenarios.  However, shared_ptr can out-perform
    278   // linked_ptr when there are many more uses of the copy constructor
    279   // than the default constructor.
    280   //
    281   // If performance becomes a problem, we should see if using
    282   // shared_ptr helps.
    283   ::testing::internal::linked_ptr<const MatcherInterface<T> > impl_;
    284 };
    285 
    286 }  // namespace internal
    287 
    288 // A Matcher<T> is a copyable and IMMUTABLE (except by assignment)
    289 // object that can check whether a value of type T matches.  The
    290 // implementation of Matcher<T> is just a linked_ptr to const
    291 // MatcherInterface<T>, so copying is fairly cheap.  Don't inherit
    292 // from Matcher!
    293 template <typename T>
    294 class Matcher : public internal::MatcherBase<T> {
    295  public:
    296   // Constructs a null matcher.  Needed for storing Matcher objects in STL
    297   // containers.  A default-constructed matcher is not yet initialized.  You
    298   // cannot use it until a valid value has been assigned to it.
    299   Matcher() {}
    300 
    301   // Constructs a matcher from its implementation.
    302   explicit Matcher(const MatcherInterface<T>* impl)
    303       : internal::MatcherBase<T>(impl) {}
    304 
    305   // Implicit constructor here allows people to write
    306   // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes
    307   Matcher(T value);  // NOLINT
    308 };
    309 
    310 // The following two specializations allow the user to write str
    311 // instead of Eq(str) and "foo" instead of Eq("foo") when a string
    312 // matcher is expected.
    313 template <>
    314 class GTEST_API_ Matcher<const internal::string&>
    315     : public internal::MatcherBase<const internal::string&> {
    316  public:
    317   Matcher() {}
    318 
    319   explicit Matcher(const MatcherInterface<const internal::string&>* impl)
    320       : internal::MatcherBase<const internal::string&>(impl) {}
    321 
    322   // Allows the user to write str instead of Eq(str) sometimes, where
    323   // str is a string object.
    324   Matcher(const internal::string& s);  // NOLINT
    325 
    326   // Allows the user to write "foo" instead of Eq("foo") sometimes.
    327   Matcher(const char* s);  // NOLINT
    328 };
    329 
    330 template <>
    331 class GTEST_API_ Matcher<internal::string>
    332     : public internal::MatcherBase<internal::string> {
    333  public:
    334   Matcher() {}
    335 
    336   explicit Matcher(const MatcherInterface<internal::string>* impl)
    337       : internal::MatcherBase<internal::string>(impl) {}
    338 
    339   // Allows the user to write str instead of Eq(str) sometimes, where
    340   // str is a string object.
    341   Matcher(const internal::string& s);  // NOLINT
    342 
    343   // Allows the user to write "foo" instead of Eq("foo") sometimes.
    344   Matcher(const char* s);  // NOLINT
    345 };
    346 
    347 #if GTEST_HAS_STRING_PIECE_
    348 // The following two specializations allow the user to write str
    349 // instead of Eq(str) and "foo" instead of Eq("foo") when a StringPiece
    350 // matcher is expected.
    351 template <>
    352 class GTEST_API_ Matcher<const StringPiece&>
    353     : public internal::MatcherBase<const StringPiece&> {
    354  public:
    355   Matcher() {}
    356 
    357   explicit Matcher(const MatcherInterface<const StringPiece&>* impl)
    358       : internal::MatcherBase<const StringPiece&>(impl) {}
    359 
    360   // Allows the user to write str instead of Eq(str) sometimes, where
    361   // str is a string object.
    362   Matcher(const internal::string& s);  // NOLINT
    363 
    364   // Allows the user to write "foo" instead of Eq("foo") sometimes.
    365   Matcher(const char* s);  // NOLINT
    366 
    367   // Allows the user to pass StringPieces directly.
    368   Matcher(StringPiece s);  // NOLINT
    369 };
    370 
    371 template <>
    372 class GTEST_API_ Matcher<StringPiece>
    373     : public internal::MatcherBase<StringPiece> {
    374  public:
    375   Matcher() {}
    376 
    377   explicit Matcher(const MatcherInterface<StringPiece>* impl)
    378       : internal::MatcherBase<StringPiece>(impl) {}
    379 
    380   // Allows the user to write str instead of Eq(str) sometimes, where
    381   // str is a string object.
    382   Matcher(const internal::string& s);  // NOLINT
    383 
    384   // Allows the user to write "foo" instead of Eq("foo") sometimes.
    385   Matcher(const char* s);  // NOLINT
    386 
    387   // Allows the user to pass StringPieces directly.
    388   Matcher(StringPiece s);  // NOLINT
    389 };
    390 #endif  // GTEST_HAS_STRING_PIECE_
    391 
    392 // The PolymorphicMatcher class template makes it easy to implement a
    393 // polymorphic matcher (i.e. a matcher that can match values of more
    394 // than one type, e.g. Eq(n) and NotNull()).
    395 //
    396 // To define a polymorphic matcher, a user should provide an Impl
    397 // class that has a DescribeTo() method and a DescribeNegationTo()
    398 // method, and define a member function (or member function template)
    399 //
    400 //   bool MatchAndExplain(const Value& value,
    401 //                        MatchResultListener* listener) const;
    402 //
    403 // See the definition of NotNull() for a complete example.
    404 template <class Impl>
    405 class PolymorphicMatcher {
    406  public:
    407   explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {}
    408 
    409   // Returns a mutable reference to the underlying matcher
    410   // implementation object.
    411   Impl& mutable_impl() { return impl_; }
    412 
    413   // Returns an immutable reference to the underlying matcher
    414   // implementation object.
    415   const Impl& impl() const { return impl_; }
    416 
    417   template <typename T>
    418   operator Matcher<T>() const {
    419     return Matcher<T>(new MonomorphicImpl<T>(impl_));
    420   }
    421 
    422  private:
    423   template <typename T>
    424   class MonomorphicImpl : public MatcherInterface<T> {
    425    public:
    426     explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {}
    427 
    428     virtual void DescribeTo(::std::ostream* os) const {
    429       impl_.DescribeTo(os);
    430     }
    431 
    432     virtual void DescribeNegationTo(::std::ostream* os) const {
    433       impl_.DescribeNegationTo(os);
    434     }
    435 
    436     virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
    437       return impl_.MatchAndExplain(x, listener);
    438     }
    439 
    440    private:
    441     const Impl impl_;
    442 
    443     GTEST_DISALLOW_ASSIGN_(MonomorphicImpl);
    444   };
    445 
    446   Impl impl_;
    447 
    448   GTEST_DISALLOW_ASSIGN_(PolymorphicMatcher);
    449 };
    450 
    451 // Creates a matcher from its implementation.  This is easier to use
    452 // than the Matcher<T> constructor as it doesn't require you to
    453 // explicitly write the template argument, e.g.
    454 //
    455 //   MakeMatcher(foo);
    456 // vs
    457 //   Matcher<const string&>(foo);
    458 template <typename T>
    459 inline Matcher<T> MakeMatcher(const MatcherInterface<T>* impl) {
    460   return Matcher<T>(impl);
    461 }
    462 
    463 // Creates a polymorphic matcher from its implementation.  This is
    464 // easier to use than the PolymorphicMatcher<Impl> constructor as it
    465 // doesn't require you to explicitly write the template argument, e.g.
    466 //
    467 //   MakePolymorphicMatcher(foo);
    468 // vs
    469 //   PolymorphicMatcher<TypeOfFoo>(foo);
    470 template <class Impl>
    471 inline PolymorphicMatcher<Impl> MakePolymorphicMatcher(const Impl& impl) {
    472   return PolymorphicMatcher<Impl>(impl);
    473 }
    474 
    475 // Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION
    476 // and MUST NOT BE USED IN USER CODE!!!
    477 namespace internal {
    478 
    479 // The MatcherCastImpl class template is a helper for implementing
    480 // MatcherCast().  We need this helper in order to partially
    481 // specialize the implementation of MatcherCast() (C++ allows
    482 // class/struct templates to be partially specialized, but not
    483 // function templates.).
    484 
    485 // This general version is used when MatcherCast()'s argument is a
    486 // polymorphic matcher (i.e. something that can be converted to a
    487 // Matcher but is not one yet; for example, Eq(value)) or a value (for
    488 // example, "hello").
    489 template <typename T, typename M>
    490 class MatcherCastImpl {
    491  public:
    492   static Matcher<T> Cast(M polymorphic_matcher_or_value) {
    493     // M can be a polymorhic matcher, in which case we want to use
    494     // its conversion operator to create Matcher<T>.  Or it can be a value
    495     // that should be passed to the Matcher<T>'s constructor.
    496     //
    497     // We can't call Matcher<T>(polymorphic_matcher_or_value) when M is a
    498     // polymorphic matcher because it'll be ambiguous if T has an implicit
    499     // constructor from M (this usually happens when T has an implicit
    500     // constructor from any type).
    501     //
    502     // It won't work to unconditionally implict_cast
    503     // polymorphic_matcher_or_value to Matcher<T> because it won't trigger
    504     // a user-defined conversion from M to T if one exists (assuming M is
    505     // a value).
    506     return CastImpl(
    507         polymorphic_matcher_or_value,
    508         BooleanConstant<
    509             internal::ImplicitlyConvertible<M, Matcher<T> >::value>());
    510   }
    511 
    512  private:
    513   static Matcher<T> CastImpl(M value, BooleanConstant<false>) {
    514     // M can't be implicitly converted to Matcher<T>, so M isn't a polymorphic
    515     // matcher.  It must be a value then.  Use direct initialization to create
    516     // a matcher.
    517     return Matcher<T>(ImplicitCast_<T>(value));
    518   }
    519 
    520   static Matcher<T> CastImpl(M polymorphic_matcher_or_value,
    521                              BooleanConstant<true>) {
    522     // M is implicitly convertible to Matcher<T>, which means that either
    523     // M is a polymorhpic matcher or Matcher<T> has an implicit constructor
    524     // from M.  In both cases using the implicit conversion will produce a
    525     // matcher.
    526     //
    527     // Even if T has an implicit constructor from M, it won't be called because
    528     // creating Matcher<T> would require a chain of two user-defined conversions
    529     // (first to create T from M and then to create Matcher<T> from T).
    530     return polymorphic_matcher_or_value;
    531   }
    532 };
    533 
    534 // This more specialized version is used when MatcherCast()'s argument
    535 // is already a Matcher.  This only compiles when type T can be
    536 // statically converted to type U.
    537 template <typename T, typename U>
    538 class MatcherCastImpl<T, Matcher<U> > {
    539  public:
    540   static Matcher<T> Cast(const Matcher<U>& source_matcher) {
    541     return Matcher<T>(new Impl(source_matcher));
    542   }
    543 
    544  private:
    545   class Impl : public MatcherInterface<T> {
    546    public:
    547     explicit Impl(const Matcher<U>& source_matcher)
    548         : source_matcher_(source_matcher) {}
    549 
    550     // We delegate the matching logic to the source matcher.
    551     virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
    552       return source_matcher_.MatchAndExplain(static_cast<U>(x), listener);
    553     }
    554 
    555     virtual void DescribeTo(::std::ostream* os) const {
    556       source_matcher_.DescribeTo(os);
    557     }
    558 
    559     virtual void DescribeNegationTo(::std::ostream* os) const {
    560       source_matcher_.DescribeNegationTo(os);
    561     }
    562 
    563    private:
    564     const Matcher<U> source_matcher_;
    565 
    566     GTEST_DISALLOW_ASSIGN_(Impl);
    567   };
    568 };
    569 
    570 // This even more specialized version is used for efficiently casting
    571 // a matcher to its own type.
    572 template <typename T>
    573 class MatcherCastImpl<T, Matcher<T> > {
    574  public:
    575   static Matcher<T> Cast(const Matcher<T>& matcher) { return matcher; }
    576 };
    577 
    578 }  // namespace internal
    579 
    580 // In order to be safe and clear, casting between different matcher
    581 // types is done explicitly via MatcherCast<T>(m), which takes a
    582 // matcher m and returns a Matcher<T>.  It compiles only when T can be
    583 // statically converted to the argument type of m.
    584 template <typename T, typename M>
    585 inline Matcher<T> MatcherCast(M matcher) {
    586   return internal::MatcherCastImpl<T, M>::Cast(matcher);
    587 }
    588 
    589 // Implements SafeMatcherCast().
    590 //
    591 // We use an intermediate class to do the actual safe casting as Nokia's
    592 // Symbian compiler cannot decide between
    593 // template <T, M> ... (M) and
    594 // template <T, U> ... (const Matcher<U>&)
    595 // for function templates but can for member function templates.
    596 template <typename T>
    597 class SafeMatcherCastImpl {
    598  public:
    599   // This overload handles polymorphic matchers and values only since
    600   // monomorphic matchers are handled by the next one.
    601   template <typename M>
    602   static inline Matcher<T> Cast(M polymorphic_matcher_or_value) {
    603     return internal::MatcherCastImpl<T, M>::Cast(polymorphic_matcher_or_value);
    604   }
    605 
    606   // This overload handles monomorphic matchers.
    607   //
    608   // In general, if type T can be implicitly converted to type U, we can
    609   // safely convert a Matcher<U> to a Matcher<T> (i.e. Matcher is
    610   // contravariant): just keep a copy of the original Matcher<U>, convert the
    611   // argument from type T to U, and then pass it to the underlying Matcher<U>.
    612   // The only exception is when U is a reference and T is not, as the
    613   // underlying Matcher<U> may be interested in the argument's address, which
    614   // is not preserved in the conversion from T to U.
    615   template <typename U>
    616   static inline Matcher<T> Cast(const Matcher<U>& matcher) {
    617     // Enforce that T can be implicitly converted to U.
    618     GTEST_COMPILE_ASSERT_((internal::ImplicitlyConvertible<T, U>::value),
    619                           T_must_be_implicitly_convertible_to_U);
    620     // Enforce that we are not converting a non-reference type T to a reference
    621     // type U.
    622     GTEST_COMPILE_ASSERT_(
    623         internal::is_reference<T>::value || !internal::is_reference<U>::value,
    624         cannot_convert_non_referentce_arg_to_reference);
    625     // In case both T and U are arithmetic types, enforce that the
    626     // conversion is not lossy.
    627     typedef GTEST_REMOVE_REFERENCE_AND_CONST_(T) RawT;
    628     typedef GTEST_REMOVE_REFERENCE_AND_CONST_(U) RawU;
    629     const bool kTIsOther = GMOCK_KIND_OF_(RawT) == internal::kOther;
    630     const bool kUIsOther = GMOCK_KIND_OF_(RawU) == internal::kOther;
    631     GTEST_COMPILE_ASSERT_(
    632         kTIsOther || kUIsOther ||
    633         (internal::LosslessArithmeticConvertible<RawT, RawU>::value),
    634         conversion_of_arithmetic_types_must_be_lossless);
    635     return MatcherCast<T>(matcher);
    636   }
    637 };
    638 
    639 template <typename T, typename M>
    640 inline Matcher<T> SafeMatcherCast(const M& polymorphic_matcher) {
    641   return SafeMatcherCastImpl<T>::Cast(polymorphic_matcher);
    642 }
    643 
    644 // A<T>() returns a matcher that matches any value of type T.
    645 template <typename T>
    646 Matcher<T> A();
    647 
    648 // Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION
    649 // and MUST NOT BE USED IN USER CODE!!!
    650 namespace internal {
    651 
    652 // If the explanation is not empty, prints it to the ostream.
    653 inline void PrintIfNotEmpty(const internal::string& explanation,
    654                             ::std::ostream* os) {
    655   if (explanation != "" && os != NULL) {
    656     *os << ", " << explanation;
    657   }
    658 }
    659 
    660 // Returns true if the given type name is easy to read by a human.
    661 // This is used to decide whether printing the type of a value might
    662 // be helpful.
    663 inline bool IsReadableTypeName(const string& type_name) {
    664   // We consider a type name readable if it's short or doesn't contain
    665   // a template or function type.
    666   return (type_name.length() <= 20 ||
    667           type_name.find_first_of("<(") == string::npos);
    668 }
    669 
    670 // Matches the value against the given matcher, prints the value and explains
    671 // the match result to the listener. Returns the match result.
    672 // 'listener' must not be NULL.
    673 // Value cannot be passed by const reference, because some matchers take a
    674 // non-const argument.
    675 template <typename Value, typename T>
    676 bool MatchPrintAndExplain(Value& value, const Matcher<T>& matcher,
    677                           MatchResultListener* listener) {
    678   if (!listener->IsInterested()) {
    679     // If the listener is not interested, we do not need to construct the
    680     // inner explanation.
    681     return matcher.Matches(value);
    682   }
    683 
    684   StringMatchResultListener inner_listener;
    685   const bool match = matcher.MatchAndExplain(value, &inner_listener);
    686 
    687   UniversalPrint(value, listener->stream());
    688 #if GTEST_HAS_RTTI
    689   const string& type_name = GetTypeName<Value>();
    690   if (IsReadableTypeName(type_name))
    691     *listener->stream() << " (of type " << type_name << ")";
    692 #endif
    693   PrintIfNotEmpty(inner_listener.str(), listener->stream());
    694 
    695   return match;
    696 }
    697 
    698 // An internal helper class for doing compile-time loop on a tuple's
    699 // fields.
    700 template <size_t N>
    701 class TuplePrefix {
    702  public:
    703   // TuplePrefix<N>::Matches(matcher_tuple, value_tuple) returns true
    704   // iff the first N fields of matcher_tuple matches the first N
    705   // fields of value_tuple, respectively.
    706   template <typename MatcherTuple, typename ValueTuple>
    707   static bool Matches(const MatcherTuple& matcher_tuple,
    708                       const ValueTuple& value_tuple) {
    709     using ::std::tr1::get;
    710     return TuplePrefix<N - 1>::Matches(matcher_tuple, value_tuple)
    711         && get<N - 1>(matcher_tuple).Matches(get<N - 1>(value_tuple));
    712   }
    713 
    714   // TuplePrefix<N>::ExplainMatchFailuresTo(matchers, values, os)
    715   // describes failures in matching the first N fields of matchers
    716   // against the first N fields of values.  If there is no failure,
    717   // nothing will be streamed to os.
    718   template <typename MatcherTuple, typename ValueTuple>
    719   static void ExplainMatchFailuresTo(const MatcherTuple& matchers,
    720                                      const ValueTuple& values,
    721                                      ::std::ostream* os) {
    722     using ::std::tr1::tuple_element;
    723     using ::std::tr1::get;
    724 
    725     // First, describes failures in the first N - 1 fields.
    726     TuplePrefix<N - 1>::ExplainMatchFailuresTo(matchers, values, os);
    727 
    728     // Then describes the failure (if any) in the (N - 1)-th (0-based)
    729     // field.
    730     typename tuple_element<N - 1, MatcherTuple>::type matcher =
    731         get<N - 1>(matchers);
    732     typedef typename tuple_element<N - 1, ValueTuple>::type Value;
    733     Value value = get<N - 1>(values);
    734     StringMatchResultListener listener;
    735     if (!matcher.MatchAndExplain(value, &listener)) {
    736       // TODO(wan): include in the message the name of the parameter
    737       // as used in MOCK_METHOD*() when possible.
    738       *os << "  Expected arg #" << N - 1 << ": ";
    739       get<N - 1>(matchers).DescribeTo(os);
    740       *os << "\n           Actual: ";
    741       // We remove the reference in type Value to prevent the
    742       // universal printer from printing the address of value, which
    743       // isn't interesting to the user most of the time.  The
    744       // matcher's MatchAndExplain() method handles the case when
    745       // the address is interesting.
    746       internal::UniversalPrint(value, os);
    747       PrintIfNotEmpty(listener.str(), os);
    748       *os << "\n";
    749     }
    750   }
    751 };
    752 
    753 // The base case.
    754 template <>
    755 class TuplePrefix<0> {
    756  public:
    757   template <typename MatcherTuple, typename ValueTuple>
    758   static bool Matches(const MatcherTuple& /* matcher_tuple */,
    759                       const ValueTuple& /* value_tuple */) {
    760     return true;
    761   }
    762 
    763   template <typename MatcherTuple, typename ValueTuple>
    764   static void ExplainMatchFailuresTo(const MatcherTuple& /* matchers */,
    765                                      const ValueTuple& /* values */,
    766                                      ::std::ostream* /* os */) {}
    767 };
    768 
    769 // TupleMatches(matcher_tuple, value_tuple) returns true iff all
    770 // matchers in matcher_tuple match the corresponding fields in
    771 // value_tuple.  It is a compiler error if matcher_tuple and
    772 // value_tuple have different number of fields or incompatible field
    773 // types.
    774 template <typename MatcherTuple, typename ValueTuple>
    775 bool TupleMatches(const MatcherTuple& matcher_tuple,
    776                   const ValueTuple& value_tuple) {
    777   using ::std::tr1::tuple_size;
    778   // Makes sure that matcher_tuple and value_tuple have the same
    779   // number of fields.
    780   GTEST_COMPILE_ASSERT_(tuple_size<MatcherTuple>::value ==
    781                         tuple_size<ValueTuple>::value,
    782                         matcher_and_value_have_different_numbers_of_fields);
    783   return TuplePrefix<tuple_size<ValueTuple>::value>::
    784       Matches(matcher_tuple, value_tuple);
    785 }
    786 
    787 // Describes failures in matching matchers against values.  If there
    788 // is no failure, nothing will be streamed to os.
    789 template <typename MatcherTuple, typename ValueTuple>
    790 void ExplainMatchFailureTupleTo(const MatcherTuple& matchers,
    791                                 const ValueTuple& values,
    792                                 ::std::ostream* os) {
    793   using ::std::tr1::tuple_size;
    794   TuplePrefix<tuple_size<MatcherTuple>::value>::ExplainMatchFailuresTo(
    795       matchers, values, os);
    796 }
    797 
    798 // TransformTupleValues and its helper.
    799 //
    800 // TransformTupleValuesHelper hides the internal machinery that
    801 // TransformTupleValues uses to implement a tuple traversal.
    802 template <typename Tuple, typename Func, typename OutIter>
    803 class TransformTupleValuesHelper {
    804  private:
    805   typedef typename ::std::tr1::tuple_size<Tuple> TupleSize;
    806 
    807  public:
    808   // For each member of tuple 't', taken in order, evaluates '*out++ = f(t)'.
    809   // Returns the final value of 'out' in case the caller needs it.
    810   static OutIter Run(Func f, const Tuple& t, OutIter out) {
    811     return IterateOverTuple<Tuple, TupleSize::value>()(f, t, out);
    812   }
    813 
    814  private:
    815   template <typename Tup, size_t kRemainingSize>
    816   struct IterateOverTuple {
    817     OutIter operator() (Func f, const Tup& t, OutIter out) const {
    818       *out++ = f(::std::tr1::get<TupleSize::value - kRemainingSize>(t));
    819       return IterateOverTuple<Tup, kRemainingSize - 1>()(f, t, out);
    820     }
    821   };
    822   template <typename Tup>
    823   struct IterateOverTuple<Tup, 0> {
    824     OutIter operator() (Func /* f */, const Tup& /* t */, OutIter out) const {
    825       return out;
    826     }
    827   };
    828 };
    829 
    830 // Successively invokes 'f(element)' on each element of the tuple 't',
    831 // appending each result to the 'out' iterator. Returns the final value
    832 // of 'out'.
    833 template <typename Tuple, typename Func, typename OutIter>
    834 OutIter TransformTupleValues(Func f, const Tuple& t, OutIter out) {
    835   return TransformTupleValuesHelper<Tuple, Func, OutIter>::Run(f, t, out);
    836 }
    837 
    838 // Implements A<T>().
    839 template <typename T>
    840 class AnyMatcherImpl : public MatcherInterface<T> {
    841  public:
    842   virtual bool MatchAndExplain(
    843       T /* x */, MatchResultListener* /* listener */) const { return true; }
    844   virtual void DescribeTo(::std::ostream* os) const { *os << "is anything"; }
    845   virtual void DescribeNegationTo(::std::ostream* os) const {
    846     // This is mostly for completeness' safe, as it's not very useful
    847     // to write Not(A<bool>()).  However we cannot completely rule out
    848     // such a possibility, and it doesn't hurt to be prepared.
    849     *os << "never matches";
    850   }
    851 };
    852 
    853 // Implements _, a matcher that matches any value of any
    854 // type.  This is a polymorphic matcher, so we need a template type
    855 // conversion operator to make it appearing as a Matcher<T> for any
    856 // type T.
    857 class AnythingMatcher {
    858  public:
    859   template <typename T>
    860   operator Matcher<T>() const { return A<T>(); }
    861 };
    862 
    863 // Implements a matcher that compares a given value with a
    864 // pre-supplied value using one of the ==, <=, <, etc, operators.  The
    865 // two values being compared don't have to have the same type.
    866 //
    867 // The matcher defined here is polymorphic (for example, Eq(5) can be
    868 // used to match an int, a short, a double, etc).  Therefore we use
    869 // a template type conversion operator in the implementation.
    870 //
    871 // We define this as a macro in order to eliminate duplicated source
    872 // code.
    873 //
    874 // The following template definition assumes that the Rhs parameter is
    875 // a "bare" type (i.e. neither 'const T' nor 'T&').
    876 #define GMOCK_IMPLEMENT_COMPARISON_MATCHER_( \
    877     name, op, relation, negated_relation) \
    878   template <typename Rhs> class name##Matcher { \
    879    public: \
    880     explicit name##Matcher(const Rhs& rhs) : rhs_(rhs) {} \
    881     template <typename Lhs> \
    882     operator Matcher<Lhs>() const { \
    883       return MakeMatcher(new Impl<Lhs>(rhs_)); \
    884     } \
    885    private: \
    886     template <typename Lhs> \
    887     class Impl : public MatcherInterface<Lhs> { \
    888      public: \
    889       explicit Impl(const Rhs& rhs) : rhs_(rhs) {} \
    890       virtual bool MatchAndExplain(\
    891           Lhs lhs, MatchResultListener* /* listener */) const { \
    892         return lhs op rhs_; \
    893       } \
    894       virtual void DescribeTo(::std::ostream* os) const { \
    895         *os << relation  " "; \
    896         UniversalPrint(rhs_, os); \
    897       } \
    898       virtual void DescribeNegationTo(::std::ostream* os) const { \
    899         *os << negated_relation  " "; \
    900         UniversalPrint(rhs_, os); \
    901       } \
    902      private: \
    903       Rhs rhs_; \
    904       GTEST_DISALLOW_ASSIGN_(Impl); \
    905     }; \
    906     Rhs rhs_; \
    907     GTEST_DISALLOW_ASSIGN_(name##Matcher); \
    908   }
    909 
    910 // Implements Eq(v), Ge(v), Gt(v), Le(v), Lt(v), and Ne(v)
    911 // respectively.
    912 GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Eq, ==, "is equal to", "isn't equal to");
    913 GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ge, >=, "is >=", "isn't >=");
    914 GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Gt, >, "is >", "isn't >");
    915 GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Le, <=, "is <=", "isn't <=");
    916 GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Lt, <, "is <", "isn't <");
    917 GMOCK_IMPLEMENT_COMPARISON_MATCHER_(Ne, !=, "isn't equal to", "is equal to");
    918 
    919 #undef GMOCK_IMPLEMENT_COMPARISON_MATCHER_
    920 
    921 // Implements the polymorphic IsNull() matcher, which matches any raw or smart
    922 // pointer that is NULL.
    923 class IsNullMatcher {
    924  public:
    925   template <typename Pointer>
    926   bool MatchAndExplain(const Pointer& p,
    927                        MatchResultListener* /* listener */) const {
    928     return GetRawPointer(p) == NULL;
    929   }
    930 
    931   void DescribeTo(::std::ostream* os) const { *os << "is NULL"; }
    932   void DescribeNegationTo(::std::ostream* os) const {
    933     *os << "isn't NULL";
    934   }
    935 };
    936 
    937 // Implements the polymorphic NotNull() matcher, which matches any raw or smart
    938 // pointer that is not NULL.
    939 class NotNullMatcher {
    940  public:
    941   template <typename Pointer>
    942   bool MatchAndExplain(const Pointer& p,
    943                        MatchResultListener* /* listener */) const {
    944     return GetRawPointer(p) != NULL;
    945   }
    946 
    947   void DescribeTo(::std::ostream* os) const { *os << "isn't NULL"; }
    948   void DescribeNegationTo(::std::ostream* os) const {
    949     *os << "is NULL";
    950   }
    951 };
    952 
    953 // Ref(variable) matches any argument that is a reference to
    954 // 'variable'.  This matcher is polymorphic as it can match any
    955 // super type of the type of 'variable'.
    956 //
    957 // The RefMatcher template class implements Ref(variable).  It can
    958 // only be instantiated with a reference type.  This prevents a user
    959 // from mistakenly using Ref(x) to match a non-reference function
    960 // argument.  For example, the following will righteously cause a
    961 // compiler error:
    962 //
    963 //   int n;
    964 //   Matcher<int> m1 = Ref(n);   // This won't compile.
    965 //   Matcher<int&> m2 = Ref(n);  // This will compile.
    966 template <typename T>
    967 class RefMatcher;
    968 
    969 template <typename T>
    970 class RefMatcher<T&> {
    971   // Google Mock is a generic framework and thus needs to support
    972   // mocking any function types, including those that take non-const
    973   // reference arguments.  Therefore the template parameter T (and
    974   // Super below) can be instantiated to either a const type or a
    975   // non-const type.
    976  public:
    977   // RefMatcher() takes a T& instead of const T&, as we want the
    978   // compiler to catch using Ref(const_value) as a matcher for a
    979   // non-const reference.
    980   explicit RefMatcher(T& x) : object_(x) {}  // NOLINT
    981 
    982   template <typename Super>
    983   operator Matcher<Super&>() const {
    984     // By passing object_ (type T&) to Impl(), which expects a Super&,
    985     // we make sure that Super is a super type of T.  In particular,
    986     // this catches using Ref(const_value) as a matcher for a
    987     // non-const reference, as you cannot implicitly convert a const
    988     // reference to a non-const reference.
    989     return MakeMatcher(new Impl<Super>(object_));
    990   }
    991 
    992  private:
    993   template <typename Super>
    994   class Impl : public MatcherInterface<Super&> {
    995    public:
    996     explicit Impl(Super& x) : object_(x) {}  // NOLINT
    997 
    998     // MatchAndExplain() takes a Super& (as opposed to const Super&)
    999     // in order to match the interface MatcherInterface<Super&>.
   1000     virtual bool MatchAndExplain(
   1001         Super& x, MatchResultListener* listener) const {
   1002       *listener << "which is located @" << static_cast<const void*>(&x);
   1003       return &x == &object_;
   1004     }
   1005 
   1006     virtual void DescribeTo(::std::ostream* os) const {
   1007       *os << "references the variable ";
   1008       UniversalPrinter<Super&>::Print(object_, os);
   1009     }
   1010 
   1011     virtual void DescribeNegationTo(::std::ostream* os) const {
   1012       *os << "does not reference the variable ";
   1013       UniversalPrinter<Super&>::Print(object_, os);
   1014     }
   1015 
   1016    private:
   1017     const Super& object_;
   1018 
   1019     GTEST_DISALLOW_ASSIGN_(Impl);
   1020   };
   1021 
   1022   T& object_;
   1023 
   1024   GTEST_DISALLOW_ASSIGN_(RefMatcher);
   1025 };
   1026 
   1027 // Polymorphic helper functions for narrow and wide string matchers.
   1028 inline bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs) {
   1029   return String::CaseInsensitiveCStringEquals(lhs, rhs);
   1030 }
   1031 
   1032 inline bool CaseInsensitiveCStringEquals(const wchar_t* lhs,
   1033                                          const wchar_t* rhs) {
   1034   return String::CaseInsensitiveWideCStringEquals(lhs, rhs);
   1035 }
   1036 
   1037 // String comparison for narrow or wide strings that can have embedded NUL
   1038 // characters.
   1039 template <typename StringType>
   1040 bool CaseInsensitiveStringEquals(const StringType& s1,
   1041                                  const StringType& s2) {
   1042   // Are the heads equal?
   1043   if (!CaseInsensitiveCStringEquals(s1.c_str(), s2.c_str())) {
   1044     return false;
   1045   }
   1046 
   1047   // Skip the equal heads.
   1048   const typename StringType::value_type nul = 0;
   1049   const size_t i1 = s1.find(nul), i2 = s2.find(nul);
   1050 
   1051   // Are we at the end of either s1 or s2?
   1052   if (i1 == StringType::npos || i2 == StringType::npos) {
   1053     return i1 == i2;
   1054   }
   1055 
   1056   // Are the tails equal?
   1057   return CaseInsensitiveStringEquals(s1.substr(i1 + 1), s2.substr(i2 + 1));
   1058 }
   1059 
   1060 // String matchers.
   1061 
   1062 // Implements equality-based string matchers like StrEq, StrCaseNe, and etc.
   1063 template <typename StringType>
   1064 class StrEqualityMatcher {
   1065  public:
   1066   StrEqualityMatcher(const StringType& str, bool expect_eq,
   1067                      bool case_sensitive)
   1068       : string_(str), expect_eq_(expect_eq), case_sensitive_(case_sensitive) {}
   1069 
   1070   // Accepts pointer types, particularly:
   1071   //   const char*
   1072   //   char*
   1073   //   const wchar_t*
   1074   //   wchar_t*
   1075   template <typename CharType>
   1076   bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
   1077     if (s == NULL) {
   1078       return !expect_eq_;
   1079     }
   1080     return MatchAndExplain(StringType(s), listener);
   1081   }
   1082 
   1083   // Matches anything that can convert to StringType.
   1084   //
   1085   // This is a template, not just a plain function with const StringType&,
   1086   // because StringPiece has some interfering non-explicit constructors.
   1087   template <typename MatcheeStringType>
   1088   bool MatchAndExplain(const MatcheeStringType& s,
   1089                        MatchResultListener* /* listener */) const {
   1090     const StringType& s2(s);
   1091     const bool eq = case_sensitive_ ? s2 == string_ :
   1092         CaseInsensitiveStringEquals(s2, string_);
   1093     return expect_eq_ == eq;
   1094   }
   1095 
   1096   void DescribeTo(::std::ostream* os) const {
   1097     DescribeToHelper(expect_eq_, os);
   1098   }
   1099 
   1100   void DescribeNegationTo(::std::ostream* os) const {
   1101     DescribeToHelper(!expect_eq_, os);
   1102   }
   1103 
   1104  private:
   1105   void DescribeToHelper(bool expect_eq, ::std::ostream* os) const {
   1106     *os << (expect_eq ? "is " : "isn't ");
   1107     *os << "equal to ";
   1108     if (!case_sensitive_) {
   1109       *os << "(ignoring case) ";
   1110     }
   1111     UniversalPrint(string_, os);
   1112   }
   1113 
   1114   const StringType string_;
   1115   const bool expect_eq_;
   1116   const bool case_sensitive_;
   1117 
   1118   GTEST_DISALLOW_ASSIGN_(StrEqualityMatcher);
   1119 };
   1120 
   1121 // Implements the polymorphic HasSubstr(substring) matcher, which
   1122 // can be used as a Matcher<T> as long as T can be converted to a
   1123 // string.
   1124 template <typename StringType>
   1125 class HasSubstrMatcher {
   1126  public:
   1127   explicit HasSubstrMatcher(const StringType& substring)
   1128       : substring_(substring) {}
   1129 
   1130   // Accepts pointer types, particularly:
   1131   //   const char*
   1132   //   char*
   1133   //   const wchar_t*
   1134   //   wchar_t*
   1135   template <typename CharType>
   1136   bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
   1137     return s != NULL && MatchAndExplain(StringType(s), listener);
   1138   }
   1139 
   1140   // Matches anything that can convert to StringType.
   1141   //
   1142   // This is a template, not just a plain function with const StringType&,
   1143   // because StringPiece has some interfering non-explicit constructors.
   1144   template <typename MatcheeStringType>
   1145   bool MatchAndExplain(const MatcheeStringType& s,
   1146                        MatchResultListener* /* listener */) const {
   1147     const StringType& s2(s);
   1148     return s2.find(substring_) != StringType::npos;
   1149   }
   1150 
   1151   // Describes what this matcher matches.
   1152   void DescribeTo(::std::ostream* os) const {
   1153     *os << "has substring ";
   1154     UniversalPrint(substring_, os);
   1155   }
   1156 
   1157   void DescribeNegationTo(::std::ostream* os) const {
   1158     *os << "has no substring ";
   1159     UniversalPrint(substring_, os);
   1160   }
   1161 
   1162  private:
   1163   const StringType substring_;
   1164 
   1165   GTEST_DISALLOW_ASSIGN_(HasSubstrMatcher);
   1166 };
   1167 
   1168 // Implements the polymorphic StartsWith(substring) matcher, which
   1169 // can be used as a Matcher<T> as long as T can be converted to a
   1170 // string.
   1171 template <typename StringType>
   1172 class StartsWithMatcher {
   1173  public:
   1174   explicit StartsWithMatcher(const StringType& prefix) : prefix_(prefix) {
   1175   }
   1176 
   1177   // Accepts pointer types, particularly:
   1178   //   const char*
   1179   //   char*
   1180   //   const wchar_t*
   1181   //   wchar_t*
   1182   template <typename CharType>
   1183   bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
   1184     return s != NULL && MatchAndExplain(StringType(s), listener);
   1185   }
   1186 
   1187   // Matches anything that can convert to StringType.
   1188   //
   1189   // This is a template, not just a plain function with const StringType&,
   1190   // because StringPiece has some interfering non-explicit constructors.
   1191   template <typename MatcheeStringType>
   1192   bool MatchAndExplain(const MatcheeStringType& s,
   1193                        MatchResultListener* /* listener */) const {
   1194     const StringType& s2(s);
   1195     return s2.length() >= prefix_.length() &&
   1196         s2.substr(0, prefix_.length()) == prefix_;
   1197   }
   1198 
   1199   void DescribeTo(::std::ostream* os) const {
   1200     *os << "starts with ";
   1201     UniversalPrint(prefix_, os);
   1202   }
   1203 
   1204   void DescribeNegationTo(::std::ostream* os) const {
   1205     *os << "doesn't start with ";
   1206     UniversalPrint(prefix_, os);
   1207   }
   1208 
   1209  private:
   1210   const StringType prefix_;
   1211 
   1212   GTEST_DISALLOW_ASSIGN_(StartsWithMatcher);
   1213 };
   1214 
   1215 // Implements the polymorphic EndsWith(substring) matcher, which
   1216 // can be used as a Matcher<T> as long as T can be converted to a
   1217 // string.
   1218 template <typename StringType>
   1219 class EndsWithMatcher {
   1220  public:
   1221   explicit EndsWithMatcher(const StringType& suffix) : suffix_(suffix) {}
   1222 
   1223   // Accepts pointer types, particularly:
   1224   //   const char*
   1225   //   char*
   1226   //   const wchar_t*
   1227   //   wchar_t*
   1228   template <typename CharType>
   1229   bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
   1230     return s != NULL && MatchAndExplain(StringType(s), listener);
   1231   }
   1232 
   1233   // Matches anything that can convert to StringType.
   1234   //
   1235   // This is a template, not just a plain function with const StringType&,
   1236   // because StringPiece has some interfering non-explicit constructors.
   1237   template <typename MatcheeStringType>
   1238   bool MatchAndExplain(const MatcheeStringType& s,
   1239                        MatchResultListener* /* listener */) const {
   1240     const StringType& s2(s);
   1241     return s2.length() >= suffix_.length() &&
   1242         s2.substr(s2.length() - suffix_.length()) == suffix_;
   1243   }
   1244 
   1245   void DescribeTo(::std::ostream* os) const {
   1246     *os << "ends with ";
   1247     UniversalPrint(suffix_, os);
   1248   }
   1249 
   1250   void DescribeNegationTo(::std::ostream* os) const {
   1251     *os << "doesn't end with ";
   1252     UniversalPrint(suffix_, os);
   1253   }
   1254 
   1255  private:
   1256   const StringType suffix_;
   1257 
   1258   GTEST_DISALLOW_ASSIGN_(EndsWithMatcher);
   1259 };
   1260 
   1261 // Implements polymorphic matchers MatchesRegex(regex) and
   1262 // ContainsRegex(regex), which can be used as a Matcher<T> as long as
   1263 // T can be converted to a string.
   1264 class MatchesRegexMatcher {
   1265  public:
   1266   MatchesRegexMatcher(const RE* regex, bool full_match)
   1267       : regex_(regex), full_match_(full_match) {}
   1268 
   1269   // Accepts pointer types, particularly:
   1270   //   const char*
   1271   //   char*
   1272   //   const wchar_t*
   1273   //   wchar_t*
   1274   template <typename CharType>
   1275   bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {
   1276     return s != NULL && MatchAndExplain(internal::string(s), listener);
   1277   }
   1278 
   1279   // Matches anything that can convert to internal::string.
   1280   //
   1281   // This is a template, not just a plain function with const internal::string&,
   1282   // because StringPiece has some interfering non-explicit constructors.
   1283   template <class MatcheeStringType>
   1284   bool MatchAndExplain(const MatcheeStringType& s,
   1285                        MatchResultListener* /* listener */) const {
   1286     const internal::string& s2(s);
   1287     return full_match_ ? RE::FullMatch(s2, *regex_) :
   1288         RE::PartialMatch(s2, *regex_);
   1289   }
   1290 
   1291   void DescribeTo(::std::ostream* os) const {
   1292     *os << (full_match_ ? "matches" : "contains")
   1293         << " regular expression ";
   1294     UniversalPrinter<internal::string>::Print(regex_->pattern(), os);
   1295   }
   1296 
   1297   void DescribeNegationTo(::std::ostream* os) const {
   1298     *os << "doesn't " << (full_match_ ? "match" : "contain")
   1299         << " regular expression ";
   1300     UniversalPrinter<internal::string>::Print(regex_->pattern(), os);
   1301   }
   1302 
   1303  private:
   1304   const internal::linked_ptr<const RE> regex_;
   1305   const bool full_match_;
   1306 
   1307   GTEST_DISALLOW_ASSIGN_(MatchesRegexMatcher);
   1308 };
   1309 
   1310 // Implements a matcher that compares the two fields of a 2-tuple
   1311 // using one of the ==, <=, <, etc, operators.  The two fields being
   1312 // compared don't have to have the same type.
   1313 //
   1314 // The matcher defined here is polymorphic (for example, Eq() can be
   1315 // used to match a tuple<int, short>, a tuple<const long&, double>,
   1316 // etc).  Therefore we use a template type conversion operator in the
   1317 // implementation.
   1318 //
   1319 // We define this as a macro in order to eliminate duplicated source
   1320 // code.
   1321 #define GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(name, op, relation) \
   1322   class name##2Matcher { \
   1323    public: \
   1324     template <typename T1, typename T2> \
   1325     operator Matcher< ::std::tr1::tuple<T1, T2> >() const { \
   1326       return MakeMatcher(new Impl< ::std::tr1::tuple<T1, T2> >); \
   1327     } \
   1328     template <typename T1, typename T2> \
   1329     operator Matcher<const ::std::tr1::tuple<T1, T2>&>() const { \
   1330       return MakeMatcher(new Impl<const ::std::tr1::tuple<T1, T2>&>); \
   1331     } \
   1332    private: \
   1333     template <typename Tuple> \
   1334     class Impl : public MatcherInterface<Tuple> { \
   1335      public: \
   1336       virtual bool MatchAndExplain( \
   1337           Tuple args, \
   1338           MatchResultListener* /* listener */) const { \
   1339         return ::std::tr1::get<0>(args) op ::std::tr1::get<1>(args); \
   1340       } \
   1341       virtual void DescribeTo(::std::ostream* os) const { \
   1342         *os << "are " relation;                                 \
   1343       } \
   1344       virtual void DescribeNegationTo(::std::ostream* os) const { \
   1345         *os << "aren't " relation; \
   1346       } \
   1347     }; \
   1348   }
   1349 
   1350 // Implements Eq(), Ge(), Gt(), Le(), Lt(), and Ne() respectively.
   1351 GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Eq, ==, "an equal pair");
   1352 GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(
   1353     Ge, >=, "a pair where the first >= the second");
   1354 GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(
   1355     Gt, >, "a pair where the first > the second");
   1356 GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(
   1357     Le, <=, "a pair where the first <= the second");
   1358 GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(
   1359     Lt, <, "a pair where the first < the second");
   1360 GMOCK_IMPLEMENT_COMPARISON2_MATCHER_(Ne, !=, "an unequal pair");
   1361 
   1362 #undef GMOCK_IMPLEMENT_COMPARISON2_MATCHER_
   1363 
   1364 // Implements the Not(...) matcher for a particular argument type T.
   1365 // We do not nest it inside the NotMatcher class template, as that
   1366 // will prevent different instantiations of NotMatcher from sharing
   1367 // the same NotMatcherImpl<T> class.
   1368 template <typename T>
   1369 class NotMatcherImpl : public MatcherInterface<T> {
   1370  public:
   1371   explicit NotMatcherImpl(const Matcher<T>& matcher)
   1372       : matcher_(matcher) {}
   1373 
   1374   virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
   1375     return !matcher_.MatchAndExplain(x, listener);
   1376   }
   1377 
   1378   virtual void DescribeTo(::std::ostream* os) const {
   1379     matcher_.DescribeNegationTo(os);
   1380   }
   1381 
   1382   virtual void DescribeNegationTo(::std::ostream* os) const {
   1383     matcher_.DescribeTo(os);
   1384   }
   1385 
   1386  private:
   1387   const Matcher<T> matcher_;
   1388 
   1389   GTEST_DISALLOW_ASSIGN_(NotMatcherImpl);
   1390 };
   1391 
   1392 // Implements the Not(m) matcher, which matches a value that doesn't
   1393 // match matcher m.
   1394 template <typename InnerMatcher>
   1395 class NotMatcher {
   1396  public:
   1397   explicit NotMatcher(InnerMatcher matcher) : matcher_(matcher) {}
   1398 
   1399   // This template type conversion operator allows Not(m) to be used
   1400   // to match any type m can match.
   1401   template <typename T>
   1402   operator Matcher<T>() const {
   1403     return Matcher<T>(new NotMatcherImpl<T>(SafeMatcherCast<T>(matcher_)));
   1404   }
   1405 
   1406  private:
   1407   InnerMatcher matcher_;
   1408 
   1409   GTEST_DISALLOW_ASSIGN_(NotMatcher);
   1410 };
   1411 
   1412 // Implements the AllOf(m1, m2) matcher for a particular argument type
   1413 // T. We do not nest it inside the BothOfMatcher class template, as
   1414 // that will prevent different instantiations of BothOfMatcher from
   1415 // sharing the same BothOfMatcherImpl<T> class.
   1416 template <typename T>
   1417 class BothOfMatcherImpl : public MatcherInterface<T> {
   1418  public:
   1419   BothOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2)
   1420       : matcher1_(matcher1), matcher2_(matcher2) {}
   1421 
   1422   virtual void DescribeTo(::std::ostream* os) const {
   1423     *os << "(";
   1424     matcher1_.DescribeTo(os);
   1425     *os << ") and (";
   1426     matcher2_.DescribeTo(os);
   1427     *os << ")";
   1428   }
   1429 
   1430   virtual void DescribeNegationTo(::std::ostream* os) const {
   1431     *os << "(";
   1432     matcher1_.DescribeNegationTo(os);
   1433     *os << ") or (";
   1434     matcher2_.DescribeNegationTo(os);
   1435     *os << ")";
   1436   }
   1437 
   1438   virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
   1439     // If either matcher1_ or matcher2_ doesn't match x, we only need
   1440     // to explain why one of them fails.
   1441     StringMatchResultListener listener1;
   1442     if (!matcher1_.MatchAndExplain(x, &listener1)) {
   1443       *listener << listener1.str();
   1444       return false;
   1445     }
   1446 
   1447     StringMatchResultListener listener2;
   1448     if (!matcher2_.MatchAndExplain(x, &listener2)) {
   1449       *listener << listener2.str();
   1450       return false;
   1451     }
   1452 
   1453     // Otherwise we need to explain why *both* of them match.
   1454     const internal::string s1 = listener1.str();
   1455     const internal::string s2 = listener2.str();
   1456 
   1457     if (s1 == "") {
   1458       *listener << s2;
   1459     } else {
   1460       *listener << s1;
   1461       if (s2 != "") {
   1462         *listener << ", and " << s2;
   1463       }
   1464     }
   1465     return true;
   1466   }
   1467 
   1468  private:
   1469   const Matcher<T> matcher1_;
   1470   const Matcher<T> matcher2_;
   1471 
   1472   GTEST_DISALLOW_ASSIGN_(BothOfMatcherImpl);
   1473 };
   1474 
   1475 #if GTEST_LANG_CXX11
   1476 // MatcherList provides mechanisms for storing a variable number of matchers in
   1477 // a list structure (ListType) and creating a combining matcher from such a
   1478 // list.
   1479 // The template is defined recursively using the following template paramters:
   1480 //   * kSize is the length of the MatcherList.
   1481 //   * Head is the type of the first matcher of the list.
   1482 //   * Tail denotes the types of the remaining matchers of the list.
   1483 template <int kSize, typename Head, typename... Tail>
   1484 struct MatcherList {
   1485   typedef MatcherList<kSize - 1, Tail...> MatcherListTail;
   1486   typedef ::std::pair<Head, typename MatcherListTail::ListType> ListType;
   1487 
   1488   // BuildList stores variadic type values in a nested pair structure.
   1489   // Example:
   1490   // MatcherList<3, int, string, float>::BuildList(5, "foo", 2.0) will return
   1491   // the corresponding result of type pair<int, pair<string, float>>.
   1492   static ListType BuildList(const Head& matcher, const Tail&... tail) {
   1493     return ListType(matcher, MatcherListTail::BuildList(tail...));
   1494   }
   1495 
   1496   // CreateMatcher<T> creates a Matcher<T> from a given list of matchers (built
   1497   // by BuildList()). CombiningMatcher<T> is used to combine the matchers of the
   1498   // list. CombiningMatcher<T> must implement MatcherInterface<T> and have a
   1499   // constructor taking two Matcher<T>s as input.
   1500   template <typename T, template <typename /* T */> class CombiningMatcher>
   1501   static Matcher<T> CreateMatcher(const ListType& matchers) {
   1502     return Matcher<T>(new CombiningMatcher<T>(
   1503         SafeMatcherCast<T>(matchers.first),
   1504         MatcherListTail::template CreateMatcher<T, CombiningMatcher>(
   1505             matchers.second)));
   1506   }
   1507 };
   1508 
   1509 // The following defines the base case for the recursive definition of
   1510 // MatcherList.
   1511 template <typename Matcher1, typename Matcher2>
   1512 struct MatcherList<2, Matcher1, Matcher2> {
   1513   typedef ::std::pair<Matcher1, Matcher2> ListType;
   1514 
   1515   static ListType BuildList(const Matcher1& matcher1,
   1516                             const Matcher2& matcher2) {
   1517     return ::std::pair<Matcher1, Matcher2>(matcher1, matcher2);
   1518   }
   1519 
   1520   template <typename T, template <typename /* T */> class CombiningMatcher>
   1521   static Matcher<T> CreateMatcher(const ListType& matchers) {
   1522     return Matcher<T>(new CombiningMatcher<T>(
   1523         SafeMatcherCast<T>(matchers.first),
   1524         SafeMatcherCast<T>(matchers.second)));
   1525   }
   1526 };
   1527 
   1528 // VariadicMatcher is used for the variadic implementation of
   1529 // AllOf(m_1, m_2, ...) and AnyOf(m_1, m_2, ...).
   1530 // CombiningMatcher<T> is used to recursively combine the provided matchers
   1531 // (of type Args...).
   1532 template <template <typename T> class CombiningMatcher, typename... Args>
   1533 class VariadicMatcher {
   1534  public:
   1535   VariadicMatcher(const Args&... matchers)  // NOLINT
   1536       : matchers_(MatcherListType::BuildList(matchers...)) {}
   1537 
   1538   // This template type conversion operator allows an
   1539   // VariadicMatcher<Matcher1, Matcher2...> object to match any type that
   1540   // all of the provided matchers (Matcher1, Matcher2, ...) can match.
   1541   template <typename T>
   1542   operator Matcher<T>() const {
   1543     return MatcherListType::template CreateMatcher<T, CombiningMatcher>(
   1544         matchers_);
   1545   }
   1546 
   1547  private:
   1548   typedef MatcherList<sizeof...(Args), Args...> MatcherListType;
   1549 
   1550   const typename MatcherListType::ListType matchers_;
   1551 
   1552   GTEST_DISALLOW_ASSIGN_(VariadicMatcher);
   1553 };
   1554 
   1555 template <typename... Args>
   1556 using AllOfMatcher = VariadicMatcher<BothOfMatcherImpl, Args...>;
   1557 
   1558 #endif  // GTEST_LANG_CXX11
   1559 
   1560 // Used for implementing the AllOf(m_1, ..., m_n) matcher, which
   1561 // matches a value that matches all of the matchers m_1, ..., and m_n.
   1562 template <typename Matcher1, typename Matcher2>
   1563 class BothOfMatcher {
   1564  public:
   1565   BothOfMatcher(Matcher1 matcher1, Matcher2 matcher2)
   1566       : matcher1_(matcher1), matcher2_(matcher2) {}
   1567 
   1568   // This template type conversion operator allows a
   1569   // BothOfMatcher<Matcher1, Matcher2> object to match any type that
   1570   // both Matcher1 and Matcher2 can match.
   1571   template <typename T>
   1572   operator Matcher<T>() const {
   1573     return Matcher<T>(new BothOfMatcherImpl<T>(SafeMatcherCast<T>(matcher1_),
   1574                                                SafeMatcherCast<T>(matcher2_)));
   1575   }
   1576 
   1577  private:
   1578   Matcher1 matcher1_;
   1579   Matcher2 matcher2_;
   1580 
   1581   GTEST_DISALLOW_ASSIGN_(BothOfMatcher);
   1582 };
   1583 
   1584 // Implements the AnyOf(m1, m2) matcher for a particular argument type
   1585 // T.  We do not nest it inside the AnyOfMatcher class template, as
   1586 // that will prevent different instantiations of AnyOfMatcher from
   1587 // sharing the same EitherOfMatcherImpl<T> class.
   1588 template <typename T>
   1589 class EitherOfMatcherImpl : public MatcherInterface<T> {
   1590  public:
   1591   EitherOfMatcherImpl(const Matcher<T>& matcher1, const Matcher<T>& matcher2)
   1592       : matcher1_(matcher1), matcher2_(matcher2) {}
   1593 
   1594   virtual void DescribeTo(::std::ostream* os) const {
   1595     *os << "(";
   1596     matcher1_.DescribeTo(os);
   1597     *os << ") or (";
   1598     matcher2_.DescribeTo(os);
   1599     *os << ")";
   1600   }
   1601 
   1602   virtual void DescribeNegationTo(::std::ostream* os) const {
   1603     *os << "(";
   1604     matcher1_.DescribeNegationTo(os);
   1605     *os << ") and (";
   1606     matcher2_.DescribeNegationTo(os);
   1607     *os << ")";
   1608   }
   1609 
   1610   virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {
   1611     // If either matcher1_ or matcher2_ matches x, we just need to
   1612     // explain why *one* of them matches.
   1613     StringMatchResultListener listener1;
   1614     if (matcher1_.MatchAndExplain(x, &listener1)) {
   1615       *listener << listener1.str();
   1616       return true;
   1617     }
   1618 
   1619     StringMatchResultListener listener2;
   1620     if (matcher2_.MatchAndExplain(x, &listener2)) {
   1621       *listener << listener2.str();
   1622       return true;
   1623     }
   1624 
   1625     // Otherwise we need to explain why *both* of them fail.
   1626     const internal::string s1 = listener1.str();
   1627     const internal::string s2 = listener2.str();
   1628 
   1629     if (s1 == "") {
   1630       *listener << s2;
   1631     } else {
   1632       *listener << s1;
   1633       if (s2 != "") {
   1634         *listener << ", and " << s2;
   1635       }
   1636     }
   1637     return false;
   1638   }
   1639 
   1640  private:
   1641   const Matcher<T> matcher1_;
   1642   const Matcher<T> matcher2_;
   1643 
   1644   GTEST_DISALLOW_ASSIGN_(EitherOfMatcherImpl);
   1645 };
   1646 
   1647 #if GTEST_LANG_CXX11
   1648 // AnyOfMatcher is used for the variadic implementation of AnyOf(m_1, m_2, ...).
   1649 template <typename... Args>
   1650 using AnyOfMatcher = VariadicMatcher<EitherOfMatcherImpl, Args...>;
   1651 
   1652 #endif  // GTEST_LANG_CXX11
   1653 
   1654 // Used for implementing the AnyOf(m_1, ..., m_n) matcher, which
   1655 // matches a value that matches at least one of the matchers m_1, ...,
   1656 // and m_n.
   1657 template <typename Matcher1, typename Matcher2>
   1658 class EitherOfMatcher {
   1659  public:
   1660   EitherOfMatcher(Matcher1 matcher1, Matcher2 matcher2)
   1661       : matcher1_(matcher1), matcher2_(matcher2) {}
   1662 
   1663   // This template type conversion operator allows a
   1664   // EitherOfMatcher<Matcher1, Matcher2> object to match any type that
   1665   // both Matcher1 and Matcher2 can match.
   1666   template <typename T>
   1667   operator Matcher<T>() const {
   1668     return Matcher<T>(new EitherOfMatcherImpl<T>(
   1669         SafeMatcherCast<T>(matcher1_), SafeMatcherCast<T>(matcher2_)));
   1670   }
   1671 
   1672  private:
   1673   Matcher1 matcher1_;
   1674   Matcher2 matcher2_;
   1675 
   1676   GTEST_DISALLOW_ASSIGN_(EitherOfMatcher);
   1677 };
   1678 
   1679 // Used for implementing Truly(pred), which turns a predicate into a
   1680 // matcher.
   1681 template <typename Predicate>
   1682 class TrulyMatcher {
   1683  public:
   1684   explicit TrulyMatcher(Predicate pred) : predicate_(pred) {}
   1685 
   1686   // This method template allows Truly(pred) to be used as a matcher
   1687   // for type T where T is the argument type of predicate 'pred'.  The
   1688   // argument is passed by reference as the predicate may be
   1689   // interested in the address of the argument.
   1690   template <typename T>
   1691   bool MatchAndExplain(T& x,  // NOLINT
   1692                        MatchResultListener* /* listener */) const {
   1693     // Without the if-statement, MSVC sometimes warns about converting
   1694     // a value to bool (warning 4800).
   1695     //
   1696     // We cannot write 'return !!predicate_(x);' as that doesn't work
   1697     // when predicate_(x) returns a class convertible to bool but
   1698     // having no operator!().
   1699     if (predicate_(x))
   1700       return true;
   1701     return false;
   1702   }
   1703 
   1704   void DescribeTo(::std::ostream* os) const {
   1705     *os << "satisfies the given predicate";
   1706   }
   1707 
   1708   void DescribeNegationTo(::std::ostream* os) const {
   1709     *os << "doesn't satisfy the given predicate";
   1710   }
   1711 
   1712  private:
   1713   Predicate predicate_;
   1714 
   1715   GTEST_DISALLOW_ASSIGN_(TrulyMatcher);
   1716 };
   1717 
   1718 // Used for implementing Matches(matcher), which turns a matcher into
   1719 // a predicate.
   1720 template <typename M>
   1721 class MatcherAsPredicate {
   1722  public:
   1723   explicit MatcherAsPredicate(M matcher) : matcher_(matcher) {}
   1724 
   1725   // This template operator() allows Matches(m) to be used as a
   1726   // predicate on type T where m is a matcher on type T.
   1727   //
   1728   // The argument x is passed by reference instead of by value, as
   1729   // some matcher may be interested in its address (e.g. as in
   1730   // Matches(Ref(n))(x)).
   1731   template <typename T>
   1732   bool operator()(const T& x) const {
   1733     // We let matcher_ commit to a particular type here instead of
   1734     // when the MatcherAsPredicate object was constructed.  This
   1735     // allows us to write Matches(m) where m is a polymorphic matcher
   1736     // (e.g. Eq(5)).
   1737     //
   1738     // If we write Matcher<T>(matcher_).Matches(x) here, it won't
   1739     // compile when matcher_ has type Matcher<const T&>; if we write
   1740     // Matcher<const T&>(matcher_).Matches(x) here, it won't compile
   1741     // when matcher_ has type Matcher<T>; if we just write
   1742     // matcher_.Matches(x), it won't compile when matcher_ is
   1743     // polymorphic, e.g. Eq(5).
   1744     //
   1745     // MatcherCast<const T&>() is necessary for making the code work
   1746     // in all of the above situations.
   1747     return MatcherCast<const T&>(matcher_).Matches(x);
   1748   }
   1749 
   1750  private:
   1751   M matcher_;
   1752 
   1753   GTEST_DISALLOW_ASSIGN_(MatcherAsPredicate);
   1754 };
   1755 
   1756 // For implementing ASSERT_THAT() and EXPECT_THAT().  The template
   1757 // argument M must be a type that can be converted to a matcher.
   1758 template <typename M>
   1759 class PredicateFormatterFromMatcher {
   1760  public:
   1761   explicit PredicateFormatterFromMatcher(const M& m) : matcher_(m) {}
   1762 
   1763   // This template () operator allows a PredicateFormatterFromMatcher
   1764   // object to act as a predicate-formatter suitable for using with
   1765   // Google Test's EXPECT_PRED_FORMAT1() macro.
   1766   template <typename T>
   1767   AssertionResult operator()(const char* value_text, const T& x) const {
   1768     // We convert matcher_ to a Matcher<const T&> *now* instead of
   1769     // when the PredicateFormatterFromMatcher object was constructed,
   1770     // as matcher_ may be polymorphic (e.g. NotNull()) and we won't
   1771     // know which type to instantiate it to until we actually see the
   1772     // type of x here.
   1773     //
   1774     // We write SafeMatcherCast<const T&>(matcher_) instead of
   1775     // Matcher<const T&>(matcher_), as the latter won't compile when
   1776     // matcher_ has type Matcher<T> (e.g. An<int>()).
   1777     // We don't write MatcherCast<const T&> either, as that allows
   1778     // potentially unsafe downcasting of the matcher argument.
   1779     const Matcher<const T&> matcher = SafeMatcherCast<const T&>(matcher_);
   1780     StringMatchResultListener listener;
   1781     if (MatchPrintAndExplain(x, matcher, &listener))
   1782       return AssertionSuccess();
   1783 
   1784     ::std::stringstream ss;
   1785     ss << "Value of: " << value_text << "\n"
   1786        << "Expected: ";
   1787     matcher.DescribeTo(&ss);
   1788     ss << "\n  Actual: " << listener.str();
   1789     return AssertionFailure() << ss.str();
   1790   }
   1791 
   1792  private:
   1793   const M matcher_;
   1794 
   1795   GTEST_DISALLOW_ASSIGN_(PredicateFormatterFromMatcher);
   1796 };
   1797 
   1798 // A helper function for converting a matcher to a predicate-formatter
   1799 // without the user needing to explicitly write the type.  This is
   1800 // used for implementing ASSERT_THAT() and EXPECT_THAT().
   1801 template <typename M>
   1802 inline PredicateFormatterFromMatcher<M>
   1803 MakePredicateFormatterFromMatcher(const M& matcher) {
   1804   return PredicateFormatterFromMatcher<M>(matcher);
   1805 }
   1806 
   1807 // Implements the polymorphic floating point equality matcher, which matches
   1808 // two float values using ULP-based approximation or, optionally, a
   1809 // user-specified epsilon.  The template is meant to be instantiated with
   1810 // FloatType being either float or double.
   1811 template <typename FloatType>
   1812 class FloatingEqMatcher {
   1813  public:
   1814   // Constructor for FloatingEqMatcher.
   1815   // The matcher's input will be compared with rhs.  The matcher treats two
   1816   // NANs as equal if nan_eq_nan is true.  Otherwise, under IEEE standards,
   1817   // equality comparisons between NANs will always return false.  We specify a
   1818   // negative max_abs_error_ term to indicate that ULP-based approximation will
   1819   // be used for comparison.
   1820   FloatingEqMatcher(FloatType rhs, bool nan_eq_nan) :
   1821     rhs_(rhs), nan_eq_nan_(nan_eq_nan), max_abs_error_(-1) {
   1822   }
   1823 
   1824   // Constructor that supports a user-specified max_abs_error that will be used
   1825   // for comparison instead of ULP-based approximation.  The max absolute
   1826   // should be non-negative.
   1827   FloatingEqMatcher(FloatType rhs, bool nan_eq_nan, FloatType max_abs_error) :
   1828     rhs_(rhs), nan_eq_nan_(nan_eq_nan), max_abs_error_(max_abs_error) {
   1829     GTEST_CHECK_(max_abs_error >= 0)
   1830         << ", where max_abs_error is" << max_abs_error;
   1831   }
   1832 
   1833   // Implements floating point equality matcher as a Matcher<T>.
   1834   template <typename T>
   1835   class Impl : public MatcherInterface<T> {
   1836    public:
   1837     Impl(FloatType rhs, bool nan_eq_nan, FloatType max_abs_error) :
   1838       rhs_(rhs), nan_eq_nan_(nan_eq_nan), max_abs_error_(max_abs_error) {}
   1839 
   1840     virtual bool MatchAndExplain(T value,
   1841                                  MatchResultListener* /* listener */) const {
   1842       const FloatingPoint<FloatType> lhs(value), rhs(rhs_);
   1843 
   1844       // Compares NaNs first, if nan_eq_nan_ is true.
   1845       if (lhs.is_nan() || rhs.is_nan()) {
   1846         if (lhs.is_nan() && rhs.is_nan()) {
   1847           return nan_eq_nan_;
   1848         }
   1849         // One is nan; the other is not nan.
   1850         return false;
   1851       }
   1852       if (HasMaxAbsError()) {
   1853         // We perform an equality check so that inf will match inf, regardless
   1854         // of error bounds.  If the result of value - rhs_ would result in
   1855         // overflow or if either value is inf, the default result is infinity,
   1856         // which should only match if max_abs_error_ is also infinity.
   1857         return value == rhs_ || fabs(value - rhs_) <= max_abs_error_;
   1858       } else {
   1859         return lhs.AlmostEquals(rhs);
   1860       }
   1861     }
   1862 
   1863     virtual void DescribeTo(::std::ostream* os) const {
   1864       // os->precision() returns the previously set precision, which we
   1865       // store to restore the ostream to its original configuration
   1866       // after outputting.
   1867       const ::std::streamsize old_precision = os->precision(
   1868           ::std::numeric_limits<FloatType>::digits10 + 2);
   1869       if (FloatingPoint<FloatType>(rhs_).is_nan()) {
   1870         if (nan_eq_nan_) {
   1871           *os << "is NaN";
   1872         } else {
   1873           *os << "never matches";
   1874         }
   1875       } else {
   1876         *os << "is approximately " << rhs_;
   1877         if (HasMaxAbsError()) {
   1878           *os << " (absolute error <= " << max_abs_error_ << ")";
   1879         }
   1880       }
   1881       os->precision(old_precision);
   1882     }
   1883 
   1884     virtual void DescribeNegationTo(::std::ostream* os) const {
   1885       // As before, get original precision.
   1886       const ::std::streamsize old_precision = os->precision(
   1887           ::std::numeric_limits<FloatType>::digits10 + 2);
   1888       if (FloatingPoint<FloatType>(rhs_).is_nan()) {
   1889         if (nan_eq_nan_) {
   1890           *os << "isn't NaN";
   1891         } else {
   1892           *os << "is anything";
   1893         }
   1894       } else {
   1895         *os << "isn't approximately " << rhs_;
   1896         if (HasMaxAbsError()) {
   1897           *os << " (absolute error > " << max_abs_error_ << ")";
   1898         }
   1899       }
   1900       // Restore original precision.
   1901       os->precision(old_precision);
   1902     }
   1903 
   1904    private:
   1905     bool HasMaxAbsError() const {
   1906       return max_abs_error_ >= 0;
   1907     }
   1908 
   1909     const FloatType rhs_;
   1910     const bool nan_eq_nan_;
   1911     // max_abs_error will be used for value comparison when >= 0.
   1912     const FloatType max_abs_error_;
   1913 
   1914     GTEST_DISALLOW_ASSIGN_(Impl);
   1915   };
   1916 
   1917   // The following 3 type conversion operators allow FloatEq(rhs) and
   1918   // NanSensitiveFloatEq(rhs) to be used as a Matcher<float>, a
   1919   // Matcher<const float&>, or a Matcher<float&>, but nothing else.
   1920   // (While Google's C++ coding style doesn't allow arguments passed
   1921   // by non-const reference, we may see them in code not conforming to
   1922   // the style.  Therefore Google Mock needs to support them.)
   1923   operator Matcher<FloatType>() const {
   1924     return MakeMatcher(new Impl<FloatType>(rhs_, nan_eq_nan_, max_abs_error_));
   1925   }
   1926 
   1927   operator Matcher<const FloatType&>() const {
   1928     return MakeMatcher(
   1929         new Impl<const FloatType&>(rhs_, nan_eq_nan_, max_abs_error_));
   1930   }
   1931 
   1932   operator Matcher<FloatType&>() const {
   1933     return MakeMatcher(new Impl<FloatType&>(rhs_, nan_eq_nan_, max_abs_error_));
   1934   }
   1935 
   1936  private:
   1937   const FloatType rhs_;
   1938   const bool nan_eq_nan_;
   1939   // max_abs_error will be used for value comparison when >= 0.
   1940   const FloatType max_abs_error_;
   1941 
   1942   GTEST_DISALLOW_ASSIGN_(FloatingEqMatcher);
   1943 };
   1944 
   1945 // Implements the Pointee(m) matcher for matching a pointer whose
   1946 // pointee matches matcher m.  The pointer can be either raw or smart.
   1947 template <typename InnerMatcher>
   1948 class PointeeMatcher {
   1949  public:
   1950   explicit PointeeMatcher(const InnerMatcher& matcher) : matcher_(matcher) {}
   1951 
   1952   // This type conversion operator template allows Pointee(m) to be
   1953   // used as a matcher for any pointer type whose pointee type is
   1954   // compatible with the inner matcher, where type Pointer can be
   1955   // either a raw pointer or a smart pointer.
   1956   //
   1957   // The reason we do this instead of relying on
   1958   // MakePolymorphicMatcher() is that the latter is not flexible
   1959   // enough for implementing the DescribeTo() method of Pointee().
   1960   template <typename Pointer>
   1961   operator Matcher<Pointer>() const {
   1962     return MakeMatcher(new Impl<Pointer>(matcher_));
   1963   }
   1964 
   1965  private:
   1966   // The monomorphic implementation that works for a particular pointer type.
   1967   template <typename Pointer>
   1968   class Impl : public MatcherInterface<Pointer> {
   1969    public:
   1970     typedef typename PointeeOf<GTEST_REMOVE_CONST_(  // NOLINT
   1971         GTEST_REMOVE_REFERENCE_(Pointer))>::type Pointee;
   1972 
   1973     explicit Impl(const InnerMatcher& matcher)
   1974         : matcher_(MatcherCast<const Pointee&>(matcher)) {}
   1975 
   1976     virtual void DescribeTo(::std::ostream* os) const {
   1977       *os << "points to a value that ";
   1978       matcher_.DescribeTo(os);
   1979     }
   1980 
   1981     virtual void DescribeNegationTo(::std::ostream* os) const {
   1982       *os << "does not point to a value that ";
   1983       matcher_.DescribeTo(os);
   1984     }
   1985 
   1986     virtual bool MatchAndExplain(Pointer pointer,
   1987                                  MatchResultListener* listener) const {
   1988       if (GetRawPointer(pointer) == NULL)
   1989         return false;
   1990 
   1991       *listener << "which points to ";
   1992       return MatchPrintAndExplain(*pointer, matcher_, listener);
   1993     }
   1994 
   1995    private:
   1996     const Matcher<const Pointee&> matcher_;
   1997 
   1998     GTEST_DISALLOW_ASSIGN_(Impl);
   1999   };
   2000 
   2001   const InnerMatcher matcher_;
   2002 
   2003   GTEST_DISALLOW_ASSIGN_(PointeeMatcher);
   2004 };
   2005 
   2006 // Implements the Field() matcher for matching a field (i.e. member
   2007 // variable) of an object.
   2008 template <typename Class, typename FieldType>
   2009 class FieldMatcher {
   2010  public:
   2011   FieldMatcher(FieldType Class::*field,
   2012                const Matcher<const FieldType&>& matcher)
   2013       : field_(field), matcher_(matcher) {}
   2014 
   2015   void DescribeTo(::std::ostream* os) const {
   2016     *os << "is an object whose given field ";
   2017     matcher_.DescribeTo(os);
   2018   }
   2019 
   2020   void DescribeNegationTo(::std::ostream* os) const {
   2021     *os << "is an object whose given field ";
   2022     matcher_.DescribeNegationTo(os);
   2023   }
   2024 
   2025   template <typename T>
   2026   bool MatchAndExplain(const T& value, MatchResultListener* listener) const {
   2027     return MatchAndExplainImpl(
   2028         typename ::testing::internal::
   2029             is_pointer<GTEST_REMOVE_CONST_(T)>::type(),
   2030         value, listener);
   2031   }
   2032 
   2033  private:
   2034   // The first argument of MatchAndExplainImpl() is needed to help
   2035   // Symbian's C++ compiler choose which overload to use.  Its type is
   2036   // true_type iff the Field() matcher is used to match a pointer.
   2037   bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj,
   2038                            MatchResultListener* listener) const {
   2039     *listener << "whose given field is ";
   2040     return MatchPrintAndExplain(obj.*field_, matcher_, listener);
   2041   }
   2042 
   2043   bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p,
   2044                            MatchResultListener* listener) const {
   2045     if (p == NULL)
   2046       return false;
   2047 
   2048     *listener << "which points to an object ";
   2049     // Since *p has a field, it must be a class/struct/union type and
   2050     // thus cannot be a pointer.  Therefore we pass false_type() as
   2051     // the first argument.
   2052     return MatchAndExplainImpl(false_type(), *p, listener);
   2053   }
   2054 
   2055   const FieldType Class::*field_;
   2056   const Matcher<const FieldType&> matcher_;
   2057 
   2058   GTEST_DISALLOW_ASSIGN_(FieldMatcher);
   2059 };
   2060 
   2061 // Implements the Property() matcher for matching a property
   2062 // (i.e. return value of a getter method) of an object.
   2063 template <typename Class, typename PropertyType>
   2064 class PropertyMatcher {
   2065  public:
   2066   // The property may have a reference type, so 'const PropertyType&'
   2067   // may cause double references and fail to compile.  That's why we
   2068   // need GTEST_REFERENCE_TO_CONST, which works regardless of
   2069   // PropertyType being a reference or not.
   2070   typedef GTEST_REFERENCE_TO_CONST_(PropertyType) RefToConstProperty;
   2071 
   2072   PropertyMatcher(PropertyType (Class::*property)() const,
   2073                   const Matcher<RefToConstProperty>& matcher)
   2074       : property_(property), matcher_(matcher) {}
   2075 
   2076   void DescribeTo(::std::ostream* os) const {
   2077     *os << "is an object whose given property ";
   2078     matcher_.DescribeTo(os);
   2079   }
   2080 
   2081   void DescribeNegationTo(::std::ostream* os) const {
   2082     *os << "is an object whose given property ";
   2083     matcher_.DescribeNegationTo(os);
   2084   }
   2085 
   2086   template <typename T>
   2087   bool MatchAndExplain(const T&value, MatchResultListener* listener) const {
   2088     return MatchAndExplainImpl(
   2089         typename ::testing::internal::
   2090             is_pointer<GTEST_REMOVE_CONST_(T)>::type(),
   2091         value, listener);
   2092   }
   2093 
   2094  private:
   2095   // The first argument of MatchAndExplainImpl() is needed to help
   2096   // Symbian's C++ compiler choose which overload to use.  Its type is
   2097   // true_type iff the Property() matcher is used to match a pointer.
   2098   bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj,
   2099                            MatchResultListener* listener) const {
   2100     *listener << "whose given property is ";
   2101     // Cannot pass the return value (for example, int) to MatchPrintAndExplain,
   2102     // which takes a non-const reference as argument.
   2103     RefToConstProperty result = (obj.*property_)();
   2104     return MatchPrintAndExplain(result, matcher_, listener);
   2105   }
   2106 
   2107   bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p,
   2108                            MatchResultListener* listener) const {
   2109     if (p == NULL)
   2110       return false;
   2111 
   2112     *listener << "which points to an object ";
   2113     // Since *p has a property method, it must be a class/struct/union
   2114     // type and thus cannot be a pointer.  Therefore we pass
   2115     // false_type() as the first argument.
   2116     return MatchAndExplainImpl(false_type(), *p, listener);
   2117   }
   2118 
   2119   PropertyType (Class::*property_)() const;
   2120   const Matcher<RefToConstProperty> matcher_;
   2121 
   2122   GTEST_DISALLOW_ASSIGN_(PropertyMatcher);
   2123 };
   2124 
   2125 // Type traits specifying various features of different functors for ResultOf.
   2126 // The default template specifies features for functor objects.
   2127 // Functor classes have to typedef argument_type and result_type
   2128 // to be compatible with ResultOf.
   2129 template <typename Functor>
   2130 struct CallableTraits {
   2131   typedef typename Functor::result_type ResultType;
   2132   typedef Functor StorageType;
   2133 
   2134   static void CheckIsValid(Functor /* functor */) {}
   2135   template <typename T>
   2136   static ResultType Invoke(Functor f, T arg) { return f(arg); }
   2137 };
   2138 
   2139 // Specialization for function pointers.
   2140 template <typename ArgType, typename ResType>
   2141 struct CallableTraits<ResType(*)(ArgType)> {
   2142   typedef ResType ResultType;
   2143   typedef ResType(*StorageType)(ArgType);
   2144 
   2145   static void CheckIsValid(ResType(*f)(ArgType)) {
   2146     GTEST_CHECK_(f != NULL)
   2147         << "NULL function pointer is passed into ResultOf().";
   2148   }
   2149   template <typename T>
   2150   static ResType Invoke(ResType(*f)(ArgType), T arg) {
   2151     return (*f)(arg);
   2152   }
   2153 };
   2154 
   2155 // Implements the ResultOf() matcher for matching a return value of a
   2156 // unary function of an object.
   2157 template <typename Callable>
   2158 class ResultOfMatcher {
   2159  public:
   2160   typedef typename CallableTraits<Callable>::ResultType ResultType;
   2161 
   2162   ResultOfMatcher(Callable callable, const Matcher<ResultType>& matcher)
   2163       : callable_(callable), matcher_(matcher) {
   2164     CallableTraits<Callable>::CheckIsValid(callable_);
   2165   }
   2166 
   2167   template <typename T>
   2168   operator Matcher<T>() const {
   2169     return Matcher<T>(new Impl<T>(callable_, matcher_));
   2170   }
   2171 
   2172  private:
   2173   typedef typename CallableTraits<Callable>::StorageType CallableStorageType;
   2174 
   2175   template <typename T>
   2176   class Impl : public MatcherInterface<T> {
   2177    public:
   2178     Impl(CallableStorageType callable, const Matcher<ResultType>& matcher)
   2179         : callable_(callable), matcher_(matcher) {}
   2180 
   2181     virtual void DescribeTo(::std::ostream* os) const {
   2182       *os << "is mapped by the given callable to a value that ";
   2183       matcher_.DescribeTo(os);
   2184     }
   2185 
   2186     virtual void DescribeNegationTo(::std::ostream* os) const {
   2187       *os << "is mapped by the given callable to a value that ";
   2188       matcher_.DescribeNegationTo(os);
   2189     }
   2190 
   2191     virtual bool MatchAndExplain(T obj, MatchResultListener* listener) const {
   2192       *listener << "which is mapped by the given callable to ";
   2193       // Cannot pass the return value (for example, int) to
   2194       // MatchPrintAndExplain, which takes a non-const reference as argument.
   2195       ResultType result =
   2196           CallableTraits<Callable>::template Invoke<T>(callable_, obj);
   2197       return MatchPrintAndExplain(result, matcher_, listener);
   2198     }
   2199 
   2200    private:
   2201     // Functors often define operator() as non-const method even though
   2202     // they are actualy stateless. But we need to use them even when
   2203     // 'this' is a const pointer. It's the user's responsibility not to
   2204     // use stateful callables with ResultOf(), which does't guarantee
   2205     // how many times the callable will be invoked.
   2206     mutable CallableStorageType callable_;
   2207     const Matcher<ResultType> matcher_;
   2208 
   2209     GTEST_DISALLOW_ASSIGN_(Impl);
   2210   };  // class Impl
   2211 
   2212   const CallableStorageType callable_;
   2213   const Matcher<ResultType> matcher_;
   2214 
   2215   GTEST_DISALLOW_ASSIGN_(ResultOfMatcher);
   2216 };
   2217 
   2218 // Implements a matcher that checks the size of an STL-style container.
   2219 template <typename SizeMatcher>
   2220 class SizeIsMatcher {
   2221  public:
   2222   explicit SizeIsMatcher(const SizeMatcher& size_matcher)
   2223        : size_matcher_(size_matcher) {
   2224   }
   2225 
   2226   template <typename Container>
   2227   operator Matcher<Container>() const {
   2228     return MakeMatcher(new Impl<Container>(size_matcher_));
   2229   }
   2230 
   2231   template <typename Container>
   2232   class Impl : public MatcherInterface<Container> {
   2233    public:
   2234     typedef internal::StlContainerView<
   2235          GTEST_REMOVE_REFERENCE_AND_CONST_(Container)> ContainerView;
   2236     typedef typename ContainerView::type::size_type SizeType;
   2237     explicit Impl(const SizeMatcher& size_matcher)
   2238         : size_matcher_(MatcherCast<SizeType>(size_matcher)) {}
   2239 
   2240     virtual void DescribeTo(::std::ostream* os) const {
   2241       *os << "size ";
   2242       size_matcher_.DescribeTo(os);
   2243     }
   2244     virtual void DescribeNegationTo(::std::ostream* os) const {
   2245       *os << "size ";
   2246       size_matcher_.DescribeNegationTo(os);
   2247     }
   2248 
   2249     virtual bool MatchAndExplain(Container container,
   2250                                  MatchResultListener* listener) const {
   2251       SizeType size = container.size();
   2252       StringMatchResultListener size_listener;
   2253       const bool result = size_matcher_.MatchAndExplain(size, &size_listener);
   2254       *listener
   2255           << "whose size " << size << (result ? " matches" : " doesn't match");
   2256       PrintIfNotEmpty(size_listener.str(), listener->stream());
   2257       return result;
   2258     }
   2259 
   2260    private:
   2261     const Matcher<SizeType> size_matcher_;
   2262     GTEST_DISALLOW_ASSIGN_(Impl);
   2263   };
   2264 
   2265  private:
   2266   const SizeMatcher size_matcher_;
   2267   GTEST_DISALLOW_ASSIGN_(SizeIsMatcher);
   2268 };
   2269 
   2270 // Implements an equality matcher for any STL-style container whose elements
   2271 // support ==. This matcher is like Eq(), but its failure explanations provide
   2272 // more detailed information that is useful when the container is used as a set.
   2273 // The failure message reports elements that are in one of the operands but not
   2274 // the other. The failure messages do not report duplicate or out-of-order
   2275 // elements in the containers (which don't properly matter to sets, but can
   2276 // occur if the containers are vectors or lists, for example).
   2277 //
   2278 // Uses the container's const_iterator, value_type, operator ==,
   2279 // begin(), and end().
   2280 template <typename Container>
   2281 class ContainerEqMatcher {
   2282  public:
   2283   typedef internal::StlContainerView<Container> View;
   2284   typedef typename View::type StlContainer;
   2285   typedef typename View::const_reference StlContainerReference;
   2286 
   2287   // We make a copy of rhs in case the elements in it are modified
   2288   // after this matcher is created.
   2289   explicit ContainerEqMatcher(const Container& rhs) : rhs_(View::Copy(rhs)) {
   2290     // Makes sure the user doesn't instantiate this class template
   2291     // with a const or reference type.
   2292     (void)testing::StaticAssertTypeEq<Container,
   2293         GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>();
   2294   }
   2295 
   2296   void DescribeTo(::std::ostream* os) const {
   2297     *os << "equals ";
   2298     UniversalPrint(rhs_, os);
   2299   }
   2300   void DescribeNegationTo(::std::ostream* os) const {
   2301     *os << "does not equal ";
   2302     UniversalPrint(rhs_, os);
   2303   }
   2304 
   2305   template <typename LhsContainer>
   2306   bool MatchAndExplain(const LhsContainer& lhs,
   2307                        MatchResultListener* listener) const {
   2308     // GTEST_REMOVE_CONST_() is needed to work around an MSVC 8.0 bug
   2309     // that causes LhsContainer to be a const type sometimes.
   2310     typedef internal::StlContainerView<GTEST_REMOVE_CONST_(LhsContainer)>
   2311         LhsView;
   2312     typedef typename LhsView::type LhsStlContainer;
   2313     StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);
   2314     if (lhs_stl_container == rhs_)
   2315       return true;
   2316 
   2317     ::std::ostream* const os = listener->stream();
   2318     if (os != NULL) {
   2319       // Something is different. Check for extra values first.
   2320       bool printed_header = false;
   2321       for (typename LhsStlContainer::const_iterator it =
   2322                lhs_stl_container.begin();
   2323            it != lhs_stl_container.end(); ++it) {
   2324         if (internal::ArrayAwareFind(rhs_.begin(), rhs_.end(), *it) ==
   2325             rhs_.end()) {
   2326           if (printed_header) {
   2327             *os << ", ";
   2328           } else {
   2329             *os << "which has these unexpected elements: ";
   2330             printed_header = true;
   2331           }
   2332           UniversalPrint(*it, os);
   2333         }
   2334       }
   2335 
   2336       // Now check for missing values.
   2337       bool printed_header2 = false;
   2338       for (typename StlContainer::const_iterator it = rhs_.begin();
   2339            it != rhs_.end(); ++it) {
   2340         if (internal::ArrayAwareFind(
   2341                 lhs_stl_container.begin(), lhs_stl_container.end(), *it) ==
   2342             lhs_stl_container.end()) {
   2343           if (printed_header2) {
   2344             *os << ", ";
   2345           } else {
   2346             *os << (printed_header ? ",\nand" : "which")
   2347                 << " doesn't have these expected elements: ";
   2348             printed_header2 = true;
   2349           }
   2350           UniversalPrint(*it, os);
   2351         }
   2352       }
   2353     }
   2354 
   2355     return false;
   2356   }
   2357 
   2358  private:
   2359   const StlContainer rhs_;
   2360 
   2361   GTEST_DISALLOW_ASSIGN_(ContainerEqMatcher);
   2362 };
   2363 
   2364 // A comparator functor that uses the < operator to compare two values.
   2365 struct LessComparator {
   2366   template <typename T, typename U>
   2367   bool operator()(const T& lhs, const U& rhs) const { return lhs < rhs; }
   2368 };
   2369 
   2370 // Implements WhenSortedBy(comparator, container_matcher).
   2371 template <typename Comparator, typename ContainerMatcher>
   2372 class WhenSortedByMatcher {
   2373  public:
   2374   WhenSortedByMatcher(const Comparator& comparator,
   2375                       const ContainerMatcher& matcher)
   2376       : comparator_(comparator), matcher_(matcher) {}
   2377 
   2378   template <typename LhsContainer>
   2379   operator Matcher<LhsContainer>() const {
   2380     return MakeMatcher(new Impl<LhsContainer>(comparator_, matcher_));
   2381   }
   2382 
   2383   template <typename LhsContainer>
   2384   class Impl : public MatcherInterface<LhsContainer> {
   2385    public:
   2386     typedef internal::StlContainerView<
   2387          GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)> LhsView;
   2388     typedef typename LhsView::type LhsStlContainer;
   2389     typedef typename LhsView::const_reference LhsStlContainerReference;
   2390     // Transforms std::pair<const Key, Value> into std::pair<Key, Value>
   2391     // so that we can match associative containers.
   2392     typedef typename RemoveConstFromKey<
   2393         typename LhsStlContainer::value_type>::type LhsValue;
   2394 
   2395     Impl(const Comparator& comparator, const ContainerMatcher& matcher)
   2396         : comparator_(comparator), matcher_(matcher) {}
   2397 
   2398     virtual void DescribeTo(::std::ostream* os) const {
   2399       *os << "(when sorted) ";
   2400       matcher_.DescribeTo(os);
   2401     }
   2402 
   2403     virtual void DescribeNegationTo(::std::ostream* os) const {
   2404       *os << "(when sorted) ";
   2405       matcher_.DescribeNegationTo(os);
   2406     }
   2407 
   2408     virtual bool MatchAndExplain(LhsContainer lhs,
   2409                                  MatchResultListener* listener) const {
   2410       LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);
   2411       ::std::vector<LhsValue> sorted_container(lhs_stl_container.begin(),
   2412                                                lhs_stl_container.end());
   2413       ::std::sort(
   2414            sorted_container.begin(), sorted_container.end(), comparator_);
   2415 
   2416       if (!listener->IsInterested()) {
   2417         // If the listener is not interested, we do not need to
   2418         // construct the inner explanation.
   2419         return matcher_.Matches(sorted_container);
   2420       }
   2421 
   2422       *listener << "which is ";
   2423       UniversalPrint(sorted_container, listener->stream());
   2424       *listener << " when sorted";
   2425 
   2426       StringMatchResultListener inner_listener;
   2427       const bool match = matcher_.MatchAndExplain(sorted_container,
   2428                                                   &inner_listener);
   2429       PrintIfNotEmpty(inner_listener.str(), listener->stream());
   2430       return match;
   2431     }
   2432 
   2433    private:
   2434     const Comparator comparator_;
   2435     const Matcher<const ::std::vector<LhsValue>&> matcher_;
   2436 
   2437     GTEST_DISALLOW_COPY_AND_ASSIGN_(Impl);
   2438   };
   2439 
   2440  private:
   2441   const Comparator comparator_;
   2442   const ContainerMatcher matcher_;
   2443 
   2444   GTEST_DISALLOW_ASSIGN_(WhenSortedByMatcher);
   2445 };
   2446 
   2447 // Implements Pointwise(tuple_matcher, rhs_container).  tuple_matcher
   2448 // must be able to be safely cast to Matcher<tuple<const T1&, const
   2449 // T2&> >, where T1 and T2 are the types of elements in the LHS
   2450 // container and the RHS container respectively.
   2451 template <typename TupleMatcher, typename RhsContainer>
   2452 class PointwiseMatcher {
   2453  public:
   2454   typedef internal::StlContainerView<RhsContainer> RhsView;
   2455   typedef typename RhsView::type RhsStlContainer;
   2456   typedef typename RhsStlContainer::value_type RhsValue;
   2457 
   2458   // Like ContainerEq, we make a copy of rhs in case the elements in
   2459   // it are modified after this matcher is created.
   2460   PointwiseMatcher(const TupleMatcher& tuple_matcher, const RhsContainer& rhs)
   2461       : tuple_matcher_(tuple_matcher), rhs_(RhsView::Copy(rhs)) {
   2462     // Makes sure the user doesn't instantiate this class template
   2463     // with a const or reference type.
   2464     (void)testing::StaticAssertTypeEq<RhsContainer,
   2465         GTEST_REMOVE_REFERENCE_AND_CONST_(RhsContainer)>();
   2466   }
   2467 
   2468   template <typename LhsContainer>
   2469   operator Matcher<LhsContainer>() const {
   2470     return MakeMatcher(new Impl<LhsContainer>(tuple_matcher_, rhs_));
   2471   }
   2472 
   2473   template <typename LhsContainer>
   2474   class Impl : public MatcherInterface<LhsContainer> {
   2475    public:
   2476     typedef internal::StlContainerView<
   2477          GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)> LhsView;
   2478     typedef typename LhsView::type LhsStlContainer;
   2479     typedef typename LhsView::const_reference LhsStlContainerReference;
   2480     typedef typename LhsStlContainer::value_type LhsValue;
   2481     // We pass the LHS value and the RHS value to the inner matcher by
   2482     // reference, as they may be expensive to copy.  We must use tuple
   2483     // instead of pair here, as a pair cannot hold references (C++ 98,
   2484     // 20.2.2 [lib.pairs]).
   2485     typedef ::std::tr1::tuple<const LhsValue&, const RhsValue&> InnerMatcherArg;
   2486 
   2487     Impl(const TupleMatcher& tuple_matcher, const RhsStlContainer& rhs)
   2488         // mono_tuple_matcher_ holds a monomorphic version of the tuple matcher.
   2489         : mono_tuple_matcher_(SafeMatcherCast<InnerMatcherArg>(tuple_matcher)),
   2490           rhs_(rhs) {}
   2491 
   2492     virtual void DescribeTo(::std::ostream* os) const {
   2493       *os << "contains " << rhs_.size()
   2494           << " values, where each value and its corresponding value in ";
   2495       UniversalPrinter<RhsStlContainer>::Print(rhs_, os);
   2496       *os << " ";
   2497       mono_tuple_matcher_.DescribeTo(os);
   2498     }
   2499     virtual void DescribeNegationTo(::std::ostream* os) const {
   2500       *os << "doesn't contain exactly " << rhs_.size()
   2501           << " values, or contains a value x at some index i"
   2502           << " where x and the i-th value of ";
   2503       UniversalPrint(rhs_, os);
   2504       *os << " ";
   2505       mono_tuple_matcher_.DescribeNegationTo(os);
   2506     }
   2507 
   2508     virtual bool MatchAndExplain(LhsContainer lhs,
   2509                                  MatchResultListener* listener) const {
   2510       LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);
   2511       const size_t actual_size = lhs_stl_container.size();
   2512       if (actual_size != rhs_.size()) {
   2513         *listener << "which contains " << actual_size << " values";
   2514         return false;
   2515       }
   2516 
   2517       typename LhsStlContainer::const_iterator left = lhs_stl_container.begin();
   2518       typename RhsStlContainer::const_iterator right = rhs_.begin();
   2519       for (size_t i = 0; i != actual_size; ++i, ++left, ++right) {
   2520         const InnerMatcherArg value_pair(*left, *right);
   2521 
   2522         if (listener->IsInterested()) {
   2523           StringMatchResultListener inner_listener;
   2524           if (!mono_tuple_matcher_.MatchAndExplain(
   2525                   value_pair, &inner_listener)) {
   2526             *listener << "where the value pair (";
   2527             UniversalPrint(*left, listener->stream());
   2528             *listener << ", ";
   2529             UniversalPrint(*right, listener->stream());
   2530             *listener << ") at index #" << i << " don't match";
   2531             PrintIfNotEmpty(inner_listener.str(), listener->stream());
   2532             return false;
   2533           }
   2534         } else {
   2535           if (!mono_tuple_matcher_.Matches(value_pair))
   2536             return false;
   2537         }
   2538       }
   2539 
   2540       return true;
   2541     }
   2542 
   2543    private:
   2544     const Matcher<InnerMatcherArg> mono_tuple_matcher_;
   2545     const RhsStlContainer rhs_;
   2546 
   2547     GTEST_DISALLOW_ASSIGN_(Impl);
   2548   };
   2549 
   2550  private:
   2551   const TupleMatcher tuple_matcher_;
   2552   const RhsStlContainer rhs_;
   2553 
   2554   GTEST_DISALLOW_ASSIGN_(PointwiseMatcher);
   2555 };
   2556 
   2557 // Holds the logic common to ContainsMatcherImpl and EachMatcherImpl.
   2558 template <typename Container>
   2559 class QuantifierMatcherImpl : public MatcherInterface<Container> {
   2560  public:
   2561   typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
   2562   typedef StlContainerView<RawContainer> View;
   2563   typedef typename View::type StlContainer;
   2564   typedef typename View::const_reference StlContainerReference;
   2565   typedef typename StlContainer::value_type Element;
   2566 
   2567   template <typename InnerMatcher>
   2568   explicit QuantifierMatcherImpl(InnerMatcher inner_matcher)
   2569       : inner_matcher_(
   2570            testing::SafeMatcherCast<const Element&>(inner_matcher)) {}
   2571 
   2572   // Checks whether:
   2573   // * All elements in the container match, if all_elements_should_match.
   2574   // * Any element in the container matches, if !all_elements_should_match.
   2575   bool MatchAndExplainImpl(bool all_elements_should_match,
   2576                            Container container,
   2577                            MatchResultListener* listener) const {
   2578     StlContainerReference stl_container = View::ConstReference(container);
   2579     size_t i = 0;
   2580     for (typename StlContainer::const_iterator it = stl_container.begin();
   2581          it != stl_container.end(); ++it, ++i) {
   2582       StringMatchResultListener inner_listener;
   2583       const bool matches = inner_matcher_.MatchAndExplain(*it, &inner_listener);
   2584 
   2585       if (matches != all_elements_should_match) {
   2586         *listener << "whose element #" << i
   2587                   << (matches ? " matches" : " doesn't match");
   2588         PrintIfNotEmpty(inner_listener.str(), listener->stream());
   2589         return !all_elements_should_match;
   2590       }
   2591     }
   2592     return all_elements_should_match;
   2593   }
   2594 
   2595  protected:
   2596   const Matcher<const Element&> inner_matcher_;
   2597 
   2598   GTEST_DISALLOW_ASSIGN_(QuantifierMatcherImpl);
   2599 };
   2600 
   2601 // Implements Contains(element_matcher) for the given argument type Container.
   2602 // Symmetric to EachMatcherImpl.
   2603 template <typename Container>
   2604 class ContainsMatcherImpl : public QuantifierMatcherImpl<Container> {
   2605  public:
   2606   template <typename InnerMatcher>
   2607   explicit ContainsMatcherImpl(InnerMatcher inner_matcher)
   2608       : QuantifierMatcherImpl<Container>(inner_matcher) {}
   2609 
   2610   // Describes what this matcher does.
   2611   virtual void DescribeTo(::std::ostream* os) const {
   2612     *os << "contains at least one element that ";
   2613     this->inner_matcher_.DescribeTo(os);
   2614   }
   2615 
   2616   virtual void DescribeNegationTo(::std::ostream* os) const {
   2617     *os << "doesn't contain any element that ";
   2618     this->inner_matcher_.DescribeTo(os);
   2619   }
   2620 
   2621   virtual bool MatchAndExplain(Container container,
   2622                                MatchResultListener* listener) const {
   2623     return this->MatchAndExplainImpl(false, container, listener);
   2624   }
   2625 
   2626  private:
   2627   GTEST_DISALLOW_ASSIGN_(ContainsMatcherImpl);
   2628 };
   2629 
   2630 // Implements Each(element_matcher) for the given argument type Container.
   2631 // Symmetric to ContainsMatcherImpl.
   2632 template <typename Container>
   2633 class EachMatcherImpl : public QuantifierMatcherImpl<Container> {
   2634  public:
   2635   template <typename InnerMatcher>
   2636   explicit EachMatcherImpl(InnerMatcher inner_matcher)
   2637       : QuantifierMatcherImpl<Container>(inner_matcher) {}
   2638 
   2639   // Describes what this matcher does.
   2640   virtual void DescribeTo(::std::ostream* os) const {
   2641     *os << "only contains elements that ";
   2642     this->inner_matcher_.DescribeTo(os);
   2643   }
   2644 
   2645   virtual void DescribeNegationTo(::std::ostream* os) const {
   2646     *os << "contains some element that ";
   2647     this->inner_matcher_.DescribeNegationTo(os);
   2648   }
   2649 
   2650   virtual bool MatchAndExplain(Container container,
   2651                                MatchResultListener* listener) const {
   2652     return this->MatchAndExplainImpl(true, container, listener);
   2653   }
   2654 
   2655  private:
   2656   GTEST_DISALLOW_ASSIGN_(EachMatcherImpl);
   2657 };
   2658 
   2659 // Implements polymorphic Contains(element_matcher).
   2660 template <typename M>
   2661 class ContainsMatcher {
   2662  public:
   2663   explicit ContainsMatcher(M m) : inner_matcher_(m) {}
   2664 
   2665   template <typename Container>
   2666   operator Matcher<Container>() const {
   2667     return MakeMatcher(new ContainsMatcherImpl<Container>(inner_matcher_));
   2668   }
   2669 
   2670  private:
   2671   const M inner_matcher_;
   2672 
   2673   GTEST_DISALLOW_ASSIGN_(ContainsMatcher);
   2674 };
   2675 
   2676 // Implements polymorphic Each(element_matcher).
   2677 template <typename M>
   2678 class EachMatcher {
   2679  public:
   2680   explicit EachMatcher(M m) : inner_matcher_(m) {}
   2681 
   2682   template <typename Container>
   2683   operator Matcher<Container>() const {
   2684     return MakeMatcher(new EachMatcherImpl<Container>(inner_matcher_));
   2685   }
   2686 
   2687  private:
   2688   const M inner_matcher_;
   2689 
   2690   GTEST_DISALLOW_ASSIGN_(EachMatcher);
   2691 };
   2692 
   2693 // Implements Key(inner_matcher) for the given argument pair type.
   2694 // Key(inner_matcher) matches an std::pair whose 'first' field matches
   2695 // inner_matcher.  For example, Contains(Key(Ge(5))) can be used to match an
   2696 // std::map that contains at least one element whose key is >= 5.
   2697 template <typename PairType>
   2698 class KeyMatcherImpl : public MatcherInterface<PairType> {
   2699  public:
   2700   typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType) RawPairType;
   2701   typedef typename RawPairType::first_type KeyType;
   2702 
   2703   template <typename InnerMatcher>
   2704   explicit KeyMatcherImpl(InnerMatcher inner_matcher)
   2705       : inner_matcher_(
   2706           testing::SafeMatcherCast<const KeyType&>(inner_matcher)) {
   2707   }
   2708 
   2709   // Returns true iff 'key_value.first' (the key) matches the inner matcher.
   2710   virtual bool MatchAndExplain(PairType key_value,
   2711                                MatchResultListener* listener) const {
   2712     StringMatchResultListener inner_listener;
   2713     const bool match = inner_matcher_.MatchAndExplain(key_value.first,
   2714                                                       &inner_listener);
   2715     const internal::string explanation = inner_listener.str();
   2716     if (explanation != "") {
   2717       *listener << "whose first field is a value " << explanation;
   2718     }
   2719     return match;
   2720   }
   2721 
   2722   // Describes what this matcher does.
   2723   virtual void DescribeTo(::std::ostream* os) const {
   2724     *os << "has a key that ";
   2725     inner_matcher_.DescribeTo(os);
   2726   }
   2727 
   2728   // Describes what the negation of this matcher does.
   2729   virtual void DescribeNegationTo(::std::ostream* os) const {
   2730     *os << "doesn't have a key that ";
   2731     inner_matcher_.DescribeTo(os);
   2732   }
   2733 
   2734  private:
   2735   const Matcher<const KeyType&> inner_matcher_;
   2736 
   2737   GTEST_DISALLOW_ASSIGN_(KeyMatcherImpl);
   2738 };
   2739 
   2740 // Implements polymorphic Key(matcher_for_key).
   2741 template <typename M>
   2742 class KeyMatcher {
   2743  public:
   2744   explicit KeyMatcher(M m) : matcher_for_key_(m) {}
   2745 
   2746   template <typename PairType>
   2747   operator Matcher<PairType>() const {
   2748     return MakeMatcher(new KeyMatcherImpl<PairType>(matcher_for_key_));
   2749   }
   2750 
   2751  private:
   2752   const M matcher_for_key_;
   2753 
   2754   GTEST_DISALLOW_ASSIGN_(KeyMatcher);
   2755 };
   2756 
   2757 // Implements Pair(first_matcher, second_matcher) for the given argument pair
   2758 // type with its two matchers. See Pair() function below.
   2759 template <typename PairType>
   2760 class PairMatcherImpl : public MatcherInterface<PairType> {
   2761  public:
   2762   typedef GTEST_REMOVE_REFERENCE_AND_CONST_(PairType) RawPairType;
   2763   typedef typename RawPairType::first_type FirstType;
   2764   typedef typename RawPairType::second_type SecondType;
   2765 
   2766   template <typename FirstMatcher, typename SecondMatcher>
   2767   PairMatcherImpl(FirstMatcher first_matcher, SecondMatcher second_matcher)
   2768       : first_matcher_(
   2769             testing::SafeMatcherCast<const FirstType&>(first_matcher)),
   2770         second_matcher_(
   2771             testing::SafeMatcherCast<const SecondType&>(second_matcher)) {
   2772   }
   2773 
   2774   // Describes what this matcher does.
   2775   virtual void DescribeTo(::std::ostream* os) const {
   2776     *os << "has a first field that ";
   2777     first_matcher_.DescribeTo(os);
   2778     *os << ", and has a second field that ";
   2779     second_matcher_.DescribeTo(os);
   2780   }
   2781 
   2782   // Describes what the negation of this matcher does.
   2783   virtual void DescribeNegationTo(::std::ostream* os) const {
   2784     *os << "has a first field that ";
   2785     first_matcher_.DescribeNegationTo(os);
   2786     *os << ", or has a second field that ";
   2787     second_matcher_.DescribeNegationTo(os);
   2788   }
   2789 
   2790   // Returns true iff 'a_pair.first' matches first_matcher and 'a_pair.second'
   2791   // matches second_matcher.
   2792   virtual bool MatchAndExplain(PairType a_pair,
   2793                                MatchResultListener* listener) const {
   2794     if (!listener->IsInterested()) {
   2795       // If the listener is not interested, we don't need to construct the
   2796       // explanation.
   2797       return first_matcher_.Matches(a_pair.first) &&
   2798              second_matcher_.Matches(a_pair.second);
   2799     }
   2800     StringMatchResultListener first_inner_listener;
   2801     if (!first_matcher_.MatchAndExplain(a_pair.first,
   2802                                         &first_inner_listener)) {
   2803       *listener << "whose first field does not match";
   2804       PrintIfNotEmpty(first_inner_listener.str(), listener->stream());
   2805       return false;
   2806     }
   2807     StringMatchResultListener second_inner_listener;
   2808     if (!second_matcher_.MatchAndExplain(a_pair.second,
   2809                                          &second_inner_listener)) {
   2810       *listener << "whose second field does not match";
   2811       PrintIfNotEmpty(second_inner_listener.str(), listener->stream());
   2812       return false;
   2813     }
   2814     ExplainSuccess(first_inner_listener.str(), second_inner_listener.str(),
   2815                    listener);
   2816     return true;
   2817   }
   2818 
   2819  private:
   2820   void ExplainSuccess(const internal::string& first_explanation,
   2821                       const internal::string& second_explanation,
   2822                       MatchResultListener* listener) const {
   2823     *listener << "whose both fields match";
   2824     if (first_explanation != "") {
   2825       *listener << ", where the first field is a value " << first_explanation;
   2826     }
   2827     if (second_explanation != "") {
   2828       *listener << ", ";
   2829       if (first_explanation != "") {
   2830         *listener << "and ";
   2831       } else {
   2832         *listener << "where ";
   2833       }
   2834       *listener << "the second field is a value " << second_explanation;
   2835     }
   2836   }
   2837 
   2838   const Matcher<const FirstType&> first_matcher_;
   2839   const Matcher<const SecondType&> second_matcher_;
   2840 
   2841   GTEST_DISALLOW_ASSIGN_(PairMatcherImpl);
   2842 };
   2843 
   2844 // Implements polymorphic Pair(first_matcher, second_matcher).
   2845 template <typename FirstMatcher, typename SecondMatcher>
   2846 class PairMatcher {
   2847  public:
   2848   PairMatcher(FirstMatcher first_matcher, SecondMatcher second_matcher)
   2849       : first_matcher_(first_matcher), second_matcher_(second_matcher) {}
   2850 
   2851   template <typename PairType>
   2852   operator Matcher<PairType> () const {
   2853     return MakeMatcher(
   2854         new PairMatcherImpl<PairType>(
   2855             first_matcher_, second_matcher_));
   2856   }
   2857 
   2858  private:
   2859   const FirstMatcher first_matcher_;
   2860   const SecondMatcher second_matcher_;
   2861 
   2862   GTEST_DISALLOW_ASSIGN_(PairMatcher);
   2863 };
   2864 
   2865 // Implements ElementsAre() and ElementsAreArray().
   2866 template <typename Container>
   2867 class ElementsAreMatcherImpl : public MatcherInterface<Container> {
   2868  public:
   2869   typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
   2870   typedef internal::StlContainerView<RawContainer> View;
   2871   typedef typename View::type StlContainer;
   2872   typedef typename View::const_reference StlContainerReference;
   2873   typedef typename StlContainer::value_type Element;
   2874 
   2875   // Constructs the matcher from a sequence of element values or
   2876   // element matchers.
   2877   template <typename InputIter>
   2878   ElementsAreMatcherImpl(InputIter first, InputIter last) {
   2879     while (first != last) {
   2880       matchers_.push_back(MatcherCast<const Element&>(*first++));
   2881     }
   2882   }
   2883 
   2884   // Describes what this matcher does.
   2885   virtual void DescribeTo(::std::ostream* os) const {
   2886     if (count() == 0) {
   2887       *os << "is empty";
   2888     } else if (count() == 1) {
   2889       *os << "has 1 element that ";
   2890       matchers_[0].DescribeTo(os);
   2891     } else {
   2892       *os << "has " << Elements(count()) << " where\n";
   2893       for (size_t i = 0; i != count(); ++i) {
   2894         *os << "element #" << i << " ";
   2895         matchers_[i].DescribeTo(os);
   2896         if (i + 1 < count()) {
   2897           *os << ",\n";
   2898         }
   2899       }
   2900     }
   2901   }
   2902 
   2903   // Describes what the negation of this matcher does.
   2904   virtual void DescribeNegationTo(::std::ostream* os) const {
   2905     if (count() == 0) {
   2906       *os << "isn't empty";
   2907       return;
   2908     }
   2909 
   2910     *os << "doesn't have " << Elements(count()) << ", or\n";
   2911     for (size_t i = 0; i != count(); ++i) {
   2912       *os << "element #" << i << " ";
   2913       matchers_[i].DescribeNegationTo(os);
   2914       if (i + 1 < count()) {
   2915         *os << ", or\n";
   2916       }
   2917     }
   2918   }
   2919 
   2920   virtual bool MatchAndExplain(Container container,
   2921                                MatchResultListener* listener) const {
   2922     // To work with stream-like "containers", we must only walk
   2923     // through the elements in one pass.
   2924 
   2925     const bool listener_interested = listener->IsInterested();
   2926 
   2927     // explanations[i] is the explanation of the element at index i.
   2928     ::std::vector<internal::string> explanations(count());
   2929     StlContainerReference stl_container = View::ConstReference(container);
   2930     typename StlContainer::const_iterator it = stl_container.begin();
   2931     size_t exam_pos = 0;
   2932     bool mismatch_found = false;  // Have we found a mismatched element yet?
   2933 
   2934     // Go through the elements and matchers in pairs, until we reach
   2935     // the end of either the elements or the matchers, or until we find a
   2936     // mismatch.
   2937     for (; it != stl_container.end() && exam_pos != count(); ++it, ++exam_pos) {
   2938       bool match;  // Does the current element match the current matcher?
   2939       if (listener_interested) {
   2940         StringMatchResultListener s;
   2941         match = matchers_[exam_pos].MatchAndExplain(*it, &s);
   2942         explanations[exam_pos] = s.str();
   2943       } else {
   2944         match = matchers_[exam_pos].Matches(*it);
   2945       }
   2946 
   2947       if (!match) {
   2948         mismatch_found = true;
   2949         break;
   2950       }
   2951     }
   2952     // If mismatch_found is true, 'exam_pos' is the index of the mismatch.
   2953 
   2954     // Find how many elements the actual container has.  We avoid
   2955     // calling size() s.t. this code works for stream-like "containers"
   2956     // that don't define size().
   2957     size_t actual_count = exam_pos;
   2958     for (; it != stl_container.end(); ++it) {
   2959       ++actual_count;
   2960     }
   2961 
   2962     if (actual_count != count()) {
   2963       // The element count doesn't match.  If the container is empty,
   2964       // there's no need to explain anything as Google Mock already
   2965       // prints the empty container.  Otherwise we just need to show
   2966       // how many elements there actually are.
   2967       if (listener_interested && (actual_count != 0)) {
   2968         *listener << "which has " << Elements(actual_count);
   2969       }
   2970       return false;
   2971     }
   2972 
   2973     if (mismatch_found) {
   2974       // The element count matches, but the exam_pos-th element doesn't match.
   2975       if (listener_interested) {
   2976         *listener << "whose element #" << exam_pos << " doesn't match";
   2977         PrintIfNotEmpty(explanations[exam_pos], listener->stream());
   2978       }
   2979       return false;
   2980     }
   2981 
   2982     // Every element matches its expectation.  We need to explain why
   2983     // (the obvious ones can be skipped).
   2984     if (listener_interested) {
   2985       bool reason_printed = false;
   2986       for (size_t i = 0; i != count(); ++i) {
   2987         const internal::string& s = explanations[i];
   2988         if (!s.empty()) {
   2989           if (reason_printed) {
   2990             *listener << ",\nand ";
   2991           }
   2992           *listener << "whose element #" << i << " matches, " << s;
   2993           reason_printed = true;
   2994         }
   2995       }
   2996     }
   2997     return true;
   2998   }
   2999 
   3000  private:
   3001   static Message Elements(size_t count) {
   3002     return Message() << count << (count == 1 ? " element" : " elements");
   3003   }
   3004 
   3005   size_t count() const { return matchers_.size(); }
   3006 
   3007   ::std::vector<Matcher<const Element&> > matchers_;
   3008 
   3009   GTEST_DISALLOW_ASSIGN_(ElementsAreMatcherImpl);
   3010 };
   3011 
   3012 // Connectivity matrix of (elements X matchers), in element-major order.
   3013 // Initially, there are no edges.
   3014 // Use NextGraph() to iterate over all possible edge configurations.
   3015 // Use Randomize() to generate a random edge configuration.
   3016 class GTEST_API_ MatchMatrix {
   3017  public:
   3018   MatchMatrix(size_t num_elements, size_t num_matchers)
   3019       : num_elements_(num_elements),
   3020         num_matchers_(num_matchers),
   3021         matched_(num_elements_* num_matchers_, 0) {
   3022   }
   3023 
   3024   size_t LhsSize() const { return num_elements_; }
   3025   size_t RhsSize() const { return num_matchers_; }
   3026   bool HasEdge(size_t ilhs, size_t irhs) const {
   3027     return matched_[SpaceIndex(ilhs, irhs)] == 1;
   3028   }
   3029   void SetEdge(size_t ilhs, size_t irhs, bool b) {
   3030     matched_[SpaceIndex(ilhs, irhs)] = b ? 1 : 0;
   3031   }
   3032 
   3033   // Treating the connectivity matrix as a (LhsSize()*RhsSize())-bit number,
   3034   // adds 1 to that number; returns false if incrementing the graph left it
   3035   // empty.
   3036   bool NextGraph();
   3037 
   3038   void Randomize();
   3039 
   3040   string DebugString() const;
   3041 
   3042  private:
   3043   size_t SpaceIndex(size_t ilhs, size_t irhs) const {
   3044     return ilhs * num_matchers_ + irhs;
   3045   }
   3046 
   3047   size_t num_elements_;
   3048   size_t num_matchers_;
   3049 
   3050   // Each element is a char interpreted as bool. They are stored as a
   3051   // flattened array in lhs-major order, use 'SpaceIndex()' to translate
   3052   // a (ilhs, irhs) matrix coordinate into an offset.
   3053   ::std::vector<char> matched_;
   3054 };
   3055 
   3056 typedef ::std::pair<size_t, size_t> ElementMatcherPair;
   3057 typedef ::std::vector<ElementMatcherPair> ElementMatcherPairs;
   3058 
   3059 // Returns a maximum bipartite matching for the specified graph 'g'.
   3060 // The matching is represented as a vector of {element, matcher} pairs.
   3061 GTEST_API_ ElementMatcherPairs
   3062 FindMaxBipartiteMatching(const MatchMatrix& g);
   3063 
   3064 GTEST_API_ bool FindPairing(const MatchMatrix& matrix,
   3065                             MatchResultListener* listener);
   3066 
   3067 // Untyped base class for implementing UnorderedElementsAre.  By
   3068 // putting logic that's not specific to the element type here, we
   3069 // reduce binary bloat and increase compilation speed.
   3070 class GTEST_API_ UnorderedElementsAreMatcherImplBase {
   3071  protected:
   3072   // A vector of matcher describers, one for each element matcher.
   3073   // Does not own the describers (and thus can be used only when the
   3074   // element matchers are alive).
   3075   typedef ::std::vector<const MatcherDescriberInterface*> MatcherDescriberVec;
   3076 
   3077   // Describes this UnorderedElementsAre matcher.
   3078   void DescribeToImpl(::std::ostream* os) const;
   3079 
   3080   // Describes the negation of this UnorderedElementsAre matcher.
   3081   void DescribeNegationToImpl(::std::ostream* os) const;
   3082 
   3083   bool VerifyAllElementsAndMatchersAreMatched(
   3084       const ::std::vector<string>& element_printouts,
   3085       const MatchMatrix& matrix,
   3086       MatchResultListener* listener) const;
   3087 
   3088   MatcherDescriberVec& matcher_describers() {
   3089     return matcher_describers_;
   3090   }
   3091 
   3092   static Message Elements(size_t n) {
   3093     return Message() << n << " element" << (n == 1 ? "" : "s");
   3094   }
   3095 
   3096  private:
   3097   MatcherDescriberVec matcher_describers_;
   3098 
   3099   GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreMatcherImplBase);
   3100 };
   3101 
   3102 // Implements unordered ElementsAre and unordered ElementsAreArray.
   3103 template <typename Container>
   3104 class UnorderedElementsAreMatcherImpl
   3105     : public MatcherInterface<Container>,
   3106       public UnorderedElementsAreMatcherImplBase {
   3107  public:
   3108   typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
   3109   typedef internal::StlContainerView<RawContainer> View;
   3110   typedef typename View::type StlContainer;
   3111   typedef typename View::const_reference StlContainerReference;
   3112   typedef typename StlContainer::const_iterator StlContainerConstIterator;
   3113   typedef typename StlContainer::value_type Element;
   3114 
   3115   // Constructs the matcher from a sequence of element values or
   3116   // element matchers.
   3117   template <typename InputIter>
   3118   UnorderedElementsAreMatcherImpl(InputIter first, InputIter last) {
   3119     for (; first != last; ++first) {
   3120       matchers_.push_back(MatcherCast<const Element&>(*first));
   3121       matcher_describers().push_back(matchers_.back().GetDescriber());
   3122     }
   3123   }
   3124 
   3125   // Describes what this matcher does.
   3126   virtual void DescribeTo(::std::ostream* os) const {
   3127     return UnorderedElementsAreMatcherImplBase::DescribeToImpl(os);
   3128   }
   3129 
   3130   // Describes what the negation of this matcher does.
   3131   virtual void DescribeNegationTo(::std::ostream* os) const {
   3132     return UnorderedElementsAreMatcherImplBase::DescribeNegationToImpl(os);
   3133   }
   3134 
   3135   virtual bool MatchAndExplain(Container container,
   3136                                MatchResultListener* listener) const {
   3137     StlContainerReference stl_container = View::ConstReference(container);
   3138     ::std::vector<string> element_printouts;
   3139     MatchMatrix matrix = AnalyzeElements(stl_container.begin(),
   3140                                          stl_container.end(),
   3141                                          &element_printouts,
   3142                                          listener);
   3143 
   3144     const size_t actual_count = matrix.LhsSize();
   3145     if (actual_count == 0 && matchers_.empty()) {
   3146       return true;
   3147     }
   3148     if (actual_count != matchers_.size()) {
   3149       // The element count doesn't match.  If the container is empty,
   3150       // there's no need to explain anything as Google Mock already
   3151       // prints the empty container. Otherwise we just need to show
   3152       // how many elements there actually are.
   3153       if (actual_count != 0 && listener->IsInterested()) {
   3154         *listener << "which has " << Elements(actual_count);
   3155       }
   3156       return false;
   3157     }
   3158 
   3159     return VerifyAllElementsAndMatchersAreMatched(element_printouts,
   3160                                                   matrix, listener) &&
   3161            FindPairing(matrix, listener);
   3162   }
   3163 
   3164  private:
   3165   typedef ::std::vector<Matcher<const Element&> > MatcherVec;
   3166 
   3167   template <typename ElementIter>
   3168   MatchMatrix AnalyzeElements(ElementIter elem_first, ElementIter elem_last,
   3169                               ::std::vector<string>* element_printouts,
   3170                               MatchResultListener* listener) const {
   3171     element_printouts->clear();
   3172     ::std::vector<char> did_match;
   3173     size_t num_elements = 0;
   3174     for (; elem_first != elem_last; ++num_elements, ++elem_first) {
   3175       if (listener->IsInterested()) {
   3176         element_printouts->push_back(PrintToString(*elem_first));
   3177       }
   3178       for (size_t irhs = 0; irhs != matchers_.size(); ++irhs) {
   3179         did_match.push_back(Matches(matchers_[irhs])(*elem_first));
   3180       }
   3181     }
   3182 
   3183     MatchMatrix matrix(num_elements, matchers_.size());
   3184     ::std::vector<char>::const_iterator did_match_iter = did_match.begin();
   3185     for (size_t ilhs = 0; ilhs != num_elements; ++ilhs) {
   3186       for (size_t irhs = 0; irhs != matchers_.size(); ++irhs) {
   3187         matrix.SetEdge(ilhs, irhs, *did_match_iter++ != 0);
   3188       }
   3189     }
   3190     return matrix;
   3191   }
   3192 
   3193   MatcherVec matchers_;
   3194 
   3195   GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreMatcherImpl);
   3196 };
   3197 
   3198 // Functor for use in TransformTuple.
   3199 // Performs MatcherCast<Target> on an input argument of any type.
   3200 template <typename Target>
   3201 struct CastAndAppendTransform {
   3202   template <typename Arg>
   3203   Matcher<Target> operator()(const Arg& a) const {
   3204     return MatcherCast<Target>(a);
   3205   }
   3206 };
   3207 
   3208 // Implements UnorderedElementsAre.
   3209 template <typename MatcherTuple>
   3210 class UnorderedElementsAreMatcher {
   3211  public:
   3212   explicit UnorderedElementsAreMatcher(const MatcherTuple& args)
   3213       : matchers_(args) {}
   3214 
   3215   template <typename Container>
   3216   operator Matcher<Container>() const {
   3217     typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
   3218     typedef typename internal::StlContainerView<RawContainer>::type View;
   3219     typedef typename View::value_type Element;
   3220     typedef ::std::vector<Matcher<const Element&> > MatcherVec;
   3221     MatcherVec matchers;
   3222     matchers.reserve(::std::tr1::tuple_size<MatcherTuple>::value);
   3223     TransformTupleValues(CastAndAppendTransform<const Element&>(), matchers_,
   3224                          ::std::back_inserter(matchers));
   3225     return MakeMatcher(new UnorderedElementsAreMatcherImpl<Container>(
   3226                            matchers.begin(), matchers.end()));
   3227   }
   3228 
   3229  private:
   3230   const MatcherTuple matchers_;
   3231   GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreMatcher);
   3232 };
   3233 
   3234 // Implements ElementsAre.
   3235 template <typename MatcherTuple>
   3236 class ElementsAreMatcher {
   3237  public:
   3238   explicit ElementsAreMatcher(const MatcherTuple& args) : matchers_(args) {}
   3239 
   3240   template <typename Container>
   3241   operator Matcher<Container>() const {
   3242     typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;
   3243     typedef typename internal::StlContainerView<RawContainer>::type View;
   3244     typedef typename View::value_type Element;
   3245     typedef ::std::vector<Matcher<const Element&> > MatcherVec;
   3246     MatcherVec matchers;
   3247     matchers.reserve(::std::tr1::tuple_size<MatcherTuple>::value);
   3248     TransformTupleValues(CastAndAppendTransform<const Element&>(), matchers_,
   3249                          ::std::back_inserter(matchers));
   3250     return MakeMatcher(new ElementsAreMatcherImpl<Container>(
   3251                            matchers.begin(), matchers.end()));
   3252   }
   3253 
   3254  private:
   3255   const MatcherTuple matchers_;
   3256   GTEST_DISALLOW_ASSIGN_(ElementsAreMatcher);
   3257 };
   3258 
   3259 // Implements UnorderedElementsAreArray().
   3260 template <typename T>
   3261 class UnorderedElementsAreArrayMatcher {
   3262  public:
   3263   UnorderedElementsAreArrayMatcher() {}
   3264 
   3265   template <typename Iter>
   3266   UnorderedElementsAreArrayMatcher(Iter first, Iter last)
   3267       : matchers_(first, last) {}
   3268 
   3269   template <typename Container>
   3270   operator Matcher<Container>() const {
   3271     return MakeMatcher(
   3272         new UnorderedElementsAreMatcherImpl<Container>(matchers_.begin(),
   3273                                                        matchers_.end()));
   3274   }
   3275 
   3276  private:
   3277   ::std::vector<T> matchers_;
   3278 
   3279   GTEST_DISALLOW_ASSIGN_(UnorderedElementsAreArrayMatcher);
   3280 };
   3281 
   3282 // Implements ElementsAreArray().
   3283 template <typename T>
   3284 class ElementsAreArrayMatcher {
   3285  public:
   3286   template <typename Iter>
   3287   ElementsAreArrayMatcher(Iter first, Iter last) : matchers_(first, last) {}
   3288 
   3289   template <typename Container>
   3290   operator Matcher<Container>() const {
   3291     return MakeMatcher(new ElementsAreMatcherImpl<Container>(
   3292         matchers_.begin(), matchers_.end()));
   3293   }
   3294 
   3295  private:
   3296   const ::std::vector<T> matchers_;
   3297 
   3298   GTEST_DISALLOW_ASSIGN_(ElementsAreArrayMatcher);
   3299 };
   3300 
   3301 // Returns the description for a matcher defined using the MATCHER*()
   3302 // macro where the user-supplied description string is "", if
   3303 // 'negation' is false; otherwise returns the description of the
   3304 // negation of the matcher.  'param_values' contains a list of strings
   3305 // that are the print-out of the matcher's parameters.
   3306 GTEST_API_ string FormatMatcherDescription(bool negation,
   3307                                            const char* matcher_name,
   3308                                            const Strings& param_values);
   3309 
   3310 }  // namespace internal
   3311 
   3312 // ElementsAreArray(first, last)
   3313 // ElementsAreArray(pointer, count)
   3314 // ElementsAreArray(array)
   3315 // ElementsAreArray(vector)
   3316 // ElementsAreArray({ e1, e2, ..., en })
   3317 //
   3318 // The ElementsAreArray() functions are like ElementsAre(...), except
   3319 // that they are given a homogeneous sequence rather than taking each
   3320 // element as a function argument. The sequence can be specified as an
   3321 // array, a pointer and count, a vector, an initializer list, or an
   3322 // STL iterator range. In each of these cases, the underlying sequence
   3323 // can be either a sequence of values or a sequence of matchers.
   3324 //
   3325 // All forms of ElementsAreArray() make a copy of the input matcher sequence.
   3326 
   3327 template <typename Iter>
   3328 inline internal::ElementsAreArrayMatcher<
   3329     typename ::std::iterator_traits<Iter>::value_type>
   3330 ElementsAreArray(Iter first, Iter last) {
   3331   typedef typename ::std::iterator_traits<Iter>::value_type T;
   3332   return internal::ElementsAreArrayMatcher<T>(first, last);
   3333 }
   3334 
   3335 template <typename T>
   3336 inline internal::ElementsAreArrayMatcher<T> ElementsAreArray(
   3337     const T* pointer, size_t count) {
   3338   return ElementsAreArray(pointer, pointer + count);
   3339 }
   3340 
   3341 template <typename T, size_t N>
   3342 inline internal::ElementsAreArrayMatcher<T> ElementsAreArray(
   3343     const T (&array)[N]) {
   3344   return ElementsAreArray(array, N);
   3345 }
   3346 
   3347 template <typename T, typename A>
   3348 inline internal::ElementsAreArrayMatcher<T> ElementsAreArray(
   3349     const ::std::vector<T, A>& vec) {
   3350   return ElementsAreArray(vec.begin(), vec.end());
   3351 }
   3352 
   3353 #if GTEST_LANG_CXX11
   3354 template <typename T>
   3355 inline internal::ElementsAreArrayMatcher<T>
   3356 ElementsAreArray(::std::initializer_list<T> xs) {
   3357   return ElementsAreArray(xs.begin(), xs.end());
   3358 }
   3359 #endif
   3360 
   3361 // UnorderedElementsAreArray(first, last)
   3362 // UnorderedElementsAreArray(pointer, count)
   3363 // UnorderedElementsAreArray(array)
   3364 // UnorderedElementsAreArray(vector)
   3365 // UnorderedElementsAreArray({ e1, e2, ..., en })
   3366 //
   3367 // The UnorderedElementsAreArray() functions are like
   3368 // ElementsAreArray(...), but allow matching the elements in any order.
   3369 template <typename Iter>
   3370 inline internal::UnorderedElementsAreArrayMatcher<
   3371     typename ::std::iterator_traits<Iter>::value_type>
   3372 UnorderedElementsAreArray(Iter first, Iter last) {
   3373   typedef typename ::std::iterator_traits<Iter>::value_type T;
   3374   return internal::UnorderedElementsAreArrayMatcher<T>(first, last);
   3375 }
   3376 
   3377 template <typename T>
   3378 inline internal::UnorderedElementsAreArrayMatcher<T>
   3379 UnorderedElementsAreArray(const T* pointer, size_t count) {
   3380   return UnorderedElementsAreArray(pointer, pointer + count);
   3381 }
   3382 
   3383 template <typename T, size_t N>
   3384 inline internal::UnorderedElementsAreArrayMatcher<T>
   3385 UnorderedElementsAreArray(const T (&array)[N]) {
   3386   return UnorderedElementsAreArray(array, N);
   3387 }
   3388 
   3389 template <typename T, typename A>
   3390 inline internal::UnorderedElementsAreArrayMatcher<T>
   3391 UnorderedElementsAreArray(const ::std::vector<T, A>& vec) {
   3392   return UnorderedElementsAreArray(vec.begin(), vec.end());
   3393 }
   3394 
   3395 #if GTEST_LANG_CXX11
   3396 template <typename T>
   3397 inline internal::UnorderedElementsAreArrayMatcher<T>
   3398 UnorderedElementsAreArray(::std::initializer_list<T> xs) {
   3399   return UnorderedElementsAreArray(xs.begin(), xs.end());
   3400 }
   3401 #endif
   3402 
   3403 // _ is a matcher that matches anything of any type.
   3404 //
   3405 // This definition is fine as:
   3406 //
   3407 //   1. The C++ standard permits using the name _ in a namespace that
   3408 //      is not the global namespace or ::std.
   3409 //   2. The AnythingMatcher class has no data member or constructor,
   3410 //      so it's OK to create global variables of this type.
   3411 //   3. c-style has approved of using _ in this case.
   3412 const internal::AnythingMatcher _ = {};
   3413 // Creates a matcher that matches any value of the given type T.
   3414 template <typename T>
   3415 inline Matcher<T> A() { return MakeMatcher(new internal::AnyMatcherImpl<T>()); }
   3416 
   3417 // Creates a matcher that matches any value of the given type T.
   3418 template <typename T>
   3419 inline Matcher<T> An() { return A<T>(); }
   3420 
   3421 // Creates a polymorphic matcher that matches anything equal to x.
   3422 // Note: if the parameter of Eq() were declared as const T&, Eq("foo")
   3423 // wouldn't compile.
   3424 template <typename T>
   3425 inline internal::EqMatcher<T> Eq(T x) { return internal::EqMatcher<T>(x); }
   3426 
   3427 // Constructs a Matcher<T> from a 'value' of type T.  The constructed
   3428 // matcher matches any value that's equal to 'value'.
   3429 template <typename T>
   3430 Matcher<T>::Matcher(T value) { *this = Eq(value); }
   3431 
   3432 // Creates a monomorphic matcher that matches anything with type Lhs
   3433 // and equal to rhs.  A user may need to use this instead of Eq(...)
   3434 // in order to resolve an overloading ambiguity.
   3435 //
   3436 // TypedEq<T>(x) is just a convenient short-hand for Matcher<T>(Eq(x))
   3437 // or Matcher<T>(x), but more readable than the latter.
   3438 //
   3439 // We could define similar monomorphic matchers for other comparison
   3440 // operations (e.g. TypedLt, TypedGe, and etc), but decided not to do
   3441 // it yet as those are used much less than Eq() in practice.  A user
   3442 // can always write Matcher<T>(Lt(5)) to be explicit about the type,
   3443 // for example.
   3444 template <typename Lhs, typename Rhs>
   3445 inline Matcher<Lhs> TypedEq(const Rhs& rhs) { return Eq(rhs); }
   3446 
   3447 // Creates a polymorphic matcher that matches anything >= x.
   3448 template <typename Rhs>
   3449 inline internal::GeMatcher<Rhs> Ge(Rhs x) {
   3450   return internal::GeMatcher<Rhs>(x);
   3451 }
   3452 
   3453 // Creates a polymorphic matcher that matches anything > x.
   3454 template <typename Rhs>
   3455 inline internal::GtMatcher<Rhs> Gt(Rhs x) {
   3456   return internal::GtMatcher<Rhs>(x);
   3457 }
   3458 
   3459 // Creates a polymorphic matcher that matches anything <= x.
   3460 template <typename Rhs>
   3461 inline internal::LeMatcher<Rhs> Le(Rhs x) {
   3462   return internal::LeMatcher<Rhs>(x);
   3463 }
   3464 
   3465 // Creates a polymorphic matcher that matches anything < x.
   3466 template <typename Rhs>
   3467 inline internal::LtMatcher<Rhs> Lt(Rhs x) {
   3468   return internal::LtMatcher<Rhs>(x);
   3469 }
   3470 
   3471 // Creates a polymorphic matcher that matches anything != x.
   3472 template <typename Rhs>
   3473 inline internal::NeMatcher<Rhs> Ne(Rhs x) {
   3474   return internal::NeMatcher<Rhs>(x);
   3475 }
   3476 
   3477 // Creates a polymorphic matcher that matches any NULL pointer.
   3478 inline PolymorphicMatcher<internal::IsNullMatcher > IsNull() {
   3479   return MakePolymorphicMatcher(internal::IsNullMatcher());
   3480 }
   3481 
   3482 // Creates a polymorphic matcher that matches any non-NULL pointer.
   3483 // This is convenient as Not(NULL) doesn't compile (the compiler
   3484 // thinks that that expression is comparing a pointer with an integer).
   3485 inline PolymorphicMatcher<internal::NotNullMatcher > NotNull() {
   3486   return MakePolymorphicMatcher(internal::NotNullMatcher());
   3487 }
   3488 
   3489 // Creates a polymorphic matcher that matches any argument that
   3490 // references variable x.
   3491 template <typename T>
   3492 inline internal::RefMatcher<T&> Ref(T& x) {  // NOLINT
   3493   return internal::RefMatcher<T&>(x);
   3494 }
   3495 
   3496 // Creates a matcher that matches any double argument approximately
   3497 // equal to rhs, where two NANs are considered unequal.
   3498 inline internal::FloatingEqMatcher<double> DoubleEq(double rhs) {
   3499   return internal::FloatingEqMatcher<double>(rhs, false);
   3500 }
   3501 
   3502 // Creates a matcher that matches any double argument approximately
   3503 // equal to rhs, including NaN values when rhs is NaN.
   3504 inline internal::FloatingEqMatcher<double> NanSensitiveDoubleEq(double rhs) {
   3505   return internal::FloatingEqMatcher<double>(rhs, true);
   3506 }
   3507 
   3508 // Creates a matcher that matches any double argument approximately equal to
   3509 // rhs, up to the specified max absolute error bound, where two NANs are
   3510 // considered unequal.  The max absolute error bound must be non-negative.
   3511 inline internal::FloatingEqMatcher<double> DoubleNear(
   3512     double rhs, double max_abs_error) {
   3513   return internal::FloatingEqMatcher<double>(rhs, false, max_abs_error);
   3514 }
   3515 
   3516 // Creates a matcher that matches any double argument approximately equal to
   3517 // rhs, up to the specified max absolute error bound, including NaN values when
   3518 // rhs is NaN.  The max absolute error bound must be non-negative.
   3519 inline internal::FloatingEqMatcher<double> NanSensitiveDoubleNear(
   3520     double rhs, double max_abs_error) {
   3521   return internal::FloatingEqMatcher<double>(rhs, true, max_abs_error);
   3522 }
   3523 
   3524 // Creates a matcher that matches any float argument approximately
   3525 // equal to rhs, where two NANs are considered unequal.
   3526 inline internal::FloatingEqMatcher<float> FloatEq(float rhs) {
   3527   return internal::FloatingEqMatcher<float>(rhs, false);
   3528 }
   3529 
   3530 // Creates a matcher that matches any float argument approximately
   3531 // equal to rhs, including NaN values when rhs is NaN.
   3532 inline internal::FloatingEqMatcher<float> NanSensitiveFloatEq(float rhs) {
   3533   return internal::FloatingEqMatcher<float>(rhs, true);
   3534 }
   3535 
   3536 // Creates a matcher that matches any float argument approximately equal to
   3537 // rhs, up to the specified max absolute error bound, where two NANs are
   3538 // considered unequal.  The max absolute error bound must be non-negative.
   3539 inline internal::FloatingEqMatcher<float> FloatNear(
   3540     float rhs, float max_abs_error) {
   3541   return internal::FloatingEqMatcher<float>(rhs, false, max_abs_error);
   3542 }
   3543 
   3544 // Creates a matcher that matches any float argument approximately equal to
   3545 // rhs, up to the specified max absolute error bound, including NaN values when
   3546 // rhs is NaN.  The max absolute error bound must be non-negative.
   3547 inline internal::FloatingEqMatcher<float> NanSensitiveFloatNear(
   3548     float rhs, float max_abs_error) {
   3549   return internal::FloatingEqMatcher<float>(rhs, true, max_abs_error);
   3550 }
   3551 
   3552 // Creates a matcher that matches a pointer (raw or smart) that points
   3553 // to a value that matches inner_matcher.
   3554 template <typename InnerMatcher>
   3555 inline internal::PointeeMatcher<InnerMatcher> Pointee(
   3556     const InnerMatcher& inner_matcher) {
   3557   return internal::PointeeMatcher<InnerMatcher>(inner_matcher);
   3558 }
   3559 
   3560 // Creates a matcher that matches an object whose given field matches
   3561 // 'matcher'.  For example,
   3562 //   Field(&Foo::number, Ge(5))
   3563 // matches a Foo object x iff x.number >= 5.
   3564 template <typename Class, typename FieldType, typename FieldMatcher>
   3565 inline PolymorphicMatcher<
   3566   internal::FieldMatcher<Class, FieldType> > Field(
   3567     FieldType Class::*field, const FieldMatcher& matcher) {
   3568   return MakePolymorphicMatcher(
   3569       internal::FieldMatcher<Class, FieldType>(
   3570           field, MatcherCast<const FieldType&>(matcher)));
   3571   // The call to MatcherCast() is required for supporting inner
   3572   // matchers of compatible types.  For example, it allows
   3573   //   Field(&Foo::bar, m)
   3574   // to compile where bar is an int32 and m is a matcher for int64.
   3575 }
   3576 
   3577 // Creates a matcher that matches an object whose given property
   3578 // matches 'matcher'.  For example,
   3579 //   Property(&Foo::str, StartsWith("hi"))
   3580 // matches a Foo object x iff x.str() starts with "hi".
   3581 template <typename Class, typename PropertyType, typename PropertyMatcher>
   3582 inline PolymorphicMatcher<
   3583   internal::PropertyMatcher<Class, PropertyType> > Property(
   3584     PropertyType (Class::*property)() const, const PropertyMatcher& matcher) {
   3585   return MakePolymorphicMatcher(
   3586       internal::PropertyMatcher<Class, PropertyType>(
   3587           property,
   3588           MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher)));
   3589   // The call to MatcherCast() is required for supporting inner
   3590   // matchers of compatible types.  For example, it allows
   3591   //   Property(&Foo::bar, m)
   3592   // to compile where bar() returns an int32 and m is a matcher for int64.
   3593 }
   3594 
   3595 // Creates a matcher that matches an object iff the result of applying
   3596 // a callable to x matches 'matcher'.
   3597 // For example,
   3598 //   ResultOf(f, StartsWith("hi"))
   3599 // matches a Foo object x iff f(x) starts with "hi".
   3600 // callable parameter can be a function, function pointer, or a functor.
   3601 // Callable has to satisfy the following conditions:
   3602 //   * It is required to keep no state affecting the results of
   3603 //     the calls on it and make no assumptions about how many calls
   3604 //     will be made. Any state it keeps must be protected from the
   3605 //     concurrent access.
   3606 //   * If it is a function object, it has to define type result_type.
   3607 //     We recommend deriving your functor classes from std::unary_function.
   3608 template <typename Callable, typename ResultOfMatcher>
   3609 internal::ResultOfMatcher<Callable> ResultOf(
   3610     Callable callable, const ResultOfMatcher& matcher) {
   3611   return internal::ResultOfMatcher<Callable>(
   3612           callable,
   3613           MatcherCast<typename internal::CallableTraits<Callable>::ResultType>(
   3614               matcher));
   3615   // The call to MatcherCast() is required for supporting inner
   3616   // matchers of compatible types.  For example, it allows
   3617   //   ResultOf(Function, m)
   3618   // to compile where Function() returns an int32 and m is a matcher for int64.
   3619 }
   3620 
   3621 // String matchers.
   3622 
   3623 // Matches a string equal to str.
   3624 inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> >
   3625     StrEq(const internal::string& str) {
   3626   return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>(
   3627       str, true, true));
   3628 }
   3629 
   3630 // Matches a string not equal to str.
   3631 inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> >
   3632     StrNe(const internal::string& str) {
   3633   return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>(
   3634       str, false, true));
   3635 }
   3636 
   3637 // Matches a string equal to str, ignoring case.
   3638 inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> >
   3639     StrCaseEq(const internal::string& str) {
   3640   return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>(
   3641       str, true, false));
   3642 }
   3643 
   3644 // Matches a string not equal to str, ignoring case.
   3645 inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::string> >
   3646     StrCaseNe(const internal::string& str) {
   3647   return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::string>(
   3648       str, false, false));
   3649 }
   3650 
   3651 // Creates a matcher that matches any string, std::string, or C string
   3652 // that contains the given substring.
   3653 inline PolymorphicMatcher<internal::HasSubstrMatcher<internal::string> >
   3654     HasSubstr(const internal::string& substring) {
   3655   return MakePolymorphicMatcher(internal::HasSubstrMatcher<internal::string>(
   3656       substring));
   3657 }
   3658 
   3659 // Matches a string that starts with 'prefix' (case-sensitive).
   3660 inline PolymorphicMatcher<internal::StartsWithMatcher<internal::string> >
   3661     StartsWith(const internal::string& prefix) {
   3662   return MakePolymorphicMatcher(internal::StartsWithMatcher<internal::string>(
   3663       prefix));
   3664 }
   3665 
   3666 // Matches a string that ends with 'suffix' (case-sensitive).
   3667 inline PolymorphicMatcher<internal::EndsWithMatcher<internal::string> >
   3668     EndsWith(const internal::string& suffix) {
   3669   return MakePolymorphicMatcher(internal::EndsWithMatcher<internal::string>(
   3670       suffix));
   3671 }
   3672 
   3673 // Matches a string that fully matches regular expression 'regex'.
   3674 // The matcher takes ownership of 'regex'.
   3675 inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(
   3676     const internal::RE* regex) {
   3677   return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true));
   3678 }
   3679 inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(
   3680     const internal::string& regex) {
   3681   return MatchesRegex(new internal::RE(regex));
   3682 }
   3683 
   3684 // Matches a string that contains regular expression 'regex'.
   3685 // The matcher takes ownership of 'regex'.
   3686 inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(
   3687     const internal::RE* regex) {
   3688   return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false));
   3689 }
   3690 inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(
   3691     const internal::string& regex) {
   3692   return ContainsRegex(new internal::RE(regex));
   3693 }
   3694 
   3695 #if GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING
   3696 // Wide string matchers.
   3697 
   3698 // Matches a string equal to str.
   3699 inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
   3700     StrEq(const internal::wstring& str) {
   3701   return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
   3702       str, true, true));
   3703 }
   3704 
   3705 // Matches a string not equal to str.
   3706 inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
   3707     StrNe(const internal::wstring& str) {
   3708   return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
   3709       str, false, true));
   3710 }
   3711 
   3712 // Matches a string equal to str, ignoring case.
   3713 inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
   3714     StrCaseEq(const internal::wstring& str) {
   3715   return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
   3716       str, true, false));
   3717 }
   3718 
   3719 // Matches a string not equal to str, ignoring case.
   3720 inline PolymorphicMatcher<internal::StrEqualityMatcher<internal::wstring> >
   3721     StrCaseNe(const internal::wstring& str) {
   3722   return MakePolymorphicMatcher(internal::StrEqualityMatcher<internal::wstring>(
   3723       str, false, false));
   3724 }
   3725 
   3726 // Creates a matcher that matches any wstring, std::wstring, or C wide string
   3727 // that contains the given substring.
   3728 inline PolymorphicMatcher<internal::HasSubstrMatcher<internal::wstring> >
   3729     HasSubstr(const internal::wstring& substring) {
   3730   return MakePolymorphicMatcher(internal::HasSubstrMatcher<internal::wstring>(
   3731       substring));
   3732 }
   3733 
   3734 // Matches a string that starts with 'prefix' (case-sensitive).
   3735 inline PolymorphicMatcher<internal::StartsWithMatcher<internal::wstring> >
   3736     StartsWith(const internal::wstring& prefix) {
   3737   return MakePolymorphicMatcher(internal::StartsWithMatcher<internal::wstring>(
   3738       prefix));
   3739 }
   3740 
   3741 // Matches a string that ends with 'suffix' (case-sensitive).
   3742 inline PolymorphicMatcher<internal::EndsWithMatcher<internal::wstring> >
   3743     EndsWith(const internal::wstring& suffix) {
   3744   return MakePolymorphicMatcher(internal::EndsWithMatcher<internal::wstring>(
   3745       suffix));
   3746 }
   3747 
   3748 #endif  // GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING
   3749 
   3750 // Creates a polymorphic matcher that matches a 2-tuple where the
   3751 // first field == the second field.
   3752 inline internal::Eq2Matcher Eq() { return internal::Eq2Matcher(); }
   3753 
   3754 // Creates a polymorphic matcher that matches a 2-tuple where the
   3755 // first field >= the second field.
   3756 inline internal::Ge2Matcher Ge() { return internal::Ge2Matcher(); }
   3757 
   3758 // Creates a polymorphic matcher that matches a 2-tuple where the
   3759 // first field > the second field.
   3760 inline internal::Gt2Matcher Gt() { return internal::Gt2Matcher(); }
   3761 
   3762 // Creates a polymorphic matcher that matches a 2-tuple where the
   3763 // first field <= the second field.
   3764 inline internal::Le2Matcher Le() { return internal::Le2Matcher(); }
   3765 
   3766 // Creates a polymorphic matcher that matches a 2-tuple where the
   3767 // first field < the second field.
   3768 inline internal::Lt2Matcher Lt() { return internal::Lt2Matcher(); }
   3769 
   3770 // Creates a polymorphic matcher that matches a 2-tuple where the
   3771 // first field != the second field.
   3772 inline internal::Ne2Matcher Ne() { return internal::Ne2Matcher(); }
   3773 
   3774 // Creates a matcher that matches any value of type T that m doesn't
   3775 // match.
   3776 template <typename InnerMatcher>
   3777 inline internal::NotMatcher<InnerMatcher> Not(InnerMatcher m) {
   3778   return internal::NotMatcher<InnerMatcher>(m);
   3779 }
   3780 
   3781 // Returns a matcher that matches anything that satisfies the given
   3782 // predicate.  The predicate can be any unary function or functor
   3783 // whose return type can be implicitly converted to bool.
   3784 template <typename Predicate>
   3785 inline PolymorphicMatcher<internal::TrulyMatcher<Predicate> >
   3786 Truly(Predicate pred) {
   3787   return MakePolymorphicMatcher(internal::TrulyMatcher<Predicate>(pred));
   3788 }
   3789 
   3790 // Returns a matcher that matches the container size. The container must
   3791 // support both size() and size_type which all STL-like containers provide.
   3792 // Note that the parameter 'size' can be a value of type size_type as well as
   3793 // matcher. For instance:
   3794 //   EXPECT_THAT(container, SizeIs(2));     // Checks container has 2 elements.
   3795 //   EXPECT_THAT(container, SizeIs(Le(2));  // Checks container has at most 2.
   3796 template <typename SizeMatcher>
   3797 inline internal::SizeIsMatcher<SizeMatcher>
   3798 SizeIs(const SizeMatcher& size_matcher) {
   3799   return internal::SizeIsMatcher<SizeMatcher>(size_matcher);
   3800 }
   3801 
   3802 // Returns a matcher that matches an equal container.
   3803 // This matcher behaves like Eq(), but in the event of mismatch lists the
   3804 // values that are included in one container but not the other. (Duplicate
   3805 // values and order differences are not explained.)
   3806 template <typename Container>
   3807 inline PolymorphicMatcher<internal::ContainerEqMatcher<  // NOLINT
   3808                             GTEST_REMOVE_CONST_(Container)> >
   3809     ContainerEq(const Container& rhs) {
   3810   // This following line is for working around a bug in MSVC 8.0,
   3811   // which causes Container to be a const type sometimes.
   3812   typedef GTEST_REMOVE_CONST_(Container) RawContainer;
   3813   return MakePolymorphicMatcher(
   3814       internal::ContainerEqMatcher<RawContainer>(rhs));
   3815 }
   3816 
   3817 // Returns a matcher that matches a container that, when sorted using
   3818 // the given comparator, matches container_matcher.
   3819 template <typename Comparator, typename ContainerMatcher>
   3820 inline internal::WhenSortedByMatcher<Comparator, ContainerMatcher>
   3821 WhenSortedBy(const Comparator& comparator,
   3822              const ContainerMatcher& container_matcher) {
   3823   return internal::WhenSortedByMatcher<Comparator, ContainerMatcher>(
   3824       comparator, container_matcher);
   3825 }
   3826 
   3827 // Returns a matcher that matches a container that, when sorted using
   3828 // the < operator, matches container_matcher.
   3829 template <typename ContainerMatcher>
   3830 inline internal::WhenSortedByMatcher<internal::LessComparator, ContainerMatcher>
   3831 WhenSorted(const ContainerMatcher& container_matcher) {
   3832   return
   3833       internal::WhenSortedByMatcher<internal::LessComparator, ContainerMatcher>(
   3834           internal::LessComparator(), container_matcher);
   3835 }
   3836 
   3837 // Matches an STL-style container or a native array that contains the
   3838 // same number of elements as in rhs, where its i-th element and rhs's
   3839 // i-th element (as a pair) satisfy the given pair matcher, for all i.
   3840 // TupleMatcher must be able to be safely cast to Matcher<tuple<const
   3841 // T1&, const T2&> >, where T1 and T2 are the types of elements in the
   3842 // LHS container and the RHS container respectively.
   3843 template <typename TupleMatcher, typename Container>
   3844 inline internal::PointwiseMatcher<TupleMatcher,
   3845                                   GTEST_REMOVE_CONST_(Container)>
   3846 Pointwise(const TupleMatcher& tuple_matcher, const Container& rhs) {
   3847   // This following line is for working around a bug in MSVC 8.0,
   3848   // which causes Container to be a const type sometimes.
   3849   typedef GTEST_REMOVE_CONST_(Container) RawContainer;
   3850   return internal::PointwiseMatcher<TupleMatcher, RawContainer>(
   3851       tuple_matcher, rhs);
   3852 }
   3853 
   3854 // Matches an STL-style container or a native array that contains at
   3855 // least one element matching the given value or matcher.
   3856 //
   3857 // Examples:
   3858 //   ::std::set<int> page_ids;
   3859 //   page_ids.insert(3);
   3860 //   page_ids.insert(1);
   3861 //   EXPECT_THAT(page_ids, Contains(1));
   3862 //   EXPECT_THAT(page_ids, Contains(Gt(2)));
   3863 //   EXPECT_THAT(page_ids, Not(Contains(4)));
   3864 //
   3865 //   ::std::map<int, size_t> page_lengths;
   3866 //   page_lengths[1] = 100;
   3867 //   EXPECT_THAT(page_lengths,
   3868 //               Contains(::std::pair<const int, size_t>(1, 100)));
   3869 //
   3870 //   const char* user_ids[] = { "joe", "mike", "tom" };
   3871 //   EXPECT_THAT(user_ids, Contains(Eq(::std::string("tom"))));
   3872 template <typename M>
   3873 inline internal::ContainsMatcher<M> Contains(M matcher) {
   3874   return internal::ContainsMatcher<M>(matcher);
   3875 }
   3876 
   3877 // Matches an STL-style container or a native array that contains only
   3878 // elements matching the given value or matcher.
   3879 //
   3880 // Each(m) is semantically equivalent to Not(Contains(Not(m))). Only
   3881 // the messages are different.
   3882 //
   3883 // Examples:
   3884 //   ::std::set<int> page_ids;
   3885 //   // Each(m) matches an empty container, regardless of what m is.
   3886 //   EXPECT_THAT(page_ids, Each(Eq(1)));
   3887 //   EXPECT_THAT(page_ids, Each(Eq(77)));
   3888 //
   3889 //   page_ids.insert(3);
   3890 //   EXPECT_THAT(page_ids, Each(Gt(0)));
   3891 //   EXPECT_THAT(page_ids, Not(Each(Gt(4))));
   3892 //   page_ids.insert(1);
   3893 //   EXPECT_THAT(page_ids, Not(Each(Lt(2))));
   3894 //
   3895 //   ::std::map<int, size_t> page_lengths;
   3896 //   page_lengths[1] = 100;
   3897 //   page_lengths[2] = 200;
   3898 //   page_lengths[3] = 300;
   3899 //   EXPECT_THAT(page_lengths, Not(Each(Pair(1, 100))));
   3900 //   EXPECT_THAT(page_lengths, Each(Key(Le(3))));
   3901 //
   3902 //   const char* user_ids[] = { "joe", "mike", "tom" };
   3903 //   EXPECT_THAT(user_ids, Not(Each(Eq(::std::string("tom")))));
   3904 template <typename M>
   3905 inline internal::EachMatcher<M> Each(M matcher) {
   3906   return internal::EachMatcher<M>(matcher);
   3907 }
   3908 
   3909 // Key(inner_matcher) matches an std::pair whose 'first' field matches
   3910 // inner_matcher.  For example, Contains(Key(Ge(5))) can be used to match an
   3911 // std::map that contains at least one element whose key is >= 5.
   3912 template <typename M>
   3913 inline internal::KeyMatcher<M> Key(M inner_matcher) {
   3914   return internal::KeyMatcher<M>(inner_matcher);
   3915 }
   3916 
   3917 // Pair(first_matcher, second_matcher) matches a std::pair whose 'first' field
   3918 // matches first_matcher and whose 'second' field matches second_matcher.  For
   3919 // example, EXPECT_THAT(map_type, ElementsAre(Pair(Ge(5), "foo"))) can be used
   3920 // to match a std::map<int, string> that contains exactly one element whose key
   3921 // is >= 5 and whose value equals "foo".
   3922 template <typename FirstMatcher, typename SecondMatcher>
   3923 inline internal::PairMatcher<FirstMatcher, SecondMatcher>
   3924 Pair(FirstMatcher first_matcher, SecondMatcher second_matcher) {
   3925   return internal::PairMatcher<FirstMatcher, SecondMatcher>(
   3926       first_matcher, second_matcher);
   3927 }
   3928 
   3929 // Returns a predicate that is satisfied by anything that matches the
   3930 // given matcher.
   3931 template <typename M>
   3932 inline internal::MatcherAsPredicate<M> Matches(M matcher) {
   3933   return internal::MatcherAsPredicate<M>(matcher);
   3934 }
   3935 
   3936 // Returns true iff the value matches the matcher.
   3937 template <typename T, typename M>
   3938 inline bool Value(const T& value, M matcher) {
   3939   return testing::Matches(matcher)(value);
   3940 }
   3941 
   3942 // Matches the value against the given matcher and explains the match
   3943 // result to listener.
   3944 template <typename T, typename M>
   3945 inline bool ExplainMatchResult(
   3946     M matcher, const T& value, MatchResultListener* listener) {
   3947   return SafeMatcherCast<const T&>(matcher).MatchAndExplain(value, listener);
   3948 }
   3949 
   3950 #if GTEST_LANG_CXX11
   3951 // Define variadic matcher versions. They are overloaded in
   3952 // gmock-generated-matchers.h for the cases supported by pre C++11 compilers.
   3953 template <typename... Args>
   3954 inline internal::AllOfMatcher<Args...> AllOf(const Args&... matchers) {
   3955   return internal::AllOfMatcher<Args...>(matchers...);
   3956 }
   3957 
   3958 template <typename... Args>
   3959 inline internal::AnyOfMatcher<Args...> AnyOf(const Args&... matchers) {
   3960   return internal::AnyOfMatcher<Args...>(matchers...);
   3961 }
   3962 
   3963 #endif  // GTEST_LANG_CXX11
   3964 
   3965 // AllArgs(m) is a synonym of m.  This is useful in
   3966 //
   3967 //   EXPECT_CALL(foo, Bar(_, _)).With(AllArgs(Eq()));
   3968 //
   3969 // which is easier to read than
   3970 //
   3971 //   EXPECT_CALL(foo, Bar(_, _)).With(Eq());
   3972 template <typename InnerMatcher>
   3973 inline InnerMatcher AllArgs(const InnerMatcher& matcher) { return matcher; }
   3974 
   3975 // These macros allow using matchers to check values in Google Test
   3976 // tests.  ASSERT_THAT(value, matcher) and EXPECT_THAT(value, matcher)
   3977 // succeed iff the value matches the matcher.  If the assertion fails,
   3978 // the value and the description of the matcher will be printed.
   3979 #define ASSERT_THAT(value, matcher) ASSERT_PRED_FORMAT1(\
   3980     ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)
   3981 #define EXPECT_THAT(value, matcher) EXPECT_PRED_FORMAT1(\
   3982     ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)
   3983 
   3984 }  // namespace testing
   3985 
   3986 #endif  // GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_
   3987