diff options
Diffstat (limited to 'absl/algorithm')
-rw-r--r-- | absl/algorithm/container.h | 4 | ||||
-rw-r--r-- | absl/algorithm/container_test.cc | 11 |
2 files changed, 14 insertions, 1 deletions
diff --git a/absl/algorithm/container.h b/absl/algorithm/container.h index 3c4fd733..bb3d1c7c 100644 --- a/absl/algorithm/container.h +++ b/absl/algorithm/container.h @@ -351,7 +351,9 @@ c_mismatch(C1& c1, C2& c2) { auto last2 = container_algorithm_internal::c_end(c2); for (; first1 != last1 && first2 != last2; ++first1, (void)++first2) { - if (*first1 != *first2) { + // Negates equality because Cpp17EqualityComparable doesn't require clients + // to overload both `operator==` and `operator!=`. + if (!(*first1 == *first2)) { break; } } diff --git a/absl/algorithm/container_test.cc b/absl/algorithm/container_test.cc index fb940560..605afc80 100644 --- a/absl/algorithm/container_test.cc +++ b/absl/algorithm/container_test.cc @@ -183,6 +183,17 @@ TEST_F(NonMutatingTest, Mismatch) { EXPECT_EQ(result.first, sequence_.end()); EXPECT_EQ(result.second, std::prev(vector_.end())); } + { + struct NoNotEquals { + constexpr bool operator==(NoNotEquals) const { return true; } + constexpr bool operator!=(NoNotEquals) const = delete; + }; + std::vector<NoNotEquals> first; + std::list<NoNotEquals> second; + + // Check this still compiles. + absl::c_mismatch(first, second); + } } TEST_F(NonMutatingTest, MismatchWithPredicate) { |