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// <set>
10
11// class set
12
13// iterator begin();
14// const_iterator begin() const;
15// iterator end();
16// const_iterator end() const;
17//
18// reverse_iterator rbegin();
19// const_reverse_iterator rbegin() const;
20// reverse_iterator rend();
21// const_reverse_iterator rend() const;
22//
23// const_iterator cbegin() const;
24// const_iterator cend() const;
25// const_reverse_iterator crbegin() const;
26// const_reverse_iterator crend() const;
27
28#include <set>
29#include <cassert>
30#include <cstddef>
31
32#include "test_macros.h"
33#include "min_allocator.h"
34
35int main(int, char**) {
36 {
37 typedef int V;
38 V ar[] = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8};
39 std::set<int> m(ar, ar + sizeof(ar) / sizeof(ar[0]));
40 assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
41 assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
42 std::set<int>::iterator i;
43 i = m.begin();
44 std::set<int>::const_iterator k = i;
45 assert(i == k);
46 for (int j = 1; j <= static_cast<int>(m.size()); ++j, ++i)
47 assert(*i == j);
48 assert(i == m.end());
49 for (int j = static_cast<int>(m.size()); j >= 1; --j) {
50 --i;
51 assert(*i == j);
52 }
53 assert(i == m.begin());
54 }
55 {
56 typedef int V;
57 V ar[] = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8};
58 const std::set<int> m(ar, ar + sizeof(ar) / sizeof(ar[0]));
59 assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
60 assert(static_cast<std::size_t>(std::distance(m.cbegin(), m.cend())) == m.size());
61 assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
62 assert(static_cast<std::size_t>(std::distance(m.crbegin(), m.crend())) == m.size());
63 std::set<int>::const_iterator i;
64 i = m.begin();
65 for (int j = 1; j <= static_cast<int>(m.size()); ++j, ++i)
66 assert(*i == j);
67 assert(i == m.end());
68 for (int j = static_cast<int>(m.size()); j >= 1; --j) {
69 --i;
70 assert(*i == j);
71 }
72 assert(i == m.begin());
73 }
74#if TEST_STD_VER >= 11
75 {
76 typedef int V;
77 V ar[] = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8};
78 std::set<int, std::less<int>, min_allocator<int>> m(ar, ar + sizeof(ar) / sizeof(ar[0]));
79 assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
80 assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
81 std::set<int, std::less<int>, min_allocator<int>>::iterator i;
82 i = m.begin();
83 std::set<int, std::less<int>, min_allocator<int>>::const_iterator k = i;
84 assert(i == k);
85 for (int j = 1; j <= static_cast<int>(m.size()); ++j, ++i)
86 assert(*i == j);
87 assert(i == m.end());
88 for (int j = static_cast<int>(m.size()); j >= 1; --j) {
89 --i;
90 assert(*i == j);
91 }
92 assert(i == m.begin());
93 }
94 {
95 typedef int V;
96 V ar[] = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8};
97 const std::set<int, std::less<int>, min_allocator<int>> m(ar, ar + sizeof(ar) / sizeof(ar[0]));
98 assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
99 assert(static_cast<std::size_t>(std::distance(m.cbegin(), m.cend())) == m.size());
100 assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
101 assert(static_cast<std::size_t>(std::distance(m.crbegin(), m.crend())) == m.size());
102 std::set<int, std::less<int>, min_allocator<int>>::const_iterator i;
103 i = m.begin();
104 for (int j = 1; j <= static_cast<int>(m.size()); ++j, ++i)
105 assert(*i == j);
106 assert(i == m.end());
107 for (int j = static_cast<int>(m.size()); j >= 1; --j) {
108 --i;
109 assert(*i == j);
110 }
111 assert(i == m.begin());
112 }
113#endif
114#if TEST_STD_VER > 11
115 { // N3644 testing
116 typedef std::set<int> C;
117 C::iterator ii1{}, ii2{};
118 C::iterator ii4 = ii1;
119 C::const_iterator cii{};
120 assert(ii1 == ii2);
121 assert(ii1 == ii4);
122
123 assert(!(ii1 != ii2));
124
125 assert((ii1 == cii));
126 assert((cii == ii1));
127 assert(!(ii1 != cii));
128 assert(!(cii != ii1));
129 }
130#endif
131
132 return 0;
133}
134

source code of libcxx/test/std/containers/associative/set/iterator.pass.cpp