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