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 p);
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};
25        C c(std::begin(t), std::end(t));
26
27        C::iterator i = c.erase_after(next(c.cbefore_begin(), 4));
28        assert(i == c.end());
29        assert(distance(c.begin(), c.end()) == 4);
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
35        i = c.erase_after(next(c.cbefore_begin(), 0));
36        assert(i == c.begin());
37        assert(distance(c.begin(), c.end()) == 3);
38        assert(*next(c.begin(), 0) == 1);
39        assert(*next(c.begin(), 1) == 2);
40        assert(*next(c.begin(), 2) == 3);
41
42        i = c.erase_after(next(c.cbefore_begin(), 1));
43        assert(i == next(c.begin()));
44        assert(distance(c.begin(), c.end()) == 2);
45        assert(*next(c.begin(), 0) == 1);
46        assert(*next(c.begin(), 1) == 3);
47
48        i = c.erase_after(next(c.cbefore_begin(), 1));
49        assert(i == c.end());
50        assert(distance(c.begin(), c.end()) == 1);
51        assert(*next(c.begin(), 0) == 1);
52
53        i = c.erase_after(next(c.cbefore_begin(), 0));
54        assert(i == c.begin());
55        assert(i == c.end());
56        assert(distance(c.begin(), c.end()) == 0);
57    }
58#if __cplusplus >= 201103L
59    {
60        typedef int T;
61        typedef std::forward_list<T, min_allocator<T>> C;
62        const T t[] = {0, 1, 2, 3, 4};
63        C c(std::begin(t), std::end(t));
64
65        C::iterator i = c.erase_after(next(c.cbefore_begin(), 4));
66        assert(i == c.end());
67        assert(distance(c.begin(), c.end()) == 4);
68        assert(*next(c.begin(), 0) == 0);
69        assert(*next(c.begin(), 1) == 1);
70        assert(*next(c.begin(), 2) == 2);
71        assert(*next(c.begin(), 3) == 3);
72
73        i = c.erase_after(next(c.cbefore_begin(), 0));
74        assert(i == c.begin());
75        assert(distance(c.begin(), c.end()) == 3);
76        assert(*next(c.begin(), 0) == 1);
77        assert(*next(c.begin(), 1) == 2);
78        assert(*next(c.begin(), 2) == 3);
79
80        i = c.erase_after(next(c.cbefore_begin(), 1));
81        assert(i == next(c.begin()));
82        assert(distance(c.begin(), c.end()) == 2);
83        assert(*next(c.begin(), 0) == 1);
84        assert(*next(c.begin(), 1) == 3);
85
86        i = c.erase_after(next(c.cbefore_begin(), 1));
87        assert(i == c.end());
88        assert(distance(c.begin(), c.end()) == 1);
89        assert(*next(c.begin(), 0) == 1);
90
91        i = c.erase_after(next(c.cbefore_begin(), 0));
92        assert(i == c.begin());
93        assert(i == c.end());
94        assert(distance(c.begin(), c.end()) == 0);
95    }
96#endif
97}
98