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 // <map>
11 
12 // class multimap
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 <map>
18 #include <cassert>
19 
20 #include "min_allocator.h"
21 #include "private_constructor.hpp"
22 
main()23 int main()
24 {
25     typedef std::pair<const int, double> V;
26     {
27     typedef std::multimap<int, double> M;
28     {
29         typedef std::pair<M::iterator, M::iterator> R;
30         V ar[] =
31         {
32             V(5, 1),
33             V(5, 2),
34             V(5, 3),
35             V(7, 1),
36             V(7, 2),
37             V(7, 3),
38             V(9, 1),
39             V(9, 2),
40             V(9, 3)
41         };
42         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
43         R r = m.equal_range(4);
44         assert(r.first == m.begin());
45         assert(r.second == m.begin());
46         r = m.equal_range(5);
47         assert(r.first == m.begin());
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 == m.end());
63         assert(r.second == m.end());
64     }
65     {
66         typedef std::pair<M::const_iterator, M::const_iterator> R;
67         V ar[] =
68         {
69             V(5, 1),
70             V(5, 2),
71             V(5, 3),
72             V(7, 1),
73             V(7, 2),
74             V(7, 3),
75             V(9, 1),
76             V(9, 2),
77             V(9, 3)
78         };
79         const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
80         R r = m.equal_range(4);
81         assert(r.first == m.begin());
82         assert(r.second == m.begin());
83         r = m.equal_range(5);
84         assert(r.first == m.begin());
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 == m.end());
100         assert(r.second == m.end());
101     }
102     }
103 #if __cplusplus >= 201103L
104     {
105     typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
106     {
107         typedef std::pair<M::iterator, M::iterator> R;
108         V ar[] =
109         {
110             V(5, 1),
111             V(5, 2),
112             V(5, 3),
113             V(7, 1),
114             V(7, 2),
115             V(7, 3),
116             V(9, 1),
117             V(9, 2),
118             V(9, 3)
119         };
120         M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
121         R r = m.equal_range(4);
122         assert(r.first == m.begin());
123         assert(r.second == m.begin());
124         r = m.equal_range(5);
125         assert(r.first == m.begin());
126         assert(r.second == next(m.begin(), 3));
127         r = m.equal_range(6);
128         assert(r.first == next(m.begin(), 3));
129         assert(r.second == next(m.begin(), 3));
130         r = m.equal_range(7);
131         assert(r.first == next(m.begin(), 3));
132         assert(r.second == next(m.begin(), 6));
133         r = m.equal_range(8);
134         assert(r.first == next(m.begin(), 6));
135         assert(r.second == next(m.begin(), 6));
136         r = m.equal_range(9);
137         assert(r.first == next(m.begin(), 6));
138         assert(r.second == next(m.begin(), 9));
139         r = m.equal_range(10);
140         assert(r.first == m.end());
141         assert(r.second == m.end());
142     }
143     {
144         typedef std::pair<M::const_iterator, M::const_iterator> R;
145         V ar[] =
146         {
147             V(5, 1),
148             V(5, 2),
149             V(5, 3),
150             V(7, 1),
151             V(7, 2),
152             V(7, 3),
153             V(9, 1),
154             V(9, 2),
155             V(9, 3)
156         };
157         const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
158         R r = m.equal_range(4);
159         assert(r.first == m.begin());
160         assert(r.second == m.begin());
161         r = m.equal_range(5);
162         assert(r.first == m.begin());
163         assert(r.second == next(m.begin(), 3));
164         r = m.equal_range(6);
165         assert(r.first == next(m.begin(), 3));
166         assert(r.second == next(m.begin(), 3));
167         r = m.equal_range(7);
168         assert(r.first == next(m.begin(), 3));
169         assert(r.second == next(m.begin(), 6));
170         r = m.equal_range(8);
171         assert(r.first == next(m.begin(), 6));
172         assert(r.second == next(m.begin(), 6));
173         r = m.equal_range(9);
174         assert(r.first == next(m.begin(), 6));
175         assert(r.second == next(m.begin(), 9));
176         r = m.equal_range(10);
177         assert(r.first == m.end());
178         assert(r.second == m.end());
179     }
180     }
181 #endif
182 #if _LIBCPP_STD_VER > 11
183     {
184     typedef std::pair<const int, double> V;
185     typedef std::multimap<int, double, std::less<>> M;
186 
187     typedef std::pair<M::iterator, M::iterator> R;
188     V ar[] =
189     {
190         V(5, 1),
191         V(5, 2),
192         V(5, 3),
193         V(7, 1),
194         V(7, 2),
195         V(7, 3),
196         V(9, 1),
197         V(9, 2),
198         V(9, 3)
199     };
200     M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
201     R r = m.equal_range(4);
202     assert(r.first == m.begin());
203     assert(r.second == m.begin());
204     r = m.equal_range(5);
205     assert(r.first == m.begin());
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 == m.end());
221     assert(r.second == m.end());
222     }
223 
224     {
225     typedef PrivateConstructor PC;
226     typedef std::multimap<PC, double, std::less<>> M;
227     typedef std::pair<M::iterator, M::iterator> R;
228 
229     M m;
230     m.insert ( std::make_pair<PC, double> ( PC::make(5), 1 ));
231     m.insert ( std::make_pair<PC, double> ( PC::make(5), 2 ));
232     m.insert ( std::make_pair<PC, double> ( PC::make(5), 3 ));
233     m.insert ( std::make_pair<PC, double> ( PC::make(7), 1 ));
234     m.insert ( std::make_pair<PC, double> ( PC::make(7), 2 ));
235     m.insert ( std::make_pair<PC, double> ( PC::make(7), 3 ));
236     m.insert ( std::make_pair<PC, double> ( PC::make(9), 1 ));
237     m.insert ( std::make_pair<PC, double> ( PC::make(9), 2 ));
238     m.insert ( std::make_pair<PC, double> ( PC::make(9), 3 ));
239 
240 //  assert(m.size() == 9);
241     R r = m.equal_range(4);
242     assert(r.first == m.begin());
243     assert(r.second == m.begin());
244     r = m.equal_range(5);
245     assert(r.first == m.begin());
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 == m.end());
261     assert(r.second == m.end());
262     }
263 #endif
264 }
265