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// <unordered_map>
10
11// template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>,
12// class Alloc = allocator<pair<const Key, T>>>
13// class unordered_map
14
15// size_type erase(const key_type& k);
16
17#include <unordered_map>
18#include <string>
19#include <cassert>
20
21#include "test_macros.h"
22#include "min_allocator.h"
23
24#if TEST_STD_VER >= 11
25template <typename Unordered>
26bool only_deletions(const Unordered& whole, const Unordered& part) {
27 typename Unordered::const_iterator w = whole.begin();
28 typename Unordered::const_iterator p = part.begin();
29
30 while (w != whole.end() && p != part.end()) {
31 if (*w == *p)
32 p++;
33 w++;
34 }
35
36 return p == part.end();
37}
38#endif
39
40int main(int, char**) {
41 {
42 typedef std::unordered_map<int, std::string> C;
43 typedef std::pair<int, std::string> P;
44 P a[] = {
45 P(1, "one"),
46 P(2, "two"),
47 P(3, "three"),
48 P(4, "four"),
49 P(1, "four"),
50 P(2, "four"),
51 };
52 C c(a, a + sizeof(a) / sizeof(a[0]));
53 assert(c.erase(5) == 0);
54 assert(c.size() == 4);
55 assert(c.at(1) == "one");
56 assert(c.at(2) == "two");
57 assert(c.at(3) == "three");
58 assert(c.at(4) == "four");
59
60 assert(c.erase(2) == 1);
61 assert(c.size() == 3);
62 assert(c.at(1) == "one");
63 assert(c.at(3) == "three");
64 assert(c.at(4) == "four");
65
66 assert(c.erase(2) == 0);
67 assert(c.size() == 3);
68 assert(c.at(1) == "one");
69 assert(c.at(3) == "three");
70 assert(c.at(4) == "four");
71
72 assert(c.erase(4) == 1);
73 assert(c.size() == 2);
74 assert(c.at(1) == "one");
75 assert(c.at(3) == "three");
76
77 assert(c.erase(4) == 0);
78 assert(c.size() == 2);
79 assert(c.at(1) == "one");
80 assert(c.at(3) == "three");
81
82 assert(c.erase(1) == 1);
83 assert(c.size() == 1);
84 assert(c.at(3) == "three");
85
86 assert(c.erase(1) == 0);
87 assert(c.size() == 1);
88 assert(c.at(3) == "three");
89
90 assert(c.erase(3) == 1);
91 assert(c.size() == 0);
92
93 assert(c.erase(3) == 0);
94 assert(c.size() == 0);
95 }
96#if TEST_STD_VER >= 11
97 {
98 typedef std::unordered_map<int,
99 std::string,
100 std::hash<int>,
101 std::equal_to<int>,
102 min_allocator<std::pair<const int, std::string>>>
103 C;
104 typedef std::pair<int, std::string> P;
105 P a[] = {
106 P(1, "one"),
107 P(2, "two"),
108 P(3, "three"),
109 P(4, "four"),
110 P(1, "four"),
111 P(2, "four"),
112 };
113 C c(a, a + sizeof(a) / sizeof(a[0]));
114 assert(c.erase(5) == 0);
115 assert(c.size() == 4);
116 assert(c.at(1) == "one");
117 assert(c.at(2) == "two");
118 assert(c.at(3) == "three");
119 assert(c.at(4) == "four");
120
121 assert(c.erase(2) == 1);
122 assert(c.size() == 3);
123 assert(c.at(1) == "one");
124 assert(c.at(3) == "three");
125 assert(c.at(4) == "four");
126
127 assert(c.erase(2) == 0);
128 assert(c.size() == 3);
129 assert(c.at(1) == "one");
130 assert(c.at(3) == "three");
131 assert(c.at(4) == "four");
132
133 assert(c.erase(4) == 1);
134 assert(c.size() == 2);
135 assert(c.at(1) == "one");
136 assert(c.at(3) == "three");
137
138 assert(c.erase(4) == 0);
139 assert(c.size() == 2);
140 assert(c.at(1) == "one");
141 assert(c.at(3) == "three");
142
143 assert(c.erase(1) == 1);
144 assert(c.size() == 1);
145 assert(c.at(3) == "three");
146
147 assert(c.erase(1) == 0);
148 assert(c.size() == 1);
149 assert(c.at(3) == "three");
150
151 assert(c.erase(3) == 1);
152 assert(c.size() == 0);
153
154 assert(c.erase(3) == 0);
155 assert(c.size() == 0);
156 }
157 {
158 typedef std::unordered_map<int, int> C;
159 C m, m2;
160 for (int i = 0; i < 10; ++i) {
161 m[i] = i;
162 m2[i] = i;
163 }
164
165 C::iterator i = m2.begin();
166 int ctr = 0;
167 while (i != m2.end()) {
168 if (ctr++ % 2 == 0)
169 m2.erase(i++);
170 else
171 ++i;
172 }
173
174 assert(only_deletions(m, m2));
175 }
176#endif
177
178 return 0;
179}
180

source code of libcxx/test/std/containers/unord/unord.map/unord.map.modifiers/erase_key.pass.cpp