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

// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS

// Make sure the various containers' iterators are not broken by the use of `std::rel_ops`.

#include <utility> // for std::rel_ops

#include <array>
#include <deque>
#include <filesystem>
#include <forward_list>
#include <list>
#include <map>
#include <set>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

#include "test_macros.h"

#if TEST_STD_VER >= 17
#  include <string_view>
#endif

#if TEST_STD_VER >= 20
#  include <span>
#endif

using namespace std::rel_ops;

template <class It, class ConstIt>
void test_eq(It it, ConstIt cit) {
  (void)(it == it);
  (void)(it != it);
  (void)(it == cit);
  (void)(it != cit);
  (void)(cit == it);
  (void)(cit != it);
  (void)(cit == cit);
  (void)(cit != cit);
}

template <class It, class ConstIt>
void test_lt(It it, ConstIt cit) {
  (void)(it < it);
  (void)(it <= it);
  (void)(it > it);
  (void)(it >= it);
  (void)(it < cit);
  (void)(it <= cit);
  (void)(it > cit);
  (void)(it >= cit);
  (void)(cit < it);
  (void)(cit <= it);
  (void)(cit > it);
  (void)(cit >= it);
  (void)(cit < cit);
  (void)(cit <= cit);
  (void)(cit > cit);
  (void)(cit >= cit);

  // Test subtraction too, even though std::rel_ops shouldn't affect it.

  (void)(it - it);
  (void)(it - cit);
  (void)(cit - it);
  (void)(cit - cit);
}

template <class Container>
void test_forward() {
  // There is no need to distinguish "forward" from "bidirectional."
  // libc++ already can't handle `c.rbegin() >= c.rbegin()` in the
  // presence of std::rel_ops, and neither can Microsoft nor libstdc++.

  Container c;
  typename Container::iterator it        = c.begin();
  typename Container::const_iterator cit = c.begin();
  test_eq(it, cit);
}

template <class Container>
void test_random_access() {
  Container c;
  typename Container::iterator it        = c.begin();
  typename Container::const_iterator cit = c.begin();
  test_eq(it, cit);
  test_lt(it, cit);
}

template void test_random_access<std::array<int, 10> >();
template void test_random_access<std::deque<int> >();
template void test_forward<std::forward_list<int> >();
template void test_forward<std::list<int> >();
template void test_forward<std::map<int, int> >();
template void test_forward<std::multimap<int, int> >();
template void test_forward<std::multiset<int> >();
template void test_forward<std::set<int> >();
template void test_random_access<std::string>();
template void test_forward<std::unordered_map<int, int> >();
template void test_forward<std::unordered_multimap<int, int> >();
template void test_forward<std::unordered_multiset<int> >();
template void test_forward<std::unordered_set<int> >();
template void test_random_access<std::vector<int> >();

#if TEST_STD_VER >= 17
void test_directory_iterators() {
#  ifndef TEST_HAS_NO_FILESYSTEM
  std::filesystem::directory_iterator it;
  test_eq(it, it);

  std::filesystem::recursive_directory_iterator rdit;
  test_eq(rdit, rdit);
#  endif
}

template void test_forward<std::filesystem::path>();
#endif

#if TEST_STD_VER >= 17
template void test_random_access<std::string_view>();
#endif

#if TEST_STD_VER >= 20
void test_span() {
  std::span<int> c;
  std::span<int>::iterator it = c.begin(); // span has no const_iterator
  test_eq(it, it);
  test_lt(it, it);
}
#endif
