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 multiset |
12 | |
13 | // pair<iterator,iterator> equal_range(const key_type& k); |
14 | // pair<const_iterator,const_iterator> equal_range(const key_type& k) const; |
15 | |
16 | #include <set> |
17 | #include <cassert> |
18 | |
19 | #include "test_macros.h" |
20 | #include "min_allocator.h" |
21 | #include "private_constructor.h" |
22 | |
23 | int main(int, char**) { |
24 | { |
25 | typedef int V; |
26 | typedef std::multiset<int> M; |
27 | { |
28 | typedef std::pair<M::iterator, M::iterator> R; |
29 | V ar[] = {5, 5, 5, 7, 7, 7, 9, 9, 9}; |
30 | M m(ar, ar + sizeof(ar) / sizeof(ar[0])); |
31 | R r = m.equal_range(x: 4); |
32 | assert(r.first == std::next(m.begin(), 0)); |
33 | assert(r.second == std::next(m.begin(), 0)); |
34 | r = m.equal_range(x: 5); |
35 | assert(r.first == std::next(m.begin(), 0)); |
36 | assert(r.second == std::next(m.begin(), 3)); |
37 | r = m.equal_range(x: 6); |
38 | assert(r.first == std::next(m.begin(), 3)); |
39 | assert(r.second == std::next(m.begin(), 3)); |
40 | r = m.equal_range(x: 7); |
41 | assert(r.first == std::next(m.begin(), 3)); |
42 | assert(r.second == std::next(m.begin(), 6)); |
43 | r = m.equal_range(x: 8); |
44 | assert(r.first == std::next(m.begin(), 6)); |
45 | assert(r.second == std::next(m.begin(), 6)); |
46 | r = m.equal_range(x: 9); |
47 | assert(r.first == std::next(m.begin(), 6)); |
48 | assert(r.second == std::next(m.begin(), 9)); |
49 | r = m.equal_range(x: 10); |
50 | assert(r.first == std::next(m.begin(), 9)); |
51 | assert(r.second == std::next(m.begin(), 9)); |
52 | } |
53 | { |
54 | typedef std::pair<M::const_iterator, M::const_iterator> R; |
55 | V ar[] = {5, 5, 5, 7, 7, 7, 9, 9, 9}; |
56 | const M m(ar, ar + sizeof(ar) / sizeof(ar[0])); |
57 | R r = m.equal_range(x: 4); |
58 | assert(r.first == std::next(m.begin(), 0)); |
59 | assert(r.second == std::next(m.begin(), 0)); |
60 | r = m.equal_range(x: 5); |
61 | assert(r.first == std::next(m.begin(), 0)); |
62 | assert(r.second == std::next(m.begin(), 3)); |
63 | r = m.equal_range(x: 6); |
64 | assert(r.first == std::next(m.begin(), 3)); |
65 | assert(r.second == std::next(m.begin(), 3)); |
66 | r = m.equal_range(x: 7); |
67 | assert(r.first == std::next(m.begin(), 3)); |
68 | assert(r.second == std::next(m.begin(), 6)); |
69 | r = m.equal_range(x: 8); |
70 | assert(r.first == std::next(m.begin(), 6)); |
71 | assert(r.second == std::next(m.begin(), 6)); |
72 | r = m.equal_range(x: 9); |
73 | assert(r.first == std::next(m.begin(), 6)); |
74 | assert(r.second == std::next(m.begin(), 9)); |
75 | r = m.equal_range(x: 10); |
76 | assert(r.first == std::next(m.begin(), 9)); |
77 | assert(r.second == std::next(m.begin(), 9)); |
78 | } |
79 | } |
80 | #if TEST_STD_VER >= 11 |
81 | { |
82 | typedef int V; |
83 | typedef std::multiset<int, std::less<int>, min_allocator<int>> M; |
84 | { |
85 | typedef std::pair<M::iterator, M::iterator> R; |
86 | V ar[] = {5, 5, 5, 7, 7, 7, 9, 9, 9}; |
87 | M m(ar, ar + sizeof(ar) / sizeof(ar[0])); |
88 | R r = m.equal_range(4); |
89 | assert(r.first == std::next(m.begin(), 0)); |
90 | assert(r.second == std::next(m.begin(), 0)); |
91 | r = m.equal_range(5); |
92 | assert(r.first == std::next(m.begin(), 0)); |
93 | assert(r.second == std::next(m.begin(), 3)); |
94 | r = m.equal_range(6); |
95 | assert(r.first == std::next(m.begin(), 3)); |
96 | assert(r.second == std::next(m.begin(), 3)); |
97 | r = m.equal_range(7); |
98 | assert(r.first == std::next(m.begin(), 3)); |
99 | assert(r.second == std::next(m.begin(), 6)); |
100 | r = m.equal_range(8); |
101 | assert(r.first == std::next(m.begin(), 6)); |
102 | assert(r.second == std::next(m.begin(), 6)); |
103 | r = m.equal_range(9); |
104 | assert(r.first == std::next(m.begin(), 6)); |
105 | assert(r.second == std::next(m.begin(), 9)); |
106 | r = m.equal_range(10); |
107 | assert(r.first == std::next(m.begin(), 9)); |
108 | assert(r.second == std::next(m.begin(), 9)); |
109 | } |
110 | { |
111 | typedef std::pair<M::const_iterator, M::const_iterator> R; |
112 | V ar[] = {5, 5, 5, 7, 7, 7, 9, 9, 9}; |
113 | const M m(ar, ar + sizeof(ar) / sizeof(ar[0])); |
114 | R r = m.equal_range(4); |
115 | assert(r.first == std::next(m.begin(), 0)); |
116 | assert(r.second == std::next(m.begin(), 0)); |
117 | r = m.equal_range(5); |
118 | assert(r.first == std::next(m.begin(), 0)); |
119 | assert(r.second == std::next(m.begin(), 3)); |
120 | r = m.equal_range(6); |
121 | assert(r.first == std::next(m.begin(), 3)); |
122 | assert(r.second == std::next(m.begin(), 3)); |
123 | r = m.equal_range(7); |
124 | assert(r.first == std::next(m.begin(), 3)); |
125 | assert(r.second == std::next(m.begin(), 6)); |
126 | r = m.equal_range(8); |
127 | assert(r.first == std::next(m.begin(), 6)); |
128 | assert(r.second == std::next(m.begin(), 6)); |
129 | r = m.equal_range(9); |
130 | assert(r.first == std::next(m.begin(), 6)); |
131 | assert(r.second == std::next(m.begin(), 9)); |
132 | r = m.equal_range(10); |
133 | assert(r.first == std::next(m.begin(), 9)); |
134 | assert(r.second == std::next(m.begin(), 9)); |
135 | } |
136 | } |
137 | #endif |
138 | #if TEST_STD_VER > 11 |
139 | { |
140 | typedef int V; |
141 | typedef std::multiset<V, std::less<>> M; |
142 | typedef std::pair<M::iterator, M::iterator> R; |
143 | V ar[] = {5, 5, 5, 7, 7, 7, 9, 9, 9}; |
144 | M m(ar, ar + sizeof(ar) / sizeof(ar[0])); |
145 | R r = m.equal_range(4); |
146 | assert(r.first == std::next(m.begin(), 0)); |
147 | assert(r.second == std::next(m.begin(), 0)); |
148 | r = m.equal_range(5); |
149 | assert(r.first == std::next(m.begin(), 0)); |
150 | assert(r.second == std::next(m.begin(), 3)); |
151 | r = m.equal_range(6); |
152 | assert(r.first == std::next(m.begin(), 3)); |
153 | assert(r.second == std::next(m.begin(), 3)); |
154 | r = m.equal_range(7); |
155 | assert(r.first == std::next(m.begin(), 3)); |
156 | assert(r.second == std::next(m.begin(), 6)); |
157 | r = m.equal_range(8); |
158 | assert(r.first == std::next(m.begin(), 6)); |
159 | assert(r.second == std::next(m.begin(), 6)); |
160 | r = m.equal_range(9); |
161 | assert(r.first == std::next(m.begin(), 6)); |
162 | assert(r.second == std::next(m.begin(), 9)); |
163 | r = m.equal_range(10); |
164 | assert(r.first == std::next(m.begin(), 9)); |
165 | assert(r.second == std::next(m.begin(), 9)); |
166 | } |
167 | |
168 | { |
169 | typedef PrivateConstructor V; |
170 | typedef std::multiset<V, std::less<>> M; |
171 | typedef std::pair<M::iterator, M::iterator> R; |
172 | |
173 | M m; |
174 | m.insert(V::make(5)); |
175 | m.insert(V::make(5)); |
176 | m.insert(V::make(5)); |
177 | m.insert(V::make(7)); |
178 | m.insert(V::make(7)); |
179 | m.insert(V::make(7)); |
180 | m.insert(V::make(9)); |
181 | m.insert(V::make(9)); |
182 | m.insert(V::make(9)); |
183 | |
184 | R r = m.equal_range(4); |
185 | assert(r.first == std::next(m.begin(), 0)); |
186 | assert(r.second == std::next(m.begin(), 0)); |
187 | r = m.equal_range(5); |
188 | assert(r.first == std::next(m.begin(), 0)); |
189 | assert(r.second == std::next(m.begin(), 3)); |
190 | r = m.equal_range(6); |
191 | assert(r.first == std::next(m.begin(), 3)); |
192 | assert(r.second == std::next(m.begin(), 3)); |
193 | r = m.equal_range(7); |
194 | assert(r.first == std::next(m.begin(), 3)); |
195 | assert(r.second == std::next(m.begin(), 6)); |
196 | r = m.equal_range(8); |
197 | assert(r.first == std::next(m.begin(), 6)); |
198 | assert(r.second == std::next(m.begin(), 6)); |
199 | r = m.equal_range(9); |
200 | assert(r.first == std::next(m.begin(), 6)); |
201 | assert(r.second == std::next(m.begin(), 9)); |
202 | r = m.equal_range(10); |
203 | assert(r.first == std::next(m.begin(), 9)); |
204 | assert(r.second == std::next(m.begin(), 9)); |
205 | } |
206 | #endif |
207 | |
208 | return 0; |
209 | } |
210 | |