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 // <vector>
11
12 // iterator erase(const_iterator first, const_iterator last);
13
14 #include <vector>
15 #include <iterator>
16 #include <cassert>
17
18 #include "min_allocator.h"
19 #include "asan_testing.h"
20
main()21 int main()
22 {
23 int a1[] = {1, 2, 3};
24 {
25 std::vector<int> l1(a1, a1+3);
26 assert(is_contiguous_container_asan_correct(l1));
27 std::vector<int>::iterator i = l1.erase(l1.cbegin(), l1.cbegin());
28 assert(l1.size() == 3);
29 assert(distance(l1.cbegin(), l1.cend()) == 3);
30 assert(i == l1.begin());
31 assert(is_contiguous_container_asan_correct(l1));
32 }
33 {
34 std::vector<int> l1(a1, a1+3);
35 assert(is_contiguous_container_asan_correct(l1));
36 std::vector<int>::iterator i = l1.erase(l1.cbegin(), next(l1.cbegin()));
37 assert(l1.size() == 2);
38 assert(distance(l1.cbegin(), l1.cend()) == 2);
39 assert(i == l1.begin());
40 assert(l1 == std::vector<int>(a1+1, a1+3));
41 assert(is_contiguous_container_asan_correct(l1));
42 }
43 {
44 std::vector<int> l1(a1, a1+3);
45 assert(is_contiguous_container_asan_correct(l1));
46 std::vector<int>::iterator i = l1.erase(l1.cbegin(), next(l1.cbegin(), 2));
47 assert(l1.size() == 1);
48 assert(distance(l1.cbegin(), l1.cend()) == 1);
49 assert(i == l1.begin());
50 assert(l1 == std::vector<int>(a1+2, a1+3));
51 assert(is_contiguous_container_asan_correct(l1));
52 }
53 {
54 std::vector<int> l1(a1, a1+3);
55 assert(is_contiguous_container_asan_correct(l1));
56 std::vector<int>::iterator i = l1.erase(l1.cbegin(), next(l1.cbegin(), 3));
57 assert(l1.size() == 0);
58 assert(distance(l1.cbegin(), l1.cend()) == 0);
59 assert(i == l1.begin());
60 assert(is_contiguous_container_asan_correct(l1));
61 }
62 {
63 std::vector<std::vector<int> > outer(2, std::vector<int>(1));
64 assert(is_contiguous_container_asan_correct(outer));
65 assert(is_contiguous_container_asan_correct(outer[0]));
66 assert(is_contiguous_container_asan_correct(outer[1]));
67 outer.erase(outer.begin(), outer.begin());
68 assert(outer.size() == 2);
69 assert(outer[0].size() == 1);
70 assert(outer[1].size() == 1);
71 assert(is_contiguous_container_asan_correct(outer));
72 assert(is_contiguous_container_asan_correct(outer[0]));
73 assert(is_contiguous_container_asan_correct(outer[1]));
74 }
75 #if __cplusplus >= 201103L
76 {
77 std::vector<int, min_allocator<int>> l1(a1, a1+3);
78 assert(is_contiguous_container_asan_correct(l1));
79 std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), l1.cbegin());
80 assert(l1.size() == 3);
81 assert(distance(l1.cbegin(), l1.cend()) == 3);
82 assert(i == l1.begin());
83 assert(is_contiguous_container_asan_correct(l1));
84 }
85 {
86 std::vector<int, min_allocator<int>> l1(a1, a1+3);
87 assert(is_contiguous_container_asan_correct(l1));
88 std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), next(l1.cbegin()));
89 assert(l1.size() == 2);
90 assert(distance(l1.cbegin(), l1.cend()) == 2);
91 assert(i == l1.begin());
92 assert((l1 == std::vector<int, min_allocator<int>>(a1+1, a1+3)));
93 assert(is_contiguous_container_asan_correct(l1));
94 }
95 {
96 std::vector<int, min_allocator<int>> l1(a1, a1+3);
97 assert(is_contiguous_container_asan_correct(l1));
98 std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), next(l1.cbegin(), 2));
99 assert(l1.size() == 1);
100 assert(distance(l1.cbegin(), l1.cend()) == 1);
101 assert(i == l1.begin());
102 assert((l1 == std::vector<int, min_allocator<int>>(a1+2, a1+3)));
103 assert(is_contiguous_container_asan_correct(l1));
104 }
105 {
106 std::vector<int, min_allocator<int>> l1(a1, a1+3);
107 assert(is_contiguous_container_asan_correct(l1));
108 std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), next(l1.cbegin(), 3));
109 assert(l1.size() == 0);
110 assert(distance(l1.cbegin(), l1.cend()) == 0);
111 assert(i == l1.begin());
112 assert(is_contiguous_container_asan_correct(l1));
113 }
114 {
115 std::vector<std::vector<int, min_allocator<int>>, min_allocator<std::vector<int, min_allocator<int>>>> outer(2, std::vector<int, min_allocator<int>>(1));
116 assert(is_contiguous_container_asan_correct(outer));
117 assert(is_contiguous_container_asan_correct(outer[0]));
118 assert(is_contiguous_container_asan_correct(outer[1]));
119 outer.erase(outer.begin(), outer.begin());
120 assert(outer.size() == 2);
121 assert(outer[0].size() == 1);
122 assert(outer[1].size() == 1);
123 assert(is_contiguous_container_asan_correct(outer));
124 assert(is_contiguous_container_asan_correct(outer[0]));
125 assert(is_contiguous_container_asan_correct(outer[1]));
126 }
127 #endif
128 }
129