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 // <set> 11 12 // class multiset 13 14 // iterator erase(const_iterator position); 15 16 #include <set> 17 #include <cassert> 18 19 #include "min_allocator.h" 20 21 struct TemplateConstructor 22 { 23 template<typename T> 24 TemplateConstructor (const T&) {} 25 }; 26 27 bool operator<(const TemplateConstructor&, const TemplateConstructor&) { return false; } 28 29 int main() 30 { 31 { 32 typedef std::multiset<int> M; 33 typedef int V; 34 typedef M::iterator I; 35 V ar[] = 36 { 37 1, 38 2, 39 3, 40 4, 41 5, 42 6, 43 7, 44 8 45 }; 46 M m(ar, ar + sizeof(ar)/sizeof(ar[0])); 47 assert(m.size() == 8); 48 I i = m.erase(next(m.cbegin(), 3)); 49 assert(m.size() == 7); 50 assert(i == next(m.begin(), 3)); 51 assert(*next(m.begin(), 0) == 1); 52 assert(*next(m.begin(), 1) == 2); 53 assert(*next(m.begin(), 2) == 3); 54 assert(*next(m.begin(), 3) == 5); 55 assert(*next(m.begin(), 4) == 6); 56 assert(*next(m.begin(), 5) == 7); 57 assert(*next(m.begin(), 6) == 8); 58 59 i = m.erase(next(m.cbegin(), 0)); 60 assert(m.size() == 6); 61 assert(i == m.begin()); 62 assert(*next(m.begin(), 0) == 2); 63 assert(*next(m.begin(), 1) == 3); 64 assert(*next(m.begin(), 2) == 5); 65 assert(*next(m.begin(), 3) == 6); 66 assert(*next(m.begin(), 4) == 7); 67 assert(*next(m.begin(), 5) == 8); 68 69 i = m.erase(next(m.cbegin(), 5)); 70 assert(m.size() == 5); 71 assert(i == m.end()); 72 assert(*next(m.begin(), 0) == 2); 73 assert(*next(m.begin(), 1) == 3); 74 assert(*next(m.begin(), 2) == 5); 75 assert(*next(m.begin(), 3) == 6); 76 assert(*next(m.begin(), 4) == 7); 77 78 i = m.erase(next(m.cbegin(), 1)); 79 assert(m.size() == 4); 80 assert(i == next(m.begin())); 81 assert(*next(m.begin(), 0) == 2); 82 assert(*next(m.begin(), 1) == 5); 83 assert(*next(m.begin(), 2) == 6); 84 assert(*next(m.begin(), 3) == 7); 85 86 i = m.erase(next(m.cbegin(), 2)); 87 assert(m.size() == 3); 88 assert(i == next(m.begin(), 2)); 89 assert(*next(m.begin(), 0) == 2); 90 assert(*next(m.begin(), 1) == 5); 91 assert(*next(m.begin(), 2) == 7); 92 93 i = m.erase(next(m.cbegin(), 2)); 94 assert(m.size() == 2); 95 assert(i == next(m.begin(), 2)); 96 assert(*next(m.begin(), 0) == 2); 97 assert(*next(m.begin(), 1) == 5); 98 99 i = m.erase(next(m.cbegin(), 0)); 100 assert(m.size() == 1); 101 assert(i == next(m.begin(), 0)); 102 assert(*next(m.begin(), 0) == 5); 103 104 i = m.erase(m.cbegin()); 105 assert(m.size() == 0); 106 assert(i == m.begin()); 107 assert(i == m.end()); 108 } 109 #if TEST_STD_VER >= 11 110 { 111 typedef std::multiset<int, std::less<int>, min_allocator<int>> M; 112 typedef int V; 113 typedef M::iterator I; 114 V ar[] = 115 { 116 1, 117 2, 118 3, 119 4, 120 5, 121 6, 122 7, 123 8 124 }; 125 M m(ar, ar + sizeof(ar)/sizeof(ar[0])); 126 assert(m.size() == 8); 127 I i = m.erase(next(m.cbegin(), 3)); 128 assert(m.size() == 7); 129 assert(i == next(m.begin(), 3)); 130 assert(*next(m.begin(), 0) == 1); 131 assert(*next(m.begin(), 1) == 2); 132 assert(*next(m.begin(), 2) == 3); 133 assert(*next(m.begin(), 3) == 5); 134 assert(*next(m.begin(), 4) == 6); 135 assert(*next(m.begin(), 5) == 7); 136 assert(*next(m.begin(), 6) == 8); 137 138 i = m.erase(next(m.cbegin(), 0)); 139 assert(m.size() == 6); 140 assert(i == m.begin()); 141 assert(*next(m.begin(), 0) == 2); 142 assert(*next(m.begin(), 1) == 3); 143 assert(*next(m.begin(), 2) == 5); 144 assert(*next(m.begin(), 3) == 6); 145 assert(*next(m.begin(), 4) == 7); 146 assert(*next(m.begin(), 5) == 8); 147 148 i = m.erase(next(m.cbegin(), 5)); 149 assert(m.size() == 5); 150 assert(i == m.end()); 151 assert(*next(m.begin(), 0) == 2); 152 assert(*next(m.begin(), 1) == 3); 153 assert(*next(m.begin(), 2) == 5); 154 assert(*next(m.begin(), 3) == 6); 155 assert(*next(m.begin(), 4) == 7); 156 157 i = m.erase(next(m.cbegin(), 1)); 158 assert(m.size() == 4); 159 assert(i == next(m.begin())); 160 assert(*next(m.begin(), 0) == 2); 161 assert(*next(m.begin(), 1) == 5); 162 assert(*next(m.begin(), 2) == 6); 163 assert(*next(m.begin(), 3) == 7); 164 165 i = m.erase(next(m.cbegin(), 2)); 166 assert(m.size() == 3); 167 assert(i == next(m.begin(), 2)); 168 assert(*next(m.begin(), 0) == 2); 169 assert(*next(m.begin(), 1) == 5); 170 assert(*next(m.begin(), 2) == 7); 171 172 i = m.erase(next(m.cbegin(), 2)); 173 assert(m.size() == 2); 174 assert(i == next(m.begin(), 2)); 175 assert(*next(m.begin(), 0) == 2); 176 assert(*next(m.begin(), 1) == 5); 177 178 i = m.erase(next(m.cbegin(), 0)); 179 assert(m.size() == 1); 180 assert(i == next(m.begin(), 0)); 181 assert(*next(m.begin(), 0) == 5); 182 183 i = m.erase(m.cbegin()); 184 assert(m.size() == 0); 185 assert(i == m.begin()); 186 assert(i == m.end()); 187 } 188 #endif 189 #if TEST_STD_VER >= 14 190 { 191 // This is LWG #2059 192 typedef TemplateConstructor T; 193 typedef std::multiset<T> C; 194 typedef C::iterator I; 195 196 C c; 197 T a{0}; 198 I it = c.find(a); 199 if (it != c.end()) 200 c.erase(it); 201 } 202 #endif 203 } 204