diff options
| author | Leitwolf | 2026-10-25 10:31:36 +0300 |
|---|---|---|
| committer | GitHub | 2026-10-25 10:31:36 +0300 |
| commit | d2e3e074bb2e1b8ffd9fc990d0b87667ea602f58 (patch) | |
| tree | 0bce4462b2e190c39b3e1c5f697e3e4abd1a5e2a /src/Progmasoft/Catch3/Internal/WildcardPattern.cpp | |
| parent | 13f81a480a93807c14dddb5abdb97355ced4d4c5 (diff) | |
| parent | 126dc333564cb72b5115d9a9242d66694694b6d0 (diff) | |
| download | catch3-d2e3e074bb2e1b8ffd9fc990d0b87667ea602f58.tar.gz | |
Merge pull request #18 from Progmasoft/build/catch3-identity
Give Catch3 its own build names and headers
Diffstat (limited to 'src/Progmasoft/Catch3/Internal/WildcardPattern.cpp')
| -rw-r--r-- | src/Progmasoft/Catch3/Internal/WildcardPattern.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/Progmasoft/Catch3/Internal/WildcardPattern.cpp b/src/Progmasoft/Catch3/Internal/WildcardPattern.cpp new file mode 100644 index 00000000..9fb356ea --- /dev/null +++ b/src/Progmasoft/Catch3/Internal/WildcardPattern.cpp @@ -0,0 +1,67 @@ + +// Copyright Catch2 Authors +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE.txt or copy at +// https://www.boost.org/LICENSE_1_0.txt) + +// SPDX-License-Identifier: BSL-1.0 +#include <Progmasoft/Catch3/Internal/WildcardPattern.hpp> +#include <Progmasoft/Catch3/Internal/Enforce.hpp> +#include <Progmasoft/Catch3/Internal/StringManip.hpp> +#include <Progmasoft/Catch3/Internal/StringRef.hpp> +#include <Progmasoft/Catch3/Internal/CaseInsensitiveComparisons.hpp> + +namespace Catch { + + WildcardPattern::WildcardPattern( std::string const& pattern, + CaseSensitive caseSensitivity ) + : m_caseSensitivity( caseSensitivity ), + m_pattern( trim(pattern) ) + { + if( startsWith( m_pattern, '*' ) ) { + m_pattern = m_pattern.erase( 0, 1 ); // effectively pop_front + m_wildcard = static_cast<WildcardPosition>( m_wildcard | WildcardAtStart ); + } + if( endsWith( m_pattern, '*' ) ) { + m_pattern.pop_back(); + m_wildcard = static_cast<WildcardPosition>( m_wildcard | WildcardAtEnd ); + } + } + + bool WildcardPattern::matches( StringRef input ) const { + input = trim( input ); + if ( input.size() < m_pattern.size() ) { return false; } + + auto casedMatch = [&]( StringRef lhs, StringRef rhs ) { + if ( m_caseSensitivity == CaseSensitive::Yes ) { + return lhs == rhs; + } else { + Detail::CaseInsensitiveEqualTo eq; + return eq( lhs, rhs ); + } + }; + + switch ( m_wildcard ) { + case NoWildcard: + return casedMatch(input, m_pattern); + case WildcardAtStart: + return casedMatch( + input.substr( input.size() - m_pattern.size(), input.size() ), + m_pattern ); + case WildcardAtEnd: + return casedMatch( input.substr( 0, m_pattern.size() ), m_pattern ); + case WildcardAtBothEnds: { + // TBD: This has terrible performance, but it is also the least + // common use case. Once the StringContains matcher gets + // efficient implementation, we should reuse it here. + const size_t lastOffset = input.size() - m_pattern.size(); + for ( size_t offset = 0; offset <= lastOffset; ++offset ) { + if ( casedMatch( input.substr(offset, m_pattern.size()), m_pattern ) ) { return true; } + } + return false; + } + default: + CATCH_INTERNAL_ERROR( "Unknown enum" ); + } + } +} |