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// <forward_list>
11
12// iterator erase_after(const_iterator first, const_iterator last);
13
14#include <forward_list>
15#include <cassert>
16
17#include "min_allocator.h"
18
19int main()
20{
21    {
22        typedef int T;
23        typedef std::forward_list<T> C;
24        const T t[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
25        C c(std::begin(t), std::end(t));
26
27        C::iterator i = c.erase_after(next(c.cbefore_begin(), 4), next(c.cbefore_begin(), 4));
28        assert(i == next(c.cbefore_begin(), 4));
29        assert(distance(c.begin(), c.end()) == 10);
30        assert(*next(c.begin(), 0) == 0);
31        assert(*next(c.begin(), 1) == 1);
32        assert(*next(c.begin(), 2) == 2);
33        assert(*next(c.begin(), 3) == 3);
34        assert(*next(c.begin(), 4) == 4);
35        assert(*next(c.begin(), 5) == 5);
36        assert(*next(c.begin(), 6) == 6);
37        assert(*next(c.begin(), 7) == 7);
38        assert(*next(c.begin(), 8) == 8);
39        assert(*next(c.begin(), 9) == 9);
40
41        i = c.erase_after(next(c.cbefore_begin(), 2), next(c.cbefore_begin(), 5));
42        assert(i == next(c.begin(), 2));
43        assert(distance(c.begin(), c.end()) == 8);
44        assert(*next(c.begin(), 0) == 0);
45        assert(*next(c.begin(), 1) == 1);
46        assert(*next(c.begin(), 2) == 4);
47        assert(*next(c.begin(), 3) == 5);
48        assert(*next(c.begin(), 4) == 6);
49        assert(*next(c.begin(), 5) == 7);
50        assert(*next(c.begin(), 6) == 8);
51        assert(*next(c.begin(), 7) == 9);
52
53        i = c.erase_after(next(c.cbefore_begin(), 2), next(c.cbefore_begin(), 3));
54        assert(i == next(c.begin(), 2));
55        assert(distance(c.begin(), c.end()) == 8);
56        assert(*next(c.begin(), 0) == 0);
57        assert(*next(c.begin(), 1) == 1);
58        assert(*next(c.begin(), 2) == 4);
59        assert(*next(c.begin(), 3) == 5);
60        assert(*next(c.begin(), 4) == 6);
61        assert(*next(c.begin(), 5) == 7);
62        assert(*next(c.begin(), 6) == 8);
63        assert(*next(c.begin(), 7) == 9);
64
65        i = c.erase_after(next(c.cbefore_begin(), 5), next(c.cbefore_begin(), 9));
66        assert(i == c.end());
67        assert(distance(c.begin(), c.end()) == 5);
68        assert(*next(c.begin(), 0) == 0);
69        assert(*next(c.begin(), 1) == 1);
70        assert(*next(c.begin(), 2) == 4);
71        assert(*next(c.begin(), 3) == 5);
72        assert(*next(c.begin(), 4) == 6);
73
74        i = c.erase_after(next(c.cbefore_begin(), 0), next(c.cbefore_begin(), 2));
75        assert(i == c.begin());
76        assert(distance(c.begin(), c.end()) == 4);
77        assert(*next(c.begin(), 0) == 1);
78        assert(*next(c.begin(), 1) == 4);
79        assert(*next(c.begin(), 2) == 5);
80        assert(*next(c.begin(), 3) == 6);
81
82        i = c.erase_after(next(c.cbefore_begin(), 0), next(c.cbefore_begin(), 5));
83        assert(i == c.begin());
84        assert(i == c.end());
85        assert(distance(c.begin(), c.end()) == 0);
86    }
87#if __cplusplus >= 201103L
88    {
89        typedef int T;
90        typedef std::forward_list<T, min_allocator<T>> C;
91        const T t[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
92        C c(std::begin(t), std::end(t));
93
94        C::iterator i = c.erase_after(next(c.cbefore_begin(), 4), next(c.cbefore_begin(), 4));
95        assert(i == next(c.cbefore_begin(), 4));
96        assert(distance(c.begin(), c.end()) == 10);
97        assert(*next(c.begin(), 0) == 0);
98        assert(*next(c.begin(), 1) == 1);
99        assert(*next(c.begin(), 2) == 2);
100        assert(*next(c.begin(), 3) == 3);
101        assert(*next(c.begin(), 4) == 4);
102        assert(*next(c.begin(), 5) == 5);
103        assert(*next(c.begin(), 6) == 6);
104        assert(*next(c.begin(), 7) == 7);
105        assert(*next(c.begin(), 8) == 8);
106        assert(*next(c.begin(), 9) == 9);
107
108        i = c.erase_after(next(c.cbefore_begin(), 2), next(c.cbefore_begin(), 5));
109        assert(i == next(c.begin(), 2));
110        assert(distance(c.begin(), c.end()) == 8);
111        assert(*next(c.begin(), 0) == 0);
112        assert(*next(c.begin(), 1) == 1);
113        assert(*next(c.begin(), 2) == 4);
114        assert(*next(c.begin(), 3) == 5);
115        assert(*next(c.begin(), 4) == 6);
116        assert(*next(c.begin(), 5) == 7);
117        assert(*next(c.begin(), 6) == 8);
118        assert(*next(c.begin(), 7) == 9);
119
120        i = c.erase_after(next(c.cbefore_begin(), 2), next(c.cbefore_begin(), 3));
121        assert(i == next(c.begin(), 2));
122        assert(distance(c.begin(), c.end()) == 8);
123        assert(*next(c.begin(), 0) == 0);
124        assert(*next(c.begin(), 1) == 1);
125        assert(*next(c.begin(), 2) == 4);
126        assert(*next(c.begin(), 3) == 5);
127        assert(*next(c.begin(), 4) == 6);
128        assert(*next(c.begin(), 5) == 7);
129        assert(*next(c.begin(), 6) == 8);
130        assert(*next(c.begin(), 7) == 9);
131
132        i = c.erase_after(next(c.cbefore_begin(), 5), next(c.cbefore_begin(), 9));
133        assert(i == c.end());
134        assert(distance(c.begin(), c.end()) == 5);
135        assert(*next(c.begin(), 0) == 0);
136        assert(*next(c.begin(), 1) == 1);
137        assert(*next(c.begin(), 2) == 4);
138        assert(*next(c.begin(), 3) == 5);
139        assert(*next(c.begin(), 4) == 6);
140
141        i = c.erase_after(next(c.cbefore_begin(), 0), next(c.cbefore_begin(), 2));
142        assert(i == c.begin());
143        assert(distance(c.begin(), c.end()) == 4);
144        assert(*next(c.begin(), 0) == 1);
145        assert(*next(c.begin(), 1) == 4);
146        assert(*next(c.begin(), 2) == 5);
147        assert(*next(c.begin(), 3) == 6);
148
149        i = c.erase_after(next(c.cbefore_begin(), 0), next(c.cbefore_begin(), 5));
150        assert(i == c.begin());
151        assert(i == c.end());
152        assert(distance(c.begin(), c.end()) == 0);
153    }
154#endif
155}
156