diff options
author | Abseil Team <absl-team@google.com> | 2020-01-24 19:09:22 (GMT) |
---|---|---|
committer | Xiaoyi Zhang <zhangxy@google.com> | 2020-01-24 20:30:34 (GMT) |
commit | 32e31b833a1af8e968a17aced7888a0c7a2f0232 (patch) | |
tree | 1c1c1cd9c86bfef54a7f9a5406ce1bb3377ecd68 /googlemock | |
parent | 763d979913a9a602899d8da711398ef6e1b3b78a (diff) | |
download | googletest-8EA412EE54E54CAC6E49EE3B7C209DA1.zip googletest-8EA412EE54E54CAC6E49EE3B7C209DA1.tar.gz googletest-8EA412EE54E54CAC6E49EE3B7C209DA1.tar.bz2 |
Export Test - Do Not Mergerefs/pull/2684/head8EA412EE54E54CAC6E49EE3B7C209DA1
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
Diffstat (limited to 'googlemock')
-rw-r--r-- | googlemock/include/gmock/gmock-generated-matchers.h | 264 | ||||
-rw-r--r-- | googlemock/include/gmock/gmock-generated-matchers.h.pump | 14 | ||||
-rw-r--r-- | googlemock/include/gmock/gmock-matchers.h | 52 |
3 files changed, 122 insertions, 208 deletions
diff --git a/googlemock/include/gmock/gmock-generated-matchers.h b/googlemock/include/gmock/gmock-generated-matchers.h index 6189238..4234b26 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<name##Matcher> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl<name##Matcher>;\ public:\ + using __internal_base_type::__internal_base_type;\ template <typename arg_type>\ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -290,14 +294,6 @@ ::std::tuple<>()));\ }\ };\ - template <typename arg_type>\ - operator ::testing::Matcher<arg_type>() const {\ - return ::testing::Matcher<arg_type>(\ - new gmock_Impl<arg_type>());\ - }\ - name##Matcher() {\ - }\ - private:\ };\ inline name##Matcher name() {\ return name##Matcher();\ @@ -310,8 +306,12 @@ #define MATCHER_P(name, p0, description)\ template <typename p0##_type>\ - class name##MatcherP {\ + class name##MatcherP : public \ + ::testing::internal::MatcherBaseImpl<name##MatcherP<p0##_type>> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl<name##MatcherP>;\ public:\ + using __internal_base_type::__internal_base_type;\ template <typename arg_type>\ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -340,15 +340,6 @@ ::std::tuple<p0##_type>(p0)));\ }\ };\ - template <typename arg_type>\ - operator ::testing::Matcher<arg_type>() const {\ - return ::testing::Matcher<arg_type>(\ - new gmock_Impl<arg_type>(p0));\ - }\ - explicit name##MatcherP(p0##_type gmock_p0) : p0(::std::move(gmock_p0)) {\ - }\ - p0##_type const p0;\ - private:\ };\ template <typename p0##_type>\ inline name##MatcherP<p0##_type> name(p0##_type p0) {\ @@ -363,8 +354,13 @@ #define MATCHER_P2(name, p0, p1, description)\ template <typename p0##_type, typename p1##_type>\ - class name##MatcherP2 {\ + class name##MatcherP2 : public \ + ::testing::internal::MatcherBaseImpl<name##MatcherP2<p0##_type, \ + p1##_type>> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl<name##MatcherP2>;\ public:\ + using __internal_base_type::__internal_base_type;\ template <typename arg_type>\ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -394,18 +390,6 @@ ::std::tuple<p0##_type, p1##_type>(p0, p1)));\ }\ };\ - template <typename arg_type>\ - operator ::testing::Matcher<arg_type>() const {\ - return ::testing::Matcher<arg_type>(\ - new gmock_Impl<arg_type>(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 <typename p0##_type, typename p1##_type>\ inline name##MatcherP2<p0##_type, p1##_type> name(p0##_type p0, \ @@ -422,8 +406,13 @@ #define MATCHER_P3(name, p0, p1, p2, description)\ template <typename p0##_type, typename p1##_type, typename p2##_type>\ - class name##MatcherP3 {\ + class name##MatcherP3 : public \ + ::testing::internal::MatcherBaseImpl<name##MatcherP3<p0##_type, \ + p1##_type, p2##_type>> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl<name##MatcherP3>;\ public:\ + using __internal_base_type::__internal_base_type;\ template <typename arg_type>\ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -455,19 +444,6 @@ ::std::tuple<p0##_type, p1##_type, p2##_type>(p0, p1, p2)));\ }\ };\ - template <typename arg_type>\ - operator ::testing::Matcher<arg_type>() const {\ - return ::testing::Matcher<arg_type>(\ - new gmock_Impl<arg_type>(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 <typename p0##_type, typename p1##_type, typename p2##_type>\ inline name##MatcherP3<p0##_type, p1##_type, p2##_type> name(p0##_type p0, \ @@ -485,8 +461,13 @@ #define MATCHER_P4(name, p0, p1, p2, p3, description)\ template <typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type>\ - class name##MatcherP4 {\ + class name##MatcherP4 : public \ + ::testing::internal::MatcherBaseImpl<name##MatcherP4<p0##_type, \ + p1##_type, p2##_type, p3##_type>> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl<name##MatcherP4>;\ public:\ + using __internal_base_type::__internal_base_type;\ template <typename arg_type>\ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -521,21 +502,6 @@ p1, p2, p3)));\ }\ };\ - template <typename arg_type>\ - operator ::testing::Matcher<arg_type>() const {\ - return ::testing::Matcher<arg_type>(\ - new gmock_Impl<arg_type>(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 <typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type>\ @@ -557,8 +523,13 @@ #define MATCHER_P5(name, p0, p1, p2, p3, p4, description)\ template <typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type, typename p4##_type>\ - class name##MatcherP5 {\ + class name##MatcherP5 : public \ + ::testing::internal::MatcherBaseImpl<name##MatcherP5<p0##_type, \ + p1##_type, p2##_type, p3##_type, p4##_type>> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl<name##MatcherP5>;\ public:\ + using __internal_base_type::__internal_base_type;\ template <typename arg_type>\ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -595,23 +566,6 @@ p4##_type>(p0, p1, p2, p3, p4)));\ }\ };\ - template <typename arg_type>\ - operator ::testing::Matcher<arg_type>() const {\ - return ::testing::Matcher<arg_type>(\ - new gmock_Impl<arg_type>(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 <typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type, typename p4##_type>\ @@ -633,8 +587,13 @@ #define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description)\ template <typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type, typename p4##_type, typename p5##_type>\ - class name##MatcherP6 {\ + class name##MatcherP6 : public \ + ::testing::internal::MatcherBaseImpl<name##MatcherP6<p0##_type, \ + p1##_type, p2##_type, p3##_type, p4##_type, p5##_type>> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl<name##MatcherP6>;\ public:\ + using __internal_base_type::__internal_base_type;\ template <typename arg_type>\ 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 <typename arg_type>\ - operator ::testing::Matcher<arg_type>() const {\ - return ::testing::Matcher<arg_type>(\ - new gmock_Impl<arg_type>(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 <typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type, typename p4##_type, typename p5##_type>\ @@ -713,8 +653,13 @@ template <typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type, typename p4##_type, typename p5##_type, \ typename p6##_type>\ - class name##MatcherP7 {\ + class name##MatcherP7 : public \ + ::testing::internal::MatcherBaseImpl<name##MatcherP7<p0##_type, \ + p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, p6##_type>> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl<name##MatcherP7>;\ public:\ + using __internal_base_type::__internal_base_type;\ template <typename arg_type>\ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -756,26 +701,6 @@ p6)));\ }\ };\ - template <typename arg_type>\ - operator ::testing::Matcher<arg_type>() const {\ - return ::testing::Matcher<arg_type>(\ - new gmock_Impl<arg_type>(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 <typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type, typename p4##_type, typename p5##_type, \ @@ -801,8 +726,14 @@ template <typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type, typename p4##_type, typename p5##_type, \ typename p6##_type, typename p7##_type>\ - class name##MatcherP8 {\ + class name##MatcherP8 : public \ + ::testing::internal::MatcherBaseImpl<name##MatcherP8<p0##_type, \ + p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, p6##_type, \ + p7##_type>> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl<name##MatcherP8>;\ public:\ + using __internal_base_type::__internal_base_type;\ template <typename arg_type>\ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -845,29 +776,6 @@ p3, p4, p5, p6, p7)));\ }\ };\ - template <typename arg_type>\ - operator ::testing::Matcher<arg_type>() const {\ - return ::testing::Matcher<arg_type>(\ - new gmock_Impl<arg_type>(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 <typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type, typename p4##_type, typename p5##_type, \ @@ -895,8 +803,14 @@ template <typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type, typename p4##_type, typename p5##_type, \ typename p6##_type, typename p7##_type, typename p8##_type>\ - class name##MatcherP9 {\ + class name##MatcherP9 : public \ + ::testing::internal::MatcherBaseImpl<name##MatcherP9<p0##_type, \ + p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, p6##_type, \ + p7##_type, p8##_type>> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl<name##MatcherP9>;\ public:\ + using __internal_base_type::__internal_base_type;\ template <typename arg_type>\ 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 <typename arg_type>\ - operator ::testing::Matcher<arg_type>() const {\ - return ::testing::Matcher<arg_type>(\ - new gmock_Impl<arg_type>(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 <typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type, typename p4##_type, typename p5##_type, \ @@ -994,8 +884,14 @@ typename p3##_type, typename p4##_type, typename p5##_type, \ typename p6##_type, typename p7##_type, typename p8##_type, \ typename p9##_type>\ - class name##MatcherP10 {\ + class name##MatcherP10 : public \ + ::testing::internal::MatcherBaseImpl<name##MatcherP10<p0##_type, \ + p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, p6##_type, \ + p7##_type, p8##_type, p9##_type>> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl<name##MatcherP10>;\ public:\ + using __internal_base_type::__internal_base_type;\ template <typename arg_type>\ 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 <typename arg_type>\ - operator ::testing::Matcher<arg_type>() const {\ - return ::testing::Matcher<arg_type>(\ - new gmock_Impl<arg_type>(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 <typename p0##_type, typename p1##_type, typename p2##_type, \ typename p3##_type, typename p4##_type, typename p5##_type, \ diff --git a/googlemock/include/gmock/gmock-generated-matchers.h.pump b/googlemock/include/gmock/gmock-generated-matchers.h.pump index 69d2ae4..54e3ca3 100644 --- a/googlemock/include/gmock/gmock-generated-matchers.h.pump +++ b/googlemock/include/gmock/gmock-generated-matchers.h.pump @@ -275,10 +275,8 @@ $var template = [[$if i==0 [[]] $else [[ template <$for j, [[typename p$j##_type]]>\ ]]]] -$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 <typename arg_type>\ 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 <typename arg_type>\ - operator ::testing::Matcher<arg_type>() const {\ - return ::testing::Matcher<arg_type>(\ - new gmock_Impl<arg_type>($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 4baeb1b..f1805db 100644 --- a/googlemock/include/gmock/gmock-matchers.h +++ b/googlemock/include/gmock/gmock-matchers.h @@ -236,6 +236,58 @@ class MatcherCastImpl<T, Matcher<T> > { static Matcher<T> Cast(const Matcher<T>& matcher) { return matcher; } }; +// Template specialization for parameterless Matcher. +template <typename Derived> +class MatcherBaseImpl { + public: + MatcherBaseImpl() = default; + + template <typename T> + operator ::testing::Matcher<T>() const { // NOLINT(runtime/explicit) + return ::testing::Matcher<T>(new + typename Derived::template gmock_Impl<T>()); + } +}; + +// Template specialization for Matcher with 1 parameter. +template <template <typename...> class Derived, typename T> +class MatcherBaseImpl<Derived<T>> { + public: + explicit MatcherBaseImpl(T param) : param_(std::move(param)) {} + + template <typename F> + operator ::testing::Matcher<F>() const { // NOLINT(runtime/explicit) + return ::testing::Matcher<F>( + new typename Derived<T>::template gmock_Impl<F>(param_)); + } + + private: + const T param_; +}; + +// Template specialization for Matcher with multiple parameters. +template <template <typename...> class Derived, typename... Ts> +class MatcherBaseImpl<Derived<Ts...>> { + public: + MatcherBaseImpl(Ts... params) + : params_(std::move(params)...) {} // NOLINT(runtime/explicit) + + template <typename F> + operator ::testing::Matcher<F>() const { // NOLINT(runtime/explicit) + return Apply<F>(MakeIndexSequence<sizeof...(Ts)>{}); + } + + private: + template <typename F, std::size_t... tuple_ids> + ::testing::Matcher<F> Apply(IndexSequence<tuple_ids...>) const { + return ::testing::Matcher<F>( + new typename Derived<Ts...>::template gmock_Impl<F>( + std::get<tuple_ids>(params_)...)); + } + + const std::tuple<Ts...> params_; +}; + } // namespace internal // In order to be safe and clear, casting between different matcher |