287 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// iterator upper_bound(const key_type& k);14// const_iterator upper_bound(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 23int main(int, char**) {24 {25 typedef std::pair<const int, double> V;26 typedef std::map<int, double> M;27 {28 typedef M::iterator R;29 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)};30 M m(ar, ar + sizeof(ar) / sizeof(ar[0]));31 R r = m.upper_bound(5);32 assert(r == std::next(m.begin(), 1));33 r = m.upper_bound(7);34 assert(r == std::next(m.begin(), 2));35 r = m.upper_bound(9);36 assert(r == std::next(m.begin(), 3));37 r = m.upper_bound(11);38 assert(r == std::next(m.begin(), 4));39 r = m.upper_bound(13);40 assert(r == std::next(m.begin(), 5));41 r = m.upper_bound(15);42 assert(r == std::next(m.begin(), 6));43 r = m.upper_bound(17);44 assert(r == std::next(m.begin(), 7));45 r = m.upper_bound(19);46 assert(r == std::next(m.begin(), 8));47 r = m.upper_bound(4);48 assert(r == std::next(m.begin(), 0));49 r = m.upper_bound(6);50 assert(r == std::next(m.begin(), 1));51 r = m.upper_bound(8);52 assert(r == std::next(m.begin(), 2));53 r = m.upper_bound(10);54 assert(r == std::next(m.begin(), 3));55 r = m.upper_bound(12);56 assert(r == std::next(m.begin(), 4));57 r = m.upper_bound(14);58 assert(r == std::next(m.begin(), 5));59 r = m.upper_bound(16);60 assert(r == std::next(m.begin(), 6));61 r = m.upper_bound(18);62 assert(r == std::next(m.begin(), 7));63 r = m.upper_bound(20);64 assert(r == std::next(m.begin(), 8));65 }66 {67 typedef M::const_iterator R;68 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)};69 const M m(ar, ar + sizeof(ar) / sizeof(ar[0]));70 R r = m.upper_bound(5);71 assert(r == std::next(m.begin(), 1));72 r = m.upper_bound(7);73 assert(r == std::next(m.begin(), 2));74 r = m.upper_bound(9);75 assert(r == std::next(m.begin(), 3));76 r = m.upper_bound(11);77 assert(r == std::next(m.begin(), 4));78 r = m.upper_bound(13);79 assert(r == std::next(m.begin(), 5));80 r = m.upper_bound(15);81 assert(r == std::next(m.begin(), 6));82 r = m.upper_bound(17);83 assert(r == std::next(m.begin(), 7));84 r = m.upper_bound(19);85 assert(r == std::next(m.begin(), 8));86 r = m.upper_bound(4);87 assert(r == std::next(m.begin(), 0));88 r = m.upper_bound(6);89 assert(r == std::next(m.begin(), 1));90 r = m.upper_bound(8);91 assert(r == std::next(m.begin(), 2));92 r = m.upper_bound(10);93 assert(r == std::next(m.begin(), 3));94 r = m.upper_bound(12);95 assert(r == std::next(m.begin(), 4));96 r = m.upper_bound(14);97 assert(r == std::next(m.begin(), 5));98 r = m.upper_bound(16);99 assert(r == std::next(m.begin(), 6));100 r = m.upper_bound(18);101 assert(r == std::next(m.begin(), 7));102 r = m.upper_bound(20);103 assert(r == std::next(m.begin(), 8));104 }105 }106#if TEST_STD_VER >= 11107 {108 typedef std::pair<const int, double> V;109 typedef std::map<int, double, std::less<int>, min_allocator<V>> M;110 {111 typedef M::iterator R;112 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)};113 M m(ar, ar + sizeof(ar) / sizeof(ar[0]));114 R r = m.upper_bound(5);115 assert(r == std::next(m.begin(), 1));116 r = m.upper_bound(7);117 assert(r == std::next(m.begin(), 2));118 r = m.upper_bound(9);119 assert(r == std::next(m.begin(), 3));120 r = m.upper_bound(11);121 assert(r == std::next(m.begin(), 4));122 r = m.upper_bound(13);123 assert(r == std::next(m.begin(), 5));124 r = m.upper_bound(15);125 assert(r == std::next(m.begin(), 6));126 r = m.upper_bound(17);127 assert(r == std::next(m.begin(), 7));128 r = m.upper_bound(19);129 assert(r == std::next(m.begin(), 8));130 r = m.upper_bound(4);131 assert(r == std::next(m.begin(), 0));132 r = m.upper_bound(6);133 assert(r == std::next(m.begin(), 1));134 r = m.upper_bound(8);135 assert(r == std::next(m.begin(), 2));136 r = m.upper_bound(10);137 assert(r == std::next(m.begin(), 3));138 r = m.upper_bound(12);139 assert(r == std::next(m.begin(), 4));140 r = m.upper_bound(14);141 assert(r == std::next(m.begin(), 5));142 r = m.upper_bound(16);143 assert(r == std::next(m.begin(), 6));144 r = m.upper_bound(18);145 assert(r == std::next(m.begin(), 7));146 r = m.upper_bound(20);147 assert(r == std::next(m.begin(), 8));148 }149 {150 typedef M::const_iterator R;151 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)};152 const M m(ar, ar + sizeof(ar) / sizeof(ar[0]));153 R r = m.upper_bound(5);154 assert(r == std::next(m.begin(), 1));155 r = m.upper_bound(7);156 assert(r == std::next(m.begin(), 2));157 r = m.upper_bound(9);158 assert(r == std::next(m.begin(), 3));159 r = m.upper_bound(11);160 assert(r == std::next(m.begin(), 4));161 r = m.upper_bound(13);162 assert(r == std::next(m.begin(), 5));163 r = m.upper_bound(15);164 assert(r == std::next(m.begin(), 6));165 r = m.upper_bound(17);166 assert(r == std::next(m.begin(), 7));167 r = m.upper_bound(19);168 assert(r == std::next(m.begin(), 8));169 r = m.upper_bound(4);170 assert(r == std::next(m.begin(), 0));171 r = m.upper_bound(6);172 assert(r == std::next(m.begin(), 1));173 r = m.upper_bound(8);174 assert(r == std::next(m.begin(), 2));175 r = m.upper_bound(10);176 assert(r == std::next(m.begin(), 3));177 r = m.upper_bound(12);178 assert(r == std::next(m.begin(), 4));179 r = m.upper_bound(14);180 assert(r == std::next(m.begin(), 5));181 r = m.upper_bound(16);182 assert(r == std::next(m.begin(), 6));183 r = m.upper_bound(18);184 assert(r == std::next(m.begin(), 7));185 r = m.upper_bound(20);186 assert(r == std::next(m.begin(), 8));187 }188 }189#endif190#if TEST_STD_VER > 11191 {192 typedef std::pair<const int, double> V;193 typedef std::map<int, double, std::less<>> M;194 typedef M::iterator R;195 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)};196 M m(ar, ar + sizeof(ar) / sizeof(ar[0]));197 R r = m.upper_bound(5);198 assert(r == std::next(m.begin(), 1));199 r = m.upper_bound(7);200 assert(r == std::next(m.begin(), 2));201 r = m.upper_bound(9);202 assert(r == std::next(m.begin(), 3));203 r = m.upper_bound(11);204 assert(r == std::next(m.begin(), 4));205 r = m.upper_bound(13);206 assert(r == std::next(m.begin(), 5));207 r = m.upper_bound(15);208 assert(r == std::next(m.begin(), 6));209 r = m.upper_bound(17);210 assert(r == std::next(m.begin(), 7));211 r = m.upper_bound(19);212 assert(r == std::next(m.begin(), 8));213 r = m.upper_bound(4);214 assert(r == std::next(m.begin(), 0));215 r = m.upper_bound(6);216 assert(r == std::next(m.begin(), 1));217 r = m.upper_bound(8);218 assert(r == std::next(m.begin(), 2));219 r = m.upper_bound(10);220 assert(r == std::next(m.begin(), 3));221 r = m.upper_bound(12);222 assert(r == std::next(m.begin(), 4));223 r = m.upper_bound(14);224 assert(r == std::next(m.begin(), 5));225 r = m.upper_bound(16);226 assert(r == std::next(m.begin(), 6));227 r = m.upper_bound(18);228 assert(r == std::next(m.begin(), 7));229 r = m.upper_bound(20);230 assert(r == std::next(m.begin(), 8));231 }232 233 {234 typedef PrivateConstructor PC;235 typedef std::map<PC, double, std::less<>> M;236 typedef M::iterator R;237 238 M m;239 m[PC::make(5)] = 5;240 m[PC::make(7)] = 6;241 m[PC::make(9)] = 7;242 m[PC::make(11)] = 8;243 m[PC::make(13)] = 9;244 m[PC::make(15)] = 10;245 m[PC::make(17)] = 11;246 m[PC::make(19)] = 12;247 248 R r = m.upper_bound(5);249 assert(r == std::next(m.begin(), 1));250 r = m.upper_bound(7);251 assert(r == std::next(m.begin(), 2));252 r = m.upper_bound(9);253 assert(r == std::next(m.begin(), 3));254 r = m.upper_bound(11);255 assert(r == std::next(m.begin(), 4));256 r = m.upper_bound(13);257 assert(r == std::next(m.begin(), 5));258 r = m.upper_bound(15);259 assert(r == std::next(m.begin(), 6));260 r = m.upper_bound(17);261 assert(r == std::next(m.begin(), 7));262 r = m.upper_bound(19);263 assert(r == std::next(m.begin(), 8));264 r = m.upper_bound(4);265 assert(r == std::next(m.begin(), 0));266 r = m.upper_bound(6);267 assert(r == std::next(m.begin(), 1));268 r = m.upper_bound(8);269 assert(r == std::next(m.begin(), 2));270 r = m.upper_bound(10);271 assert(r == std::next(m.begin(), 3));272 r = m.upper_bound(12);273 assert(r == std::next(m.begin(), 4));274 r = m.upper_bound(14);275 assert(r == std::next(m.begin(), 5));276 r = m.upper_bound(16);277 assert(r == std::next(m.begin(), 6));278 r = m.upper_bound(18);279 assert(r == std::next(m.begin(), 7));280 r = m.upper_bound(20);281 assert(r == std::next(m.begin(), 8));282 }283#endif284 285 return 0;286}287