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