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