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