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