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