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 21struct TemplateConstructor 22{ 23 template<typename T> 24 TemplateConstructor (const T&) {} 25}; 26 27bool operator<(const TemplateConstructor&, const TemplateConstructor&) { return false; } 28 29int 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