//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include <algorithm>
#include <cassert>
#include <iterator>
#include "test_macros.h"
template <class T>
struct Iterator {
using value_type = T;
using pointer = value_type*;
using difference_type = std::ptrdiff_t;
using iterator_category = std::forward_iterator_tag;
struct reference {
T* ptr_;
reference(T* ptr) : ptr_(ptr) {}
friend bool operator<(reference a, reference b) { return *a.ptr_ < *b.ptr_; }
friend bool operator<(reference a, value_type const& b) { return *a.ptr_ < b; }
friend bool operator<(value_type const& a, reference b) { return a < *b.ptr_; }
operator T&() const;
};
Iterator& operator++() {
ptr_++;
return *this;
}
Iterator operator++(int) {
Iterator tmp = *this;
ptr_++;
return tmp;
}
friend bool operator==(Iterator const& a, Iterator const& b) { return a.ptr_ == b.ptr_; }
friend bool operator!=(Iterator const& a, Iterator const& b) { return !(a == b); }
reference operator*() const { return reference(ptr_); }
explicit Iterator(T* ptr) : ptr_(ptr) {}
Iterator() = default;
Iterator(Iterator const&) = default;
Iterator(Iterator&&) = default;
Iterator& operator=(Iterator const&) = default;
Iterator& operator=(Iterator&&) = default;
private:
T* ptr_;
};
int main(int, char**) {
int array[5] = {1, 2, 3, 4, 5};
Iterator<int> first(array);
Iterator<int> middle(array + 3);
Iterator<int> last(array + 5);
(void)std::binary_search(first, last, 3);
(void)std::equal_range(first, last, 3);
(void)std::includes(first, last, first, last);
(void)std::is_sorted_until(first, last);
(void)std::is_sorted(first, last);
(void)std::lexicographical_compare(first, last, first, last);
(void)std::lower_bound(first, last, 3);
(void)std::max_element(first, last);
(void)std::min_element(first, last);
(void)std::minmax_element(first, last);
(void)std::upper_bound(first, last, 3);
return 0;
}