Googletest export
Add support for ref qualifiers in MOCK_METHOD. PiperOrigin-RevId: 341047839
This commit is contained in:
		@@ -48,15 +48,21 @@ namespace internal {
 | 
			
		||||
template <typename T>
 | 
			
		||||
using identity_t = T;
 | 
			
		||||
 | 
			
		||||
template <typename MockType>
 | 
			
		||||
const MockType* AdjustConstness_const(const MockType* mock) {
 | 
			
		||||
  return mock;
 | 
			
		||||
}
 | 
			
		||||
template <typename Pattern>
 | 
			
		||||
struct ThisRefAdjuster {
 | 
			
		||||
  template <typename T>
 | 
			
		||||
  using AdjustT = typename std::conditional<
 | 
			
		||||
      std::is_const<typename std::remove_reference<Pattern>::type>::value,
 | 
			
		||||
      typename std::conditional<std::is_lvalue_reference<Pattern>::value,
 | 
			
		||||
                                const T&, const T&&>::type,
 | 
			
		||||
      typename std::conditional<std::is_lvalue_reference<Pattern>::value, T&,
 | 
			
		||||
                                T&&>::type>::type;
 | 
			
		||||
 | 
			
		||||
template <typename MockType>
 | 
			
		||||
MockType* AdjustConstness_(const MockType* mock) {
 | 
			
		||||
  return const_cast<MockType*>(mock);
 | 
			
		||||
}
 | 
			
		||||
  template <typename MockType>
 | 
			
		||||
  static AdjustT<MockType> Adjust(const MockType& mock) {
 | 
			
		||||
    return static_cast<AdjustT<MockType>>(const_cast<MockType&>(mock));
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}  // namespace internal
 | 
			
		||||
 | 
			
		||||
@@ -80,17 +86,17 @@ using internal::FunctionMocker;
 | 
			
		||||
#define GMOCK_INTERNAL_MOCK_METHOD_ARG_3(_Ret, _MethodName, _Args) \
 | 
			
		||||
  GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, ())
 | 
			
		||||
 | 
			
		||||
#define GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, _Spec)  \
 | 
			
		||||
  GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Args);                                \
 | 
			
		||||
  GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Spec);                                \
 | 
			
		||||
  GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE(                                   \
 | 
			
		||||
      GMOCK_PP_NARG0 _Args, GMOCK_INTERNAL_SIGNATURE(_Ret, _Args));        \
 | 
			
		||||
  GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec)                                  \
 | 
			
		||||
  GMOCK_INTERNAL_MOCK_METHOD_IMPL(                                         \
 | 
			
		||||
      GMOCK_PP_NARG0 _Args, _MethodName, GMOCK_INTERNAL_HAS_CONST(_Spec),  \
 | 
			
		||||
      GMOCK_INTERNAL_HAS_OVERRIDE(_Spec), GMOCK_INTERNAL_HAS_FINAL(_Spec), \
 | 
			
		||||
      GMOCK_INTERNAL_GET_NOEXCEPT_SPEC(_Spec),                             \
 | 
			
		||||
      GMOCK_INTERNAL_GET_CALLTYPE(_Spec),                                  \
 | 
			
		||||
#define GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, _Spec)     \
 | 
			
		||||
  GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Args);                                   \
 | 
			
		||||
  GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Spec);                                   \
 | 
			
		||||
  GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE(                                      \
 | 
			
		||||
      GMOCK_PP_NARG0 _Args, GMOCK_INTERNAL_SIGNATURE(_Ret, _Args));           \
 | 
			
		||||
  GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec)                                     \
 | 
			
		||||
  GMOCK_INTERNAL_MOCK_METHOD_IMPL(                                            \
 | 
			
		||||
      GMOCK_PP_NARG0 _Args, _MethodName, GMOCK_INTERNAL_HAS_CONST(_Spec),     \
 | 
			
		||||
      GMOCK_INTERNAL_HAS_OVERRIDE(_Spec), GMOCK_INTERNAL_HAS_FINAL(_Spec),    \
 | 
			
		||||
      GMOCK_INTERNAL_GET_NOEXCEPT_SPEC(_Spec),                                \
 | 
			
		||||
      GMOCK_INTERNAL_GET_CALLTYPE(_Spec), GMOCK_INTERNAL_GET_REF_SPEC(_Spec), \
 | 
			
		||||
      (GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)))
 | 
			
		||||
 | 
			
		||||
