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