Fix RangeEquals matcher to handle iterator + sentinel ranges

Also added tests for types that require ADL lookup for their
`begin` and `end`.
This commit is contained in:
Martin Hořeňovský
2023-02-03 16:12:09 +01:00
parent 42d9d4533e
commit f3c0a3cd09
15 changed files with 543 additions and 22 deletions

View File

@@ -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 {