Blender  V2.93
BLI_vector_test.cc
Go to the documentation of this file.
1 /* Apache License, Version 2.0 */
2 
4 #include "BLI_strict_flags.h"
5 #include "BLI_vector.hh"
6 #include "testing/testing.h"
7 #include <forward_list>
8 
9 namespace blender::tests {
10 
11 TEST(vector, DefaultConstructor)
12 {
13  Vector<int> vec;
14  EXPECT_EQ(vec.size(), 0);
15 }
16 
17 TEST(vector, SizeConstructor)
18 {
19  Vector<int> vec(3);
20  EXPECT_EQ(vec.size(), 3);
21 }
22 
27 TEST(vector, TrivialTypeSizeConstructor)
28 {
29  Vector<char, 1> *vec = new Vector<char, 1>(1);
30  char *ptr = &(*vec)[0];
31  vec->~Vector();
32 
33  const char magic = 42;
34  *ptr = magic;
35  EXPECT_EQ(*ptr, magic);
36 
37  new (vec) Vector<char, 1>(1);
38  EXPECT_EQ((*vec)[0], magic);
39  EXPECT_EQ(*ptr, magic);
40  delete vec;
41 }
42 
43 TEST(vector, SizeValueConstructor)
44 {
45  Vector<int> vec(4, 10);
46  EXPECT_EQ(vec.size(), 4);
47  EXPECT_EQ(vec[0], 10);
48  EXPECT_EQ(vec[1], 10);
49  EXPECT_EQ(vec[2], 10);
50  EXPECT_EQ(vec[3], 10);
51 }
52 
53 TEST(vector, InitializerListConstructor)
54 {
55  Vector<int> vec = {1, 3, 4, 6};
56  EXPECT_EQ(vec.size(), 4);
57  EXPECT_EQ(vec[0], 1);
58  EXPECT_EQ(vec[1], 3);
59  EXPECT_EQ(vec[2], 4);
60  EXPECT_EQ(vec[3], 6);
61 }
62 
63 TEST(vector, ConvertingConstructor)
64 {
65  std::array<float, 5> values = {5.4f, 7.3f, -8.1f, 5.0f, 0.0f};
66  Vector<int> vec = values;
67  EXPECT_EQ(vec.size(), 5);
68  EXPECT_EQ(vec[0], 5);
69  EXPECT_EQ(vec[1], 7);
70  EXPECT_EQ(vec[2], -8);
71  EXPECT_EQ(vec[3], 5);
72  EXPECT_EQ(vec[4], 0);
73 }
74 
75 struct TestListValue {
77  int value;
78 };
79 
80 TEST(vector, ListBaseConstructor)
81 {
82  TestListValue *value1 = new TestListValue{nullptr, nullptr, 4};
83  TestListValue *value2 = new TestListValue{nullptr, nullptr, 5};
84  TestListValue *value3 = new TestListValue{nullptr, nullptr, 6};
85 
86  ListBase list = {nullptr, nullptr};
87  BLI_addtail(&list, value1);
88  BLI_addtail(&list, value2);
89  BLI_addtail(&list, value3);
90  Vector<TestListValue *> vec(list);
91 
92  EXPECT_EQ(vec.size(), 3);
93  EXPECT_EQ(vec[0]->value, 4);
94  EXPECT_EQ(vec[1]->value, 5);
95  EXPECT_EQ(vec[2]->value, 6);
96 
97  delete value1;
98  delete value2;
99  delete value3;
100 }
101 
102 TEST(vector, IteratorConstructor)
103 {
104  std::forward_list<int> list;
105  list.push_front(3);
106  list.push_front(1);
107  list.push_front(5);
108 
109  Vector<int> vec = Vector<int>(list.begin(), list.end());
110  EXPECT_EQ(vec.size(), 3);
111  EXPECT_EQ(vec[0], 5);
112  EXPECT_EQ(vec[1], 1);
113  EXPECT_EQ(vec[2], 3);
114 }
115 
116 TEST(vector, CopyConstructor)
117 {
118  Vector<int> vec1 = {1, 2, 3};
119  Vector<int> vec2(vec1);
120  EXPECT_EQ(vec2.size(), 3);
121  EXPECT_EQ(vec2[0], 1);
122  EXPECT_EQ(vec2[1], 2);
123  EXPECT_EQ(vec2[2], 3);
124 
125  vec1[1] = 5;
126  EXPECT_EQ(vec1[1], 5);
127  EXPECT_EQ(vec2[1], 2);
128 }
129 
130 TEST(vector, CopyConstructor2)
131 {
132  Vector<int, 2> vec1 = {1, 2, 3, 4};
133  Vector<int, 3> vec2(vec1);
134 
135  EXPECT_EQ(vec1.size(), 4);
136  EXPECT_EQ(vec2.size(), 4);
137  EXPECT_NE(vec1.data(), vec2.data());
138  EXPECT_EQ(vec2[0], 1);
139  EXPECT_EQ(vec2[1], 2);
140  EXPECT_EQ(vec2[2], 3);
141  EXPECT_EQ(vec2[3], 4);
142 }
143 
144 TEST(vector, CopyConstructor3)
145 {
146  Vector<int, 20> vec1 = {1, 2, 3, 4};
147  Vector<int, 1> vec2(vec1);
148 
149  EXPECT_EQ(vec1.size(), 4);
150  EXPECT_EQ(vec2.size(), 4);
151  EXPECT_NE(vec1.data(), vec2.data());
152  EXPECT_EQ(vec2[2], 3);
153 }
154 
155 TEST(vector, CopyConstructor4)
156 {
157  Vector<int, 5> vec1 = {1, 2, 3, 4};
158  Vector<int, 6> vec2(vec1);
159 
160  EXPECT_EQ(vec1.size(), 4);
161  EXPECT_EQ(vec2.size(), 4);
162  EXPECT_NE(vec1.data(), vec2.data());
163  EXPECT_EQ(vec2[3], 4);
164 }
165 
166 TEST(vector, MoveConstructor)
167 {
168  Vector<int> vec1 = {1, 2, 3, 4};
169  Vector<int> vec2(std::move(vec1));
170 
171  EXPECT_EQ(vec1.size(), 0); /* NOLINT: bugprone-use-after-move */
172  EXPECT_EQ(vec2.size(), 4);
173  EXPECT_EQ(vec2[0], 1);
174  EXPECT_EQ(vec2[1], 2);
175  EXPECT_EQ(vec2[2], 3);
176  EXPECT_EQ(vec2[3], 4);
177 }
178 
179 TEST(vector, MoveConstructor2)
180 {
181  Vector<int, 2> vec1 = {1, 2, 3, 4};
182  Vector<int, 3> vec2(std::move(vec1));
183 
184  EXPECT_EQ(vec1.size(), 0); /* NOLINT: bugprone-use-after-move */
185  EXPECT_EQ(vec2.size(), 4);
186  EXPECT_EQ(vec2[0], 1);
187  EXPECT_EQ(vec2[1], 2);
188  EXPECT_EQ(vec2[2], 3);
189  EXPECT_EQ(vec2[3], 4);
190 }
191 
192 TEST(vector, MoveConstructor3)
193 {
194  Vector<int, 20> vec1 = {1, 2, 3, 4};
195  Vector<int, 1> vec2(std::move(vec1));
196 
197  EXPECT_EQ(vec1.size(), 0); /* NOLINT: bugprone-use-after-move */
198  EXPECT_EQ(vec2.size(), 4);
199  EXPECT_EQ(vec2[2], 3);
200 }
201 
202 TEST(vector, MoveConstructor4)
203 {
204  Vector<int, 5> vec1 = {1, 2, 3, 4};
205  Vector<int, 6> vec2(std::move(vec1));
206 
207  EXPECT_EQ(vec1.size(), 0); /* NOLINT: bugprone-use-after-move */
208  EXPECT_EQ(vec2.size(), 4);
209  EXPECT_EQ(vec2[3], 4);
210 }
211 
212 TEST(vector, MoveAssignment)
213 {
214  Vector<int> vec = {1, 2};
215  EXPECT_EQ(vec.size(), 2);
216  EXPECT_EQ(vec[0], 1);
217  EXPECT_EQ(vec[1], 2);
218 
219  vec = Vector<int>({5});
220  EXPECT_EQ(vec.size(), 1);
221  EXPECT_EQ(vec[0], 5);
222 }
223 
224 TEST(vector, CopyAssignment)
225 {
226  Vector<int> vec1 = {1, 2, 3};
227  Vector<int> vec2 = {4, 5};
228  EXPECT_EQ(vec1.size(), 3);
229  EXPECT_EQ(vec2.size(), 2);
230 
231  vec2 = vec1;
232  EXPECT_EQ(vec2.size(), 3);
233 
234  vec1[0] = 7;
235  EXPECT_EQ(vec1[0], 7);
236  EXPECT_EQ(vec2[0], 1);
237 }
238 
239 TEST(vector, Append)
240 {
241  Vector<int> vec;
242  vec.append(3);
243  vec.append(6);
244  vec.append(7);
245  EXPECT_EQ(vec.size(), 3);
246  EXPECT_EQ(vec[0], 3);
247  EXPECT_EQ(vec[1], 6);
248  EXPECT_EQ(vec[2], 7);
249 }
250 
251 TEST(vector, AppendAndGetIndex)
252 {
253  Vector<int> vec;
254  EXPECT_EQ(vec.append_and_get_index(10), 0);
255  EXPECT_EQ(vec.append_and_get_index(10), 1);
256  EXPECT_EQ(vec.append_and_get_index(10), 2);
257  vec.append(10);
258  EXPECT_EQ(vec.append_and_get_index(10), 4);
259 }
260 
261 TEST(vector, AppendNonDuplicates)
262 {
263  Vector<int> vec;
264  vec.append_non_duplicates(4);
265  EXPECT_EQ(vec.size(), 1);
266  vec.append_non_duplicates(5);
267  EXPECT_EQ(vec.size(), 2);
268  vec.append_non_duplicates(4);
269  EXPECT_EQ(vec.size(), 2);
270 }
271 
272 TEST(vector, ExtendNonDuplicates)
273 {
274  Vector<int> vec;
275  vec.extend_non_duplicates({1, 2});
276  EXPECT_EQ(vec.size(), 2);
277  vec.extend_non_duplicates({3, 4});
278  EXPECT_EQ(vec.size(), 4);
279  vec.extend_non_duplicates({0, 1, 2, 3});
280  EXPECT_EQ(vec.size(), 5);
281 }
282 
283 TEST(vector, ExtendIterator)
284 {
285  Vector<int> vec = {3, 4, 5};
286  std::forward_list<int> list = {8, 9};
287  vec.extend(list.begin(), list.end());
288  EXPECT_EQ(vec.size(), 5);
289  EXPECT_EQ_ARRAY(vec.data(), Span({3, 4, 5, 8, 9}).data(), 5);
290 }
291 
292 TEST(vector, Iterator)
293 {
294  Vector<int> vec({1, 4, 9, 16});
295  int i = 1;
296  for (int value : vec) {
297  EXPECT_EQ(value, i * i);
298  i++;
299  }
300 }
301 
302 TEST(vector, BecomeLarge)
303 {
304  Vector<int, 4> vec;
305  for (int i = 0; i < 100; i++) {
306  vec.append(i * 5);
307  }
308  EXPECT_EQ(vec.size(), 100);
309  for (int i = 0; i < 100; i++) {
310  EXPECT_EQ(vec[i], static_cast<int>(i * 5));
311  }
312 }
313 
315 {
316  return Vector<int>({3, 5, 1});
317 }
318 
319 TEST(vector, ReturnByValue)
320 {
322  EXPECT_EQ(vec.size(), 3);
323  EXPECT_EQ(vec[0], 3);
324  EXPECT_EQ(vec[1], 5);
325  EXPECT_EQ(vec[2], 1);
326 }
327 
328 TEST(vector, VectorOfVectors_Append)
329 {
330  Vector<Vector<int>> vec;
331  EXPECT_EQ(vec.size(), 0);
332 
333  Vector<int> v({1, 2});
334  vec.append(v);
335  vec.append({7, 8});
336  EXPECT_EQ(vec.size(), 2);
337  EXPECT_EQ(vec[0][0], 1);
338  EXPECT_EQ(vec[0][1], 2);
339  EXPECT_EQ(vec[1][0], 7);
340  EXPECT_EQ(vec[1][1], 8);
341 }
342 
343 TEST(vector, RemoveLast)
344 {
345  Vector<int> vec = {5, 6};
346  EXPECT_EQ(vec.size(), 2);
347  vec.remove_last();
348  EXPECT_EQ(vec.size(), 1);
349  vec.remove_last();
350  EXPECT_EQ(vec.size(), 0);
351 }
352 
353 TEST(vector, IsEmpty)
354 {
355  Vector<int> vec;
356  EXPECT_TRUE(vec.is_empty());
357  vec.append(1);
358  EXPECT_FALSE(vec.is_empty());
359  vec.remove_last();
360  EXPECT_TRUE(vec.is_empty());
361 }
362 
363 TEST(vector, RemoveReorder)
364 {
365  Vector<int> vec = {4, 5, 6, 7};
366  vec.remove_and_reorder(1);
367  EXPECT_EQ(vec[0], 4);
368  EXPECT_EQ(vec[1], 7);
369  EXPECT_EQ(vec[2], 6);
370  vec.remove_and_reorder(2);
371  EXPECT_EQ(vec[0], 4);
372  EXPECT_EQ(vec[1], 7);
373  vec.remove_and_reorder(0);
374  EXPECT_EQ(vec[0], 7);
375  vec.remove_and_reorder(0);
376  EXPECT_TRUE(vec.is_empty());
377 }
378 
379 TEST(vector, RemoveFirstOccurrenceAndReorder)
380 {
381  Vector<int> vec = {4, 5, 6, 7};
383  EXPECT_EQ(vec[0], 4);
384  EXPECT_EQ(vec[1], 7);
385  EXPECT_EQ(vec[2], 6);
387  EXPECT_EQ(vec[0], 4);
388  EXPECT_EQ(vec[1], 7);
390  EXPECT_EQ(vec[0], 7);
392  EXPECT_EQ(vec.size(), 0);
393 }
394 
395 TEST(vector, Remove)
396 {
397  Vector<int> vec = {1, 2, 3, 4, 5, 6};
398  vec.remove(3);
399  EXPECT_TRUE(std::equal(vec.begin(), vec.end(), Span<int>({1, 2, 3, 5, 6}).begin()));
400  vec.remove(0);
401  EXPECT_TRUE(std::equal(vec.begin(), vec.end(), Span<int>({2, 3, 5, 6}).begin()));
402  vec.remove(3);
403  EXPECT_TRUE(std::equal(vec.begin(), vec.end(), Span<int>({2, 3, 5}).begin()));
404  vec.remove(1);
405  EXPECT_TRUE(std::equal(vec.begin(), vec.end(), Span<int>({2, 5}).begin()));
406  vec.remove(1);
407  EXPECT_TRUE(std::equal(vec.begin(), vec.end(), Span<int>({2}).begin()));
408  vec.remove(0);
409  EXPECT_TRUE(std::equal(vec.begin(), vec.end(), Span<int>({}).begin()));
410 }
411 
412 TEST(vector, ExtendSmallVector)
413 {
414  Vector<int> a = {2, 3, 4};
415  Vector<int> b = {11, 12};
416  b.extend(a);
417  EXPECT_EQ(b.size(), 5);
418  EXPECT_EQ(b[0], 11);
419  EXPECT_EQ(b[1], 12);
420  EXPECT_EQ(b[2], 2);
421  EXPECT_EQ(b[3], 3);
422  EXPECT_EQ(b[4], 4);
423 }
424 
425 TEST(vector, ExtendArray)
426 {
427  int array[] = {3, 4, 5, 6};
428 
429  Vector<int> a;
430  a.extend(array, 2);
431 
432  EXPECT_EQ(a.size(), 2);
433  EXPECT_EQ(a[0], 3);
434  EXPECT_EQ(a[1], 4);
435 }
436 
437 TEST(vector, Last)
438 {
439  Vector<int> a{3, 5, 7};
440  EXPECT_EQ(a.last(), 7);
441 }
442 
443 TEST(vector, AppendNTimes)
444 {
445  Vector<int> a;
446  a.append_n_times(5, 3);
447  a.append_n_times(2, 2);
448  EXPECT_EQ(a.size(), 5);
449  EXPECT_EQ(a[0], 5);
450  EXPECT_EQ(a[1], 5);
451  EXPECT_EQ(a[2], 5);
452  EXPECT_EQ(a[3], 2);
453  EXPECT_EQ(a[4], 2);
454 }
455 
456 TEST(vector, UniquePtrValue)
457 {
459  vec.append(std::make_unique<int>());
460  vec.append(std::make_unique<int>());
461  vec.append(std::make_unique<int>());
462  vec.append(std::make_unique<int>());
463  EXPECT_EQ(vec.size(), 4);
464 
465  std::unique_ptr<int> &a = vec.last();
466  std::unique_ptr<int> b = vec.pop_last();
467  vec.remove_and_reorder(0);
468  vec.remove(0);
469  EXPECT_EQ(vec.size(), 1);
470 
471  UNUSED_VARS(a, b);
472 }
473 
475  public:
476  bool default_constructed = false;
477  bool copy_constructed = false;
478  bool move_constructed = false;
479  bool copy_assigned = false;
480  bool move_assigned = false;
481 
483  {
484  }
485 
487  {
488  }
489 
491  {
492  }
493 
495  {
496  if (this == &other) {
497  return *this;
498  }
499 
500  copy_assigned = true;
501  return *this;
502  }
503 
505  {
506  if (this == &other) {
507  return *this;
508  }
509 
510  move_assigned = true;
511  return *this;
512  }
513 };
514 
515 TEST(vector, SizeConstructorCallsDefaultConstructor)
516 {
518  EXPECT_TRUE(vec[0].default_constructed);
519  EXPECT_TRUE(vec[1].default_constructed);
520  EXPECT_TRUE(vec[2].default_constructed);
521 }
522 
523 TEST(vector, SizeValueConstructorCallsCopyConstructor)
524 {
526  EXPECT_TRUE(vec[0].copy_constructed);
527  EXPECT_TRUE(vec[1].copy_constructed);
528  EXPECT_TRUE(vec[2].copy_constructed);
529 }
530 
531 TEST(vector, AppendCallsCopyConstructor)
532 {
534  TypeConstructMock value;
535  vec.append(value);
536  EXPECT_TRUE(vec[0].copy_constructed);
537 }
538 
539 TEST(vector, AppendCallsMoveConstructor)
540 {
542  vec.append(TypeConstructMock());
543  EXPECT_TRUE(vec[0].move_constructed);
544 }
545 
546 TEST(vector, SmallVectorCopyCallsCopyConstructor)
547 {
550  EXPECT_TRUE(dst[0].copy_constructed);
551  EXPECT_TRUE(dst[1].copy_constructed);
552 }
553 
554 TEST(vector, LargeVectorCopyCallsCopyConstructor)
555 {
558  EXPECT_TRUE(dst[0].copy_constructed);
559  EXPECT_TRUE(dst[1].copy_constructed);
560 }
561 
562 TEST(vector, SmallVectorMoveCallsMoveConstructor)
563 {
565  Vector<TypeConstructMock, 2> dst(std::move(src));
566  EXPECT_TRUE(dst[0].move_constructed);
567  EXPECT_TRUE(dst[1].move_constructed);
568 }
569 
570 TEST(vector, LargeVectorMoveCallsNoConstructor)
571 {
573  Vector<TypeConstructMock, 2> dst(std::move(src));
574 
575  EXPECT_TRUE(dst[0].default_constructed);
576  EXPECT_FALSE(dst[0].move_constructed);
577  EXPECT_FALSE(dst[0].copy_constructed);
578 }
579 
580 TEST(vector, Resize)
581 {
582  std::string long_string = "012345678901234567890123456789";
584  EXPECT_EQ(vec.size(), 0);
585  vec.resize(2);
586  EXPECT_EQ(vec.size(), 2);
587  EXPECT_EQ(vec[0], "");
588  EXPECT_EQ(vec[1], "");
589  vec.resize(5, long_string);
590  EXPECT_EQ(vec.size(), 5);
591  EXPECT_EQ(vec[0], "");
592  EXPECT_EQ(vec[1], "");
593  EXPECT_EQ(vec[2], long_string);
594  EXPECT_EQ(vec[3], long_string);
595  EXPECT_EQ(vec[4], long_string);
596  vec.resize(1);
597  EXPECT_EQ(vec.size(), 1);
598  EXPECT_EQ(vec[0], "");
599 }
600 
601 TEST(vector, FirstIndexOf)
602 {
603  Vector<int> vec = {2, 3, 5, 7, 5, 9};
604  EXPECT_EQ(vec.first_index_of(2), 0);
605  EXPECT_EQ(vec.first_index_of(5), 2);
606  EXPECT_EQ(vec.first_index_of(9), 5);
607 }
608 
609 TEST(vector, FirstIndexTryOf)
610 {
611  Vector<int> vec = {2, 3, 5, 7, 5, 9};
612  EXPECT_EQ(vec.first_index_of_try(2), 0);
613  EXPECT_EQ(vec.first_index_of_try(4), -1);
614  EXPECT_EQ(vec.first_index_of_try(5), 2);
615  EXPECT_EQ(vec.first_index_of_try(9), 5);
616  EXPECT_EQ(vec.first_index_of_try(1), -1);
617 }
618 
619 TEST(vector, OveralignedValues)
620 {
622  for (int i = 0; i < 100; i++) {
623  vec.append({});
624  EXPECT_EQ((uintptr_t)&vec.last() % 512, 0);
625  }
626 }
627 
628 TEST(vector, ConstructVoidPointerVector)
629 {
630  int a;
631  float b;
632  double c;
633  Vector<void *> vec = {&a, &b, &c};
634  EXPECT_EQ(vec.size(), 3);
635 }
636 
638 {
639  Vector<int> vec(5);
640  vec.fill(3);
641  EXPECT_EQ(vec.size(), 5u);
642  EXPECT_EQ(vec[0], 3);
643  EXPECT_EQ(vec[1], 3);
644  EXPECT_EQ(vec[2], 3);
645  EXPECT_EQ(vec[3], 3);
646  EXPECT_EQ(vec[4], 3);
647 }
648 
649 TEST(vector, InsertAtBeginning)
650 {
651  Vector<int> vec = {1, 2, 3};
652  vec.insert(0, {6, 7});
653  EXPECT_EQ(vec.size(), 5);
654  EXPECT_EQ_ARRAY(vec.data(), Span({6, 7, 1, 2, 3}).data(), 5);
655 }
656 
657 TEST(vector, InsertAtEnd)
658 {
659  Vector<int> vec = {1, 2, 3};
660  vec.insert(3, {6, 7});
661  EXPECT_EQ(vec.size(), 5);
662  EXPECT_EQ_ARRAY(vec.data(), Span({1, 2, 3, 6, 7}).data(), 5);
663 }
664 
665 TEST(vector, InsertInMiddle)
666 {
667  Vector<int> vec = {1, 2, 3};
668  vec.insert(1, {6, 7});
669  EXPECT_EQ(vec.size(), 5);
670  EXPECT_EQ_ARRAY(vec.data(), Span({1, 6, 7, 2, 3}).data(), 5);
671 }
672 
673 TEST(vector, InsertAtIterator)
674 {
675  Vector<std::string> vec = {"1", "2", "3"};
676  Vector<std::string> other_vec = {"hello", "world"};
677  vec.insert(vec.begin() + 1, other_vec.begin(), other_vec.end());
678  EXPECT_EQ(vec.size(), 5);
679  EXPECT_EQ_ARRAY(vec.data(), Span<std::string>({"1", "hello", "world", "2", "3"}).data(), 5);
680 }
681 
682 TEST(vector, InsertMoveOnlyType)
683 {
685  vec.append(std::make_unique<int>(1));
686  vec.append(std::make_unique<int>(2));
687  vec.insert(1, std::make_unique<int>(30));
688  EXPECT_EQ(vec.size(), 3);
689  EXPECT_EQ(*vec[0], 1);
690  EXPECT_EQ(*vec[1], 30);
691  EXPECT_EQ(*vec[2], 2);
692 }
693 
694 TEST(vector, Prepend)
695 {
696  Vector<int> vec = {1, 2, 3};
697  vec.prepend({7, 8});
698  EXPECT_EQ(vec.size(), 5);
699  EXPECT_EQ_ARRAY(vec.data(), Span({7, 8, 1, 2, 3}).data(), 5);
700 }
701 
702 TEST(vector, ReverseIterator)
703 {
704  Vector<int> vec = {4, 5, 6, 7};
705  Vector<int> reversed_vec;
706  for (auto it = vec.rbegin(); it != vec.rend(); ++it) {
707  reversed_vec.append(*it);
708  }
709  EXPECT_EQ(reversed_vec.size(), 4);
710  EXPECT_EQ_ARRAY(reversed_vec.data(), Span({7, 6, 5, 4}).data(), 4);
711 }
712 
713 TEST(vector, SizeValueConstructorExceptions)
714 {
715  ExceptionThrower value;
716  value.throw_during_copy = true;
717  EXPECT_ANY_THROW({ Vector<ExceptionThrower> vec(5, value); });
718 }
719 
720 TEST(vector, SpanConstructorExceptions)
721 {
722  std::array<ExceptionThrower, 5> values;
723  values[3].throw_during_copy = true;
724  EXPECT_ANY_THROW({ Vector<ExceptionThrower> vec(values); });
725 }
726 
727 TEST(vector, MoveConstructorExceptions)
728 {
730  vec[2].throw_during_move = true;
731  EXPECT_ANY_THROW({ Vector<ExceptionThrower> moved_vector{std::move(vec)}; });
732 }
733 
734 TEST(vector, AppendExceptions)
735 {
737  ExceptionThrower *ptr1 = &vec.last();
738  ExceptionThrower value;
739  value.throw_during_copy = true;
740  EXPECT_ANY_THROW({ vec.append(value); });
741  EXPECT_EQ(vec.size(), 2);
742  ExceptionThrower *ptr2 = &vec.last();
743  EXPECT_EQ(ptr1, ptr2);
744 }
745 
746 TEST(vector, ExtendExceptions)
747 {
749  std::array<ExceptionThrower, 10> values;
750  values[6].throw_during_copy = true;
751  EXPECT_ANY_THROW({ vec.extend(values); });
752  EXPECT_EQ(vec.size(), 5);
753 }
754 
755 TEST(vector, Insert1Exceptions)
756 {
757  Vector<ExceptionThrower> vec(10);
758  std::array<ExceptionThrower, 5> values;
759  values[3].throw_during_copy = true;
760  EXPECT_ANY_THROW({ vec.insert(7, values); });
761 }
762 
763 TEST(vector, Insert2Exceptions)
764 {
765  Vector<ExceptionThrower> vec(10);
766  vec.reserve(100);
767  vec[8].throw_during_move = true;
768  std::array<ExceptionThrower, 5> values;
769  EXPECT_ANY_THROW({ vec.insert(3, values); });
770 }
771 
772 TEST(vector, PopLastExceptions)
773 {
774  Vector<ExceptionThrower> vec(10);
775  vec.last().throw_during_move = true;
776  EXPECT_ANY_THROW({ vec.pop_last(); }); /* NOLINT: bugprone-throw-keyword-missing */
777  EXPECT_EQ(vec.size(), 10);
778 }
779 
780 TEST(vector, RemoveAndReorderExceptions)
781 {
782  Vector<ExceptionThrower> vec(10);
783  vec.last().throw_during_move = true;
784  EXPECT_ANY_THROW({ vec.remove_and_reorder(3); });
785  EXPECT_EQ(vec.size(), 10);
786 }
787 
788 TEST(vector, RemoveExceptions)
789 {
790  Vector<ExceptionThrower> vec(10);
791  vec[8].throw_during_move = true;
792  EXPECT_ANY_THROW({ vec.remove(2); });
793  EXPECT_EQ(vec.size(), 10);
794 }
795 
796 TEST(vector, RemoveChunk)
797 {
798  Vector<int> vec = {2, 3, 4, 5, 6, 7, 8};
799  EXPECT_EQ(vec.size(), 7);
800  vec.remove(2, 4);
801  EXPECT_EQ(vec.size(), 3);
802  EXPECT_EQ(vec[0], 2);
803  EXPECT_EQ(vec[1], 3);
804  EXPECT_EQ(vec[2], 8);
805  vec.remove(0, 1);
806  EXPECT_EQ(vec.size(), 2);
807  EXPECT_EQ(vec[0], 3);
808  EXPECT_EQ(vec[1], 8);
809  vec.remove(1, 1);
810  EXPECT_EQ(vec.size(), 1);
811  EXPECT_EQ(vec[0], 3);
812  vec.remove(0, 1);
813  EXPECT_EQ(vec.size(), 0);
814  vec.remove(0, 0);
815  EXPECT_EQ(vec.size(), 0);
816 }
817 
818 TEST(vector, RemoveChunkExceptions)
819 {
820  Vector<ExceptionThrower> vec(10);
821  vec.remove(1, 3);
822  EXPECT_EQ(vec.size(), 7);
823  vec[5].throw_during_move = true;
824  EXPECT_ANY_THROW({ vec.remove(2, 3); });
825  EXPECT_EQ(vec.size(), 7);
826 }
827 
828 } // namespace blender::tests
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:110
Strict compiler flags for areas of code we want to ensure don't do conversions without us knowing abo...
#define UNUSED_VARS(...)
#define UNUSED(x)
Group RGB to Bright Vector Camera Vector Combine Material Light Line Style Layer Add Ambient Diffuse Glossy Refraction Transparent Toon Principled Hair Volume Principled Light Particle Volume Image Sky Noise Wave Voronoi Brick Texture Vector Combine Vertex Separate Vector White RGB Map Separate Set Z Dilate Combine Combine Color Channel Split ID Combine Luminance Directional Alpha Distance Hue Movie Ellipse Bokeh View Corner Anti Mix RGB Hue Separate TEX_NODE_PROC TEX_NODE_PROC TEX_NODE_PROC TEX_NODE_PROC TEX_NODE_PROC Boolean Random Edge Subdivision Point Object Attribute Attribute Fill
ATTR_WARN_UNUSED_RESULT const BMVert * v
constexpr const T * data() const
Definition: BLI_span.hh:217
constexpr const T * begin() const
Definition: BLI_span.hh:222
std::reverse_iterator< T * > rbegin()
Definition: BLI_vector.hh:851
int64_t size() const
Definition: BLI_vector.hh:662
void remove_and_reorder(const int64_t index)
Definition: BLI_vector.hh:711
int64_t append_and_get_index(const T &value)
Definition: BLI_vector.hh:453
void append(const T &value)
Definition: BLI_vector.hh:438
void insert(const int64_t insert_index, const T &value)
Definition: BLI_vector.hh:564
void remove(const int64_t index)
Definition: BLI_vector.hh:741
bool is_empty() const
Definition: BLI_vector.hh:674
void remove_first_occurrence_and_reorder(const T &value)
Definition: BLI_vector.hh:728
void resize(const int64_t new_size)
Definition: BLI_vector.hh:368
int64_t first_index_of(const T &value) const
Definition: BLI_vector.hh:793
void remove_last()
Definition: BLI_vector.hh:683
std::reverse_iterator< T * > rend()
Definition: BLI_vector.hh:855
void reserve(const int64_t min_capacity)
Definition: BLI_vector.hh:355
void extend(Span< T > array)
Definition: BLI_vector.hh:515
void prepend(const T &&value)
Definition: BLI_vector.hh:627
void extend_non_duplicates(Span< T > array)
Definition: BLI_vector.hh:530
void append_non_duplicates(const T &value)
Definition: BLI_vector.hh:465
const T & last() const
Definition: BLI_vector.hh:648
void fill(const T &value) const
Definition: BLI_vector.hh:812
int64_t first_index_of_try(const T &value) const
Definition: BLI_vector.hh:779
TypeConstructMock(const TypeConstructMock &UNUSED(other))
TypeConstructMock & operator=(TypeConstructMock &&other) noexcept
TypeConstructMock & operator=(const TypeConstructMock &other)
TypeConstructMock(TypeConstructMock &&UNUSED(other)) noexcept
static unsigned c
Definition: RandGen.cpp:97
static unsigned a[3]
Definition: RandGen.cpp:92
static Vector< int > return_by_value_helper()
TEST(array, DefaultConstructor)
_W64 unsigned int uintptr_t
Definition: stdint.h:122
static int magic(const Tex *tex, const float texvec[3], TexResult *texres)
PointerRNA * ptr
Definition: wm_files.c:3157