yaml-cpp

FORK: A YAML parser and emitter in C++
git clone https://git.neptards.moe/neptards/yaml-cpp.git
Log | Files | Refs | README | LICENSE

gmock-matchers.h (166045B)


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