diff options
author | zhanyong.wan <zhanyong.wan@8415998a-534a-0410-bf83-d39667b30386> | 2010-06-09 19:21:30 +0000 |
---|---|---|
committer | zhanyong.wan <zhanyong.wan@8415998a-534a-0410-bf83-d39667b30386> | 2010-06-09 19:21:30 +0000 |
commit | 02c1505ebfaadbc34b4cb85546796521d6f0e634 (patch) | |
tree | 45d7941b6eb0a3f77c80a903ed9637d05e2ef63d /include | |
parent | b4140808f98ff09c43ca1ddaa8ff13bc47cd0089 (diff) | |
download | googletest-02c1505ebfaadbc34b4cb85546796521d6f0e634.tar.gz googletest-02c1505ebfaadbc34b4cb85546796521d6f0e634.tar.bz2 googletest-02c1505ebfaadbc34b4cb85546796521d6f0e634.zip |
Increases the maximum arity of AllOf() and AnyOf() to 10, by Marcus Börger.
Diffstat (limited to 'include')
-rw-r--r-- | include/gmock/gmock-generated-matchers.h | 184 | ||||
-rw-r--r-- | include/gmock/gmock-generated-matchers.h.pump | 46 | ||||
-rw-r--r-- | include/gmock/gmock-matchers.h | 76 |
3 files changed, 230 insertions, 76 deletions
diff --git a/include/gmock/gmock-generated-matchers.h b/include/gmock/gmock-generated-matchers.h index 2cc5746e..cb610543 100644 --- a/include/gmock/gmock-generated-matchers.h +++ b/include/gmock/gmock-generated-matchers.h @@ -849,6 +849,190 @@ ElementsAreArray(const T (&array)[N]) { return internal::ElementsAreArrayMatcher<T>(array, N); } +// AllOf(m1, m2, ..., mk) matches any value that matches all of the given +// sub-matchers. + +template <typename Matcher1, typename Matcher2> +inline internal::BothOfMatcher<Matcher1, Matcher2> +AllOf(Matcher1 m1, Matcher2 m2) { + return internal::BothOfMatcher<Matcher1, Matcher2>(m1, m2); +} + +template <typename Matcher1, typename Matcher2, typename Matcher3> +inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, + Matcher3> > +AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) { + return AllOf(m1, AllOf(m2, m3)); +} + +template <typename Matcher1, typename Matcher2, typename Matcher3, + typename Matcher4> +inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, + internal::BothOfMatcher<Matcher3, Matcher4> > > +AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) { + return AllOf(m1, AllOf(m2, m3, m4)); +} + +template <typename Matcher1, typename Matcher2, typename Matcher3, + typename Matcher4, typename Matcher5> +inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, + internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, + Matcher5> > > > +AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) { + return AllOf(m1, AllOf(m2, m3, m4, m5)); +} + +template <typename Matcher1, typename Matcher2, typename Matcher3, + typename Matcher4, typename Matcher5, typename Matcher6> +inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, + internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, + internal::BothOfMatcher<Matcher5, Matcher6> > > > > +AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, + Matcher6 m6) { + return AllOf(m1, AllOf(m2, m3, m4, m5, m6)); +} + +template <typename Matcher1, typename Matcher2, typename Matcher3, + typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7> +inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, + internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, + internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6, + Matcher7> > > > > > +AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, + Matcher6 m6, Matcher7 m7) { + return AllOf(m1, AllOf(m2, m3, m4, m5, m6, m7)); +} + +template <typename Matcher1, typename Matcher2, typename Matcher3, + typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, + typename Matcher8> +inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, + internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, + internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6, + internal::BothOfMatcher<Matcher7, Matcher8> > > > > > > +AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, + Matcher6 m6, Matcher7 m7, Matcher8 m8) { + return AllOf(m1, AllOf(m2, m3, m4, m5, m6, m7, m8)); +} + +template <typename Matcher1, typename Matcher2, typename Matcher3, + typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, + typename Matcher8, typename Matcher9> +inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, + internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, + internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6, + internal::BothOfMatcher<Matcher7, internal::BothOfMatcher<Matcher8, + Matcher9> > > > > > > > +AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, + Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9) { + return AllOf(m1, AllOf(m2, m3, m4, m5, m6, m7, m8, m9)); +} + +template <typename Matcher1, typename Matcher2, typename Matcher3, + typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, + typename Matcher8, typename Matcher9, typename Matcher10> +inline internal::BothOfMatcher<Matcher1, internal::BothOfMatcher<Matcher2, + internal::BothOfMatcher<Matcher3, internal::BothOfMatcher<Matcher4, + internal::BothOfMatcher<Matcher5, internal::BothOfMatcher<Matcher6, + internal::BothOfMatcher<Matcher7, internal::BothOfMatcher<Matcher8, + internal::BothOfMatcher<Matcher9, Matcher10> > > > > > > > > +AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, + Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9, Matcher10 m10) { + return AllOf(m1, AllOf(m2, m3, m4, m5, m6, m7, m8, m9, m10)); +} + +// AnyOf(m1, m2, ..., mk) matches any value that matches any of the given +// sub-matchers. + +template <typename Matcher1, typename Matcher2> +inline internal::EitherOfMatcher<Matcher1, Matcher2> +AnyOf(Matcher1 m1, Matcher2 m2) { + return internal::EitherOfMatcher<Matcher1, Matcher2>(m1, m2); +} + +template <typename Matcher1, typename Matcher2, typename Matcher3> +inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, + Matcher3> > +AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) { + return AnyOf(m1, AnyOf(m2, m3)); +} + +template <typename Matcher1, typename Matcher2, typename Matcher3, + typename Matcher4> +inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, + internal::EitherOfMatcher<Matcher3, Matcher4> > > +AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) { + return AnyOf(m1, AnyOf(m2, m3, m4)); +} + +template <typename Matcher1, typename Matcher2, typename Matcher3, + typename Matcher4, typename Matcher5> +inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, + internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, + Matcher5> > > > +AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) { + return AnyOf(m1, AnyOf(m2, m3, m4, m5)); +} + +template <typename Matcher1, typename Matcher2, typename Matcher3, + typename Matcher4, typename Matcher5, typename Matcher6> +inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, + internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, + internal::EitherOfMatcher<Matcher5, Matcher6> > > > > +AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, + Matcher6 m6) { + return AnyOf(m1, AnyOf(m2, m3, m4, m5, m6)); +} + +template <typename Matcher1, typename Matcher2, typename Matcher3, + typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7> +inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, + internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, + internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6, + Matcher7> > > > > > +AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, + Matcher6 m6, Matcher7 m7) { + return AnyOf(m1, AnyOf(m2, m3, m4, m5, m6, m7)); +} + +template <typename Matcher1, typename Matcher2, typename Matcher3, + typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, + typename Matcher8> +inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, + internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, + internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6, + internal::EitherOfMatcher<Matcher7, Matcher8> > > > > > > +AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, + Matcher6 m6, Matcher7 m7, Matcher8 m8) { + return AnyOf(m1, AnyOf(m2, m3, m4, m5, m6, m7, m8)); +} + +template <typename Matcher1, typename Matcher2, typename Matcher3, + typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, + typename Matcher8, typename Matcher9> +inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, + internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, + internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6, + internal::EitherOfMatcher<Matcher7, internal::EitherOfMatcher<Matcher8, + Matcher9> > > > > > > > +AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, + Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9) { + return AnyOf(m1, AnyOf(m2, m3, m4, m5, m6, m7, m8, m9)); +} + +template <typename Matcher1, typename Matcher2, typename Matcher3, + typename Matcher4, typename Matcher5, typename Matcher6, typename Matcher7, + typename Matcher8, typename Matcher9, typename Matcher10> +inline internal::EitherOfMatcher<Matcher1, internal::EitherOfMatcher<Matcher2, + internal::EitherOfMatcher<Matcher3, internal::EitherOfMatcher<Matcher4, + internal::EitherOfMatcher<Matcher5, internal::EitherOfMatcher<Matcher6, + internal::EitherOfMatcher<Matcher7, internal::EitherOfMatcher<Matcher8, + internal::EitherOfMatcher<Matcher9, Matcher10> > > > > > > > > +AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5, + Matcher6 m6, Matcher7 m7, Matcher8 m8, Matcher9 m9, Matcher10 m10) { + return AnyOf(m1, AnyOf(m2, m3, m4, m5, m6, m7, m8, m9, m10)); +} + } // namespace testing // The MATCHER* family of macros can be used in a namespace scope to diff --git a/include/gmock/gmock-generated-matchers.h.pump b/include/gmock/gmock-generated-matchers.h.pump index 9f19fb8b..02e3c980 100644 --- a/include/gmock/gmock-generated-matchers.h.pump +++ b/include/gmock/gmock-generated-matchers.h.pump @@ -302,6 +302,52 @@ ElementsAreArray(const T (&array)[N]) { return internal::ElementsAreArrayMatcher<T>(array, N); } +// AllOf(m1, m2, ..., mk) matches any value that matches all of the given +// sub-matchers. + +$range i 2..n +$for i [[ +$range j 1..i +$range k 1..i-1 + +template <$for j, [[typename Matcher$j]]> +inline $for k[[internal::BothOfMatcher<Matcher$k, ]]Matcher$i[[]]$for k [[> ]] + +AllOf($for j, [[Matcher$j m$j]]) { + +$if i == 2 [[ + return internal::BothOfMatcher<Matcher1, Matcher2>(m1, m2); +]] $else [[ + return AllOf(m1, AllOf($for k, [[m$(k + 1)]])); +]] + +} + +]] + +// AnyOf(m1, m2, ..., mk) matches any value that matches any of the given +// sub-matchers. + +$range i 2..n +$for i [[ +$range j 1..i +$range k 1..i-1 + +template <$for j, [[typename Matcher$j]]> +inline $for k[[internal::EitherOfMatcher<Matcher$k, ]]Matcher$i[[]]$for k [[> ]] + +AnyOf($for j, [[Matcher$j m$j]]) { + +$if i == 2 [[ + return internal::EitherOfMatcher<Matcher1, Matcher2>(m1, m2); +]] $else [[ + return AnyOf(m1, AnyOf($for k, [[m$(k + 1)]])); +]] + +} + +]] + } // namespace testing $$ } // This Pump meta comment fixes auto-indentation in Emacs. It will not $$ // show up in the generated code. diff --git a/include/gmock/gmock-matchers.h b/include/gmock/gmock-matchers.h index 315e1f56..9f268d64 100644 --- a/include/gmock/gmock-matchers.h +++ b/include/gmock/gmock-matchers.h @@ -2889,82 +2889,6 @@ inline internal::NotMatcher<InnerMatcher> Not(InnerMatcher m) { return internal::NotMatcher<InnerMatcher>(m); } -// Creates a matcher that matches any value that matches all of the -// given matchers. -// -// For now we only support up to 5 matchers. Support for more -// matchers can be added as needed, or the user can use nested -// AllOf()s. -template <typename Matcher1, typename Matcher2> -inline internal::BothOfMatcher<Matcher1, Matcher2> -AllOf(Matcher1 m1, Matcher2 m2) { - return internal::BothOfMatcher<Matcher1, Matcher2>(m1, m2); -} - -template <typename Matcher1, typename Matcher2, typename Matcher3> -inline internal::BothOfMatcher<Matcher1, - internal::BothOfMatcher<Matcher2, Matcher3> > -AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) { - return AllOf(m1, AllOf(m2, m3)); -} - -template <typename Matcher1, typename Matcher2, typename Matcher3, - typename Matcher4> -inline internal::BothOfMatcher<Matcher1, - internal::BothOfMatcher<Matcher2, - internal::BothOfMatcher<Matcher3, Matcher4> > > -AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) { - return AllOf(m1, AllOf(m2, m3, m4)); -} - -template <typename Matcher1, typename Matcher2, typename Matcher3, - typename Matcher4, typename Matcher5> -inline internal::BothOfMatcher<Matcher1, - internal::BothOfMatcher<Matcher2, - internal::BothOfMatcher<Matcher3, - internal::BothOfMatcher<Matcher4, Matcher5> > > > -AllOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) { - return AllOf(m1, AllOf(m2, m3, m4, m5)); -} - -// Creates a matcher that matches any value that matches at least one -// of the given matchers. -// -// For now we only support up to 5 matchers. Support for more -// matchers can be added as needed, or the user can use nested -// AnyOf()s. -template <typename Matcher1, typename Matcher2> -inline internal::EitherOfMatcher<Matcher1, Matcher2> -AnyOf(Matcher1 m1, Matcher2 m2) { - return internal::EitherOfMatcher<Matcher1, Matcher2>(m1, m2); -} - -template <typename Matcher1, typename Matcher2, typename Matcher3> -inline internal::EitherOfMatcher<Matcher1, - internal::EitherOfMatcher<Matcher2, Matcher3> > -AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3) { - return AnyOf(m1, AnyOf(m2, m3)); -} - -template <typename Matcher1, typename Matcher2, typename Matcher3, - typename Matcher4> -inline internal::EitherOfMatcher<Matcher1, - internal::EitherOfMatcher<Matcher2, - internal::EitherOfMatcher<Matcher3, Matcher4> > > -AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4) { - return AnyOf(m1, AnyOf(m2, m3, m4)); -} - -template <typename Matcher1, typename Matcher2, typename Matcher3, - typename Matcher4, typename Matcher5> -inline internal::EitherOfMatcher<Matcher1, - internal::EitherOfMatcher<Matcher2, - internal::EitherOfMatcher<Matcher3, - internal::EitherOfMatcher<Matcher4, Matcher5> > > > -AnyOf(Matcher1 m1, Matcher2 m2, Matcher3 m3, Matcher4 m4, Matcher5 m5) { - return AnyOf(m1, AnyOf(m2, m3, m4, m5)); -} - // Returns a matcher that matches anything that satisfies the given // predicate. The predicate can be any unary function or functor // whose return type can be implicitly converted to bool. |