288 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// <set>10 11// class set12 13// iterator upper_bound(const key_type& k);14// const_iterator upper_bound(const key_type& k) const;15 16#include <set>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 int V;26 typedef std::set<int> M;27 {28 typedef M::iterator R;29 V ar[] = {5, 7, 9, 11, 13, 15, 17, 19};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[] = {5, 7, 9, 11, 13, 15, 17, 19};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 int V;109 typedef std::set<int, std::less<int>, min_allocator<int>> M;110 {111 typedef M::iterator R;112 V ar[] = {5, 7, 9, 11, 13, 15, 17, 19};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[] = {5, 7, 9, 11, 13, 15, 17, 19};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 int V;193 typedef std::set<V, std::less<>> M;194 typedef M::iterator R;195 196 V ar[] = {5, 7, 9, 11, 13, 15, 17, 19};197 M m(ar, ar + sizeof(ar) / sizeof(ar[0]));198 R r = m.upper_bound(5);199 assert(r == std::next(m.begin(), 1));200 r = m.upper_bound(7);201 assert(r == std::next(m.begin(), 2));202 r = m.upper_bound(9);203 assert(r == std::next(m.begin(), 3));204 r = m.upper_bound(11);205 assert(r == std::next(m.begin(), 4));206 r = m.upper_bound(13);207 assert(r == std::next(m.begin(), 5));208 r = m.upper_bound(15);209 assert(r == std::next(m.begin(), 6));210 r = m.upper_bound(17);211 assert(r == std::next(m.begin(), 7));212 r = m.upper_bound(19);213 assert(r == std::next(m.begin(), 8));214 r = m.upper_bound(4);215 assert(r == std::next(m.begin(), 0));216 r = m.upper_bound(6);217 assert(r == std::next(m.begin(), 1));218 r = m.upper_bound(8);219 assert(r == std::next(m.begin(), 2));220 r = m.upper_bound(10);221 assert(r == std::next(m.begin(), 3));222 r = m.upper_bound(12);223 assert(r == std::next(m.begin(), 4));224 r = m.upper_bound(14);225 assert(r == std::next(m.begin(), 5));226 r = m.upper_bound(16);227 assert(r == std::next(m.begin(), 6));228 r = m.upper_bound(18);229 assert(r == std::next(m.begin(), 7));230 r = m.upper_bound(20);231 assert(r == std::next(m.begin(), 8));232 }233 234 {235 typedef PrivateConstructor V;236 typedef std::set<V, std::less<>> M;237 typedef M::iterator R;238 239 M m;240 m.insert(V::make(5));241 m.insert(V::make(7));242 m.insert(V::make(9));243 m.insert(V::make(11));244 m.insert(V::make(13));245 m.insert(V::make(15));246 m.insert(V::make(17));247 m.insert(V::make(19));248 249 R r = m.upper_bound(5);250 assert(r == std::next(m.begin(), 1));251 r = m.upper_bound(7);252 assert(r == std::next(m.begin(), 2));253 r = m.upper_bound(9);254 assert(r == std::next(m.begin(), 3));255 r = m.upper_bound(11);256 assert(r == std::next(m.begin(), 4));257 r = m.upper_bound(13);258 assert(r == std::next(m.begin(), 5));259 r = m.upper_bound(15);260 assert(r == std::next(m.begin(), 6));261 r = m.upper_bound(17);262 assert(r == std::next(m.begin(), 7));263 r = m.upper_bound(19);264 assert(r == std::next(m.begin(), 8));265 r = m.upper_bound(4);266 assert(r == std::next(m.begin(), 0));267 r = m.upper_bound(6);268 assert(r == std::next(m.begin(), 1));269 r = m.upper_bound(8);270 assert(r == std::next(m.begin(), 2));271 r = m.upper_bound(10);272 assert(r == std::next(m.begin(), 3));273 r = m.upper_bound(12);274 assert(r == std::next(m.begin(), 4));275 r = m.upper_bound(14);276 assert(r == std::next(m.begin(), 5));277 r = m.upper_bound(16);278 assert(r == std::next(m.begin(), 6));279 r = m.upper_bound(18);280 assert(r == std::next(m.begin(), 7));281 r = m.upper_bound(20);282 assert(r == std::next(m.begin(), 8));283 }284#endif285 286 return 0;287}288