1 // { dg-do compile { target c++20 } }
4 #include <testsuite_hooks.h>
7 struct Alloc
: std::allocator
<T
>
9 using std::allocator
<T
>::allocator
;
11 constexpr explicit Alloc(int p
) : personality(p
) { }
14 constexpr Alloc(const Alloc
<U
>& a
) : personality(a
.personality
) { }
18 constexpr bool operator==(const Alloc
& a
) const noexcept
19 { return personality
== a
.personality
; }
26 int& r
= v
.emplace_back(7);
28 VERIFY( &r
== &v
.front() );
30 v
.emplace_back(v
.front());
31 v
.emplace_back(v
.back());
32 VERIFY( v
.size() == 4 );
34 VERIFY( v
.size() == 5 );
35 VERIFY( v
.back() == 8 );
38 VERIFY( v
.size() == 4 );
39 VERIFY( v
.back() == 7 );
47 for (std::size_t i
= 0, c
= v
.capacity(); i
<= c
; ++i
)
48 v
.push_back(v
.front());
49 VERIFY( v
.capacity() > v
.size() );
51 std::vector
<int, Alloc
<int>> va
;
53 va
.push_back(va
.front());
54 VERIFY( va
.size() == 2 );
59 static_assert( test_push_back() );
61 template<typename T
= int>
62 constexpr std::false_type
63 pop_back_empty() { return {}; }
65 template<typename T
= int>
66 requires (std::bool_constant
<(std::vector
<T
>().pop_back(), true)>::value
)
67 constexpr std::true_type
68 pop_back_empty() { return {}; }
70 static_assert( ! pop_back_empty() );
77 // vector::emplace(const_iterator, Args&&...)
78 auto p
= v
.emplace(v
.begin());
79 VERIFY( p
== v
.begin() );
80 p
= v
.emplace(v
.end(), 7);
81 VERIFY( p
== --v
.end() );
83 // vector::insert(const_iterator, const T&)
84 p
= v
.insert(v
.begin(), *p
);
85 VERIFY( p
== v
.begin() );
87 VERIFY( &*p
== &v
.front() );
88 // vector::insert(const_iterator, T&&)
89 p
= v
.insert(v
.end(), 1);
90 VERIFY( p
== --v
.end() );
91 v
.insert(p
, v
.front());
92 v
.insert(v
.end(), v
.back());
93 VERIFY( v
.size() == 6 );
95 VERIFY( v
.size() == 7 );
96 VERIFY( v
.back() == 8 );
98 // vector::insert(const_iterator, size_type, const T&)
99 v
.insert(v
.begin(), 2, v
.front());
100 v
.insert(v
.end(), 3, 99);
101 VERIFY( v
.size() == 12 );
103 struct input_iterator
105 using iterator_category
= std::input_iterator_tag
;
106 using value_type
= int;
107 using pointer
= const int*;
108 using reference
= int;
109 using difference_type
= int;
111 constexpr input_iterator() : val(0) { }
112 constexpr input_iterator(int i
) : val(i
) { }
114 constexpr input_iterator
& operator++() { --val
; return *this; }
115 constexpr input_iterator
operator++(int) { return {val
--}; }
117 constexpr int operator*() const { return val
; }
118 constexpr const int* operator->() const { return &val
; }
120 constexpr bool operator==(const input_iterator
&) const = default;
125 // vector::insert(const_iterator, Iter, Iter);
126 v
.insert(v
.begin() + 2, input_iterator(), input_iterator());
127 VERIFY( v
.size() == 12 );
129 auto n
= v
.capacity() - v
.size();
130 v
.insert(v
.end() - 9, input_iterator(n
), input_iterator()); // no reallocation
131 VERIFY( v
.size() == (12 + n
) );
132 short a
[] = { 84, 85 };
133 v
.insert(v
.end() - 1, a
, a
+ 2); // reallocation needed
134 VERIFY( v
.size() == (12 + n
+ 2) );
137 // vector::insert(const_iterator, initializer_list<T>)
138 v
.insert(v
.begin(), {1,2,3});
139 VERIFY( v
.size() == 35 );
144 // vector::erase(const_iterator)
145 v
.erase(v
.end() - 1);
146 VERIFY( v
.size() == 34 );
147 VERIFY( v
.back() == 888 );
149 v
.erase(v
.begin() + 1);
150 v
.erase(v
.end() - 1);
151 VERIFY( v
.size() == 31 );
153 // vector::erase(const_iterator, const_iterator)
154 v
.erase(v
.begin(), v
.begin());
155 v
.erase(v
.end(), v
.end());
156 v
.erase(v
.begin(), v
.begin() + 1);
157 VERIFY( v
.size() == 30 );
158 v
.erase(v
.begin() + 2, v
.end() - 2);
159 VERIFY( v
.size() == 4 );
160 v
.erase(v
.begin(), v
.end());
162 v
.erase( v
.begin(), v
.begin() );
165 v
.insert(v
.end(), 99);
166 for (std::size_t i
= 0, c
= v
.capacity(); i
<= c
; ++i
)
167 v
.insert(v
.end() - 1, v
.front());
168 VERIFY( v
.capacity() > v
.size() );
169 v
.insert(v
.end(), 999);
170 for (std::size_t i
= 0, c
= v
.capacity(); i
<= c
; ++i
)
171 v
.insert(v
.begin(), v
.front());
173 std::vector
<int, Alloc
<int>> va
;
174 va
.insert(va
.begin(), 99);
175 va
.insert(va
.begin(), va
.front());
176 VERIFY( va
.size() == 2 );
177 va
.erase(va
.begin());
182 static_assert( test_insert_erase() );
189 VERIFY( v0
.size() == 0 );
190 VERIFY( v0
.capacity() == 0 );
192 std::vector
<int> v
{1, 10, 100};
194 VERIFY( v
.size() == 0 );
195 VERIFY( v
.capacity() == 3 );
197 std::vector
<int, Alloc
<int>> va
;
206 static_assert( test_clear() );
211 const char* names
[] = { "Vince", "Clarke", "Andy", "Bell" };
212 std::vector
<const char*> e(std::begin(names
), std::end(names
));
214 auto n
= std::erase(e
, names
[0]);
216 VERIFY( e
.size() == 3 );
217 n
= std::erase_if(e
, [](auto name
) { return name
[4] == '\0'; });
219 VERIFY( e
.size() == 1 );
224 static_assert( test_erasure() );