#define GMOCK_INTERNAL_MOCK_METHOD_ARG_5(...) \
 | 
			
		||||
@@ -131,12 +137,12 @@ using internal::FunctionMocker;
 | 
			
		||||
 | 
			
		||||
#define GMOCK_INTERNAL_MOCK_METHOD_IMPL(_N, _MethodName, _Constness,           \
 | 
			
		||||
                                        _Override, _Final, _NoexceptSpec,      \
 | 
			
		||||
                                        _CallType, _Signature)                 \
 | 
			
		||||
                                        _CallType, _RefSpec, _Signature)       \
 | 
			
		||||
  typename ::testing::internal::Function<GMOCK_PP_REMOVE_PARENS(               \
 | 
			
		||||
      _Signature)>::Result                                                     \
 | 
			
		||||
  GMOCK_INTERNAL_EXPAND(_CallType)                                             \
 | 
			
		||||
      _MethodName(GMOCK_PP_REPEAT(GMOCK_INTERNAL_PARAMETER, _Signature, _N))   \
 | 
			
		||||
          GMOCK_PP_IF(_Constness, const, ) _NoexceptSpec                       \
 | 
			
		||||
          GMOCK_PP_IF(_Constness, const, ) _RefSpec _NoexceptSpec              \
 | 
			
		||||
          GMOCK_PP_IF(_Override, override, ) GMOCK_PP_IF(_Final, final, ) {    \
 | 
			
		||||
    GMOCK_MOCKER_(_N, _Constness, _MethodName)                                 \
 | 
			
		||||
        .SetOwnerAndName(this, #_MethodName);                                  \
 | 
			
		||||
@@ -145,7 +151,7 @@ using internal::FunctionMocker;
 | 
			
		||||
  }                                                                            \
 | 
			
		||||
  ::testing::MockSpec<GMOCK_PP_REMOVE_PARENS(_Signature)> gmock_##_MethodName( \
 | 
			
		||||
      GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_PARAMETER, _Signature, _N))       \
 | 
			
		||||
      GMOCK_PP_IF(_Constness, const, ) {                                       \
 | 
			
		||||
      GMOCK_PP_IF(_Constness, const, ) _RefSpec {                              \
 | 
			
		||||
    GMOCK_MOCKER_(_N, _Constness, _MethodName).RegisterOwner(this);            \
 | 
			
		||||
    return GMOCK_MOCKER_(_N, _Constness, _MethodName)                          \
 | 
			
		||||
        .With(GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_ARGUMENT, , _N));         \
 | 
			
		||||
@@ -153,10 +159,10 @@ using internal::FunctionMocker;
 | 
			
		||||
  ::testing::MockSpec<GMOCK_PP_REMOVE_PARENS(_Signature)> gmock_##_MethodName( \
 | 
			
		||||
      const ::testing::internal::WithoutMatchers&,                             \
 | 
			
		||||
      GMOCK_PP_IF(_Constness, const, )::testing::internal::Function<           \
 | 
			
		||||
          GMOCK_PP_REMOVE_PARENS(_Signature)>*) const _NoexceptSpec {          \
 | 
			
		||||
    return GMOCK_PP_CAT(::testing::internal::AdjustConstness_,                 \
 | 
			
		||||
                        GMOCK_PP_IF(_Constness, const, ))(this)                \
 | 
			
		||||
        ->gmock_##_MethodName(GMOCK_PP_REPEAT(                                 \
 | 
			
		||||
          GMOCK_PP_REMOVE_PARENS(_Signature)>*) const _RefSpec _NoexceptSpec { \
 | 
			
		||||
    return ::testing::internal::ThisRefAdjuster<GMOCK_PP_IF(                   \
 | 
			
		||||
        _Constness, const, ) int _RefSpec>::Adjust(*this)                      \
 | 
			
		||||
        .gmock_##_MethodName(GMOCK_PP_REPEAT(                                  \
 | 
			
		||||
            GMOCK_INTERNAL_A_MATCHER_ARGUMENT, _Signature, _N));               \
 | 
			
		||||
  }                                                                            \
 | 
			
		||||
  mutable ::testing::FunctionMocker<GMOCK_PP_REMOVE_PARENS(_Signature)>        \
 | 
			
		||||
