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
23int 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

source code of libcxx/test/std/containers/associative/multiset/equal_range.pass.cpp