1 // Copyright 2020 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14
15 #include "pw_containers/vector.h"
16
17 #include <cstddef>
18
19 #include "pw_compilation_testing/negative_compilation.h"
20 #include "pw_containers_private/test_helpers.h"
21 #include "pw_unit_test/framework.h"
22
23 namespace pw {
24 namespace {
25
26 using namespace std::literals::string_view_literals;
27 using containers::test::CopyOnly;
28 using containers::test::Counter;
29 using containers::test::MoveOnly;
30
31 // Since pw::Vector<T, N> downcasts to a pw::Vector<T, 0>, ensure that the
32 // alignment doesn't change.
33 static_assert(alignof(Vector<std::max_align_t, 0>) ==
34 alignof(Vector<std::max_align_t, 1>));
35
TEST(Vector,Construct_NoArg)36 TEST(Vector, Construct_NoArg) {
37 Vector<int, 3> vector;
38 EXPECT_TRUE(vector.empty());
39 }
40
TEST(Vector,Construct_MultipleCopies)41 TEST(Vector, Construct_MultipleCopies) {
42 Vector<int, 3> vector(3, 123);
43
44 EXPECT_EQ(vector.size(), 3u);
45 EXPECT_EQ(vector[0], 123);
46 EXPECT_EQ(vector[1], 123);
47 EXPECT_EQ(vector[2], 123);
48 }
49
TEST(Vector,Construct_DefaultSize)50 TEST(Vector, Construct_DefaultSize) {
51 Vector<int, 3> vector(3);
52
53 EXPECT_EQ(vector.size(), 3u);
54 EXPECT_EQ(vector[0], 0);
55 EXPECT_EQ(vector[1], 0);
56 EXPECT_EQ(vector[2], 0);
57 }
58
TEST(Vector,Construct_Iterators)59 TEST(Vector, Construct_Iterators) {
60 std::array array{1, 2, 3, 4, 5};
61
62 Vector<int, 64> vector(array.begin(), array.end());
63
64 EXPECT_EQ(vector.size(), array.size());
65 for (unsigned short i = 0; i < array.size(); ++i) {
66 EXPECT_EQ(vector[i], array[i]);
67 }
68 }
69
TEST(Vector,Construct_Copy)70 TEST(Vector, Construct_Copy) {
71 CopyOnly origin(5);
72 Vector<CopyOnly, 10> origin_vector(3, origin);
73
74 Vector<CopyOnly, 100> vector(origin_vector);
75
76 EXPECT_EQ(3u, vector.size());
77
78 for (unsigned short i = 0; i < vector.size(); ++i) {
79 EXPECT_EQ(vector[i].value, origin.value);
80 }
81 }
82
TEST(Vector,Construct_Move)83 TEST(Vector, Construct_Move) {
84 Vector<MoveOnly, 10> origin_vector;
85
86 for (int i = 0; i < 5; ++i) {
87 origin_vector.emplace_back(421);
88 }
89
90 Vector<MoveOnly, 100> vector(std::move(origin_vector));
91
92 EXPECT_EQ(5u, vector.size());
93
94 for (unsigned short i = 0; i < vector.size(); ++i) {
95 EXPECT_EQ(vector[i].value, 421);
96 }
97
98 // NOLINTNEXTLINE(bugprone-use-after-move)
99 for (unsigned short i = 0; i < origin_vector.size(); ++i) {
100 EXPECT_EQ(origin_vector[i].value, MoveOnly::kDeleted);
101 }
102 }
103
TEST(Vector,Construct_InitializerList)104 TEST(Vector, Construct_InitializerList) {
105 Vector<int, 3> vector{100, 200};
106 EXPECT_EQ(vector.size(), 2u);
107 EXPECT_EQ(vector[0], 100);
108 EXPECT_EQ(vector[1], 200);
109 }
110
111 struct Aggregate {
112 int integer;
113 Vector<char, 8> vector;
114 };
115
TEST(Vector,Construct_String)116 TEST(Vector, Construct_String) {
117 const auto vector = Vector<char, 8>{"Hello"};
118 EXPECT_EQ(5u, vector.size());
119 EXPECT_EQ("Hello"sv, std::string_view(vector.data(), vector.size()));
120 }
121
TEST(Vector,Construct_StringTruncates)122 TEST(Vector, Construct_StringTruncates) {
123 const auto vector = Vector<char, 8>{"Hello from a long string"};
124 EXPECT_EQ(8u, vector.size());
125 EXPECT_EQ("Hello fr"sv, std::string_view(vector.data(), vector.size()));
126 }
127
TEST(Vector,Construct_AssignFromString)128 TEST(Vector, Construct_AssignFromString) {
129 Vector<char, 8> vector = "Hello";
130 EXPECT_EQ(5u, vector.size());
131 EXPECT_EQ("Hello"sv, std::string_view(vector.data(), vector.size()));
132 }
133
TEST(Vector,Construct_AggregateString)134 TEST(Vector, Construct_AggregateString) {
135 Aggregate aggregate = {.integer = 42, .vector = "Hello"};
136 EXPECT_EQ(5u, aggregate.vector.size());
137 EXPECT_EQ("Hello"sv,
138 std::string_view(aggregate.vector.data(), aggregate.vector.size()));
139 }
140
TEST(Vector,Construct_StringView)141 TEST(Vector, Construct_StringView) {
142 const auto vector = Vector<char, 8>{"Hello"sv};
143 EXPECT_EQ(5u, vector.size());
144 EXPECT_EQ("Hello"sv, std::string_view(vector.data(), vector.size()));
145 }
146
TEST(Vector,Construct_StringViewTruncates)147 TEST(Vector, Construct_StringViewTruncates) {
148 const auto vector = Vector<char, 8>{"Hello from a long string"sv};
149 EXPECT_EQ(8u, vector.size());
150 EXPECT_EQ("Hello fr"sv, std::string_view(vector.data(), vector.size()));
151 }
152
TEST(Vector,Construct_AssignFromStringView)153 TEST(Vector, Construct_AssignFromStringView) {
154 Vector<char, 8> vector = "Hello"sv;
155 EXPECT_EQ(5u, vector.size());
156 EXPECT_EQ("Hello"sv, std::string_view(vector.data(), vector.size()));
157 }
158
TEST(Vector,Construct_AggregateStringView)159 TEST(Vector, Construct_AggregateStringView) {
160 Aggregate aggregate = {.integer = 42, .vector = "Hello"sv};
161 EXPECT_EQ(5u, aggregate.vector.size());
162 EXPECT_EQ("Hello"sv,
163 std::string_view(aggregate.vector.data(), aggregate.vector.size()));
164 }
165
TEST(Vector,Destruct_ZeroLength)166 TEST(Vector, Destruct_ZeroLength) {
167 Counter::Reset();
168
169 {
170 Vector<Counter, 0> destroyed;
171 }
172 EXPECT_EQ(Counter::created, 0);
173 EXPECT_EQ(Counter::destroyed, 0);
174 }
175
TEST(Vector,Destruct_Empty)176 TEST(Vector, Destruct_Empty) {
177 Counter::Reset();
178
179 {
180 Vector<Counter, 128> destroyed;
181 }
182 EXPECT_EQ(Counter::created, 0);
183 EXPECT_EQ(Counter::destroyed, 0);
184 }
185
TEST(Vector,Destruct_MultpileEntries)186 TEST(Vector, Destruct_MultpileEntries) {
187 Counter value;
188 Counter::Reset();
189
190 {
191 Vector<Counter, 128> destroyed(100, value);
192 }
193
194 EXPECT_EQ(Counter::created, 100);
195 EXPECT_EQ(Counter::destroyed, 100);
196 }
197
TEST(Vector,Assign_Copy_SmallerToLarger)198 TEST(Vector, Assign_Copy_SmallerToLarger) {
199 CopyOnly origin(5);
200 Vector<CopyOnly, 3> origin_vector(3, origin);
201
202 Vector<CopyOnly, 2> vector;
203 vector = origin_vector;
204
205 EXPECT_EQ(2u, vector.size());
206
207 for (unsigned short i = 0; i < vector.size(); ++i) {
208 EXPECT_EQ(vector[i].value, origin.value);
209 }
210 }
211
TEST(Vector,Assign_DifferentMaxSize_Copy)212 TEST(Vector, Assign_DifferentMaxSize_Copy) {
213 const Vector<int, 10> origin_vector = {1, 1, 2, 3};
214
215 Vector<int, 100> vector;
216 vector = origin_vector;
217
218 ASSERT_EQ(4u, vector.size());
219 EXPECT_EQ(1, vector[0]);
220 EXPECT_EQ(1, vector[1]);
221 EXPECT_EQ(2, vector[2]);
222 EXPECT_EQ(3, vector[3]);
223 }
224
TEST(Vector,Assign_SameMaxSize_Copy)225 TEST(Vector, Assign_SameMaxSize_Copy) {
226 const Vector<int, 10> origin_vector = {1, 1, 2, 3};
227
228 Vector<int, 10> vector;
229 vector = origin_vector;
230
231 ASSERT_EQ(4u, vector.size());
232 EXPECT_EQ(1, vector[0]);
233 EXPECT_EQ(1, vector[1]);
234 EXPECT_EQ(2, vector[2]);
235 EXPECT_EQ(3, vector[3]);
236 }
237
TEST(Vector,Assign_Generic_Copy)238 TEST(Vector, Assign_Generic_Copy) {
239 const Vector<int, 10> origin_vector = {1, 1, 2, 3};
240
241 Vector<int, 10> vector;
242 Vector<int>& ref = vector;
243 ref = static_cast<const Vector<int>&>(origin_vector);
244
245 ASSERT_EQ(4u, vector.size());
246 EXPECT_EQ(1, vector[0]);
247 EXPECT_EQ(1, vector[1]);
248 EXPECT_EQ(2, vector[2]);
249 EXPECT_EQ(3, vector[3]);
250 }
251
TEST(Vector,Assign_Move)252 TEST(Vector, Assign_Move) {
253 Vector<MoveOnly, 10> origin_vector;
254
255 for (int i = 0; i < 5; ++i) {
256 origin_vector.emplace_back(421);
257 }
258
259 Vector<MoveOnly, 10> vector;
260 vector = std::move(origin_vector);
261
262 EXPECT_EQ(5u, vector.size());
263
264 for (unsigned short i = 0; i < vector.size(); ++i) {
265 EXPECT_EQ(vector[i].value, 421);
266 }
267
268 // NOLINTNEXTLINE(bugprone-use-after-move)
269 for (unsigned short i = 0; i < origin_vector.size(); ++i) {
270 EXPECT_EQ(origin_vector[i].value, MoveOnly::kDeleted);
271 }
272 }
273
TEST(Vector,Assign_InitializerList)274 TEST(Vector, Assign_InitializerList) {
275 Vector<int, 4> vector;
276 vector = {1, 3, 5, 7, 9};
277
278 EXPECT_EQ(4u, vector.size());
279
280 EXPECT_EQ(1, vector[0]);
281 EXPECT_EQ(3, vector[1]);
282 EXPECT_EQ(5, vector[2]);
283 EXPECT_EQ(7, vector[3]);
284 }
285
TEST(Vector,Access_ZeroLength)286 TEST(Vector, Access_ZeroLength) {
287 Vector<Counter, 0> vector;
288
289 EXPECT_EQ(0u, vector.size());
290 EXPECT_EQ(0u, vector.max_size());
291 EXPECT_TRUE(vector.empty());
292 EXPECT_TRUE(vector.full());
293
294 for (auto& item : vector) {
295 (void)item;
296 FAIL();
297 }
298 }
299
TEST(Vector,Access_Data_ArrayLocationIsIndependentOfMaxSize)300 TEST(Vector, Access_Data_ArrayLocationIsIndependentOfMaxSize) {
301 Vector<int, 10> vector;
302 Vector<int>& base = static_cast<Vector<int>&>(vector);
303
304 EXPECT_EQ(vector.data(), base.data());
305 EXPECT_EQ(vector.data(), (static_cast<Vector<int, 0>&>(base).data()));
306 EXPECT_EQ(vector.data(), (static_cast<Vector<int, 1>&>(base).data()));
307 }
308
TEST(Vector,Modify_Clear)309 TEST(Vector, Modify_Clear) {
310 Counter::Reset();
311
312 Vector<Counter, 100> vector;
313 vector.emplace_back();
314 vector.emplace_back();
315 vector.emplace_back();
316
317 vector.clear();
318
319 EXPECT_EQ(3, Counter::created);
320 EXPECT_EQ(3, Counter::destroyed);
321 }
322
TEST(Vector,Modify_PushBack_Copy)323 TEST(Vector, Modify_PushBack_Copy) {
324 Counter value(99);
325 Counter::Reset();
326
327 {
328 Vector<Counter, 10> vector;
329 vector.push_back(value);
330
331 EXPECT_EQ(vector.size(), 1u);
332 EXPECT_EQ(vector.front().value, 99);
333 }
334
335 EXPECT_EQ(Counter::created, 1);
336 EXPECT_EQ(Counter::destroyed, 1);
337 }
338
TEST(Vector,Modify_PushBack_Move)339 TEST(Vector, Modify_PushBack_Move) {
340 Counter::Reset();
341
342 {
343 Counter value(99);
344 Vector<Counter, 10> vector;
345 vector.push_back(std::move(value));
346
347 EXPECT_EQ(vector.size(), 1u);
348 EXPECT_EQ(vector.front().value, 99);
349 // NOLINTNEXTLINE(bugprone-use-after-move)
350 EXPECT_EQ(value.value, 0);
351 }
352
353 EXPECT_EQ(Counter::created, 1);
354 EXPECT_EQ(Counter::destroyed, 2);
355 EXPECT_EQ(Counter::moved, 1);
356 }
357
TEST(Vector,Modify_EmplaceBack)358 TEST(Vector, Modify_EmplaceBack) {
359 Counter::Reset();
360
361 {
362 Vector<Counter, 10> vector;
363 vector.emplace_back(314);
364
365 EXPECT_EQ(vector.size(), 1u);
366 EXPECT_EQ(vector.front().value, 314);
367 }
368
369 EXPECT_EQ(Counter::created, 1);
370 EXPECT_EQ(Counter::destroyed, 1);
371 }
372
TEST(Vector,Modify_Resize_Larger)373 TEST(Vector, Modify_Resize_Larger) {
374 Vector<CopyOnly, 10> vector(1, CopyOnly(123));
375 vector.resize(3, CopyOnly(123));
376
377 EXPECT_EQ(vector.size(), 3u);
378 for (auto& i : vector) {
379 EXPECT_EQ(i.value, 123);
380 }
381 }
382
TEST(Vector,Modify_Resize_LargerThanMax)383 TEST(Vector, Modify_Resize_LargerThanMax) {
384 Vector<CopyOnly, 10> vector;
385 vector.resize(1000, CopyOnly(123));
386
387 EXPECT_EQ(vector.size(), 10u);
388 for (auto& i : vector) {
389 EXPECT_EQ(i.value, 123);
390 }
391 }
392
TEST(Vector,Modify_Resize_Smaller)393 TEST(Vector, Modify_Resize_Smaller) {
394 Vector<CopyOnly, 10> vector(9, CopyOnly(123));
395 vector.resize(3, CopyOnly(123));
396
397 EXPECT_EQ(vector.size(), 3u);
398 for (auto& i : vector) {
399 EXPECT_EQ(i.value, 123);
400 }
401 }
402
TEST(Vector,Modify_PopBack)403 TEST(Vector, Modify_PopBack) {
404 Vector<Counter, 10> vector({Counter(1), Counter(2), Counter(3)});
405 Counter::Reset();
406
407 vector.pop_back();
408
409 EXPECT_EQ(vector.size(), 2u);
410 EXPECT_EQ(vector[0].value, 1);
411 EXPECT_EQ(vector[1].value, 2);
412
413 EXPECT_EQ(Counter::created, 0);
414 EXPECT_EQ(Counter::destroyed, 1);
415 }
416
TEST(Vector,Modify_Resize_Zero)417 TEST(Vector, Modify_Resize_Zero) {
418 Vector<CopyOnly, 10> vector(10, CopyOnly(123));
419 vector.resize(0, CopyOnly(123));
420
421 EXPECT_EQ(vector.size(), 0u);
422 }
423
TEST(Vector,Modify_Erase_TrivialRangeBegin)424 TEST(Vector, Modify_Erase_TrivialRangeBegin) {
425 Vector<size_t, 10> vector;
426
427 for (size_t i = 0; i < vector.max_size(); ++i) {
428 vector.emplace_back(i);
429 }
430
431 vector.erase(vector.begin() + 2, vector.end());
432 EXPECT_EQ(vector.size(), 2u);
433
434 for (unsigned short i = 0; i < vector.size(); ++i) {
435 EXPECT_EQ(vector[i], i);
436 }
437 }
438
TEST(Vector,Modify_Erase_TrivialRangeEnd)439 TEST(Vector, Modify_Erase_TrivialRangeEnd) {
440 Vector<size_t, 10> vector;
441
442 for (size_t i = 0; i < vector.max_size(); ++i) {
443 vector.emplace_back(i);
444 }
445
446 vector.erase(vector.begin(), vector.end() - 2);
447 EXPECT_EQ(vector.size(), 2u);
448
449 for (unsigned short i = 0; i < vector.size(); ++i) {
450 EXPECT_EQ(vector[i], 8u + i);
451 }
452 }
453
TEST(Vector,Modify_Erase_TrivialSingleItem)454 TEST(Vector, Modify_Erase_TrivialSingleItem) {
455 Vector<size_t, 10> vector;
456
457 for (size_t i = 0; i < vector.max_size(); ++i) {
458 vector.emplace_back(i);
459 }
460
461 vector.erase(vector.begin() + 9);
462
463 EXPECT_EQ(vector.size(), 9u);
464 EXPECT_EQ(vector.at(8), 8u);
465 EXPECT_EQ(vector.at(0), 0u);
466
467 vector.erase(vector.begin());
468 EXPECT_EQ(vector.size(), 8u);
469 EXPECT_EQ(vector.at(0), 1u);
470 }
471
TEST(Vector,Modify_Erase_NonTrivialRangeBegin)472 TEST(Vector, Modify_Erase_NonTrivialRangeBegin) {
473 Counter::Reset();
474 Vector<Counter, 10> vector;
475
476 for (size_t i = 0; i < vector.max_size(); ++i) {
477 vector.emplace_back(static_cast<int>(i));
478 }
479
480 for (unsigned short i = 0; i < vector.size(); ++i) {
481 EXPECT_EQ(vector[i].value, static_cast<int>(i));
482 }
483
484 vector.erase(vector.begin() + 2, vector.end());
485 EXPECT_EQ(vector.size(), 2u);
486
487 for (unsigned short i = 0; i < vector.size(); ++i) {
488 EXPECT_EQ(vector[i].value, static_cast<int>(i));
489 }
490
491 EXPECT_EQ(Counter::destroyed, 8);
492 EXPECT_EQ(Counter::moved, 0);
493 }
494
TEST(Vector,Modify_Erase_NonTrivialRangeEnd)495 TEST(Vector, Modify_Erase_NonTrivialRangeEnd) {
496 Counter::Reset();
497 Vector<Counter, 10> vector;
498
499 for (size_t i = 0; i < vector.max_size(); ++i) {
500 vector.emplace_back(static_cast<int>(i));
501 }
502
503 vector.erase(vector.begin(), vector.end() - 2);
504 EXPECT_EQ(vector.size(), 2u);
505
506 for (unsigned short i = 0; i < vector.size(); ++i) {
507 EXPECT_EQ(vector[i].value, static_cast<int>(8u + i));
508 }
509
510 EXPECT_EQ(Counter::destroyed, 8);
511 EXPECT_EQ(Counter::moved, 2);
512 }
513
TEST(Vector,Modify_Erase_None)514 TEST(Vector, Modify_Erase_None) {
515 Counter::Reset();
516 Vector<Counter, 10> vector;
517
518 for (size_t i = 0; i < vector.max_size(); ++i) {
519 vector.emplace_back(static_cast<int>(i));
520 }
521
522 vector.erase(vector.begin() + 2, vector.begin() + 2);
523 EXPECT_EQ(vector.size(), 10u);
524
525 EXPECT_EQ(Counter::destroyed, 0);
526 EXPECT_EQ(Counter::moved, 0);
527 EXPECT_EQ(Counter::created, 10);
528 }
529
TEST(Vector,Modify_Insert_End)530 TEST(Vector, Modify_Insert_End) {
531 Counter::Reset();
532 Vector<Counter, 10> vector;
533
534 for (int i = 0; i < 8; ++i) {
535 vector.emplace_back(i);
536 }
537
538 EXPECT_EQ(vector.size(), 8u);
539 EXPECT_EQ(Counter::created, 8);
540
541 decltype(vector)::iterator it = vector.insert(vector.cend(), 8);
542 EXPECT_EQ(it->value, 8);
543 EXPECT_EQ(vector.at(8).value, 8);
544
545 EXPECT_EQ(Counter::destroyed, 1);
546 EXPECT_EQ(Counter::moved, 1);
547 EXPECT_EQ(Counter::created, 9);
548 }
549
TEST(Vector,Modify_Insert_Begin)550 TEST(Vector, Modify_Insert_Begin) {
551 Counter::Reset();
552 Vector<Counter, 10> vector;
553
554 for (int i = 0; i < 8; ++i) {
555 vector.emplace_back(i);
556 }
557
558 EXPECT_EQ(vector.size(), 8u);
559
560 decltype(vector)::iterator it = vector.insert(vector.cbegin(), 123);
561 EXPECT_EQ(it->value, 123);
562 EXPECT_EQ(vector.at(0).value, 123);
563 EXPECT_EQ(vector.at(8).value, 7);
564
565 EXPECT_EQ(Counter::moved, 9);
566 }
567
TEST(Vector,Modify_Insert_CountCopies)568 TEST(Vector, Modify_Insert_CountCopies) {
569 Counter::Reset();
570 Vector<Counter, 10> vector;
571
572 vector.emplace_back(123);
573 vector.insert(vector.cbegin() + 1, 8, Counter{421});
574 EXPECT_EQ(vector.at(0).value, 123);
575 EXPECT_EQ(vector.size(), 9u);
576
577 for (unsigned short i = 1; i < vector.size(); ++i) {
578 EXPECT_EQ(vector[i].value, 421);
579 }
580
581 EXPECT_EQ(Counter::moved, 0);
582 EXPECT_EQ(Counter::created, 10);
583 }
584
TEST(Vector,Modify_Insert_IteratorRange)585 TEST(Vector, Modify_Insert_IteratorRange) {
586 std::array array_to_insert_first{0, 1, 2, 8, 9};
587 std::array array_to_insert_middle{3, 4, 5, 6, 7};
588
589 Vector<int, 10> vector(array_to_insert_first.begin(),
590 array_to_insert_first.end());
591
592 decltype(vector)::iterator it = vector.insert(vector.cbegin() + 3,
593 array_to_insert_middle.begin(),
594 array_to_insert_middle.end());
595 EXPECT_EQ(*it, array_to_insert_middle.front());
596
597 for (unsigned short i = 0; i < vector.max_size(); ++i) {
598 EXPECT_EQ(vector[i], static_cast<int>(i));
599 }
600 }
601
TEST(Vector,Modify_Insert_IteratorEmptyRange)602 TEST(Vector, Modify_Insert_IteratorEmptyRange) {
603 Vector<int, 10> src;
604 Vector<int, 10> dst(10, 1);
605 dst.insert(dst.end(), src.begin(), src.end());
606 EXPECT_EQ(dst.size(), 10U);
607 EXPECT_EQ(dst.back(), 1);
608 }
609
TEST(Vector,Modify_Insert_InitializerListRange)610 TEST(Vector, Modify_Insert_InitializerListRange) {
611 std::array array_to_insert_first{0, 1, 2, 8, 9};
612 Vector<int, 10> vector(array_to_insert_first.begin(),
613 array_to_insert_first.end());
614
615 decltype(vector)::iterator it =
616 vector.insert(vector.cbegin() + 3, {3, 4, 5, 6, 7});
617 EXPECT_EQ(*it, 3);
618
619 for (unsigned short i = 0; i < vector.max_size(); ++i) {
620 EXPECT_EQ(vector[i], static_cast<int>(i));
621 }
622 }
623
TEST(Vector,Modify_Insert_NonTrivial_InitializerListRange)624 TEST(Vector, Modify_Insert_NonTrivial_InitializerListRange) {
625 std::array<Counter, 5> array_to_insert_first{0, 1, 2, 8, 9};
626 Vector<Counter, 10> vector(array_to_insert_first.begin(),
627 array_to_insert_first.end());
628
629 decltype(vector)::iterator it = vector.insert(
630 vector.cbegin() + 3, std::initializer_list<Counter>{3, 4, 5, 6, 7});
631 EXPECT_EQ(it->value, 3);
632
633 for (unsigned short i = 0; i < vector.max_size(); ++i) {
634 EXPECT_EQ(vector[i].value, static_cast<int>(i));
635 }
636 }
637
TEST(Vector,Generic)638 TEST(Vector, Generic) {
639 Vector<int, 10> vector{1, 2, 3, 4, 5};
640
641 Vector<int>& generic_vector(vector);
642
643 EXPECT_EQ(generic_vector.size(), vector.size());
644 EXPECT_EQ(generic_vector.max_size(), vector.max_size());
645
646 unsigned short i = 0;
647 for (int value : vector) {
648 EXPECT_EQ(value, generic_vector[i]);
649 i += 1;
650 }
651
652 i = 0;
653 for (int value : generic_vector) {
654 EXPECT_EQ(vector[i], value);
655 i += 1;
656 }
657 }
658
TEST(Vector,ConstexprMaxSize)659 TEST(Vector, ConstexprMaxSize) {
660 Vector<int, 10> vector;
661 Vector<int, vector.max_size()> vector2;
662
663 EXPECT_EQ(vector.max_size(), vector2.max_size());
664
665 #if PW_NC_TEST(DynamicCapacity_MaxSizeNotConstexpr)
666 PW_NC_EXPECT_CLANG("non-type template argument is not a constant expression");
667 PW_NC_EXPECT_GCC("call to non-'constexpr' function");
668 Vector<int>& generic_vector(vector);
669 Vector<int, generic_vector.max_size()> vector3;
670 #endif // PW_NC_TEST
671 }
672
TEST(Vector,DeleteAndDestructionDisallowedOnDynamicCapacity)673 TEST(Vector, DeleteAndDestructionDisallowedOnDynamicCapacity) {
674 std::byte raw_storage[64]{};
675 Vector<int, 4>* vector = new (raw_storage) Vector<int, 4>;
676 [[maybe_unused]] Vector<int>* generic_vector = vector;
677
678 #if PW_NC_TEST(GenericCapacity_DeleteDisallowed)
679 PW_NC_EXPECT(" protected ");
680 delete generic_vector;
681 #elif PW_NC_TEST(GenericCapacity_ManualDestructionDisallowed)
682 PW_NC_EXPECT(" protected ");
683 generic_vector->~Vector();
684 #elif PW_NC_TEST(KnownCapacity_ManualDestructionDisallowed)
685 PW_NC_EXPECT(" protected ");
686 vector->~Vector<int>();
687 #else
688 vector->~Vector<int, 4>();
689 #endif // PW_NC_TEST
690 }
691
692 // Test that Vector<T> is trivially destructible when its type is.
693 static_assert(std::is_trivially_destructible_v<Vector<int, 4>>);
694
695 static_assert(std::is_trivially_destructible_v<MoveOnly>);
696 static_assert(std::is_trivially_destructible_v<Vector<MoveOnly, 1>>);
697
698 static_assert(std::is_trivially_destructible_v<CopyOnly>);
699 static_assert(std::is_trivially_destructible_v<Vector<CopyOnly, 99>>);
700
701 static_assert(!std::is_trivially_destructible_v<Counter>);
702 static_assert(!std::is_trivially_destructible_v<Vector<Counter, 99>>);
703
704 // Generic-capacity Vectors cannot be constructed or destructed.
705 static_assert(!std::is_constructible_v<Vector<int>>);
706 static_assert(!std::is_destructible_v<Vector<int>>);
707
708 } // namespace
709 } // namespace pw
710