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