258 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 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::map<int, double> M;31 typedef std::pair<int, double> P;32 typedef M::iterator I;33 P ar[] = {34 P(1, 1.5),35 P(2, 2.5),36 P(3, 3.5),37 P(4, 4.5),38 P(5, 5.5),39 P(6, 6.5),40 P(7, 7.5),41 P(8, 8.5),42 };43 M m(ar, ar + sizeof(ar) / sizeof(ar[0]));44 assert(m.size() == 8);45 I i = m.erase(std::next(m.cbegin(), 3));46 assert(m.size() == 7);47 assert(i == std::next(m.begin(), 3));48 assert(m.begin()->first == 1);49 assert(m.begin()->second == 1.5);50 assert(std::next(m.begin())->first == 2);51 assert(std::next(m.begin())->second == 2.5);52 assert(std::next(m.begin(), 2)->first == 3);53 assert(std::next(m.begin(), 2)->second == 3.5);54 assert(std::next(m.begin(), 3)->first == 5);55 assert(std::next(m.begin(), 3)->second == 5.5);56 assert(std::next(m.begin(), 4)->first == 6);57 assert(std::next(m.begin(), 4)->second == 6.5);58 assert(std::next(m.begin(), 5)->first == 7);59 assert(std::next(m.begin(), 5)->second == 7.5);60 assert(std::next(m.begin(), 6)->first == 8);61 assert(std::next(m.begin(), 6)->second == 8.5);62 63 i = m.erase(std::next(m.cbegin(), 0));64 assert(m.size() == 6);65 assert(i == m.begin());66 assert(m.begin()->first == 2);67 assert(m.begin()->second == 2.5);68 assert(std::next(m.begin())->first == 3);69 assert(std::next(m.begin())->second == 3.5);70 assert(std::next(m.begin(), 2)->first == 5);71 assert(std::next(m.begin(), 2)->second == 5.5);72 assert(std::next(m.begin(), 3)->first == 6);73 assert(std::next(m.begin(), 3)->second == 6.5);74 assert(std::next(m.begin(), 4)->first == 7);75 assert(std::next(m.begin(), 4)->second == 7.5);76 assert(std::next(m.begin(), 5)->first == 8);77 assert(std::next(m.begin(), 5)->second == 8.5);78 79 i = m.erase(std::next(m.cbegin(), 5));80 assert(m.size() == 5);81 assert(i == m.end());82 assert(m.begin()->first == 2);83 assert(m.begin()->second == 2.5);84 assert(std::next(m.begin())->first == 3);85 assert(std::next(m.begin())->second == 3.5);86 assert(std::next(m.begin(), 2)->first == 5);87 assert(std::next(m.begin(), 2)->second == 5.5);88 assert(std::next(m.begin(), 3)->first == 6);89 assert(std::next(m.begin(), 3)->second == 6.5);90 assert(std::next(m.begin(), 4)->first == 7);91 assert(std::next(m.begin(), 4)->second == 7.5);92 93 i = m.erase(std::next(m.cbegin(), 1));94 assert(m.size() == 4);95 assert(i == std::next(m.begin()));96 assert(m.begin()->first == 2);97 assert(m.begin()->second == 2.5);98 assert(std::next(m.begin())->first == 5);99 assert(std::next(m.begin())->second == 5.5);100 assert(std::next(m.begin(), 2)->first == 6);101 assert(std::next(m.begin(), 2)->second == 6.5);102 assert(std::next(m.begin(), 3)->first == 7);103 assert(std::next(m.begin(), 3)->second == 7.5);104 105 i = m.erase(std::next(m.cbegin(), 2));106 assert(m.size() == 3);107 assert(i == std::next(m.begin(), 2));108 assert(m.begin()->first == 2);109 assert(m.begin()->second == 2.5);110 assert(std::next(m.begin())->first == 5);111 assert(std::next(m.begin())->second == 5.5);112 assert(std::next(m.begin(), 2)->first == 7);113 assert(std::next(m.begin(), 2)->second == 7.5);114 115 i = m.erase(std::next(m.cbegin(), 2));116 assert(m.size() == 2);117 assert(i == std::next(m.begin(), 2));118 assert(m.begin()->first == 2);119 assert(m.begin()->second == 2.5);120 assert(std::next(m.begin())->first == 5);121 assert(std::next(m.begin())->second == 5.5);122 123 i = m.erase(std::next(m.cbegin(), 0));124 assert(m.size() == 1);125 assert(i == std::next(m.begin(), 0));126 assert(m.begin()->first == 5);127 assert(m.begin()->second == 5.5);128 129 i = m.erase(m.cbegin());130 assert(m.size() == 0);131 assert(i == m.begin());132 assert(i == m.end());133 }134#if TEST_STD_VER >= 11135 {136 typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;137 typedef std::pair<int, double> P;138 typedef M::iterator I;139 P ar[] = {140 P(1, 1.5),141 P(2, 2.5),142 P(3, 3.5),143 P(4, 4.5),144 P(5, 5.5),145 P(6, 6.5),146 P(7, 7.5),147 P(8, 8.5),148 };149 M m(ar, ar + sizeof(ar) / sizeof(ar[0]));150 assert(m.size() == 8);151 I i = m.erase(std::next(m.cbegin(), 3));152 assert(m.size() == 7);153 assert(i == std::next(m.begin(), 3));154 assert(m.begin()->first == 1);155 assert(m.begin()->second == 1.5);156 assert(std::next(m.begin())->first == 2);157 assert(std::next(m.begin())->second == 2.5);158 assert(std::next(m.begin(), 2)->first == 3);159 assert(std::next(m.begin(), 2)->second == 3.5);160 assert(std::next(m.begin(), 3)->first == 5);161 assert(std::next(m.begin(), 3)->second == 5.5);162 assert(std::next(m.begin(), 4)->first == 6);163 assert(std::next(m.begin(), 4)->second == 6.5);164 assert(std::next(m.begin(), 5)->first == 7);165 assert(std::next(m.begin(), 5)->second == 7.5);166 assert(std::next(m.begin(), 6)->first == 8);167 assert(std::next(m.begin(), 6)->second == 8.5);168 169 i = m.erase(std::next(m.cbegin(), 0));170 assert(m.size() == 6);171 assert(i == m.begin());172 assert(m.begin()->first == 2);173 assert(m.begin()->second == 2.5);174 assert(std::next(m.begin())->first == 3);175 assert(std::next(m.begin())->second == 3.5);176 assert(std::next(m.begin(), 2)->first == 5);177 assert(std::next(m.begin(), 2)->second == 5.5);178 assert(std::next(m.begin(), 3)->first == 6);179 assert(std::next(m.begin(), 3)->second == 6.5);180 assert(std::next(m.begin(), 4)->first == 7);181 assert(std::next(m.begin(), 4)->second == 7.5);182 assert(std::next(m.begin(), 5)->first == 8);183 assert(std::next(m.begin(), 5)->second == 8.5);184 185 i = m.erase(std::next(m.cbegin(), 5));186 assert(m.size() == 5);187 assert(i == m.end());188 assert(m.begin()->first == 2);189 assert(m.begin()->second == 2.5);190 assert(std::next(m.begin())->first == 3);191 assert(std::next(m.begin())->second == 3.5);192 assert(std::next(m.begin(), 2)->first == 5);193 assert(std::next(m.begin(), 2)->second == 5.5);194 assert(std::next(m.begin(), 3)->first == 6);195 assert(std::next(m.begin(), 3)->second == 6.5);196 assert(std::next(m.begin(), 4)->first == 7);197 assert(std::next(m.begin(), 4)->second == 7.5);198 199 i = m.erase(std::next(m.cbegin(), 1));200 assert(m.size() == 4);201 assert(i == std::next(m.begin()));202 assert(m.begin()->first == 2);203 assert(m.begin()->second == 2.5);204 assert(std::next(m.begin())->first == 5);205 assert(std::next(m.begin())->second == 5.5);206 assert(std::next(m.begin(), 2)->first == 6);207 assert(std::next(m.begin(), 2)->second == 6.5);208 assert(std::next(m.begin(), 3)->first == 7);209 assert(std::next(m.begin(), 3)->second == 7.5);210 211 i = m.erase(std::next(m.cbegin(), 2));212 assert(m.size() == 3);213 assert(i == std::next(m.begin(), 2));214 assert(m.begin()->first == 2);215 assert(m.begin()->second == 2.5);216 assert(std::next(m.begin())->first == 5);217 assert(std::next(m.begin())->second == 5.5);218 assert(std::next(m.begin(), 2)->first == 7);219 assert(std::next(m.begin(), 2)->second == 7.5);220 221 i = m.erase(std::next(m.cbegin(), 2));222 assert(m.size() == 2);223 assert(i == std::next(m.begin(), 2));224 assert(m.begin()->first == 2);225 assert(m.begin()->second == 2.5);226 assert(std::next(m.begin())->first == 5);227 assert(std::next(m.begin())->second == 5.5);228 229 i = m.erase(std::next(m.cbegin(), 0));230 assert(m.size() == 1);231 assert(i == std::next(m.begin(), 0));232 assert(m.begin()->first == 5);233 assert(m.begin()->second == 5.5);234 235 i = m.erase(m.cbegin());236 assert(m.size() == 0);237 assert(i == m.begin());238 assert(i == m.end());239 }240#endif241#if TEST_STD_VER >= 14242 {243 // This is LWG #2059244 typedef TemplateConstructor T;245 typedef std::map<T, int> C;246 typedef C::iterator I;247 248 C c;249 T a{0};250 I it = c.find(a);251 if (it != c.end())252 c.erase(it);253 }254#endif255 256 return 0;257}258