blob: b6dd12c12763d7fd81f79b3a39c56d56e380f33e [file]
//===----------------------------------------------------------------------===//
//
// 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 <algorithm>
#include <cassert>
#include <concepts>
#include <deque>
#include <iterator>
#include <vector>
template <class InContainer1, class InContainer2>
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<bool> 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<bool> 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::vector<int>, std::deque<int>>();
test_containers<std::deque<int>, std::vector<int>>();
test_containers<std::deque<int>, std::deque<int>>();
return 0;
}