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 
main()19 int 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