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