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

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