161 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// <unordered_set>10 11// template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,12// class Alloc = allocator<Value>>13// class unordered_set14 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 >= 1125template <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#endif39 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 >= 1190 {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 else152 ++i;153 }154 155 assert(only_deletions(m, m2));156 }157#endif158 159 return 0;160}161