xref: /llvm-project/libcxx/test/std/containers/associative/multiset/erase_iter.pass.cpp (revision 5ffe11a9fccfffbabbea5bbcc1cfd4b21af6d631)
15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <set>
105a83710eSEric Fiselier 
115a83710eSEric Fiselier // class multiset
125a83710eSEric Fiselier 
135a83710eSEric Fiselier // iterator erase(const_iterator position);
145a83710eSEric Fiselier 
155a83710eSEric Fiselier #include <set>
165a83710eSEric Fiselier #include <cassert>
175a83710eSEric Fiselier 
187fc6a556SMarshall Clow #include "test_macros.h"
195a83710eSEric Fiselier #include "min_allocator.h"
205a83710eSEric Fiselier 
21ec392968SMarshall Clow struct TemplateConstructor
22ec392968SMarshall Clow {
23ec392968SMarshall Clow     template<typename T>
TemplateConstructorTemplateConstructor24ec392968SMarshall Clow     TemplateConstructor (const T&) {}
25ec392968SMarshall Clow };
26ec392968SMarshall Clow 
operator <(const TemplateConstructor &,const TemplateConstructor &)27ec392968SMarshall Clow bool operator<(const TemplateConstructor&, const TemplateConstructor&) { return false; }
28ec392968SMarshall Clow 
main(int,char **)292df59c50SJF Bastien int main(int, char**)
305a83710eSEric Fiselier {
315a83710eSEric Fiselier     {
325a83710eSEric Fiselier         typedef std::multiset<int> M;
335a83710eSEric Fiselier         typedef int V;
345a83710eSEric Fiselier         typedef M::iterator I;
355a83710eSEric Fiselier         V ar[] =
365a83710eSEric Fiselier         {
375a83710eSEric Fiselier             1,
385a83710eSEric Fiselier             2,
395a83710eSEric Fiselier             3,
405a83710eSEric Fiselier             4,
415a83710eSEric Fiselier             5,
425a83710eSEric Fiselier             6,
435a83710eSEric Fiselier             7,
445a83710eSEric Fiselier             8
455a83710eSEric Fiselier         };
465a83710eSEric Fiselier         M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
475a83710eSEric Fiselier         assert(m.size() == 8);
48*5ffe11a9SArthur O'Dwyer         I i = m.erase(std::next(m.cbegin(), 3));
495a83710eSEric Fiselier         assert(m.size() == 7);
50*5ffe11a9SArthur O'Dwyer         assert(i == std::next(m.begin(), 3));
51*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 0) == 1);
52*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 1) == 2);
53*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 2) == 3);
54*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 3) == 5);
55*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 4) == 6);
56*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 5) == 7);
57*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 6) == 8);
585a83710eSEric Fiselier 
59*5ffe11a9SArthur O'Dwyer         i = m.erase(std::next(m.cbegin(), 0));
605a83710eSEric Fiselier         assert(m.size() == 6);
615a83710eSEric Fiselier         assert(i == m.begin());
62*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 0) == 2);
63*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 1) == 3);
64*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 2) == 5);
65*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 3) == 6);
66*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 4) == 7);
67*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 5) == 8);
685a83710eSEric Fiselier 
69*5ffe11a9SArthur O'Dwyer         i = m.erase(std::next(m.cbegin(), 5));
705a83710eSEric Fiselier         assert(m.size() == 5);
715a83710eSEric Fiselier         assert(i == m.end());
72*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 0) == 2);
73*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 1) == 3);
74*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 2) == 5);
75*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 3) == 6);
76*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 4) == 7);
775a83710eSEric Fiselier 
78*5ffe11a9SArthur O'Dwyer         i = m.erase(std::next(m.cbegin(), 1));
795a83710eSEric Fiselier         assert(m.size() == 4);
80*5ffe11a9SArthur O'Dwyer         assert(i == std::next(m.begin()));
81*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 0) == 2);
82*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 1) == 5);
83*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 2) == 6);
84*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 3) == 7);
855a83710eSEric Fiselier 
86*5ffe11a9SArthur O'Dwyer         i = m.erase(std::next(m.cbegin(), 2));
875a83710eSEric Fiselier         assert(m.size() == 3);
88*5ffe11a9SArthur O'Dwyer         assert(i == std::next(m.begin(), 2));
89*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 0) == 2);
90*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 1) == 5);
91*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 2) == 7);
925a83710eSEric Fiselier 
93*5ffe11a9SArthur O'Dwyer         i = m.erase(std::next(m.cbegin(), 2));
945a83710eSEric Fiselier         assert(m.size() == 2);
95*5ffe11a9SArthur O'Dwyer         assert(i == std::next(m.begin(), 2));
96*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 0) == 2);
97*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 1) == 5);
985a83710eSEric Fiselier 
99*5ffe11a9SArthur O'Dwyer         i = m.erase(std::next(m.cbegin(), 0));
1005a83710eSEric Fiselier         assert(m.size() == 1);
101*5ffe11a9SArthur O'Dwyer         assert(i == std::next(m.begin(), 0));
102*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 0) == 5);
1035a83710eSEric Fiselier 
1045a83710eSEric Fiselier         i = m.erase(m.cbegin());
1055a83710eSEric Fiselier         assert(m.size() == 0);
1065a83710eSEric Fiselier         assert(i == m.begin());
1075a83710eSEric Fiselier         assert(i == m.end());
1085a83710eSEric Fiselier     }
109f2f2a639SEric Fiselier #if TEST_STD_VER >= 11
1105a83710eSEric Fiselier     {
1115a83710eSEric Fiselier         typedef std::multiset<int, std::less<int>, min_allocator<int>> M;
1125a83710eSEric Fiselier         typedef int V;
1135a83710eSEric Fiselier         typedef M::iterator I;
1145a83710eSEric Fiselier         V ar[] =
1155a83710eSEric Fiselier         {
1165a83710eSEric Fiselier             1,
1175a83710eSEric Fiselier             2,
1185a83710eSEric Fiselier             3,
1195a83710eSEric Fiselier             4,
1205a83710eSEric Fiselier             5,
1215a83710eSEric Fiselier             6,
1225a83710eSEric Fiselier             7,
1235a83710eSEric Fiselier             8
1245a83710eSEric Fiselier         };
1255a83710eSEric Fiselier         M m(ar, ar + sizeof(ar)/sizeof(ar[0]));
1265a83710eSEric Fiselier         assert(m.size() == 8);
127*5ffe11a9SArthur O'Dwyer         I i = m.erase(std::next(m.cbegin(), 3));
1285a83710eSEric Fiselier         assert(m.size() == 7);
129*5ffe11a9SArthur O'Dwyer         assert(i == std::next(m.begin(), 3));
130*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 0) == 1);
131*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 1) == 2);
132*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 2) == 3);
133*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 3) == 5);
134*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 4) == 6);
135*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 5) == 7);
136*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 6) == 8);
1375a83710eSEric Fiselier 
138*5ffe11a9SArthur O'Dwyer         i = m.erase(std::next(m.cbegin(), 0));
1395a83710eSEric Fiselier         assert(m.size() == 6);
1405a83710eSEric Fiselier         assert(i == m.begin());
141*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 0) == 2);
142*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 1) == 3);
143*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 2) == 5);
144*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 3) == 6);
145*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 4) == 7);
146*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 5) == 8);
1475a83710eSEric Fiselier 
148*5ffe11a9SArthur O'Dwyer         i = m.erase(std::next(m.cbegin(), 5));
1495a83710eSEric Fiselier         assert(m.size() == 5);
1505a83710eSEric Fiselier         assert(i == m.end());
151*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 0) == 2);
152*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 1) == 3);
153*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 2) == 5);
154*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 3) == 6);
155*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 4) == 7);
1565a83710eSEric Fiselier 
157*5ffe11a9SArthur O'Dwyer         i = m.erase(std::next(m.cbegin(), 1));
1585a83710eSEric Fiselier         assert(m.size() == 4);
159*5ffe11a9SArthur O'Dwyer         assert(i == std::next(m.begin()));
160*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 0) == 2);
161*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 1) == 5);
162*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 2) == 6);
163*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 3) == 7);
1645a83710eSEric Fiselier 
165*5ffe11a9SArthur O'Dwyer         i = m.erase(std::next(m.cbegin(), 2));
1665a83710eSEric Fiselier         assert(m.size() == 3);
167*5ffe11a9SArthur O'Dwyer         assert(i == std::next(m.begin(), 2));
168*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 0) == 2);
169*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 1) == 5);
170*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 2) == 7);
1715a83710eSEric Fiselier 
172*5ffe11a9SArthur O'Dwyer         i = m.erase(std::next(m.cbegin(), 2));
1735a83710eSEric Fiselier         assert(m.size() == 2);
174*5ffe11a9SArthur O'Dwyer         assert(i == std::next(m.begin(), 2));
175*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 0) == 2);
176*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 1) == 5);
1775a83710eSEric Fiselier 
178*5ffe11a9SArthur O'Dwyer         i = m.erase(std::next(m.cbegin(), 0));
1795a83710eSEric Fiselier         assert(m.size() == 1);
180*5ffe11a9SArthur O'Dwyer         assert(i == std::next(m.begin(), 0));
181*5ffe11a9SArthur O'Dwyer         assert(*std::next(m.begin(), 0) == 5);
1825a83710eSEric Fiselier 
1835a83710eSEric Fiselier         i = m.erase(m.cbegin());
1845a83710eSEric Fiselier         assert(m.size() == 0);
1855a83710eSEric Fiselier         assert(i == m.begin());
1865a83710eSEric Fiselier         assert(i == m.end());
1875a83710eSEric Fiselier     }
1885a83710eSEric Fiselier #endif
189f2f2a639SEric Fiselier #if TEST_STD_VER >= 14
190ec392968SMarshall Clow     {
191ec392968SMarshall Clow     //  This is LWG #2059
192ec392968SMarshall Clow         typedef TemplateConstructor T;
193ec392968SMarshall Clow         typedef std::multiset<T> C;
194ec392968SMarshall Clow         typedef C::iterator I;
195ec392968SMarshall Clow 
196ec392968SMarshall Clow         C c;
197ec392968SMarshall Clow         T a{0};
198ec392968SMarshall Clow         I it = c.find(a);
199ec392968SMarshall Clow         if (it != c.end())
200ec392968SMarshall Clow             c.erase(it);
201ec392968SMarshall Clow     }
202ec392968SMarshall Clow #endif
2032df59c50SJF Bastien 
2042df59c50SJF Bastien   return 0;
2055a83710eSEric Fiselier }
206