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// <map>
10
11// class map
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 <map>
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 std::pair<const int, double> V;
38 V ar[] = {V(1, 1), V(1, 1.5), V(1, 2), V(2, 1), V(2, 1.5), V(2, 2), V(3, 1), V(3, 1.5),
39 V(3, 2), V(4, 1), V(4, 1.5), V(4, 2), V(5, 1), V(5, 1.5), V(5, 2), V(6, 1),
40 V(6, 1.5), V(6, 2), V(7, 1), V(7, 1.5), V(7, 2), V(8, 1), V(8, 1.5), V(8, 2)};
41 std::map<int, double> m(ar, ar + sizeof(ar) / sizeof(ar[0]));
42 assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
43 assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
44 std::map<int, double>::iterator i;
45 i = m.begin();
46 std::map<int, double>::const_iterator k = i;
47 assert(i == k);
48 for (int j = 1; static_cast<std::size_t>(j) <= m.size(); ++j, ++i) {
49 assert(i->first == j);
50 assert(i->second == 1);
51 i->second = 2.5;
52 assert(i->second == 2.5);
53 }
54 assert(i == m.end());
55 for (int j = m.size(); j >= 1; --j) {
56 --i;
57 assert(i->first == j);
58 assert(i->second == 2.5);
59 i->second = 1;
60 assert(i->second == 1);
61 }
62 assert(i == m.begin());
63 }
64 {
65 typedef std::pair<const int, double> V;
66 V ar[] = {V(1, 1), V(1, 1.5), V(1, 2), V(2, 1), V(2, 1.5), V(2, 2), V(3, 1), V(3, 1.5),
67 V(3, 2), V(4, 1), V(4, 1.5), V(4, 2), V(5, 1), V(5, 1.5), V(5, 2), V(6, 1),
68 V(6, 1.5), V(6, 2), V(7, 1), V(7, 1.5), V(7, 2), V(8, 1), V(8, 1.5), V(8, 2)};
69 const std::map<int, double> m(ar, ar + sizeof(ar) / sizeof(ar[0]));
70 assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
71 assert(static_cast<std::size_t>(std::distance(m.cbegin(), m.cend())) == m.size());
72 assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
73 assert(static_cast<std::size_t>(std::distance(m.crbegin(), m.crend())) == m.size());
74 std::map<int, double>::const_iterator i;
75 i = m.begin();
76 for (int j = 1; static_cast<std::size_t>(j) <= m.size(); ++j, ++i) {
77 assert(i->first == j);
78 assert(i->second == 1);
79 }
80 assert(i == m.end());
81 for (int j = m.size(); j >= 1; --j) {
82 --i;
83 assert(i->first == j);
84 assert(i->second == 1);
85 }
86 assert(i == m.begin());
87 }
88#if TEST_STD_VER >= 11
89 {
90 typedef std::pair<const int, double> V;
91 V ar[] = {V(1, 1), V(1, 1.5), V(1, 2), V(2, 1), V(2, 1.5), V(2, 2), V(3, 1), V(3, 1.5),
92 V(3, 2), V(4, 1), V(4, 1.5), V(4, 2), V(5, 1), V(5, 1.5), V(5, 2), V(6, 1),
93 V(6, 1.5), V(6, 2), V(7, 1), V(7, 1.5), V(7, 2), V(8, 1), V(8, 1.5), V(8, 2)};
94 std::map<int, double, std::less<int>, min_allocator<V>> m(ar, ar + sizeof(ar) / sizeof(ar[0]));
95 assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
96 assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
97 std::map<int, double, std::less<int>, min_allocator<V>>::iterator i;
98 i = m.begin();
99 std::map<int, double, std::less<int>, min_allocator<V>>::const_iterator k = i;
100 assert(i == k);
101 for (int j = 1; static_cast<std::size_t>(j) <= m.size(); ++j, ++i) {
102 assert(i->first == j);
103 assert(i->second == 1);
104 i->second = 2.5;
105 assert(i->second == 2.5);
106 }
107 assert(i == m.end());
108 for (int j = m.size(); j >= 1; --j) {
109 --i;
110 assert(i->first == j);
111 assert(i->second == 2.5);
112 i->second = 1;
113 assert(i->second == 1);
114 }
115 assert(i == m.begin());
116 }
117 {
118 typedef std::pair<const int, double> V;
119 V ar[] = {V(1, 1), V(1, 1.5), V(1, 2), V(2, 1), V(2, 1.5), V(2, 2), V(3, 1), V(3, 1.5),
120 V(3, 2), V(4, 1), V(4, 1.5), V(4, 2), V(5, 1), V(5, 1.5), V(5, 2), V(6, 1),
121 V(6, 1.5), V(6, 2), V(7, 1), V(7, 1.5), V(7, 2), V(8, 1), V(8, 1.5), V(8, 2)};
122 const std::map<int, double, std::less<int>, min_allocator<V>> m(ar, ar + sizeof(ar) / sizeof(ar[0]));
123 assert(static_cast<std::size_t>(std::distance(m.begin(), m.end())) == m.size());
124 assert(static_cast<std::size_t>(std::distance(m.cbegin(), m.cend())) == m.size());
125 assert(static_cast<std::size_t>(std::distance(m.rbegin(), m.rend())) == m.size());
126 assert(static_cast<std::size_t>(std::distance(m.crbegin(), m.crend())) == m.size());
127 std::map<int, double, std::less<int>, min_allocator<V>>::const_iterator i;
128 i = m.begin();
129 for (int j = 1; static_cast<std::size_t>(j) <= m.size(); ++j, ++i) {
130 assert(i->first == j);
131 assert(i->second == 1);
132 }
133 assert(i == m.end());
134 for (int j = m.size(); j >= 1; --j) {
135 --i;
136 assert(i->first == j);
137 assert(i->second == 1);
138 }
139 assert(i == m.begin());
140 }
141#endif
142#if TEST_STD_VER > 11
143 { // N3644 testing
144 typedef std::map<int, double> C;
145 C::iterator ii1{}, ii2{};
146 C::iterator ii4 = ii1;
147 C::const_iterator cii{};
148 assert(ii1 == ii2);
149 assert(ii1 == ii4);
150
151 assert(!(ii1 != ii2));
152
153 assert((ii1 == cii));
154 assert((cii == ii1));
155 assert(!(ii1 != cii));
156 assert(!(cii != ii1));
157 }
158#endif
159
160 return 0;
161}
162

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