github.com/jlmucb/cloudproxy@v0.0.0-20170830161738-b5aa0b619bc4/src/third_party/googlemock/include/gmock/gmock-matchers.h (about)

     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@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@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_