@@ -183,6 +189,13 @@ using internal::FunctionMocker;
 | 
			
		||||
      GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem)), \
 | 
			
		||||
      _elem, )
 | 
			
		||||
 | 
			
		||||
#define GMOCK_INTERNAL_GET_REF_SPEC(_Tuple) \
 | 
			
		||||
  GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_REF_SPEC_IF_REF, ~, _Tuple)
 | 
			
		||||
 | 
			
		||||
#define GMOCK_INTERNAL_REF_SPEC_IF_REF(_i, _, _elem)                       \
 | 
			
		||||
  GMOCK_PP_IF(GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_REF(_i, _, _elem)), \
 | 
			
		||||
              GMOCK_PP_CAT(GMOCK_INTERNAL_UNPACK_, _elem), )
 | 
			
		||||
 | 
			
		||||
#define GMOCK_INTERNAL_GET_CALLTYPE(_Tuple) \
 | 
			
		||||
  GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_GET_CALLTYPE_IMPL, ~, _Tuple)
 | 
			
		||||
 | 
			
		||||
@@ -192,6 +205,7 @@ using internal::FunctionMocker;
 | 
			
		||||
       GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_OVERRIDE(_i, _, _elem)) + \
 | 
			
		||||
       GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_FINAL(_i, _, _elem)) +    \
 | 
			
		||||
       GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem)) + \
 | 
			
		||||
       GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_REF(_i, _, _elem)) +      \
 | 
			
		||||
       GMOCK_INTERNAL_IS_CALLTYPE(_elem)) == 1,                           \
 | 
			
		||||
      GMOCK_PP_STRINGIZE(                                                 \
 | 
			
		||||
          _elem) " cannot be recognized as a valid specification modifier.");
 | 
			
		||||
@@ -217,6 +231,13 @@ using internal::FunctionMocker;
 | 
			
		||||
 | 
			
		||||
#define GMOCK_INTERNAL_DETECT_NOEXCEPT_I_noexcept ,
 | 
			
		||||
 | 
			
		||||
#define GMOCK_INTERNAL_DETECT_REF(_i, _, _elem) \
 | 
			
		||||
  GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_REF_I_, _elem)
 | 
			
		||||
 | 
			
		||||
#define GMOCK_INTERNAL_DETECT_REF_I_ref ,
 | 
			
		||||
 | 
			
		||||
#define GMOCK_INTERNAL_UNPACK_ref(x) x
 | 
			
		||||
 | 
			
		||||
#define GMOCK_INTERNAL_GET_CALLTYPE_IMPL(_i, _, _elem)           \
 | 
			
		||||
  GMOCK_PP_IF(GMOCK_INTERNAL_IS_CALLTYPE(_elem),                 \
 | 
			
		||||
              GMOCK_INTERNAL_GET_VALUE_CALLTYPE, GMOCK_PP_EMPTY) \
 | 
			
		||||
@@ -449,7 +470,7 @@ using internal::FunctionMocker;
 | 
			
		||||
  GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE(                                  \
 | 
			
		||||
      args_num, ::testing::internal::identity_t<__VA_ARGS__>);            \
 | 
			
		||||
  GMOCK_INTERNAL_MOCK_METHOD_IMPL(                                        \
 | 
			
		||||
      args_num, Method, GMOCK_PP_NARG0(constness), 0, 0, , ct,            \
 | 
			
		||||
      args_num, Method, GMOCK_PP_NARG0(constness), 0, 0, , ct, ,          \
 | 
			
		||||
      (::testing::internal::identity_t<__VA_ARGS__>))
 | 
			
		||||
 | 
			
		||||
#define GMOCK_MOCKER_(arity, constness, Method) \
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user