Googletest export
Introduce a new `Address` matcher to gmock. PiperOrigin-RevId: 346344591
This commit is contained in:
		@@ -2833,6 +2833,49 @@ class KeyMatcher {
 | 
			
		||||
  const M matcher_for_key_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Implements polymorphic Address(matcher_for_address).
 | 
			
		||||
template <typename InnerMatcher>
 | 
			
		||||
class AddressMatcher {
 | 
			
		||||
 public:
 | 
			
		||||
  explicit AddressMatcher(InnerMatcher m) : matcher_(m) {}
 | 
			
		||||
 | 
			
		||||
  template <typename Type>
 | 
			
		||||
  operator Matcher<Type>() const {  // NOLINT
 | 
			
		||||
    return Matcher<Type>(new Impl<const Type&>(matcher_));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  // The monomorphic implementation that works for a particular object type.
 | 
			
		||||
  template <typename Type>
 | 
			
		||||
  class Impl : public MatcherInterface<Type> {
 | 
			
		||||
   public:
 | 
			
		||||
    using Address = const GTEST_REMOVE_REFERENCE_AND_CONST_(Type) *;
 | 
			
		||||
    explicit Impl(const InnerMatcher& matcher)
 | 
			
		||||
        : matcher_(MatcherCast<Address>(matcher)) {}
 | 
			
		||||
 | 
			
		||||
    void DescribeTo(::std::ostream* os) const override {
 | 
			
		||||
      *os << "has address that ";
 | 
			
		||||
      matcher_.DescribeTo(os);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void DescribeNegationTo(::std::ostream* os) const override {
 | 
			
		||||
      *os << "does not have address that ";
 | 
			
		||||
      matcher_.DescribeTo(os);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool MatchAndExplain(Type object,
 | 
			
		||||
                         MatchResultListener* listener) const override {
 | 
			
		||||
      *listener << "which has address ";
 | 
			
		||||
      Address address = std::addressof(object);
 | 
			
		||||
      return MatchPrintAndExplain(address, matcher_, listener);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
   private:
 | 
			
		||||
    const Matcher<Address> matcher_;
 | 
			
		||||
  };
 | 
			
		||||
  const InnerMatcher matcher_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Implements Pair(first_matcher, second_matcher) for the given argument pair
 | 
			
		||||
// type with its two matchers. See Pair() function below.
 | 
			
		||||
template <typename PairType>
 | 
			
		||||
@@ -4787,6 +4830,14 @@ inline internal::PointerMatcher<InnerMatcher> Pointer(
 | 
			
		||||
    const InnerMatcher& inner_matcher) {
 | 
			
		||||
  return internal::PointerMatcher<InnerMatcher>(inner_matcher);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Creates a matcher that matches an object that has an address that matches
 | 
			
		||||
// inner_matcher.
 | 
			
		||||
template <typename InnerMatcher>
 | 
			
		||||
inline internal::AddressMatcher<InnerMatcher> Address(
 | 
			
		||||
    const InnerMatcher& inner_matcher) {
 | 
			
		||||
  return internal::AddressMatcher<InnerMatcher>(inner_matcher);
 | 
			
		||||
}
 | 
			
		||||
}  // namespace no_adl
 | 
			
		||||
 | 
			
		||||
// Returns a predicate that is satisfied by anything that matches the
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user