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
21int main()
22{
23    {
24        typedef std::multiset<int> M;
25        typedef int V;
26        typedef M::iterator I;
27        V ar[] =
28        {
29            1,
30            2,
31            3,
32            4,
33            5,
34            6,
35            7,
36            8
37        };
38        M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
39        assert(m.size() == 8);
40        I i = m.erase(next(m.cbegin(), 3));
41        assert(m.size() == 7);
42        assert(i == next(m.begin(), 3));
43        assert(*next(m.begin(), 0) == 1);
44        assert(*next(m.begin(), 1) == 2);
45        assert(*next(m.begin(), 2) == 3);
46        assert(*next(m.begin(), 3) == 5);
47        assert(*next(m.begin(), 4) == 6);
48        assert(*next(m.begin(), 5) == 7);
49        assert(*next(m.begin(), 6) == 8);
50
51        i = m.erase(next(m.cbegin(), 0));
52        assert(m.size() == 6);
53        assert(i == m.begin());
54        assert(*next(m.begin(), 0) == 2);
55        assert(*next(m.begin(), 1) == 3);
56        assert(*next(m.begin(), 2) == 5);
57        assert(*next(m.begin(), 3) == 6);
58        assert(*next(m.begin(), 4) == 7);
59        assert(*next(m.begin(), 5) == 8);
60
61        i = m.erase(next(m.cbegin(), 5));
62        assert(m.size() == 5);
63        assert(i == m.end());
64        assert(*next(m.begin(), 0) == 2);
65        assert(*next(m.begin(), 1) == 3);
66        assert(*next(m.begin(), 2) == 5);
67        assert(*next(m.begin(), 3) == 6);
68        assert(*next(m.begin(), 4) == 7);
69
70        i = m.erase(next(m.cbegin(), 1));
71        assert(m.size() == 4);
72        assert(i == next(m.begin()));
73        assert(*next(m.begin(), 0) == 2);
74        assert(*next(m.begin(), 1) == 5);
75        assert(*next(m.begin(), 2) == 6);
76        assert(*next(m.begin(), 3) == 7);
77
78        i = m.erase(next(m.cbegin(), 2));
79        assert(m.size() == 3);
80        assert(i == next(m.begin(), 2));
81        assert(*next(m.begin(), 0) == 2);
82        assert(*next(m.begin(), 1) == 5);
83        assert(*next(m.begin(), 2) == 7);
84
85        i = m.erase(next(m.cbegin(), 2));
86        assert(m.size() == 2);
87        assert(i == next(m.begin(), 2));
88        assert(*next(m.begin(), 0) == 2);
89        assert(*next(m.begin(), 1) == 5);
90
91        i = m.erase(next(m.cbegin(), 0));
92        assert(m.size() == 1);
93        assert(i == next(m.begin(), 0));
94        assert(*next(m.begin(), 0) == 5);
95
96        i = m.erase(m.cbegin());
97        assert(m.size() == 0);
98        assert(i == m.begin());
99        assert(i == m.end());
100    }
101#if __cplusplus >= 201103L
102    {
103        typedef std::multiset<int, std::less<int>, min_allocator<int>> M;
104        typedef int V;
105        typedef M::iterator I;
106        V ar[] =
107        {
108            1,
109            2,
110            3,
111            4,
112            5,
113            6,
114            7,
115            8
116        };
117        M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
118        assert(m.size() == 8);
119        I i = m.erase(next(m.cbegin(), 3));
120        assert(m.size() == 7);
121        assert(i == next(m.begin(), 3));
122        assert(*next(m.begin(), 0) == 1);
123        assert(*next(m.begin(), 1) == 2);
124        assert(*next(m.begin(), 2) == 3);
125        assert(*next(m.begin(), 3) == 5);
126        assert(*next(m.begin(), 4) == 6);
127        assert(*next(m.begin(), 5) == 7);
128        assert(*next(m.begin(), 6) == 8);
129
130        i = m.erase(next(m.cbegin(), 0));
131        assert(m.size() == 6);
132        assert(i == m.begin());
133        assert(*next(m.begin(), 0) == 2);
134        assert(*next(m.begin(), 1) == 3);
135        assert(*next(m.begin(), 2) == 5);
136        assert(*next(m.begin(), 3) == 6);
137        assert(*next(m.begin(), 4) == 7);
138        assert(*next(m.begin(), 5) == 8);
139
140        i = m.erase(next(m.cbegin(), 5));
141        assert(m.size() == 5);
142        assert(i == m.end());
143        assert(*next(m.begin(), 0) == 2);
144        assert(*next(m.begin(), 1) == 3);
145        assert(*next(m.begin(), 2) == 5);
146        assert(*next(m.begin(), 3) == 6);
147        assert(*next(m.begin(), 4) == 7);
148
149        i = m.erase(next(m.cbegin(), 1));
150        assert(m.size() == 4);
151        assert(i == next(m.begin()));
152        assert(*next(m.begin(), 0) == 2);
153        assert(*next(m.begin(), 1) == 5);
154        assert(*next(m.begin(), 2) == 6);
155        assert(*next(m.begin(), 3) == 7);
156
157        i = m.erase(next(m.cbegin(), 2));
158        assert(m.size() == 3);
159        assert(i == next(m.begin(), 2));
160        assert(*next(m.begin(), 0) == 2);
161        assert(*next(m.begin(), 1) == 5);
162        assert(*next(m.begin(), 2) == 7);
163
164        i = m.erase(next(m.cbegin(), 2));
165        assert(m.size() == 2);
166        assert(i == next(m.begin(), 2));
167        assert(*next(m.begin(), 0) == 2);
168        assert(*next(m.begin(), 1) == 5);
169
170        i = m.erase(next(m.cbegin(), 0));
171        assert(m.size() == 1);
172        assert(i == next(m.begin(), 0));
173        assert(*next(m.begin(), 0) == 5);
174
175        i = m.erase(m.cbegin());
176        assert(m.size() == 0);
177        assert(i == m.begin());
178        assert(i == m.end());
179    }
180#endif
181}
182