//===----------------------------------------------------------------------===//
//
// 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;
}
