1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
14 // iterator upper_bound(const key_type& k);
15 // const_iterator upper_bound(const key_type& k) const;
20 #include "test_macros.h"
21 #include "min_allocator.h"
22 #include "private_constructor.hpp"
23 #include "is_transparent.h"
27 typedef std::pair<const int, double> V;
29 typedef std::multimap<int, double> M;
31 typedef M::iterator R;
44 M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
45 R r = m.upper_bound(4);
46 assert(r == m.begin());
48 assert(r == next(m.begin(), 3));
50 assert(r == next(m.begin(), 3));
52 assert(r == next(m.begin(), 6));
54 assert(r == next(m.begin(), 6));
56 assert(r == next(m.begin(), 9));
57 r = m.upper_bound(10);
61 typedef M::const_iterator R;
74 const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
75 R r = m.upper_bound(4);
76 assert(r == m.begin());
78 assert(r == next(m.begin(), 3));
80 assert(r == next(m.begin(), 3));
82 assert(r == next(m.begin(), 6));
84 assert(r == next(m.begin(), 6));
86 assert(r == next(m.begin(), 9));
87 r = m.upper_bound(10);
91 #if TEST_STD_VER >= 11
93 typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
95 typedef M::iterator R;
108 M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
109 R r = m.upper_bound(4);
110 assert(r == m.begin());
111 r = m.upper_bound(5);
112 assert(r == next(m.begin(), 3));
113 r = m.upper_bound(6);
114 assert(r == next(m.begin(), 3));
115 r = m.upper_bound(7);
116 assert(r == next(m.begin(), 6));
117 r = m.upper_bound(8);
118 assert(r == next(m.begin(), 6));
119 r = m.upper_bound(9);
120 assert(r == next(m.begin(), 9));
121 r = m.upper_bound(10);
122 assert(r == m.end());
125 typedef M::const_iterator R;
138 const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
139 R r = m.upper_bound(4);
140 assert(r == m.begin());
141 r = m.upper_bound(5);
142 assert(r == next(m.begin(), 3));
143 r = m.upper_bound(6);
144 assert(r == next(m.begin(), 3));
145 r = m.upper_bound(7);
146 assert(r == next(m.begin(), 6));
147 r = m.upper_bound(8);
148 assert(r == next(m.begin(), 6));
149 r = m.upper_bound(9);
150 assert(r == next(m.begin(), 9));
151 r = m.upper_bound(10);
152 assert(r == m.end());
156 #if TEST_STD_VER > 11
158 typedef std::pair<const int, double> V;
159 typedef std::multimap<int, double, std::less<>> M;
160 typedef M::iterator R;
173 M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
174 R r = m.upper_bound(4);
175 assert(r == m.begin());
176 r = m.upper_bound(5);
177 assert(r == next(m.begin(), 3));
178 r = m.upper_bound(6);
179 assert(r == next(m.begin(), 3));
180 r = m.upper_bound(7);
181 assert(r == next(m.begin(), 6));
182 r = m.upper_bound(8);
183 assert(r == next(m.begin(), 6));
184 r = m.upper_bound(9);
185 assert(r == next(m.begin(), 9));
186 r = m.upper_bound(10);
187 assert(r == m.end());
189 r = m.upper_bound(C2Int(4));
190 assert(r == m.begin());
191 r = m.upper_bound(C2Int(5));
192 assert(r == next(m.begin(), 3));
193 r = m.upper_bound(C2Int(6));
194 assert(r == next(m.begin(), 3));
195 r = m.upper_bound(C2Int(7));
196 assert(r == next(m.begin(), 6));
197 r = m.upper_bound(C2Int(8));
198 assert(r == next(m.begin(), 6));
199 r = m.upper_bound(C2Int(9));
200 assert(r == next(m.begin(), 9));
201 r = m.upper_bound(C2Int(10));
205 typedef PrivateConstructor PC;
206 typedef std::multimap<PC, double, std::less<>> M;
207 typedef M::iterator R;
210 m.insert ( std::make_pair<PC, double> ( PC::make(5), 1 ));
211 m.insert ( std::make_pair<PC, double> ( PC::make(5), 2 ));
212 m.insert ( std::make_pair<PC, double> ( PC::make(5), 3 ));
213 m.insert ( std::make_pair<PC, double> ( PC::make(7), 1 ));
214 m.insert ( std::make_pair<PC, double> ( PC::make(7), 2 ));
215 m.insert ( std::make_pair<PC, double> ( PC::make(7), 3 ));
216 m.insert ( std::make_pair<PC, double> ( PC::make(9), 1 ));
217 m.insert ( std::make_pair<PC, double> ( PC::make(9), 2 ));
218 m.insert ( std::make_pair<PC, double> ( PC::make(9), 3 ));
220 R r = m.upper_bound(4);
221 assert(r == m.begin());
222 r = m.upper_bound(5);
223 assert(r == next(m.begin(), 3));
224 r = m.upper_bound(6);
225 assert(r == next(m.begin(), 3));
226 r = m.upper_bound(7);
227 assert(r == next(m.begin(), 6));
228 r = m.upper_bound(8);
229 assert(r == next(m.begin(), 6));
230 r = m.upper_bound(9);
231 assert(r == next(m.begin(), 9));
232 r = m.upper_bound(10);
233 assert(r == m.end());