442 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <map>10 11// class map12 13// pair<iterator,iterator> equal_range(const key_type& k);14// pair<const_iterator,const_iterator> equal_range(const key_type& k) const;15 16#include <map>17#include <cassert>18 19#include "test_macros.h"20#include "min_allocator.h"21#include "private_constructor.h"22#include "is_transparent.h"23 24int main(int, char**) {25 {26 typedef std::pair<const int, double> V;27 typedef std::map<int, double> M;28 {29 typedef std::pair<M::iterator, M::iterator> R;30 V ar[] = {V(5, 5), V(7, 6), V(9, 7), V(11, 8), V(13, 9), V(15, 10), V(17, 11), V(19, 12)};31 M m(ar, ar + sizeof(ar) / sizeof(ar[0]));32 R r = m.equal_range(5);33 assert(r.first == std::next(m.begin(), 0));34 assert(r.second == std::next(m.begin(), 1));35 r = m.equal_range(7);36 assert(r.first == std::next(m.begin(), 1));37 assert(r.second == std::next(m.begin(), 2));38 r = m.equal_range(9);39 assert(r.first == std::next(m.begin(), 2));40 assert(r.second == std::next(m.begin(), 3));41 r = m.equal_range(11);42 assert(r.first == std::next(m.begin(), 3));43 assert(r.second == std::next(m.begin(), 4));44 r = m.equal_range(13);45 assert(r.first == std::next(m.begin(), 4));46 assert(r.second == std::next(m.begin(), 5));47 r = m.equal_range(15);48 assert(r.first == std::next(m.begin(), 5));49 assert(r.second == std::next(m.begin(), 6));50 r = m.equal_range(17);51 assert(r.first == std::next(m.begin(), 6));52 assert(r.second == std::next(m.begin(), 7));53 r = m.equal_range(19);54 assert(r.first == std::next(m.begin(), 7));55 assert(r.second == std::next(m.begin(), 8));56 r = m.equal_range(4);57 assert(r.first == std::next(m.begin(), 0));58 assert(r.second == std::next(m.begin(), 0));59 r = m.equal_range(6);60 assert(r.first == std::next(m.begin(), 1));61 assert(r.second == std::next(m.begin(), 1));62 r = m.equal_range(8);63 assert(r.first == std::next(m.begin(), 2));64 assert(r.second == std::next(m.begin(), 2));65 r = m.equal_range(10);66 assert(r.first == std::next(m.begin(), 3));67 assert(r.second == std::next(m.begin(), 3));68 r = m.equal_range(12);69 assert(r.first == std::next(m.begin(), 4));70 assert(r.second == std::next(m.begin(), 4));71 r = m.equal_range(14);72 assert(r.first == std::next(m.begin(), 5));73 assert(r.second == std::next(m.begin(), 5));74 r = m.equal_range(16);75 assert(r.first == std::next(m.begin(), 6));76 assert(r.second == std::next(m.begin(), 6));77 r = m.equal_range(18);78 assert(r.first == std::next(m.begin(), 7));79 assert(r.second == std::next(m.begin(), 7));80 r = m.equal_range(20);81 assert(r.first == std::next(m.begin(), 8));82 assert(r.second == std::next(m.begin(), 8));83 }84 {85 typedef std::pair<M::const_iterator, M::const_iterator> R;86 V ar[] = {V(5, 5), V(7, 6), V(9, 7), V(11, 8), V(13, 9), V(15, 10), V(17, 11), V(19, 12)};87 const M m(ar, ar + sizeof(ar) / sizeof(ar[0]));88 R r = m.equal_range(5);89 assert(r.first == std::next(m.begin(), 0));90 assert(r.second == std::next(m.begin(), 1));91 r = m.equal_range(7);92 assert(r.first == std::next(m.begin(), 1));93 assert(r.second == std::next(m.begin(), 2));94 r = m.equal_range(9);95 assert(r.first == std::next(m.begin(), 2));96 assert(r.second == std::next(m.begin(), 3));97 r = m.equal_range(11);98 assert(r.first == std::next(m.begin(), 3));99 assert(r.second == std::next(m.begin(), 4));100 r = m.equal_range(13);101 assert(r.first == std::next(m.begin(), 4));102 assert(r.second == std::next(m.begin(), 5));103 r = m.equal_range(15);104 assert(r.first == std::next(m.begin(), 5));105 assert(r.second == std::next(m.begin(), 6));106 r = m.equal_range(17);107 assert(r.first == std::next(m.begin(), 6));108 assert(r.second == std::next(m.begin(), 7));109 r = m.equal_range(19);110 assert(r.first == std::next(m.begin(), 7));111 assert(r.second == std::next(m.begin(), 8));112 r = m.equal_range(4);113 assert(r.first == std::next(m.begin(), 0));114 assert(r.second == std::next(m.begin(), 0));115 r = m.equal_range(6);116 assert(r.first == std::next(m.begin(), 1));117 assert(r.second == std::next(m.begin(), 1));118 r = m.equal_range(8);119 assert(r.first == std::next(m.begin(), 2));120 assert(r.second == std::next(m.begin(), 2));121 r = m.equal_range(10);122 assert(r.first == std::next(m.begin(), 3));123 assert(r.second == std::next(m.begin(), 3));124 r = m.equal_range(12);125 assert(r.first == std::next(m.begin(), 4));126 assert(r.second == std::next(m.begin(), 4));127 r = m.equal_range(14);128 assert(r.first == std::next(m.begin(), 5));129 assert(r.second == std::next(m.begin(), 5));130 r = m.equal_range(16);131 assert(r.first == std::next(m.begin(), 6));132 assert(r.second == std::next(m.begin(), 6));133 r = m.equal_range(18);134 assert(r.first == std::next(m.begin(), 7));135 assert(r.second == std::next(m.begin(), 7));136 r = m.equal_range(20);137 assert(r.first == std::next(m.begin(), 8));138 assert(r.second == std::next(m.begin(), 8));139 }140 }141#if TEST_STD_VER >= 11142 {143 typedef std::pair<const int, double> V;144 typedef std::map<int, double, std::less<int>, min_allocator<V>> M;145 {146 typedef std::pair<M::iterator, M::iterator> R;147 V ar[] = {V(5, 5), V(7, 6), V(9, 7), V(11, 8), V(13, 9), V(15, 10), V(17, 11), V(19, 12)};148 M m(ar, ar + sizeof(ar) / sizeof(ar[0]));149 R r = m.equal_range(5);150 assert(r.first == std::next(m.begin(), 0));151 assert(r.second == std::next(m.begin(), 1));152 r = m.equal_range(7);153 assert(r.first == std::next(m.begin(), 1));154 assert(r.second == std::next(m.begin(), 2));155 r = m.equal_range(9);156 assert(r.first == std::next(m.begin(), 2));157 assert(r.second == std::next(m.begin(), 3));158 r = m.equal_range(11);159 assert(r.first == std::next(m.begin(), 3));160 assert(r.second == std::next(m.begin(), 4));161 r = m.equal_range(13);162 assert(r.first == std::next(m.begin(), 4));163 assert(r.second == std::next(m.begin(), 5));164 r = m.equal_range(15);165 assert(r.first == std::next(m.begin(), 5));166 assert(r.second == std::next(m.begin(), 6));167 r = m.equal_range(17);168 assert(r.first == std::next(m.begin(), 6));169 assert(r.second == std::next(m.begin(), 7));170 r = m.equal_range(19);171 assert(r.first == std::next(m.begin(), 7));172 assert(r.second == std::next(m.begin(), 8));173 r = m.equal_range(4);174 assert(r.first == std::next(m.begin(), 0));175 assert(r.second == std::next(m.begin(), 0));176 r = m.equal_range(6);177 assert(r.first == std::next(m.begin(), 1));178 assert(r.second == std::next(m.begin(), 1));179 r = m.equal_range(8);180 assert(r.first == std::next(m.begin(), 2));181 assert(r.second == std::next(m.begin(), 2));182 r = m.equal_range(10);183 assert(r.first == std::next(m.begin(), 3));184 assert(r.second == std::next(m.begin(), 3));185 r = m.equal_range(12);186 assert(r.first == std::next(m.begin(), 4));187 assert(r.second == std::next(m.begin(), 4));188 r = m.equal_range(14);189 assert(r.first == std::next(m.begin(), 5));190 assert(r.second == std::next(m.begin(), 5));191 r = m.equal_range(16);192 assert(r.first == std::next(m.begin(), 6));193 assert(r.second == std::next(m.begin(), 6));194 r = m.equal_range(18);195 assert(r.first == std::next(m.begin(), 7));196 assert(r.second == std::next(m.begin(), 7));197 r = m.equal_range(20);198 assert(r.first == std::next(m.begin(), 8));199 assert(r.second == std::next(m.begin(), 8));200 }201 {202 typedef std::pair<M::const_iterator, M::const_iterator> R;203 V ar[] = {V(5, 5), V(7, 6), V(9, 7), V(11, 8), V(13, 9), V(15, 10), V(17, 11), V(19, 12)};204 const M m(ar, ar + sizeof(ar) / sizeof(ar[0]));205 R r = m.equal_range(5);206 assert(r.first == std::next(m.begin(), 0));207 assert(r.second == std::next(m.begin(), 1));208 r = m.equal_range(7);209 assert(r.first == std::next(m.begin(), 1));210 assert(r.second == std::next(m.begin(), 2));211 r = m.equal_range(9);212 assert(r.first == std::next(m.begin(), 2));213 assert(r.second == std::next(m.begin(), 3));214 r = m.equal_range(11);215 assert(r.first == std::next(m.begin(), 3));216 assert(r.second == std::next(m.begin(), 4));217 r = m.equal_range(13);218 assert(r.first == std::next(m.begin(), 4));219 assert(r.second == std::next(m.begin(), 5));220 r = m.equal_range(15);221 assert(r.first == std::next(m.begin(), 5));222 assert(r.second == std::next(m.begin(), 6));223 r = m.equal_range(17);224 assert(r.first == std::next(m.begin(), 6));225 assert(r.second == std::next(m.begin(), 7));226 r = m.equal_range(19);227 assert(r.first == std::next(m.begin(), 7));228 assert(r.second == std::next(m.begin(), 8));229 r = m.equal_range(4);230 assert(r.first == std::next(m.begin(), 0));231 assert(r.second == std::next(m.begin(), 0));232 r = m.equal_range(6);233 assert(r.first == std::next(m.begin(), 1));234 assert(r.second == std::next(m.begin(), 1));235 r = m.equal_range(8);236 assert(r.first == std::next(m.begin(), 2));237 assert(r.second == std::next(m.begin(), 2));238 r = m.equal_range(10);239 assert(r.first == std::next(m.begin(), 3));240 assert(r.second == std::next(m.begin(), 3));241 r = m.equal_range(12);242 assert(r.first == std::next(m.begin(), 4));243 assert(r.second == std::next(m.begin(), 4));244 r = m.equal_range(14);245 assert(r.first == std::next(m.begin(), 5));246 assert(r.second == std::next(m.begin(), 5));247 r = m.equal_range(16);248 assert(r.first == std::next(m.begin(), 6));249 assert(r.second == std::next(m.begin(), 6));250 r = m.equal_range(18);251 assert(r.first == std::next(m.begin(), 7));252 assert(r.second == std::next(m.begin(), 7));253 r = m.equal_range(20);254 assert(r.first == std::next(m.begin(), 8));255 assert(r.second == std::next(m.begin(), 8));256 }257 }258#endif259#if TEST_STD_VER > 11260 {261 typedef std::pair<const int, double> V;262 typedef std::map<int, double, std::less<>> M;263 typedef std::pair<M::iterator, M::iterator> R;264 265 V ar[] = {V(5, 5), V(7, 6), V(9, 7), V(11, 8), V(13, 9), V(15, 10), V(17, 11), V(19, 12)};266 M m(ar, ar + sizeof(ar) / sizeof(ar[0]));267 R r = m.equal_range(5);268 assert(r.first == std::next(m.begin(), 0));269 assert(r.second == std::next(m.begin(), 1));270 r = m.equal_range(7);271 assert(r.first == std::next(m.begin(), 1));272 assert(r.second == std::next(m.begin(), 2));273 r = m.equal_range(9);274 assert(r.first == std::next(m.begin(), 2));275 assert(r.second == std::next(m.begin(), 3));276 r = m.equal_range(11);277 assert(r.first == std::next(m.begin(), 3));278 assert(r.second == std::next(m.begin(), 4));279 r = m.equal_range(13);280 assert(r.first == std::next(m.begin(), 4));281 assert(r.second == std::next(m.begin(), 5));282 r = m.equal_range(15);283 assert(r.first == std::next(m.begin(), 5));284 assert(r.second == std::next(m.begin(), 6));285 r = m.equal_range(17);286 assert(r.first == std::next(m.begin(), 6));287 assert(r.second == std::next(m.begin(), 7));288 r = m.equal_range(19);289 assert(r.first == std::next(m.begin(), 7));290 assert(r.second == std::next(m.begin(), 8));291 r = m.equal_range(4);292 assert(r.first == std::next(m.begin(), 0));293 assert(r.second == std::next(m.begin(), 0));294 r = m.equal_range(6);295 assert(r.first == std::next(m.begin(), 1));296 assert(r.second == std::next(m.begin(), 1));297 r = m.equal_range(8);298 assert(r.first == std::next(m.begin(), 2));299 assert(r.second == std::next(m.begin(), 2));300 r = m.equal_range(10);301 assert(r.first == std::next(m.begin(), 3));302 assert(r.second == std::next(m.begin(), 3));303 r = m.equal_range(12);304 assert(r.first == std::next(m.begin(), 4));305 assert(r.second == std::next(m.begin(), 4));306 r = m.equal_range(14);307 assert(r.first == std::next(m.begin(), 5));308 assert(r.second == std::next(m.begin(), 5));309 r = m.equal_range(16);310 assert(r.first == std::next(m.begin(), 6));311 assert(r.second == std::next(m.begin(), 6));312 r = m.equal_range(18);313 assert(r.first == std::next(m.begin(), 7));314 assert(r.second == std::next(m.begin(), 7));315 r = m.equal_range(20);316 assert(r.first == std::next(m.begin(), 8));317 assert(r.second == std::next(m.begin(), 8));318 319 r = m.equal_range(C2Int(5));320 assert(r.first == std::next(m.begin(), 0));321 assert(r.second == std::next(m.begin(), 1));322 r = m.equal_range(C2Int(7));323 assert(r.first == std::next(m.begin(), 1));324 assert(r.second == std::next(m.begin(), 2));325 r = m.equal_range(C2Int(9));326 assert(r.first == std::next(m.begin(), 2));327 assert(r.second == std::next(m.begin(), 3));328 r = m.equal_range(C2Int(11));329 assert(r.first == std::next(m.begin(), 3));330 assert(r.second == std::next(m.begin(), 4));331 r = m.equal_range(C2Int(13));332 assert(r.first == std::next(m.begin(), 4));333 assert(r.second == std::next(m.begin(), 5));334 r = m.equal_range(C2Int(15));335 assert(r.first == std::next(m.begin(), 5));336 assert(r.second == std::next(m.begin(), 6));337 r = m.equal_range(C2Int(17));338 assert(r.first == std::next(m.begin(), 6));339 assert(r.second == std::next(m.begin(), 7));340 r = m.equal_range(C2Int(19));341 assert(r.first == std::next(m.begin(), 7));342 assert(r.second == std::next(m.begin(), 8));343 r = m.equal_range(C2Int(4));344 assert(r.first == std::next(m.begin(), 0));345 assert(r.second == std::next(m.begin(), 0));346 r = m.equal_range(C2Int(6));347 assert(r.first == std::next(m.begin(), 1));348 assert(r.second == std::next(m.begin(), 1));349 r = m.equal_range(C2Int(8));350 assert(r.first == std::next(m.begin(), 2));351 assert(r.second == std::next(m.begin(), 2));352 r = m.equal_range(C2Int(10));353 assert(r.first == std::next(m.begin(), 3));354 assert(r.second == std::next(m.begin(), 3));355 r = m.equal_range(C2Int(12));356 assert(r.first == std::next(m.begin(), 4));357 assert(r.second == std::next(m.begin(), 4));358 r = m.equal_range(C2Int(14));359 assert(r.first == std::next(m.begin(), 5));360 assert(r.second == std::next(m.begin(), 5));361 r = m.equal_range(C2Int(16));362 assert(r.first == std::next(m.begin(), 6));363 assert(r.second == std::next(m.begin(), 6));364 r = m.equal_range(C2Int(18));365 assert(r.first == std::next(m.begin(), 7));366 assert(r.second == std::next(m.begin(), 7));367 r = m.equal_range(C2Int(20));368 assert(r.first == std::next(m.begin(), 8));369 assert(r.second == std::next(m.begin(), 8));370 }371 {372 typedef PrivateConstructor PC;373 typedef std::map<PC, double, std::less<>> M;374 typedef std::pair<M::iterator, M::iterator> R;375 376 M m;377 m[PC::make(5)] = 5;378 m[PC::make(7)] = 6;379 m[PC::make(9)] = 7;380 m[PC::make(11)] = 8;381 m[PC::make(13)] = 9;382 m[PC::make(15)] = 10;383 m[PC::make(17)] = 11;384 m[PC::make(19)] = 12;385 386 R r = m.equal_range(5);387 assert(r.first == std::next(m.begin(), 0));388 assert(r.second == std::next(m.begin(), 1));389 r = m.equal_range(7);390 assert(r.first == std::next(m.begin(), 1));391 assert(r.second == std::next(m.begin(), 2));392 r = m.equal_range(9);393 assert(r.first == std::next(m.begin(), 2));394 assert(r.second == std::next(m.begin(), 3));395 r = m.equal_range(11);396 assert(r.first == std::next(m.begin(), 3));397 assert(r.second == std::next(m.begin(), 4));398 r = m.equal_range(13);399 assert(r.first == std::next(m.begin(), 4));400 assert(r.second == std::next(m.begin(), 5));401 r = m.equal_range(15);402 assert(r.first == std::next(m.begin(), 5));403 assert(r.second == std::next(m.begin(), 6));404 r = m.equal_range(17);405 assert(r.first == std::next(m.begin(), 6));406 assert(r.second == std::next(m.begin(), 7));407 r = m.equal_range(19);408 assert(r.first == std::next(m.begin(), 7));409 assert(r.second == std::next(m.begin(), 8));410 r = m.equal_range(4);411 assert(r.first == std::next(m.begin(), 0));412 assert(r.second == std::next(m.begin(), 0));413 r = m.equal_range(6);414 assert(r.first == std::next(m.begin(), 1));415 assert(r.second == std::next(m.begin(), 1));416 r = m.equal_range(8);417 assert(r.first == std::next(m.begin(), 2));418 assert(r.second == std::next(m.begin(), 2));419 r = m.equal_range(10);420 assert(r.first == std::next(m.begin(), 3));421 assert(r.second == std::next(m.begin(), 3));422 r = m.equal_range(12);423 assert(r.first == std::next(m.begin(), 4));424 assert(r.second == std::next(m.begin(), 4));425 r = m.equal_range(14);426 assert(r.first == std::next(m.begin(), 5));427 assert(r.second == std::next(m.begin(), 5));428 r = m.equal_range(16);429 assert(r.first == std::next(m.begin(), 6));430 assert(r.second == std::next(m.begin(), 6));431 r = m.equal_range(18);432 assert(r.first == std::next(m.begin(), 7));433 assert(r.second == std::next(m.begin(), 7));434 r = m.equal_range(20);435 assert(r.first == std::next(m.begin(), 8));436 assert(r.second == std::next(m.begin(), 8));437 }438#endif439 440 return 0;441}442