mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 04:07:10 +01:00 
			
		
		
		
	Do not use shared_ptrs for filters and patterns
This commit is contained in:
		| @@ -29,13 +29,13 @@ namespace Catch { | ||||
|     namespace { | ||||
|  | ||||
|         void listTests(IStreamingReporter& reporter, Config const& config) { | ||||
|             TestSpec testSpec = config.testSpec(); | ||||
|             auto const& testSpec = config.testSpec(); | ||||
|             auto matchedTestCases = filterTests(getAllTestCasesSorted(config), testSpec, config); | ||||
|             reporter.listTests(matchedTestCases, config); | ||||
|         } | ||||
|  | ||||
|         void listTags(IStreamingReporter& reporter, Config const& config) { | ||||
|             TestSpec testSpec = config.testSpec(); | ||||
|             auto const& testSpec = config.testSpec(); | ||||
|             std::vector<TestCaseHandle> matchedTestCases = filterTests(getAllTestCasesSorted(config), testSpec, config); | ||||
|  | ||||
|             std::map<StringRef, TagInfo> tagCounts; | ||||
|   | ||||
| @@ -25,6 +25,7 @@ namespace Catch { | ||||
|     struct IConfig; | ||||
|  | ||||
|     class TestSpec { | ||||
|  | ||||
|         class Pattern { | ||||
|         public: | ||||
|             explicit Pattern( std::string const& name ); | ||||
| @@ -34,7 +35,6 @@ namespace Catch { | ||||
|         private: | ||||
|             std::string const m_name; | ||||
|         }; | ||||
|         using PatternPtr = std::shared_ptr<Pattern>; | ||||
|  | ||||
|         class NamePattern : public Pattern { | ||||
|         public: | ||||
| @@ -53,8 +53,8 @@ namespace Catch { | ||||
|         }; | ||||
|  | ||||
|         struct Filter { | ||||
|             std::vector<PatternPtr> m_required; | ||||
|             std::vector<PatternPtr> m_forbidden; | ||||
|             std::vector<std::unique_ptr<Pattern>> m_required; | ||||
|             std::vector<std::unique_ptr<Pattern>> m_forbidden; | ||||
|  | ||||
|             bool matches( TestCaseInfo const& testCase ) const; | ||||
|             std::string name() const; | ||||
|   | ||||
| @@ -20,10 +20,10 @@ namespace Catch { | ||||
|         m_substring.reserve(m_arg.size()); | ||||
|         m_patternName.reserve(m_arg.size()); | ||||
|         m_realPatternPos = 0; | ||||
|          | ||||
|  | ||||
|         for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) | ||||
|           //if visitChar fails | ||||
|            if( !visitChar( m_arg[m_pos] ) ){  | ||||
|            if( !visitChar( m_arg[m_pos] ) ){ | ||||
|                m_testSpec.m_invalidArgs.push_back(arg); | ||||
|                break; | ||||
|            } | ||||
| @@ -32,7 +32,7 @@ namespace Catch { | ||||
|     } | ||||
|     TestSpec TestSpecParser::testSpec() { | ||||
|         addFilter(); | ||||
|         return m_testSpec; | ||||
|         return std::move(m_testSpec); | ||||
|     } | ||||
|     bool TestSpecParser::visitChar( char c ) { | ||||
|         if( (m_mode != EscapedName) && (c == '\\') ) { | ||||
| @@ -148,7 +148,7 @@ namespace Catch { | ||||
|  | ||||
|     void TestSpecParser::addFilter() { | ||||
|         if( !m_currentFilter.m_required.empty() || !m_currentFilter.m_forbidden.empty() ) { | ||||
|             m_testSpec.m_filters.push_back( m_currentFilter ); | ||||
|             m_testSpec.m_filters.push_back( std::move(m_currentFilter) ); | ||||
|             m_currentFilter = TestSpec::Filter(); | ||||
|         } | ||||
|     } | ||||
| @@ -156,12 +156,12 @@ namespace Catch { | ||||
|     void TestSpecParser::saveLastMode() { | ||||
|       lastMode = m_mode; | ||||
|     } | ||||
|      | ||||
|  | ||||
|     void TestSpecParser::revertBackToLastMode() { | ||||
|       m_mode = lastMode; | ||||
|     } | ||||
|      | ||||
|     bool TestSpecParser::separate() {   | ||||
|  | ||||
|     bool TestSpecParser::separate() { | ||||
|       if( (m_mode==QuotedName) || (m_mode==Tag) ){ | ||||
|          //invalid argument, signal failure to previous scope. | ||||
|          m_mode = None; | ||||
| @@ -174,7 +174,7 @@ namespace Catch { | ||||
|       addFilter(); | ||||
|       return true; //success | ||||
|     } | ||||
|      | ||||
|  | ||||
|     TestSpec parseTestSpec( std::string const& arg ) { | ||||
|         return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec(); | ||||
|     } | ||||
|   | ||||
| @@ -65,11 +65,10 @@ namespace Catch { | ||||
|                 token = token.substr( 8 ); | ||||
|             } | ||||
|             if( !token.empty() ) { | ||||
|                 TestSpec::PatternPtr pattern = std::make_shared<T>( token, m_substring ); | ||||
|                 if (m_exclusion) { | ||||
|                     m_currentFilter.m_forbidden.push_back(pattern); | ||||
|                     m_currentFilter.m_forbidden.emplace_back(std::make_unique<T>(token, m_substring)); | ||||
|                 } else { | ||||
|                     m_currentFilter.m_required.push_back(pattern); | ||||
|                     m_currentFilter.m_required.emplace_back(std::make_unique<T>(token, m_substring)); | ||||
|                 } | ||||
|             } | ||||
|             m_substring.clear(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský