1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant//                     The LLVM Compiler Infrastructure
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <forward_list>
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
127a2523b201eb46508db7570718da915f8f982a4aHoward Hinnant// iterator erase_after(const_iterator first, const_iterator last);
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <forward_list>
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert>
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
17061d0cc4db18d17bf01ed14c5db0be098205bd47Marshall Clow#include "min_allocator.h"
1881381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main()
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef int T;
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        typedef std::forward_list<T> C;
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        const T t[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        C c(std::begin(t), std::end(t));
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
277a2523b201eb46508db7570718da915f8f982a4aHoward Hinnant        C::iterator i = c.erase_after(next(c.cbefore_begin(), 4), next(c.cbefore_begin(), 4));
287a2523b201eb46508db7570718da915f8f982a4aHoward Hinnant        assert(i == next(c.cbefore_begin(), 4));
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(distance(c.begin(), c.end()) == 10);
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 0) == 0);
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 1) == 1);
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 2) == 2);
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 3) == 3);
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 4) == 4);
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 5) == 5);
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 6) == 6);
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 7) == 7);
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 8) == 8);
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 9) == 9);
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
417a2523b201eb46508db7570718da915f8f982a4aHoward Hinnant        i = c.erase_after(next(c.cbefore_begin(), 2), next(c.cbefore_begin(), 5));
427a2523b201eb46508db7570718da915f8f982a4aHoward Hinnant        assert(i == next(c.begin(), 2));
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(distance(c.begin(), c.end()) == 8);
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 0) == 0);
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 1) == 1);
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 2) == 4);
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 3) == 5);
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 4) == 6);
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 5) == 7);
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 6) == 8);
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 7) == 9);
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
537a2523b201eb46508db7570718da915f8f982a4aHoward Hinnant        i = c.erase_after(next(c.cbefore_begin(), 2), next(c.cbefore_begin(), 3));
547a2523b201eb46508db7570718da915f8f982a4aHoward Hinnant        assert(i == next(c.begin(), 2));
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(distance(c.begin(), c.end()) == 8);
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 0) == 0);
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 1) == 1);
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 2) == 4);
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 3) == 5);
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 4) == 6);
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 5) == 7);
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 6) == 8);
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 7) == 9);
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
657a2523b201eb46508db7570718da915f8f982a4aHoward Hinnant        i = c.erase_after(next(c.cbefore_begin(), 5), next(c.cbefore_begin(), 9));
667a2523b201eb46508db7570718da915f8f982a4aHoward Hinnant        assert(i == c.end());
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(distance(c.begin(), c.end()) == 5);
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 0) == 0);
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 1) == 1);
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 2) == 4);
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 3) == 5);
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 4) == 6);
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
747a2523b201eb46508db7570718da915f8f982a4aHoward Hinnant        i = c.erase_after(next(c.cbefore_begin(), 0), next(c.cbefore_begin(), 2));
757a2523b201eb46508db7570718da915f8f982a4aHoward Hinnant        assert(i == c.begin());
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(distance(c.begin(), c.end()) == 4);
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 0) == 1);
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 1) == 4);
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 2) == 5);
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(*next(c.begin(), 3) == 6);
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
827a2523b201eb46508db7570718da915f8f982a4aHoward Hinnant        i = c.erase_after(next(c.cbefore_begin(), 0), next(c.cbefore_begin(), 5));
837a2523b201eb46508db7570718da915f8f982a4aHoward Hinnant        assert(i == c.begin());
847a2523b201eb46508db7570718da915f8f982a4aHoward Hinnant        assert(i == c.end());
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        assert(distance(c.begin(), c.end()) == 0);
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
8781381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant#if __cplusplus >= 201103L
8881381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant    {
8981381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        typedef int T;
9081381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        typedef std::forward_list<T, min_allocator<T>> C;
9181381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        const T t[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
9281381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        C c(std::begin(t), std::end(t));
9381381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant
9481381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        C::iterator i = c.erase_after(next(c.cbefore_begin(), 4), next(c.cbefore_begin(), 4));
9581381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(i == next(c.cbefore_begin(), 4));
9681381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(distance(c.begin(), c.end()) == 10);
9781381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 0) == 0);
9881381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 1) == 1);
9981381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 2) == 2);
10081381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 3) == 3);
10181381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 4) == 4);
10281381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 5) == 5);
10381381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 6) == 6);
10481381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 7) == 7);
10581381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 8) == 8);
10681381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 9) == 9);
10781381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant
10881381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        i = c.erase_after(next(c.cbefore_begin(), 2), next(c.cbefore_begin(), 5));
10981381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(i == next(c.begin(), 2));
11081381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(distance(c.begin(), c.end()) == 8);
11181381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 0) == 0);
11281381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 1) == 1);
11381381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 2) == 4);
11481381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 3) == 5);
11581381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 4) == 6);
11681381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 5) == 7);
11781381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 6) == 8);
11881381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 7) == 9);
11981381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant
12081381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        i = c.erase_after(next(c.cbefore_begin(), 2), next(c.cbefore_begin(), 3));
12181381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(i == next(c.begin(), 2));
12281381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(distance(c.begin(), c.end()) == 8);
12381381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 0) == 0);
12481381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 1) == 1);
12581381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 2) == 4);
12681381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 3) == 5);
12781381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 4) == 6);
12881381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 5) == 7);
12981381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 6) == 8);
13081381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 7) == 9);
13181381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant
13281381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        i = c.erase_after(next(c.cbefore_begin(), 5), next(c.cbefore_begin(), 9));
13381381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(i == c.end());
13481381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(distance(c.begin(), c.end()) == 5);
13581381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 0) == 0);
13681381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 1) == 1);
13781381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 2) == 4);
13881381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 3) == 5);
13981381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 4) == 6);
14081381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant
14181381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        i = c.erase_after(next(c.cbefore_begin(), 0), next(c.cbefore_begin(), 2));
14281381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(i == c.begin());
14381381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(distance(c.begin(), c.end()) == 4);
14481381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 0) == 1);
14581381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 1) == 4);
14681381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 2) == 5);
14781381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(*next(c.begin(), 3) == 6);
14881381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant
14981381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        i = c.erase_after(next(c.cbefore_begin(), 0), next(c.cbefore_begin(), 5));
15081381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(i == c.begin());
15181381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(i == c.end());
15281381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant        assert(distance(c.begin(), c.end()) == 0);
15381381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant    }
15481381a932fbebb384adfe5c0116d45b37479efdeHoward Hinnant#endif
155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
156