diff --git a/src/catch2/matchers/catch_matchers_templated.hpp b/src/catch2/matchers/catch_matchers_templated.hpp index 71e3ce1b..9688dbd4 100644 --- a/src/catch2/matchers/catch_matchers_templated.hpp +++ b/src/catch2/matchers/catch_matchers_templated.hpp @@ -130,6 +130,32 @@ namespace Matchers { std::array m_matchers; + //! Avoids type nesting for `GenericAllOf && GenericAllOf` case + template + friend + MatchAllOfGeneric operator && ( + MatchAllOfGeneric&& lhs, + MatchAllOfGeneric&& rhs) { + return MatchAllOfGeneric{array_cat(std::move(lhs.m_matchers), std::move(rhs.m_matchers))}; + } + + //! Avoids type nesting for `GenericAllOf && some matcher` case + template + friend std::enable_if_t::value, + MatchAllOfGeneric> operator && ( + MatchAllOfGeneric&& lhs, + MatcherRHS const& rhs) { + return MatchAllOfGeneric{array_cat(std::move(lhs.m_matchers), static_cast(&rhs))}; + } + + //! Avoids type nesting for `some matcher && GenericAllOf` case + template + friend std::enable_if_t::value, + MatchAllOfGeneric> operator && ( + MatcherLHS const& lhs, + MatchAllOfGeneric&& rhs) { + return MatchAllOfGeneric{array_cat(static_cast(std::addressof(lhs)), std::move(rhs.m_matchers))}; + } }; @@ -153,6 +179,32 @@ namespace Matchers { } std::array m_matchers; + + //! Avoids type nesting for `GenericAnyOf || GenericAnyOf` case + template + friend MatchAnyOfGeneric operator || ( + MatchAnyOfGeneric&& lhs, + MatchAnyOfGeneric&& rhs) { + return MatchAnyOfGeneric{array_cat(std::move(lhs.m_matchers), std::move(rhs.m_matchers))}; + } + + //! Avoids type nesting for `GenericAnyOf || some matcher` case + template + friend std::enable_if_t::value, + MatchAnyOfGeneric> operator || ( + MatchAnyOfGeneric&& lhs, + MatcherRHS const& rhs) { + return MatchAnyOfGeneric{array_cat(std::move(lhs.m_matchers), static_cast(std::addressof(rhs)))}; + } + + //! Avoids type nesting for `some matcher || GenericAnyOf` case + template + friend std::enable_if_t::value, + MatchAnyOfGeneric> operator || ( + MatcherLHS const& lhs, + MatchAnyOfGeneric&& rhs) { + return MatchAnyOfGeneric{array_cat(static_cast(std::addressof(lhs)), std::move(rhs.m_matchers))}; + } }; @@ -175,7 +227,7 @@ namespace Matchers { } //! Negating negation can just unwrap and return underlying matcher - friend MatcherT const& operator ! (Detail::MatchNotOfGeneric const& matcher) { + friend MatcherT const& operator ! (MatchNotOfGeneric const& matcher) { return matcher.m_matcher; } private: @@ -230,44 +282,6 @@ namespace Matchers { return { lhs, rhs }; } - - // avoid deep nesting of matcher templates - template - Detail::MatchAllOfGeneric - operator && (Detail::MatchAllOfGeneric&& lhs, Detail::MatchAllOfGeneric&& rhs) { - return Detail::MatchAllOfGeneric{Detail::array_cat(std::move(lhs.m_matchers), std::move(rhs.m_matchers))}; - } - - template - std::enable_if_t::value, Detail::MatchAllOfGeneric> - operator && (Detail::MatchAllOfGeneric&& lhs, MatcherRHS const& rhs) { - return Detail::MatchAllOfGeneric{Detail::array_cat(std::move(lhs.m_matchers), static_cast(&rhs))}; - } - - template - std::enable_if_t::value, Detail::MatchAllOfGeneric> - operator && (MatcherLHS const& lhs, Detail::MatchAllOfGeneric&& rhs) { - return Detail::MatchAllOfGeneric{Detail::array_cat(static_cast(std::addressof(lhs)), std::move(rhs.m_matchers))}; - } - - template - Detail::MatchAnyOfGeneric - operator || (Detail::MatchAnyOfGeneric&& lhs, Detail::MatchAnyOfGeneric&& rhs) { - return Detail::MatchAnyOfGeneric{Detail::array_cat(std::move(lhs.m_matchers), std::move(rhs.m_matchers))}; - } - - template - std::enable_if_t::value, Detail::MatchAnyOfGeneric> - operator || (Detail::MatchAnyOfGeneric&& lhs, MatcherRHS const& rhs) { - return Detail::MatchAnyOfGeneric{Detail::array_cat(std::move(lhs.m_matchers), static_cast(std::addressof(rhs)))}; - } - - template - std::enable_if_t::value, Detail::MatchAnyOfGeneric> - operator || (MatcherLHS const& lhs, Detail::MatchAnyOfGeneric&& rhs) { - return Detail::MatchAnyOfGeneric{Detail::array_cat(static_cast(std::addressof(lhs)), std::move(rhs.m_matchers))}; - } - } // namespace Matchers } // namespace Catch