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

#ifndef TEST_LIBCXX_ITERATORS_ITERATOR_REQUIREMENTS_ITERATOR_ASSOC_TYPES_ITERATOR_TRAITS_ITERATOR_TRAITS_CPP17_ITERATORS
#define TEST_LIBCXX_ITERATORS_ITERATOR_REQUIREMENTS_ITERATOR_ASSOC_TYPES_ITERATOR_TRAITS_ITERATOR_TRAITS_CPP17_ITERATORS

struct iterator_traits_cpp17_iterator {
  int& operator*();
  iterator_traits_cpp17_iterator& operator++();
  iterator_traits_cpp17_iterator operator++(int);
};

struct iterator_traits_cpp17_proxy_iterator {
  int operator*();
  iterator_traits_cpp17_proxy_iterator& operator++();

  // this returns legcay_iterator, not iterator_traits_cpp17_proxy_iterator
  iterator_traits_cpp17_iterator operator++(int);
};

struct iterator_traits_cpp17_input_iterator {
  using difference_type = int;
  using value_type = long;

  int& operator*();
  iterator_traits_cpp17_input_iterator& operator++();
  iterator_traits_cpp17_input_iterator operator++(int);

  bool operator==(iterator_traits_cpp17_input_iterator const&) const;
};

struct iterator_traits_cpp17_proxy_input_iterator {
  using difference_type = int;
  using value_type = long;

  int operator*();
  iterator_traits_cpp17_proxy_input_iterator& operator++();

  // this returns legcay_input_iterator, not iterator_traits_cpp17_proxy_input_iterator
  iterator_traits_cpp17_input_iterator operator++(int);

  bool operator==(iterator_traits_cpp17_proxy_input_iterator const&) const;
};

struct iterator_traits_cpp17_forward_iterator {
  using difference_type = int;
  using value_type = int;

  int& operator*();
  iterator_traits_cpp17_forward_iterator& operator++();
  iterator_traits_cpp17_forward_iterator operator++(int);

  bool operator==(iterator_traits_cpp17_forward_iterator const&) const;
};

struct iterator_traits_cpp17_bidirectional_iterator {
  using difference_type = int;
  using value_type = int;

  int& operator*();
  iterator_traits_cpp17_bidirectional_iterator& operator++();
  iterator_traits_cpp17_bidirectional_iterator operator++(int);
  iterator_traits_cpp17_bidirectional_iterator& operator--();
  iterator_traits_cpp17_bidirectional_iterator operator--(int);

  bool operator==(iterator_traits_cpp17_bidirectional_iterator const&) const;
};

struct iterator_traits_cpp17_random_access_iterator {
  using difference_type = int;
  using value_type = int;

  int& operator*();
  int& operator[](difference_type);
  iterator_traits_cpp17_random_access_iterator& operator++();
  iterator_traits_cpp17_random_access_iterator operator++(int);
  iterator_traits_cpp17_random_access_iterator& operator--();
  iterator_traits_cpp17_random_access_iterator operator--(int);

  bool operator==(iterator_traits_cpp17_random_access_iterator const&) const;
  bool operator<(iterator_traits_cpp17_random_access_iterator const&) const;
  bool operator>(iterator_traits_cpp17_random_access_iterator const&) const;
  bool operator<=(iterator_traits_cpp17_random_access_iterator const&) const;
  bool operator>=(iterator_traits_cpp17_random_access_iterator const&) const;

  iterator_traits_cpp17_random_access_iterator& operator+=(difference_type);
  iterator_traits_cpp17_random_access_iterator& operator-=(difference_type);

  friend iterator_traits_cpp17_random_access_iterator operator+(iterator_traits_cpp17_random_access_iterator,
                                                                difference_type);
  friend iterator_traits_cpp17_random_access_iterator operator+(difference_type,
                                                                iterator_traits_cpp17_random_access_iterator);
  friend iterator_traits_cpp17_random_access_iterator operator-(iterator_traits_cpp17_random_access_iterator,
                                                                difference_type);
  friend difference_type operator-(iterator_traits_cpp17_random_access_iterator,
                                   iterator_traits_cpp17_random_access_iterator);
};

#endif // TEST_LIBCXX_ITERATORS_ITERATOR_REQUIREMENTS_ITERATOR_ASSOC_TYPES_ITERATOR_TRAITS_ITERATOR_TRAITS_CPP17_ITERATORS
