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 set
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
23int main()
24{
25    {
26    typedef int V;
27    typedef std::set<int> M;
28    {
29        typedef std::pair<M::iterator, M::iterator> R;
30        V ar[] =
31        {
32            5,
33            7,
34            9,
35            11,
36            13,
37            15,
38            17,
39            19
40        };
41        M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
42        R r = m.equal_range(5);
43        assert(r.first == next(m.begin(), 0));
44        assert(r.second == next(m.begin(), 1));
45        r = m.equal_range(7);
46        assert(r.first == next(m.begin(), 1));
47        assert(r.second == next(m.begin(), 2));
48        r = m.equal_range(9);
49        assert(r.first == next(m.begin(), 2));
50        assert(r.second == next(m.begin(), 3));
51        r = m.equal_range(11);
52        assert(r.first == next(m.begin(), 3));
53        assert(r.second == next(m.begin(), 4));
54        r = m.equal_range(13);
55        assert(r.first == next(m.begin(), 4));
56        assert(r.second == next(m.begin(), 5));
57        r = m.equal_range(15);
58        assert(r.first == next(m.begin(), 5));
59        assert(r.second == next(m.begin(), 6));
60        r = m.equal_range(17);
61        assert(r.first == next(m.begin(), 6));
62        assert(r.second == next(m.begin(), 7));
63        r = m.equal_range(19);
64        assert(r.first == next(m.begin(), 7));
65        assert(r.second == next(m.begin(), 8));
66        r = m.equal_range(4);
67        assert(r.first == next(m.begin(), 0));
68        assert(r.second == next(m.begin(), 0));
69        r = m.equal_range(6);
70        assert(r.first == next(m.begin(), 1));
71        assert(r.second == next(m.begin(), 1));
72        r = m.equal_range(8);
73        assert(r.first == next(m.begin(), 2));
74        assert(r.second == next(m.begin(), 2));
75        r = m.equal_range(10);
76        assert(r.first == next(m.begin(), 3));
77        assert(r.second == next(m.begin(), 3));
78        r = m.equal_range(12);
79        assert(r.first == next(m.begin(), 4));
80        assert(r.second == next(m.begin(), 4));
81        r = m.equal_range(14);
82        assert(r.first == next(m.begin(), 5));
83        assert(r.second == next(m.begin(), 5));
84        r = m.equal_range(16);
85        assert(r.first == next(m.begin(), 6));
86        assert(r.second == next(m.begin(), 6));
87        r = m.equal_range(18);
88        assert(r.first == next(m.begin(), 7));
89        assert(r.second == next(m.begin(), 7));
90        r = m.equal_range(20);
91        assert(r.first == next(m.begin(), 8));
92        assert(r.second == next(m.begin(), 8));
93    }
94    {
95        typedef std::pair<M::const_iterator, M::const_iterator> R;
96        V ar[] =
97        {
98            5,
99            7,
100            9,
101            11,
102            13,
103            15,
104            17,
105            19
106        };
107        const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
108        R r = m.equal_range(5);
109        assert(r.first == next(m.begin(), 0));
110        assert(r.second == next(m.begin(), 1));
111        r = m.equal_range(7);
112        assert(r.first == next(m.begin(), 1));
113        assert(r.second == next(m.begin(), 2));
114        r = m.equal_range(9);
115        assert(r.first == next(m.begin(), 2));
116        assert(r.second == next(m.begin(), 3));
117        r = m.equal_range(11);
118        assert(r.first == next(m.begin(), 3));
119        assert(r.second == next(m.begin(), 4));
120        r = m.equal_range(13);
121        assert(r.first == next(m.begin(), 4));
122        assert(r.second == next(m.begin(), 5));
123        r = m.equal_range(15);
124        assert(r.first == next(m.begin(), 5));
125        assert(r.second == next(m.begin(), 6));
126        r = m.equal_range(17);
127        assert(r.first == next(m.begin(), 6));
128        assert(r.second == next(m.begin(), 7));
129        r = m.equal_range(19);
130        assert(r.first == next(m.begin(), 7));
131        assert(r.second == next(m.begin(), 8));
132        r = m.equal_range(4);
133        assert(r.first == next(m.begin(), 0));
134        assert(r.second == next(m.begin(), 0));
135        r = m.equal_range(6);
136        assert(r.first == next(m.begin(), 1));
137        assert(r.second == next(m.begin(), 1));
138        r = m.equal_range(8);
139        assert(r.first == next(m.begin(), 2));
140        assert(r.second == next(m.begin(), 2));
141        r = m.equal_range(10);
142        assert(r.first == next(m.begin(), 3));
143        assert(r.second == next(m.begin(), 3));
144        r = m.equal_range(12);
145        assert(r.first == next(m.begin(), 4));
146        assert(r.second == next(m.begin(), 4));
147        r = m.equal_range(14);
148        assert(r.first == next(m.begin(), 5));
149        assert(r.second == next(m.begin(), 5));
150        r = m.equal_range(16);
151        assert(r.first == next(m.begin(), 6));
152        assert(r.second == next(m.begin(), 6));
153        r = m.equal_range(18);
154        assert(r.first == next(m.begin(), 7));
155        assert(r.second == next(m.begin(), 7));
156        r = m.equal_range(20);
157        assert(r.first == next(m.begin(), 8));
158        assert(r.second == next(m.begin(), 8));
159    }
160    }
161#if __cplusplus >= 201103L
162    {
163    typedef int V;
164    typedef std::set<int, std::less<int>, min_allocator<int>> M;
165    typedef std::pair<M::iterator, M::iterator> R;
166    V ar[] =
167    {
168        5,
169        7,
170        9,
171        11,
172        13,
173        15,
174        17,
175        19
176    };
177    M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
178    R r = m.equal_range(5);
179    assert(r.first == next(m.begin(), 0));
180    assert(r.second == next(m.begin(), 1));
181    r = m.equal_range(7);
182    assert(r.first == next(m.begin(), 1));
183    assert(r.second == next(m.begin(), 2));
184    r = m.equal_range(9);
185    assert(r.first == next(m.begin(), 2));
186    assert(r.second == next(m.begin(), 3));
187    r = m.equal_range(11);
188    assert(r.first == next(m.begin(), 3));
189    assert(r.second == next(m.begin(), 4));
190    r = m.equal_range(13);
191    assert(r.first == next(m.begin(), 4));
192    assert(r.second == next(m.begin(), 5));
193    r = m.equal_range(15);
194    assert(r.first == next(m.begin(), 5));
195    assert(r.second == next(m.begin(), 6));
196    r = m.equal_range(17);
197    assert(r.first == next(m.begin(), 6));
198    assert(r.second == next(m.begin(), 7));
199    r = m.equal_range(19);
200    assert(r.first == next(m.begin(), 7));
201    assert(r.second == next(m.begin(), 8));
202    r = m.equal_range(4);
203    assert(r.first == next(m.begin(), 0));
204    assert(r.second == next(m.begin(), 0));
205    r = m.equal_range(6);
206    assert(r.first == next(m.begin(), 1));
207    assert(r.second == next(m.begin(), 1));
208    r = m.equal_range(8);
209    assert(r.first == next(m.begin(), 2));
210    assert(r.second == next(m.begin(), 2));
211    r = m.equal_range(10);
212    assert(r.first == next(m.begin(), 3));
213    assert(r.second == next(m.begin(), 3));
214    r = m.equal_range(12);
215    assert(r.first == next(m.begin(), 4));
216    assert(r.second == next(m.begin(), 4));
217    r = m.equal_range(14);
218    assert(r.first == next(m.begin(), 5));
219    assert(r.second == next(m.begin(), 5));
220    r = m.equal_range(16);
221    assert(r.first == next(m.begin(), 6));
222    assert(r.second == next(m.begin(), 6));
223    r = m.equal_range(18);
224    assert(r.first == next(m.begin(), 7));
225    assert(r.second == next(m.begin(), 7));
226    r = m.equal_range(20);
227    assert(r.first == next(m.begin(), 8));
228    assert(r.second == next(m.begin(), 8));
229    }
230#endif
231#if _LIBCPP_STD_VER > 11
232    {
233    typedef int V;
234    typedef std::set<V, std::less<>> M;
235    {
236        typedef std::pair<M::iterator, M::iterator> R;
237        V ar[] =
238        {
239            5,
240            7,
241            9,
242            11,
243            13,
244            15,
245            17,
246            19
247        };
248        M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
249        R r = m.equal_range(5);
250        assert(r.first == next(m.begin(), 0));
251        assert(r.second == next(m.begin(), 1));
252        r = m.equal_range(7);
253        assert(r.first == next(m.begin(), 1));
254        assert(r.second == next(m.begin(), 2));
255        r = m.equal_range(9);
256        assert(r.first == next(m.begin(), 2));
257        assert(r.second == next(m.begin(), 3));
258        r = m.equal_range(11);
259        assert(r.first == next(m.begin(), 3));
260        assert(r.second == next(m.begin(), 4));
261        r = m.equal_range(13);
262        assert(r.first == next(m.begin(), 4));
263        assert(r.second == next(m.begin(), 5));
264        r = m.equal_range(15);
265        assert(r.first == next(m.begin(), 5));
266        assert(r.second == next(m.begin(), 6));
267        r = m.equal_range(17);
268        assert(r.first == next(m.begin(), 6));
269        assert(r.second == next(m.begin(), 7));
270        r = m.equal_range(19);
271        assert(r.first == next(m.begin(), 7));
272        assert(r.second == next(m.begin(), 8));
273        r = m.equal_range(4);
274        assert(r.first == next(m.begin(), 0));
275        assert(r.second == next(m.begin(), 0));
276        r = m.equal_range(6);
277        assert(r.first == next(m.begin(), 1));
278        assert(r.second == next(m.begin(), 1));
279        r = m.equal_range(8);
280        assert(r.first == next(m.begin(), 2));
281        assert(r.second == next(m.begin(), 2));
282        r = m.equal_range(10);
283        assert(r.first == next(m.begin(), 3));
284        assert(r.second == next(m.begin(), 3));
285        r = m.equal_range(12);
286        assert(r.first == next(m.begin(), 4));
287        assert(r.second == next(m.begin(), 4));
288        r = m.equal_range(14);
289        assert(r.first == next(m.begin(), 5));
290        assert(r.second == next(m.begin(), 5));
291        r = m.equal_range(16);
292        assert(r.first == next(m.begin(), 6));
293        assert(r.second == next(m.begin(), 6));
294        r = m.equal_range(18);
295        assert(r.first == next(m.begin(), 7));
296        assert(r.second == next(m.begin(), 7));
297        r = m.equal_range(20);
298        assert(r.first == next(m.begin(), 8));
299        assert(r.second == next(m.begin(), 8));
300        }
301    }
302    {
303    typedef PrivateConstructor V;
304    typedef std::set<V, std::less<>> M;
305    typedef std::pair<M::iterator, M::iterator> R;
306
307    M m;
308    m.insert ( V::make ( 5 ));
309    m.insert ( V::make ( 7 ));
310    m.insert ( V::make ( 9 ));
311    m.insert ( V::make ( 11 ));
312    m.insert ( V::make ( 13 ));
313    m.insert ( V::make ( 15 ));
314    m.insert ( V::make ( 17 ));
315    m.insert ( V::make ( 19 ));
316
317    R r = m.equal_range(5);
318    assert(r.first == next(m.begin(), 0));
319    assert(r.second == next(m.begin(), 1));
320    r = m.equal_range(7);
321    assert(r.first == next(m.begin(), 1));
322    assert(r.second == next(m.begin(), 2));
323    r = m.equal_range(9);
324    assert(r.first == next(m.begin(), 2));
325    assert(r.second == next(m.begin(), 3));
326    r = m.equal_range(11);
327    assert(r.first == next(m.begin(), 3));
328    assert(r.second == next(m.begin(), 4));
329    r = m.equal_range(13);
330    assert(r.first == next(m.begin(), 4));
331    assert(r.second == next(m.begin(), 5));
332    r = m.equal_range(15);
333    assert(r.first == next(m.begin(), 5));
334    assert(r.second == next(m.begin(), 6));
335    r = m.equal_range(17);
336    assert(r.first == next(m.begin(), 6));
337    assert(r.second == next(m.begin(), 7));
338    r = m.equal_range(19);
339    assert(r.first == next(m.begin(), 7));
340    assert(r.second == next(m.begin(), 8));
341    r = m.equal_range(4);
342    assert(r.first == next(m.begin(), 0));
343    assert(r.second == next(m.begin(), 0));
344    r = m.equal_range(6);
345    assert(r.first == next(m.begin(), 1));
346    assert(r.second == next(m.begin(), 1));
347    r = m.equal_range(8);
348    assert(r.first == next(m.begin(), 2));
349    assert(r.second == next(m.begin(), 2));
350    r = m.equal_range(10);
351    assert(r.first == next(m.begin(), 3));
352    assert(r.second == next(m.begin(), 3));
353    r = m.equal_range(12);
354    assert(r.first == next(m.begin(), 4));
355    assert(r.second == next(m.begin(), 4));
356    r = m.equal_range(14);
357    assert(r.first == next(m.begin(), 5));
358    assert(r.second == next(m.begin(), 5));
359    r = m.equal_range(16);
360    assert(r.first == next(m.begin(), 6));
361    assert(r.second == next(m.begin(), 6));
362    r = m.equal_range(18);
363    assert(r.first == next(m.begin(), 7));
364    assert(r.second == next(m.begin(), 7));
365    r = m.equal_range(20);
366    assert(r.first == next(m.begin(), 8));
367    assert(r.second == next(m.begin(), 8));
368    }
369#endif
370}
371