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
23int 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