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 std::vector
<bool>::reference r
= v
.emplace_back("");
29 VERIFY( v
.back() == true );
30 v
.emplace_back(v
.front());
31 VERIFY( v
.back() == true );
33 v
.emplace_back(v
.back());
34 VERIFY( v
.back() == false );
35 VERIFY( v
.size() == 65 );
37 VERIFY( v
.size() == 66 );
38 VERIFY( v
.back() == true );
40 VERIFY( v
.size() == 67 );
41 VERIFY( v
.back() == false );
44 VERIFY( v
.size() == 66 );
45 VERIFY( v
.back() == true );
46 for (int i
= 0, n
= v
.size(); i
< n
; ++i
)
51 for (std::size_t i
= 0, c
= v
.capacity(); i
<= c
; ++i
)
52 v
.push_back(v
.front());
53 VERIFY( v
.capacity() > v
.size() );
55 std::vector
<bool, Alloc
<bool>> va
;
57 va
.push_back(va
.front());
58 VERIFY( va
.size() == 2 );
63 static_assert( test_push_back() );
65 template<typename T
= bool>
66 constexpr std::false_type
67 pop_back_empty() { return {}; }
69 template<typename T
= bool>
70 requires (std::bool_constant
<(std::vector
<T
>().pop_back(), true)>::value
)
71 constexpr std::true_type
72 pop_back_empty() { return {}; }
74 static_assert( ! pop_back_empty() );
81 // vector::emplace(const_iterator, Args&&...)
82 auto p
= v
.emplace(v
.begin());
83 VERIFY( p
== v
.begin() );
84 p
= v
.emplace(v
.end(), '7');
85 VERIFY( p
== --v
.end() );
87 // vector::insert(const_iterator, const T&)
88 p
= v
.insert(v
.begin(), *p
);
89 VERIFY( p
== v
.begin() );
91 // vector::insert(const_iterator, T&&)
92 p
= v
.insert(v
.end(), 1);
93 VERIFY( p
== --v
.end() );
94 v
.insert(p
, v
.front());
95 v
.insert(v
.end(), v
.back());
96 VERIFY( v
.size() == 6 );
97 v
.insert(v
.end(), true);
98 VERIFY( v
.size() == 7 );
99 VERIFY( v
.back() == true );
101 // vector::insert(const_iterator, size_type, const T&)
102 v
.insert(v
.begin(), 2, v
.front());
103 v
.insert(v
.end(), 3, 99);
104 VERIFY( v
.size() == 12 );
106 struct input_iterator
108 using iterator_category
= std::input_iterator_tag
;
109 using value_type
= bool;
110 using pointer
= const bool*;
111 using reference
= bool;
112 using difference_type
= int;
114 constexpr input_iterator() : val(0) { }
115 constexpr input_iterator(int i
) : val(i
) { }
117 constexpr input_iterator
& operator++() { --val
; return *this; }
118 constexpr input_iterator
operator++(int) { return {val
--}; }
120 constexpr bool operator*() const { return val
% 2; }
121 constexpr const bool* operator->() const { return nullptr; }
123 constexpr bool operator==(const input_iterator
&) const = default;
128 // vector::insert(const_iterator, Iter, Iter);
129 v
.insert(v
.begin() + 2, input_iterator(), input_iterator());
130 VERIFY( v
.size() == 12 );
131 v
.insert(v
.end() - 9, input_iterator(18), input_iterator());
132 VERIFY( v
.size() == 30 );
133 short a
[] = { false, true };
134 v
.insert(v
.end(), a
, a
+ 2);
135 VERIFY( v
.size() == 32 );
137 // vector::insert(const_iterator, initializer_list<T>)
138 v
.insert(v
.begin(), {1,1,1});
139 VERIFY( v
.size() == 35 );
141 // vector::erase(const_iterator)
142 v
.erase(v
.end() - 1);
143 VERIFY( v
.size() == 34 );
144 VERIFY( v
.back() == false );
146 v
.erase(v
.begin() + 1);
147 v
.erase(v
.end() - 1);
148 VERIFY( v
.size() == 31 );
150 // vector::erase(const_iterator, const_iterator)
151 v
.erase(v
.begin(), v
.begin());
152 v
.erase(v
.end(), v
.end());
153 v
.erase(v
.begin(), v
.begin() + 1);
154 VERIFY( v
.size() == 30 );
155 v
.erase(v
.begin() + 2, v
.end() - 2);
156 VERIFY( v
.size() == 4 );
157 v
.erase(v
.begin(), v
.end());
159 v
.erase( v
.begin(), v
.begin() );
162 v
.insert(v
.end(), 99);
163 for (std::size_t i
= 0, c
= v
.capacity(); i
<= c
; ++i
)
164 v
.insert(v
.end() - 1, v
.front());
165 VERIFY( v
.capacity() > v
.size() );
166 v
.insert(v
.end(), 999);
167 for (std::size_t i
= 0, c
= v
.capacity(); i
<= c
; ++i
)
168 v
.insert(v
.begin(), v
.front());
170 std::vector
<bool, Alloc
<bool>> va
;
171 va
.insert(va
.begin(), 99);
172 va
.insert(va
.begin(), va
.front());
173 VERIFY( va
.size() == 2 );
174 va
.erase(va
.begin());
179 static_assert( test_insert_erase() );
181 constexpr std::size_t
182 capacity_for(std::size_t n
)
184 std::size_t N
= std::vector
<bool>(1).capacity();
193 std::vector
<bool> v0
;
195 VERIFY( v0
.size() == 0 );
196 VERIFY( v0
.capacity() == 0 );
198 std::vector
<bool> v
{1, 0, 0};
200 VERIFY( v
.size() == 0 );
201 VERIFY( v
.capacity() == capacity_for(3) );
203 std::vector
<bool, Alloc
<bool>> va
;
212 static_assert( test_clear() );
217 std::vector
<bool> v
{1, 0, 0, 1, 0, 1, 1, 0};
219 VERIFY( !v
[0] && v
[1] && v
[2] && !v
[3] && v
[4] && !v
[5] && !v
[6] && v
[7] );
228 static_assert( test_flip() );
233 std::vector
<bool> e
{true,true,true,false,true,false};
235 auto n
= std::erase(e
, false);
237 VERIFY( e
.size() == 4 );
239 n
= std::erase_if(e
, [](std::vector
<bool>::reference val
) { return !val
; });
241 VERIFY( e
.size() == 3 );
246 static_assert( test_erasure() );