diff options
| author | Martin Hořeňovský | 2023-02-03 16:12:09 +0100 |
|---|---|---|
| committer | Martin Hořeňovský | 2023-02-03 18:22:41 +0100 |
| commit | f3c0a3cd091aba8341a77e5c8580e5697f0e6892 (patch) | |
| tree | cf5fd5193620d0661ea1315b768a8256d03a036c /src | |
| parent | 42d9d4533e8583506463ab1e688add6542b15ad4 (diff) | |
| download | catch3-f3c0a3cd091aba8341a77e5c8580e5697f0e6892.tar.gz | |
Fix RangeEquals matcher to handle iterator + sentinel ranges
Also added tests for types that require ADL lookup for their
`begin` and `end`.
Diffstat (limited to 'src')
| -rw-r--r-- | src/catch2/matchers/catch_matchers_range_equals.hpp | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/src/catch2/matchers/catch_matchers_range_equals.hpp b/src/catch2/matchers/catch_matchers_range_equals.hpp index bc94e696..c0985fd9 100644 --- a/src/catch2/matchers/catch_matchers_range_equals.hpp +++ b/src/catch2/matchers/catch_matchers_range_equals.hpp @@ -33,13 +33,19 @@ namespace Catch { template <typename RangeLike> bool match( RangeLike&& rng ) const { - using std::begin; - using std::end; - return std::equal( begin(m_desired), - end(m_desired), - begin(rng), - end(rng), - m_predicate ); + auto rng_start = begin( rng ); + const auto rng_end = end( rng ); + auto target_start = begin( m_desired ); + const auto target_end = end( m_desired ); + + while (rng_start != rng_end && target_start != target_end) { + if (!m_predicate(*rng_start, *target_start)) { + return false; + } + ++rng_start; + ++target_start; + } + return rng_start == rng_end && target_start == target_end; } std::string describe() const override { |