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_multiset
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_multiset<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() == 6);
48 assert(c.count(1) == 2);
49 assert(c.count(2) == 2);
50 assert(c.count(3) == 1);
51 assert(c.count(4) == 1);
52
53 assert(c.erase(2) == 2);
54 assert(c.size() == 4);
55 assert(c.count(1) == 2);
56 assert(c.count(3) == 1);
57 assert(c.count(4) == 1);
58
59 assert(c.erase(2) == 0);
60 assert(c.size() == 4);
61 assert(c.count(1) == 2);
62 assert(c.count(3) == 1);
63 assert(c.count(4) == 1);
64
65 assert(c.erase(4) == 1);
66 assert(c.size() == 3);
67 assert(c.count(1) == 2);
68 assert(c.count(3) == 1);
69
70 assert(c.erase(4) == 0);
71 assert(c.size() == 3);
72 assert(c.count(1) == 2);
73 assert(c.count(3) == 1);
74
75 assert(c.erase(1) == 2);
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_multiset<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() == 6);
97 assert(c.count(1) == 2);
98 assert(c.count(2) == 2);
99 assert(c.count(3) == 1);
100 assert(c.count(4) == 1);
101
102 assert(c.erase(2) == 2);
103 assert(c.size() == 4);
104 assert(c.count(1) == 2);
105 assert(c.count(3) == 1);
106 assert(c.count(4) == 1);
107
108 assert(c.erase(2) == 0);
109 assert(c.size() == 4);
110 assert(c.count(1) == 2);
111 assert(c.count(3) == 1);
112 assert(c.count(4) == 1);
113
114 assert(c.erase(4) == 1);
115 assert(c.size() == 3);
116 assert(c.count(1) == 2);
117 assert(c.count(3) == 1);
118
119 assert(c.erase(4) == 0);
120 assert(c.size() == 3);
121 assert(c.count(1) == 2);
122 assert(c.count(3) == 1);
123
124 assert(c.erase(1) == 2);
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_multiset<int> C;
140 C m, m2;
141 for (int i = 0; i < 10; ++i) {
142 m.insert(i);
143 m.insert(i);
144 m2.insert(i);
145 m2.insert(i);
146 }
147
148 C::iterator i = m2.begin();
149 int ctr = 0;
150 while (i != m2.end()) {
151 if (ctr++ % 2 == 0)
152 m2.erase(i++);
153 else
154 ++i;
155 }
156
157 assert(only_deletions(m, m2));
158 }
159#endif
160
161 return 0;
162}
163

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