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_set>
10
11// template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
12// class Alloc = allocator<Value>>
13// class unordered_set
14
15// size_type erase(const key_type& k);
16
17#include <unordered_set>
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_set<int> C;
43 typedef int P;
44 P a[] = {P(1), P(2), P(3), P(4), P(1), P(2)};
45 C c(a, a + sizeof(a) / sizeof(a[0]));
46 assert(c.erase(5) == 0);
47 assert(c.size() == 4);
48 assert(c.count(1) == 1);
49 assert(c.count(2) == 1);
50 assert(c.count(3) == 1);
51 assert(c.count(4) == 1);
52
53 assert(c.erase(2) == 1);
54 assert(c.size() == 3);
55 assert(c.count(1) == 1);
56 assert(c.count(3) == 1);
57 assert(c.count(4) == 1);
58
59 assert(c.erase(2) == 0);
60 assert(c.size() == 3);
61 assert(c.count(1) == 1);
62 assert(c.count(3) == 1);
63 assert(c.count(4) == 1);
64
65 assert(c.erase(4) == 1);
66 assert(c.size() == 2);
67 assert(c.count(1) == 1);
68 assert(c.count(3) == 1);
69
70 assert(c.erase(4) == 0);
71 assert(c.size() == 2);
72 assert(c.count(1) == 1);
73 assert(c.count(3) == 1);
74
75 assert(c.erase(1) == 1);
76 assert(c.size() == 1);
77 assert(c.count(3) == 1);
78
79 assert(c.erase(1) == 0);
80 assert(c.size() == 1);
81 assert(c.count(3) == 1);
82
83 assert(c.erase(3) == 1);
84 assert(c.size() == 0);
85
86 assert(c.erase(3) == 0);
87 assert(c.size() == 0);
88 }
89#if TEST_STD_VER >= 11
90 {
91 typedef std::unordered_set<int, std::hash<int>, std::equal_to<int>, min_allocator<int>> C;
92 typedef int P;
93 P a[] = {P(1), P(2), P(3), P(4), P(1), P(2)};
94 C c(a, a + sizeof(a) / sizeof(a[0]));
95 assert(c.erase(5) == 0);
96 assert(c.size() == 4);
97 assert(c.count(1) == 1);
98 assert(c.count(2) == 1);
99 assert(c.count(3) == 1);
100 assert(c.count(4) == 1);
101
102 assert(c.erase(2) == 1);
103 assert(c.size() == 3);
104 assert(c.count(1) == 1);
105 assert(c.count(3) == 1);
106 assert(c.count(4) == 1);
107
108 assert(c.erase(2) == 0);
109 assert(c.size() == 3);
110 assert(c.count(1) == 1);
111 assert(c.count(3) == 1);
112 assert(c.count(4) == 1);
113
114 assert(c.erase(4) == 1);
115 assert(c.size() == 2);
116 assert(c.count(1) == 1);
117 assert(c.count(3) == 1);
118
119 assert(c.erase(4) == 0);
120 assert(c.size() == 2);
121 assert(c.count(1) == 1);
122 assert(c.count(3) == 1);
123
124 assert(c.erase(1) == 1);
125 assert(c.size() == 1);
126 assert(c.count(3) == 1);
127
128 assert(c.erase(1) == 0);
129 assert(c.size() == 1);
130 assert(c.count(3) == 1);
131
132 assert(c.erase(3) == 1);
133 assert(c.size() == 0);
134
135 assert(c.erase(3) == 0);
136 assert(c.size() == 0);
137 }
138 {
139 typedef std::unordered_set<int> C;
140 C m, m2;
141 for (int i = 0; i < 10; ++i) {
142 m.insert(i);
143 m2.insert(i);
144 }
145
146 C::iterator i = m2.begin();
147 int ctr = 0;
148 while (i != m2.end()) {
149 if (ctr++ % 2 == 0)
150 m2.erase(i++);
151 else
152 ++i;
153 }
154
155 assert(only_deletions(m, m2));
156 }
157#endif
158
159 return 0;
160}
161

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