1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <set>
11 
12 // class multiset
13 
14 // pair<iterator,iterator>             equal_range(const key_type& k);
15 // pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
16 
17 #include <set>
18 #include <cassert>
19 
20 #include "min_allocator.h"
21 #include "private_constructor.hpp"
22 
main()23 int main()
24 {
25     {
26     typedef int V;
27     typedef std::multiset<int> M;
28     {
29         typedef std::pair<M::iterator, M::iterator> R;
30         V ar[] =
31         {
32             5,
33             5,
34             5,
35             7,
36             7,
37             7,
38             9,
39             9,
40             9
41         };
42         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
43         R r = m.equal_range(4);
44         assert(r.first  == next(m.begin(), 0));
45         assert(r.second == next(m.begin(), 0));
46         r = m.equal_range(5);
47         assert(r.first  == next(m.begin(), 0));
48         assert(r.second == next(m.begin(), 3));
49         r = m.equal_range(6);
50         assert(r.first  == next(m.begin(), 3));
51         assert(r.second == next(m.begin(), 3));
52         r = m.equal_range(7);
53         assert(r.first  == next(m.begin(), 3));
54         assert(r.second == next(m.begin(), 6));
55         r = m.equal_range(8);
56         assert(r.first  == next(m.begin(), 6));
57         assert(r.second == next(m.begin(), 6));
58         r = m.equal_range(9);
59         assert(r.first  == next(m.begin(), 6));
60         assert(r.second == next(m.begin(), 9));
61         r = m.equal_range(10);
62         assert(r.first  == next(m.begin(), 9));
63         assert(r.second == next(m.begin(), 9));
64     }
65     {
66         typedef std::pair<M::const_iterator, M::const_iterator> R;
67         V ar[] =
68         {
69             5,
70             5,
71             5,
72             7,
73             7,
74             7,
75             9,
76             9,
77             9
78         };
79         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
80         R r = m.equal_range(4);
81         assert(r.first  == next(m.begin(), 0));
82         assert(r.second == next(m.begin(), 0));
83         r = m.equal_range(5);
84         assert(r.first  == next(m.begin(), 0));
85         assert(r.second == next(m.begin(), 3));
86         r = m.equal_range(6);
87         assert(r.first  == next(m.begin(), 3));
88         assert(r.second == next(m.begin(), 3));
89         r = m.equal_range(7);
90         assert(r.first  == next(m.begin(), 3));
91         assert(r.second == next(m.begin(), 6));
92         r = m.equal_range(8);
93         assert(r.first  == next(m.begin(), 6));
94         assert(r.second == next(m.begin(), 6));
95         r = m.equal_range(9);
96         assert(r.first  == next(m.begin(), 6));
97         assert(r.second == next(m.begin(), 9));
98         r = m.equal_range(10);
99         assert(r.first  == next(m.begin(), 9));
100         assert(r.second == next(m.begin(), 9));
101     }
102     }
103 #if __cplusplus >= 201103L
104     {
105     typedef int V;
106     typedef std::multiset<int, std::less<int>, min_allocator<int>> M;
107     {
108         typedef std::pair<M::iterator, M::iterator> R;
109         V ar[] =
110         {
111             5,
112             5,
113             5,
114             7,
115             7,
116             7,
117             9,
118             9,
119             9
120         };
121         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
122         R r = m.equal_range(4);
123         assert(r.first  == next(m.begin(), 0));
124         assert(r.second == next(m.begin(), 0));
125         r = m.equal_range(5);
126         assert(r.first  == next(m.begin(), 0));
127         assert(r.second == next(m.begin(), 3));
128         r = m.equal_range(6);
129         assert(r.first  == next(m.begin(), 3));
130         assert(r.second == next(m.begin(), 3));
131         r = m.equal_range(7);
132         assert(r.first  == next(m.begin(), 3));
133         assert(r.second == next(m.begin(), 6));
134         r = m.equal_range(8);
135         assert(r.first  == next(m.begin(), 6));
136         assert(r.second == next(m.begin(), 6));
137         r = m.equal_range(9);
138         assert(r.first  == next(m.begin(), 6));
139         assert(r.second == next(m.begin(), 9));
140         r = m.equal_range(10);
141         assert(r.first  == next(m.begin(), 9));
142         assert(r.second == next(m.begin(), 9));
143     }
144     {
145         typedef std::pair<M::const_iterator, M::const_iterator> R;
146         V ar[] =
147         {
148             5,
149             5,
150             5,
151             7,
152             7,
153             7,
154             9,
155             9,
156             9
157         };
158         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
159         R r = m.equal_range(4);
160         assert(r.first  == next(m.begin(), 0));
161         assert(r.second == next(m.begin(), 0));
162         r = m.equal_range(5);
163         assert(r.first  == next(m.begin(), 0));
164         assert(r.second == next(m.begin(), 3));
165         r = m.equal_range(6);
166         assert(r.first  == next(m.begin(), 3));
167         assert(r.second == next(m.begin(), 3));
168         r = m.equal_range(7);
169         assert(r.first  == next(m.begin(), 3));
170         assert(r.second == next(m.begin(), 6));
171         r = m.equal_range(8);
172         assert(r.first  == next(m.begin(), 6));
173         assert(r.second == next(m.begin(), 6));
174         r = m.equal_range(9);
175         assert(r.first  == next(m.begin(), 6));
176         assert(r.second == next(m.begin(), 9));
177         r = m.equal_range(10);
178         assert(r.first  == next(m.begin(), 9));
179         assert(r.second == next(m.begin(), 9));
180     }
181     }
182 #endif
183 #if _LIBCPP_STD_VER > 11
184     {
185     typedef int V;
186     typedef std::multiset<V, std::less<>> M;
187     typedef std::pair<M::iterator, M::iterator> R;
188     V ar[] =
189     {
190         5,
191         5,
192         5,
193         7,
194         7,
195         7,
196         9,
197         9,
198         9
199     };
200     M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
201     R r = m.equal_range(4);
202     assert(r.first  == next(m.begin(), 0));
203     assert(r.second == next(m.begin(), 0));
204     r = m.equal_range(5);
205     assert(r.first  == next(m.begin(), 0));
206     assert(r.second == next(m.begin(), 3));
207     r = m.equal_range(6);
208     assert(r.first  == next(m.begin(), 3));
209     assert(r.second == next(m.begin(), 3));
210     r = m.equal_range(7);
211     assert(r.first  == next(m.begin(), 3));
212     assert(r.second == next(m.begin(), 6));
213     r = m.equal_range(8);
214     assert(r.first  == next(m.begin(), 6));
215     assert(r.second == next(m.begin(), 6));
216     r = m.equal_range(9);
217     assert(r.first  == next(m.begin(), 6));
218     assert(r.second == next(m.begin(), 9));
219     r = m.equal_range(10);
220     assert(r.first  == next(m.begin(), 9));
221     assert(r.second == next(m.begin(), 9));
222     }
223 
224     {
225     typedef PrivateConstructor V;
226     typedef std::multiset<V, std::less<>> M;
227     typedef std::pair<M::iterator, M::iterator> R;
228 
229     M m;
230     m.insert ( V::make ( 5 ));
231     m.insert ( V::make ( 5 ));
232     m.insert ( V::make ( 5 ));
233     m.insert ( V::make ( 7 ));
234     m.insert ( V::make ( 7 ));
235     m.insert ( V::make ( 7 ));
236     m.insert ( V::make ( 9 ));
237     m.insert ( V::make ( 9 ));
238     m.insert ( V::make ( 9 ));
239 
240     R r = m.equal_range(4);
241     assert(r.first  == next(m.begin(), 0));
242     assert(r.second == next(m.begin(), 0));
243     r = m.equal_range(5);
244     assert(r.first  == next(m.begin(), 0));
245     assert(r.second == next(m.begin(), 3));
246     r = m.equal_range(6);
247     assert(r.first  == next(m.begin(), 3));
248     assert(r.second == next(m.begin(), 3));
249     r = m.equal_range(7);
250     assert(r.first  == next(m.begin(), 3));
251     assert(r.second == next(m.begin(), 6));
252     r = m.equal_range(8);
253     assert(r.first  == next(m.begin(), 6));
254     assert(r.second == next(m.begin(), 6));
255     r = m.equal_range(9);
256     assert(r.first  == next(m.begin(), 6));
257     assert(r.second == next(m.begin(), 9));
258     r = m.equal_range(10);
259     assert(r.first  == next(m.begin(), 9));
260     assert(r.second == next(m.begin(), 9));
261     }
262 #endif
263 }
264