From 87061810f4c744cdc1abb8f1cd98970a986eea75 Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Fri, 24 Jan 2020 14:09:22 -0500 Subject: Googletest export Move part of functionality of Matcher* class to the base one. Reduce copypaste. Make constructor and conversion operator of Matcher* class independent of pump. PiperOrigin-RevId: 291405510 --- .../include/gmock/gmock-generated-matchers.h | 264 ++++++--------------- .../include/gmock/gmock-generated-matchers.h.pump | 14 +- googlemock/include/gmock/gmock-matchers.h | 52 ++++ 3 files changed, 122 insertions(+), 208 deletions(-) (limited to 'googlemock') diff --git a/googlemock/include/gmock/gmock-generated-matchers.h b/googlemock/include/gmock/gmock-generated-matchers.h index 61892380..4234b267 100644 --- a/googlemock/include/gmock/gmock-generated-matchers.h +++ b/googlemock/include/gmock/gmock-generated-matchers.h @@ -261,8 +261,12 @@ // https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md #define MATCHER(name, description)\ - class name##Matcher {\ + class name##Matcher : public \ + ::testing::internal::MatcherBaseImpl {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -290,14 +294,6 @@ ::std::tuple<>()));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl());\ - }\ - name##Matcher() {\ - }\ - private:\ };\ inline name##Matcher name() {\ return name##Matcher();\ @@ -310,8 +306,12 @@ #define MATCHER_P(name, p0, description)\ template \ - class name##MatcherP {\ + class name##MatcherP : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -340,15 +340,6 @@ ::std::tuple(p0)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0));\ - }\ - explicit name##MatcherP(p0##_type gmock_p0) : p0(::std::move(gmock_p0)) {\ - }\ - p0##_type const p0;\ - private:\ };\ template \ inline name##MatcherP name(p0##_type p0) {\ @@ -363,8 +354,13 @@ #define MATCHER_P2(name, p0, p1, description)\ template \ - class name##MatcherP2 {\ + class name##MatcherP2 : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -394,18 +390,6 @@ ::std::tuple(p0, p1)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1));\ - }\ - name##MatcherP2(p0##_type gmock_p0, \ - p1##_type gmock_p1) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - private:\ };\ template \ inline name##MatcherP2 name(p0##_type p0, \ @@ -422,8 +406,13 @@ #define MATCHER_P3(name, p0, p1, p2, description)\ template \ - class name##MatcherP3 {\ + class name##MatcherP3 : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -455,19 +444,6 @@ ::std::tuple(p0, p1, p2)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2));\ - }\ - name##MatcherP3(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - private:\ };\ template \ inline name##MatcherP3 name(p0##_type p0, \ @@ -485,8 +461,13 @@ #define MATCHER_P4(name, p0, p1, p2, p3, description)\ template \ - class name##MatcherP4 {\ + class name##MatcherP4 : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -521,21 +502,6 @@ p1, p2, p3)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3));\ - }\ - name##MatcherP4(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - private:\ };\ template \ @@ -557,8 +523,13 @@ #define MATCHER_P5(name, p0, p1, p2, p3, p4, description)\ template \ - class name##MatcherP5 {\ + class name##MatcherP5 : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -595,23 +566,6 @@ p4##_type>(p0, p1, p2, p3, p4)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3, p4));\ - }\ - name##MatcherP5(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, \ - p4##_type gmock_p4) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - private:\ };\ template \ @@ -633,8 +587,13 @@ #define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description)\ template \ - class name##MatcherP6 {\ + class name##MatcherP6 : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -672,25 +631,6 @@ p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3, p4, p5));\ - }\ - name##MatcherP6(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - private:\ };\ template \ @@ -713,8 +653,13 @@ template \ - class name##MatcherP7 {\ + class name##MatcherP7 : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -756,26 +701,6 @@ p6)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3, p4, p5, p6));\ - }\ - name##MatcherP7(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5, p6##_type gmock_p6) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - p6##_type const p6;\ - private:\ };\ template \ - class name##MatcherP8 {\ + class name##MatcherP8 : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -845,29 +776,6 @@ p3, p4, p5, p6, p7)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3, p4, p5, p6, p7));\ - }\ - name##MatcherP8(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5, p6##_type gmock_p6, \ - p7##_type gmock_p7) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \ - p7(::std::move(gmock_p7)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - p6##_type const p6;\ - p7##_type const p7;\ - private:\ };\ template \ - class name##MatcherP9 {\ + class name##MatcherP9 : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -941,30 +855,6 @@ p8##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3, p4, p5, p6, p7, p8));\ - }\ - name##MatcherP9(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ - p8##_type gmock_p8) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \ - p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - p6##_type const p6;\ - p7##_type const p7;\ - p8##_type const p8;\ - private:\ };\ template \ - class name##MatcherP10 {\ + class name##MatcherP10 : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -1042,32 +938,6 @@ p9##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9));\ - }\ - name##MatcherP10(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ - p8##_type gmock_p8, p9##_type gmock_p9) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \ - p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8)), \ - p9(::std::move(gmock_p9)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - p6##_type const p6;\ - p7##_type const p7;\ - p8##_type const p8;\ - p9##_type const p9;\ - private:\ };\ template \ ]]]] -$var ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]] $var impl_ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]] $var impl_inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(::std::move(gmock_p$j))]]]]]] -$var inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(::std::move(gmock_p$j))]]]]]] $var params = [[$for j, [[p$j]]]] $var param_types = [[$if i==0 [[]] $else [[<$for j, [[p$j##_type]]>]]]] $var param_types_and_names = [[$for j, [[p$j##_type p$j]]]] @@ -294,8 +292,10 @@ $var param_field_decls2 = [[$for j ]]]] #define $macro_name(name$for j [[, p$j]], description)\$template - class $class_name {\ + class $class_name : public ::testing::internal::MatcherBaseImpl<$class_name$param_types> {\ + using __internal_base_type = ::testing::internal::MatcherBaseImpl<$class_name>;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -323,14 +323,6 @@ $var param_field_decls2 = [[$for j ::std::tuple<$for j, [[p$j##_type]]>($for j, [[p$j]])));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl($params));\ - }\ - [[$if i==1 [[explicit ]]]]$class_name($ctor_param_list)$inits {\ - }\$param_field_decls2 - private:\ };\$template inline $class_name$param_types name($param_types_and_names) {\ return $class_name$param_types($params);\ diff --git a/googlemock/include/gmock/gmock-matchers.h b/googlemock/include/gmock/gmock-matchers.h index 4baeb1bd..f1805dbb 100644 --- a/googlemock/include/gmock/gmock-matchers.h +++ b/googlemock/include/gmock/gmock-matchers.h @@ -236,6 +236,58 @@ class MatcherCastImpl > { static Matcher Cast(const Matcher& matcher) { return matcher; } }; +// Template specialization for parameterless Matcher. +template +class MatcherBaseImpl { + public: + MatcherBaseImpl() = default; + + template + operator ::testing::Matcher() const { // NOLINT(runtime/explicit) + return ::testing::Matcher(new + typename Derived::template gmock_Impl()); + } +}; + +// Template specialization for Matcher with 1 parameter. +template