//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // std::equal(segmented-iterator, segmented-iterator, other-iterator); // std::equal(other-iterator, other-iterator, segmented-iterator); // std::equal(segmented-iterator, segmented-iterator, segmented-iterator); // UNSUPPORTED: c++03, c++11, c++14, c++17 #include #include #include #include #include #include template constexpr void test_containers() { using InIter1 = typename InContainer1::iterator; using InIter2 = typename InContainer2::iterator; { // Simple positive test InContainer1 lhs{1, 2, 3, 4}; InContainer2 rhs{1, 2, 3, 4}; std::same_as auto ret = std::equal(InIter1(lhs.begin()), InIter1(lhs.end()), InIter2(rhs.begin())); assert(ret); } { // Simple negative test InContainer1 lhs{1, 2, 3, 4}; InContainer2 rhs{2, 2, 3, 4}; std::same_as auto ret = std::equal(InIter1(lhs.begin()), InIter1(lhs.end()), InIter2(rhs.begin())); assert(!ret); } { // Multiple segments are iterated, equal InContainer1 lhs; std::generate_n(std::back_inserter(lhs), 4095, [i = 0]() mutable { return i++; }); InContainer2 rhs(lhs.begin(), lhs.end()); assert(std::equal(InIter1(lhs.begin()), InIter1(lhs.end()), InIter2(rhs.begin()))); } { // Multiple segments are iterated, not equal InContainer1 lhs; std::generate_n(std::back_inserter(lhs), 4095, [i = 0]() mutable { return i++; }); InContainer2 rhs(lhs.begin(), lhs.end()); rhs.back() = -1; assert(!std::equal(InIter1(lhs.begin()), InIter1(lhs.end()), InIter2(rhs.begin()))); } { // Multiple segments are iterated, first segment is partially iterated, equal InContainer1 lhs; std::generate_n(std::back_inserter(lhs), 4095, [i = 0]() mutable { return i++; }); InContainer2 rhs; rhs.resize(10); rhs.insert(rhs.end(), lhs.begin(), lhs.end()); rhs.erase(rhs.begin(), rhs.begin() + 10); assert(std::equal(InIter1(lhs.begin()), InIter1(lhs.end()), InIter2(rhs.begin()))); } { // Multiple segments are iterated, first segment is partially iterated, not equal InContainer1 lhs; std::generate_n(std::back_inserter(lhs), 4095, [i = 0]() mutable { return i++; }); InContainer2 rhs; rhs.resize(10); rhs.insert(rhs.end(), lhs.begin(), lhs.end()); rhs.erase(rhs.begin(), rhs.begin() + 10); rhs.back() = -1; assert(!std::equal(InIter1(lhs.begin()), InIter1(lhs.end()), InIter2(rhs.begin()))); } } int main(int, char**) { test_containers, std::deque>(); test_containers, std::vector>(); test_containers, std::deque>(); return 0; }