1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: c++03, c++11, c++14, c++17
10
11// <iterator>
12
13// move_sentinel
14
15// template <class Iter, class Sent>
16// constexpr bool operator==(const move_iterator<Iter>& x, const move_sentinel<Sent>& y);
17
18#include <iterator>
19#include <cassert>
20
21#include "test_macros.h"
22#include "test_iterators.h"
23
24template<class T, class U> concept HasEquals = requires (T t, U u) { t == u; };
25template<class T, class U> concept HasNotEquals = requires (T t, U u) { t != u; };
26template<class T, class U> concept HasLess = requires (T t, U u) { t < u; };
27
28static_assert(!HasEquals<std::move_iterator<int*>, std::move_sentinel<char*>>);
29static_assert(!HasNotEquals<std::move_iterator<int*>, std::move_sentinel<char*>>);
30static_assert(!HasLess<std::move_iterator<int*>, std::move_sentinel<char*>>);
31
32static_assert( HasEquals<std::move_iterator<int*>, std::move_sentinel<const int*>>);
33static_assert( HasNotEquals<std::move_iterator<int*>, std::move_sentinel<const int*>>);
34static_assert(!HasLess<std::move_iterator<int*>, std::move_sentinel<const int*>>);
35
36static_assert( HasEquals<std::move_iterator<const int*>, std::move_sentinel<int*>>);
37static_assert( HasNotEquals<std::move_iterator<const int*>, std::move_sentinel<int*>>);
38static_assert(!HasLess<std::move_iterator<const int*>, std::move_sentinel<int*>>);
39
40template <class It>
41constexpr void test_one() {
42 char s[] = "abc";
43 const auto it = std::move_iterator<It>(It(s));
44 const auto sent1 = std::move_sentinel<sentinel_wrapper<It>>(sentinel_wrapper<It>(It(s)));
45 const auto sent2 = std::move_sentinel<sentinel_wrapper<It>>(sentinel_wrapper<It>(It(s + 1)));
46 ASSERT_SAME_TYPE(decltype(it == sent1), bool);
47 assert( (it == sent1));
48 assert(!(it != sent1));
49 assert(!(it == sent2));
50 assert( (it != sent2));
51 assert( (sent1 == it));
52 assert(!(sent1 != it));
53 assert(!(sent2 == it));
54 assert( (sent2 != it));
55 static_assert(!HasEquals<decltype(sent1), decltype(sent1)>);
56 static_assert(!HasLess<decltype(sent1), decltype(sent1)>);
57}
58
59constexpr bool test() {
60 test_one<cpp17_input_iterator<char*>>();
61 test_one<cpp20_input_iterator<char*>>();
62 test_one<forward_iterator<char*>>();
63 test_one<bidirectional_iterator<char*>>();
64 test_one<random_access_iterator<char*>>();
65 test_one<contiguous_iterator<char*>>();
66 test_one<three_way_contiguous_iterator<char*>>();
67 test_one<char*>();
68 test_one<const char*>();
69
70 return true;
71}
72
73int main(int, char**) {
74 test();
75 static_assert(test());
76
77 return 0;
78}
79

source code of libcxx/test/std/iterators/predef.iterators/move.iterators/move.sentinel/op_eq.pass.cpp