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