7#include <gtest/gtest.h>
9#include "arccore/collections/Array.h"
10#include "arccore/collections/IMemoryAllocator.h"
12#include "arccore/base/FatalErrorException.h"
13#include "arccore/base/Iterator.h"
15#include "TestArrayCommon.h"
20using namespace TestArccore;
24void _testArraySwap(
bool use_own_swap)
26 std::cout <<
"** TestArraySwap is_own=" << use_own_swap <<
"\n";
30 c1.setDebugName(c1_name);
32 std::cout <<
"** C1_this = " << &c1 <<
"\n";
33 std::cout <<
"** C1_BASE = " << x1 <<
"\n";
36 std::cout <<
"** C2_this = " << &c2 <<
"\n";
37 std::cout <<
"** C2_BASE = " << x2 <<
"\n";
39 ASSERT_EQ(c1.debugName(), c1_name);
40 ASSERT_EQ(c2.debugName(),
String{});
48 ASSERT_EQ(c2.debugName(), c1_name);
49 ASSERT_EQ(c1.debugName(),
String{});
53 std::cout <<
"** C1_BASE_AFTER = " << after_x1 <<
" size=" << c1.size() <<
"\n";
54 std::cout <<
"** C2_BASE_AFTER = " << after_x2 <<
" size=" << c2.size() <<
"\n";
56 ASSERT_TRUE(x1 == after_x2) <<
"Bad value after swap [1]";
57 ASSERT_TRUE(x2 == after_x1) <<
"Bad value after swap [2]";
68 _testArraySwap(
false);
76template <
typename ArrayType>
77void _testArrayAssign()
80 using value_type = ArrayType::value_type;
84 a.assign(5l, value_type(42));
85 ASSERT_EQ(a.size(), 5);
86 for (Int32 i = 0; i < 5; ++i)
90 a.assign(0l, value_type(99));
91 ASSERT_EQ(a.size(), 0);
94 a.assign(3l, value_type(1));
95 a.assign(2l, value_type(7));
96 ASSERT_EQ(a.size(), 2);
104 std::vector<Int32> src = { 1, 2, 3, 4, 5 };
105 a.assign(src.begin(), src.end());
106 ASSERT_EQ(a.size(), 5);
107 for (Int32 i = 0; i < 5; ++i)
108 ASSERT_EQ(a[i], i + 1);
112 std::vector<Int32> empty;
113 a2.assign(empty.begin(), empty.end());
114 ASSERT_EQ(a2.size(), 0);
118 ArrayType src_array = { 10, 20, 30 };
119 a3.assign(src_array.begin(), src_array.end());
120 ASSERT_EQ(a3.size(), 3);
121 ASSERT_EQ(a3[0], 10);
122 ASSERT_EQ(a3[1], 20);
123 ASSERT_EQ(a3[2], 30);
127 std::vector<Int32> il_src = { 100, 200 };
128 a4.assign(il_src.begin(), il_src.end());
129 ASSERT_EQ(a4.size(), 2);
130 ASSERT_EQ(a4[0], 100);
131 ASSERT_EQ(a4[1], 200);
135template <
typename ArrayType>
136void _testArrayErase()
139 using value_type = ArrayType::value_type;
143 ArrayType a = { 1, 2, 3, 4, 5 };
146 auto it = a.erase(a.begin());
147 ASSERT_EQ(a.size(), 4);
155 a = { 1, 2, 3, 4, 5 };
156 it = a.erase(a.begin() + 2);
157 ASSERT_EQ(a.size(), 4);
165 a = { 1, 2, 3, 4, 5 };
166 it = a.erase(a.end() - 1);
167 ASSERT_EQ(a.size(), 4);
172 ASSERT_EQ(it, a.end());
178 ArrayType a = { 1, 2, 3, 4, 5 };
179 auto it = a.erase(a.begin(), a.begin() + 2);
180 ASSERT_EQ(a.size(), 3);
187 a = { 1, 2, 3, 4, 5 };
188 it = a.erase(a.begin() + 1, a.begin() + 3);
189 ASSERT_EQ(a.size(), 3);
196 a = { 1, 2, 3, 4, 5 };
197 it = a.erase(a.begin() + 2, a.end());
198 ASSERT_EQ(a.size(), 2);
201 ASSERT_EQ(it, a.end());
204 a = { 1, 2, 3, 4, 5 };
205 it = a.erase(a.begin(), a.end());
206 ASSERT_EQ(a.size(), 0);
207 ASSERT_EQ(it, a.end());
210 a = { 1, 2, 3, 4, 5 };
211 it = a.erase(a.begin() + 2, a.begin() + 2);
212 ASSERT_EQ(a.size(), 5);
222 auto it = a.
erase(a.cbegin() + 1);
223 ASSERT_EQ(a.size(), 4);
230 it = a.
erase(a.cbegin() + 1, a.cbegin() + 3);
231 ASSERT_EQ(a.size(), 3);
238template <
typename ArrayType>
239void _testArrayPopBack()
243 ArrayType a = {1, 2, 3, 4, 5};
245 ASSERT_EQ(a.size(), 4);
249 ASSERT_EQ(a.size(), 3);
255 ASSERT_EQ(a.size(), 0);
258template <
typename ArrayType>
259void _testArrayEmplaceBack()
262 using value_type = ArrayType::value_type;
264 if constexpr(std::is_same_v<Int32,value_type>){
267 ASSERT_EQ(a.size(), 1);
271 ASSERT_EQ(a.size(), 2);
272 ASSERT_EQ(a[1], 100);
276 if constexpr(std::is_same_v<IntSubClass,value_type>){
279 ASSERT_EQ(a.size(), 1);
280 ASSERT_EQ(a[0].value(), 10);
283 ASSERT_EQ(a.size(), 2);
284 ASSERT_EQ(a[1].value(), 20);
288template <
typename ArrayType>
289void _testArrayEdgeCases()
292 using value_type = ArrayType::value_type;
297 ASSERT_EQ(a.size(), 0);
299 a.assign(3l, value_type(7));
300 ASSERT_EQ(a.size(), 3);
307 ArrayType a = { 42 };
308 ASSERT_EQ(a.size(), 1);
311 auto it = a.erase(a.begin());
312 ASSERT_EQ(a.size(), 0);
313 ASSERT_EQ(it, a.end());
316 a.assign(1l, value_type(99));
317 ASSERT_EQ(a.size(), 1);
322 ASSERT_EQ(a.size(), 0);
326 ASSERT_EQ(a.size(), 1);
327 ASSERT_EQ(a[0], 123);
332 ArrayType a = { 1, 2, 3 };
333 auto begin = a.begin();
335 a.assign(begin, end);
336 ASSERT_EQ(a.size(), 3);
347 _testArrayAssign<UniqueArray<Int32>>();
348 _testArrayAssign<SharedArray<Int32>>();
349 _testArrayAssign<UniqueArray<IntSubClass>>();
350 _testArrayAssign<SharedArray<IntSubClass>>();
355 _testArrayErase<UniqueArray<Int32>>();
356 _testArrayErase<SharedArray<Int32>>();
357 _testArrayErase<UniqueArray<IntSubClass>>();
358 _testArrayErase<SharedArray<IntSubClass>>();
363 _testArrayPopBack<UniqueArray<Int32>>();
364 _testArrayPopBack<SharedArray<Int32>>();
365 _testArrayPopBack<UniqueArray<IntSubClass>>();
366 _testArrayPopBack<SharedArray<IntSubClass>>();
369TEST(
Array, EmplaceBack)
371 _testArrayEmplaceBack<UniqueArray<Int32>>();
372 _testArrayEmplaceBack<SharedArray<Int32>>();
373 _testArrayEmplaceBack<UniqueArray<IntSubClass>>();
374 _testArrayEmplaceBack<SharedArray<IntSubClass>>();
377TEST(
Array, EdgeCases)
379 _testArrayEdgeCases<UniqueArray<Int32>>();
380 _testArrayEdgeCases<SharedArray<Int32>>();
381 _testArrayEdgeCases<UniqueArray<IntSubClass>>();
382 _testArrayEdgeCases<SharedArray<IntSubClass>>();
388Integer IntPtrSubClass::count = 0;
393template <
typename Container,
typename SubClass>
405 ARCCORE_UT_CHECK((c.size() == 3),
"Bad size (3)");
406 ARCCORE_UT_CHECK((c[0] == 1),
"Bad value [0]");
407 ARCCORE_UT_CHECK((c[1] == 2),
"Bad value [1]");
408 ARCCORE_UT_CHECK((c[2] == 3),
"Bad value [2]");
410 ARCCORE_UT_CHECK((c.size() == 0),
"Bad size (0)");
412 ARCCORE_UT_CHECK((c.size() == 5),
"Bad size");
414 ARCCORE_UT_CHECK((c.size() == 6),
"Bad size");
415 ARCCORE_UT_CHECK((c[5] == 6),
"Bad value [5]");
417 ASSERT_EQ(c.size(), c.capacity()) <<
"Bad capacity (test 1)";
420 ASSERT_EQ(c.size(), c.capacity()) <<
"Bad capacity (test 2)";
425 ASSERT_EQ(c.capacity(), 0) <<
"Bad capacity (test 3)";
430 for (
Integer i = 0; i < nb; ++i)
433 Int64 current_capacity = c.capacity();
434 ASSERT_EQ(current_capacity, (nb * 2)) <<
"Bad capacity (test 4)";
435 c.shrink(c.capacity() + 5);
436 ASSERT_EQ(c.capacity(), current_capacity) <<
"Bad capacity (test 5)";
438 ASSERT_EQ(c.capacity(), 32) <<
"Bad capacity (test 6)";
440 ASSERT_EQ(c.capacity(), c.size()) <<
"Bad capacity (test 7)";
446 for (Container& c : uc) {
453 for (
Integer i = 0; i < 50; ++i)
454 c.add(SubClass(i + 2));
457 for (
Integer i = 50; i < 100; ++i) {
458 c2.add(SubClass(i + 2));
466 for (
Integer i = 100; i < 150; ++i) {
467 c4.add(SubClass(i + 2));
470 ARCCORE_UT_CHECK((c.size() == 150),
"Bad size (150)");
472 ARCCORE_UT_CHECK((c.capacity() == 300),
"Bad capacity (300)");
473 for (
Integer i = 0; i < 50; ++i) {
476 ARCCORE_UT_CHECK((c.size() == 100),
"Bad size (100)");
477 for (
Integer i = 0; i < 50; ++i) {
479 ARCCORE_UT_CHECK((c[i] == ((i * 2) + 3)),
"Bad value");
481 for (
Integer i = 50; i < 100; ++i) {
483 ARCCORE_UT_CHECK((c[i] == (i + 52)),
"Bad value");
491void _testArrayNewInternal()
494 std::cout <<
"** TEST VECTOR NEW\n";
503 std::cout <<
"** TEST VECTOR NEW 2\n";
507 std::cout <<
"** COUNT = " << IntPtrSubClass::count <<
"\n";
509 std::cout <<
"** TEST VECTOR NEW 3\n";
513 std::cout <<
"** COUNT = " << IntPtrSubClass::count <<
"\n";
521 ARCCORE_UT_CHECK((c2.size() == 3),
"Bad value [3]");
522 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
523 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
524 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
525 ARCCORE_UT_CHECK((c2[0] == 5),
"Bad value [5]");
526 ARCCORE_UT_CHECK((c2[1] == 7),
"Bad value [7]");
527 ARCCORE_UT_CHECK((c2[2] == 3),
"Bad value [7]");
535 ARCCORE_UT_CHECK((c2.size() == 3),
"Bad value [3]");
536 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
537 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
538 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
539 ARCCORE_UT_CHECK((c2[0] == 5),
"Bad value [5]");
540 ARCCORE_UT_CHECK((c2[1] == 7),
"Bad value [7]");
541 ARCCORE_UT_CHECK((c2[2] == 3),
"Bad value [7]");
547 ARCCORE_UT_CHECK((c2.size() == 3),
"Bad value [3]");
548 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
549 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
550 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
551 ARCCORE_UT_CHECK((c2[0] == 5),
"Bad value [5]");
552 ARCCORE_UT_CHECK((c2[1] == 7),
"Bad value [7]");
553 ARCCORE_UT_CHECK((c2[2] == 3),
"Bad value [7]");
557 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
558 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
559 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
563 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
564 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
565 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
571 ARCCORE_UT_CHECK((cx.size() == 5),
"Bad value [5]");
576 ARCCORE_UT_CHECK((c2.size() == 3),
"Bad value [3]");
577 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
578 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
579 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
580 ARCCORE_UT_CHECK((c2[0] == 5),
"Bad value [5]");
581 ARCCORE_UT_CHECK((c2[1] == 7),
"Bad value [7]");
582 ARCCORE_UT_CHECK((c2[2] == 3),
"Bad value [7]");
583 for (
Integer i = 0; i < 50; ++i)
593 ASSERT_EQ(c22.size(), 33);
603 ASSERT_EQ(c2.
size(), c3.size());
604 ASSERT_EQ(c2.
size(), c4.size());
606 ASSERT_EQ(c2.
size(), c3.size());
607 ASSERT_EQ(c2.
size(), c4.size());
612 ARCCORE_UT_CHECK((c2.
size() == 33),
"Bad value [3]");
613 ARCCORE_UT_CHECK((c2[0] == 5),
"Bad value [5]");
614 ARCCORE_UT_CHECK((c2[1] == 7),
"Bad value [7]");
615 ARCCORE_UT_CHECK((c2[32] == 3),
"Bad value [7]");
617 ASSERT_EQ(c2.
size(), 1293);
618 ASSERT_EQ(c22.size(), 2);
622 ASSERT_EQ(values1.
size(), 3);
623 ASSERT_EQ(values1[0], -7);
624 ASSERT_EQ(values1[1], 3);
625 ASSERT_EQ(values1[2], 4);
626 values1 = { 2, -1, 9, 13 };
627 ASSERT_EQ(values1.
size(), 4);
628 ASSERT_EQ(values1[0], 2);
629 ASSERT_EQ(values1[1], -1);
630 ASSERT_EQ(values1[2], 9);
631 ASSERT_EQ(values1[3], 13);
633 ASSERT_EQ(values2, values1);
636 ASSERT_EQ(values1.
size(), 0);
637 ASSERT_EQ(values2.
size(), 0);
644 std::copy(std::begin(values2), std::end(values2), std::back_inserter(values1));
645 std::cout <<
"** VALUES1 = " << values1 <<
"\n";
646 ARCCORE_UT_CHECK((values1.size() == 5),
"BI: Bad size");
647 ARCCORE_UT_CHECK((values1[0] == 2),
"BI: Bad value [0]");
648 ARCCORE_UT_CHECK((values1[1] == 5),
"BI: Bad value [1]");
649 ARCCORE_UT_CHECK((values1[2] == 4),
"BI: Bad value [2]");
650 ARCCORE_UT_CHECK((values1[3] == 9),
"BI: Bad value [3]");
651 ARCCORE_UT_CHECK((values1[4] == 7),
"BI: Bad value [4]");
657 std::cout <<
"V=" << i->m_v <<
" " << ci->m_v <<
'\n';
660 ASSERT_EQ(values1.size(), 2);
661 ASSERT_EQ(values1[0], -7);
662 ASSERT_EQ(values1[1], 3);
665 ASSERT_EQ(values1.size(), 0);
671 values1.
copy(values2);
672 std::cout <<
"** VALUES1 = " << values1 <<
"\n";
673 ARCCORE_UT_CHECK((values1.size() == 5),
"BI: Bad size");
674 ARCCORE_UT_CHECK((values1[0] == 4),
"BI2: Bad value [0]");
675 ARCCORE_UT_CHECK((values1[1] == 9),
"BI2: Bad value [1]");
676 ARCCORE_UT_CHECK((values1[2] == 7),
"BI2: Bad value [2]");
677 ARCCORE_UT_CHECK((values1[3] == 6),
"BI2: Bad value [3]");
678 ARCCORE_UT_CHECK((values1[4] == 3),
"BI2: Bad value [4]");
684 std::cout <<
"V=" << i->m_v <<
" " << ci->m_v <<
'\n';
691 std::cout <<
"V=" << i->m_v <<
" " << ci->m_v <<
'\n';
694 std::cout <<
"V=" << cicvx->m_v <<
'\n';
702 std::cout <<
"V=" << i->m_v <<
" " << ci->m_v <<
" " << (iend - i) <<
'\n';
705 std::cout <<
"V=" << cicvx->m_v <<
'\n';
706 std::copy(std::begin(vx), std::end(vx), std::begin(vx));
711 std::cout << *i <<
'\n';
714 std::cout << *i <<
'\n';
716 for (
auto i : values.
range()) {
717 std::cout << i <<
'\n';
719 for (
auto i : values.
constView().range()) {
720 std::cout << i <<
'\n';
724 auto r1 = std::make_reverse_iterator(values.
end());
725 auto r2 = std::make_reverse_iterator(values.
begin());
726 for (; r1 != r2; ++r1) {
727 std::cout <<
"RVALUE = " << *r1 <<
'\n';
731 auto r1 = values.
rbegin();
744 ARCCORE_UT_CHECK((c2.
size() == 3),
"Bad value [3]");
745 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
746 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
747 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
748 ARCCORE_UT_CHECK((c2[0] == 5),
"Bad value [5]");
749 ARCCORE_UT_CHECK((c2[1] == 7),
"Bad value [7]");
750 ARCCORE_UT_CHECK((c2[2] == 3),
"Bad value [7]");
767 _testArrayNewInternal();
770 std::cerr <<
"Exception ex=" << ex <<
"\n";
798 ASSERT_EQ(v[0], 1.2);
799 ASSERT_EQ(v[1], -1.3);
800 ASSERT_EQ(v.
at(2), 7.6);
804 std::cout <<
" Value: " << x <<
'\n';
806 v.printInfos(std::cout);
813 v.printInfos(std::cout);
817 v.printInfos(std::cout);
819 v.printInfos(std::cout);
824 v.printInfos(std::cout);
826 std::cout <<
" Value: " << v[i] <<
'\n';
832 for (
int i = 0; i < 10; ++i)
835 std::cout <<
" Value: " << v[i] <<
'\n';
841 for (
int i = 0; i < 27500; ++i) {
845 for (
int i = 0; i < 5000; ++i) {
849 for (
int i = 0; i < 27500; ++i) {
853 std::cout <<
" ValueSize= " << v.
size() <<
" values=" << v <<
'\n';
855 for (
Integer i = 0; i < 100; ++i) {
864 std::cout <<
" Size: " << v.
size() <<
'\n';
865 ASSERT_EQ(v.
size(), 230000);
880 for (Int32 i = 0, n = v.
size(); i < n; ++i)
883 auto sub_view1 = v.
subView(50, 5);
884 ASSERT_EQ(sub_view1.data(),
nullptr);
885 ASSERT_EQ(sub_view1.size(), 0);
887 auto sub_view2 = v.
subView(2, 8);
888 ASSERT_EQ(sub_view2.size(), 8);
889 for (Int32 i = 0, n = sub_view2.size(); i < n; ++i)
890 ASSERT_EQ(sub_view2[i], v[2 + i]);
892 auto sub_view3 = v.
subView(20, 8);
893 ASSERT_EQ(sub_view3.size(), 3);
894 for (Int32 i = 0, n = sub_view3.size(); i < n; ++i)
895 ASSERT_EQ(sub_view3[i], v[20 + i]);
898 ASSERT_EQ(sub_const_view1.data(),
nullptr);
899 ASSERT_EQ(sub_const_view1.size(), 0);
902 ASSERT_EQ(sub_const_view2.size(), 8);
903 for (Int32 i = 0, n = sub_const_view2.size(); i < n; ++i)
904 ASSERT_EQ(sub_const_view2[i], v[2 + i]);
907 ASSERT_EQ(sub_const_view3.size(), 3);
908 for (Int32 i = 0, n = sub_const_view3.size(); i < n; ++i)
909 ASSERT_EQ(sub_const_view3[i], v[20 + i]);
920 NoCopyData(
const NoCopyData& x) =
delete;
923template <
typename DataType>
941 const Int32 ref_value1 = 12;
942 const Int32 ref_value2 = 7;
945 std::cout <<
"C1=" << c <<
"\n";
947 ASSERT_EQ(x, ref_value1);
950 ASSERT_EQ(c.size(), 21);
951 std::cout <<
"C2=" << c <<
"\n";
956 std::cout <<
"C4=" << c <<
"\n";
957 for (Int32 i = 9, s = c.size(); i < s; ++i)
958 ASSERT_EQ(c[i], ref_value2);
959 for (Int32 i = 9, s = c.size(); i < s; ++i)
961 for (Int32 i = 9, s = c.size(); i < s; ++i)
962 ASSERT_EQ(c[i], (i + 2));
973template <
typename ArrayType>
978 static void doTestBase()
987 std::cout <<
"Array a\n";
988 ArrayType a(allocator1);
989 ASSERT_EQ(a.allocator(), allocator1);
995 std::cout <<
"Array b\n";
996 ArrayType b(allocator2);
997 ASSERT_EQ(b.capacity(), 0);
998 ASSERT_EQ(b.size(), 0);
999 ASSERT_EQ(b.allocator(), allocator2);
1002 ASSERT_EQ(b.size(), a.size());
1003 ASSERT_EQ(b.allocator(), a.allocator());
1005 std::cout <<
"Array c\n";
1006 ArrayType c(a.clone());
1007 ASSERT_EQ(c.allocator(), a.allocator());
1008 ASSERT_EQ(c.size(), a.size());
1009 ASSERT_EQ(c.constSpan(), a.constSpan());
1011 std::cout <<
"Array d\n";
1012 ArrayType d(allocator2, a);
1013 ASSERT_EQ(d.allocator(), allocator2);
1014 ASSERT_EQ(d.size(), a.size());
1015 ASSERT_EQ(d.constSpan(), a.constSpan());
1017 std::cout <<
"Array e\n";
1018 ArrayType e(allocator2, 25);
1019 ASSERT_EQ(e.allocator(), allocator2);
1020 ASSERT_EQ(e.size(), 25);
1022 ArrayType f(allocator2);
1024 ASSERT_EQ(f.allocator(), e.allocator());
1025 ASSERT_EQ(f.size(), e.size());
1028 ASSERT_EQ(f.allocator(), e.allocator());
1029 ASSERT_EQ(f.size(), e.size());
1051 std::cout <<
"Sizeof(ArrayMetaData)=" <<
sizeof(
ArrayMetaData) <<
"\n";
1060 std::cout <<
"Array a1\n";
1062 ASSERT_EQ(a1.allocator(), allocator2);
1063 ASSERT_EQ(a1.size(), 0);
1064 ASSERT_EQ(a1.capacity(), 0);
1065 ASSERT_EQ(a1.data(),
nullptr);
1067 std::cout <<
"Array a2\n";
1069 ASSERT_EQ(a1.allocator(), a2.allocator());
1070 ASSERT_EQ(a2.capacity(), 0);
1071 ASSERT_EQ(a2.data(),
nullptr);
1078 ASSERT_EQ(a1.size(), 5);
1080 std::cout <<
"Array a3\n";
1085 ASSERT_EQ(a3.size(), 3);
1087 ASSERT_EQ(a3.allocator(), a1.allocator());
1088 ASSERT_EQ(a3.size(), a1.size());
1089 ASSERT_EQ(a3.constSpan(), a1.constSpan());
1091 std::cout <<
"Array a4\n";
1096 ASSERT_EQ(a4.size(), 3);
1098 ASSERT_EQ(a4.allocator(), allocator1);
1104 for (
Integer i = 0; i < 2; ++i) {
1107 ASSERT_EQ(array[0].allocator(), allocator3);
1108 ASSERT_EQ(array[1].allocator(), allocator3);
1119 std::cout <<
"Sizeof(ArrayMetaData)=" <<
sizeof(
ArrayMetaData) <<
"\n";
1128 std::cout <<
"Array a1\n";
1130 ASSERT_EQ(a1.allocator(), allocator2);
1131 ASSERT_EQ(a1.size(), 0);
1132 ASSERT_EQ(a1.capacity(), 0);
1133 ASSERT_EQ(a1.data(),
nullptr);
1135 std::cout <<
"Array a2\n";
1137 ASSERT_EQ(a1.allocator(), a2.allocator());
1138 ASSERT_EQ(a2.capacity(), 0);
1139 ASSERT_EQ(a2.data(),
nullptr);
1146 ASSERT_EQ(a1.size(), 5);
1148 std::cout <<
"Array a3\n";
1153 ASSERT_EQ(a3.size(), 3);
1155 ASSERT_EQ(a3.allocator(), a1.allocator());
1156 ASSERT_EQ(a3.size(), a1.size());
1157 ASSERT_EQ(a3.constSpan(), a1.constSpan());
1159 std::cout <<
"Array a4\n";
1161 ASSERT_EQ(a4.size(), 2);
1165 ASSERT_EQ(a4.size(), 5);
1166 ASSERT_EQ(a4[2], 4);
1167 ASSERT_EQ(a4[3], 6);
1168 ASSERT_EQ(a4[4], 2);
1171 ASSERT_EQ(a4.allocator(), allocator1);
1177 for (
Integer i = 0; i < 2; ++i) {
1180 ASSERT_EQ(array[0].allocator(), allocator3);
1181 ASSERT_EQ(array[1].allocator(), allocator3);
1193:
public IMemoryAllocator3
1200 return m_default_allocator.hasRealloc(args);
1205 return m_default_allocator.allocate(args, new_size);
1210 return m_default_allocator.reallocate(args, current_ptr, new_size);
1215 m_default_allocator.deallocate(args, ptr);
1217 Int64 adjustedCapacity(
MemoryAllocationArgs args, Int64 wanted_capacity, Int64 element_size)
const override
1220 return m_default_allocator.adjustedCapacity(args, wanted_capacity, element_size);
1225 return m_default_allocator.guaranteedAlignment(args);
1233 ASSERT_EQ(ptr.
size(), 8);
1234 m_default_allocator.notifyMemoryArgsChanged(old_args, new_args, ptr);
1239 DefaultMemoryAllocator3 m_default_allocator;
1248 bool is_valid = v1 || v2 || v3;
1253#define ASSERT_SAME_ARRAY_INFOS(a, b) \
1254 ASSERT_EQ(a.allocationOptions(), b.allocationOptions()); \
1255 ASSERT_EQ(a.size(), b.size()); \
1256 ASSERT_EQ(a.capacity(), b.capacity())
1258TEST(
Array, AllocatorV2)
1268 ASSERT_EQ(opt3, allocate_options1);
1271 std::cout <<
"Array a1\n";
1273 ASSERT_EQ(a1.allocationOptions(), allocate_options2);
1274 ASSERT_EQ(a1.size(), 0);
1275 ASSERT_EQ(a1.capacity(), 0);
1276 ASSERT_EQ(a1.data(),
nullptr);
1278 std::cout <<
"Array a2\n";
1280 ASSERT_SAME_ARRAY_INFOS(a2, a1);
1281 ASSERT_EQ(a2.data(),
nullptr);
1288 ASSERT_EQ(a1.size(), 5);
1294 std::cout <<
"Array a3\n";
1299 ASSERT_EQ(a3.size(), 3);
1301 ASSERT_EQ(a3.allocator(), a1.allocator());
1302 ASSERT_EQ(a3.size(), a1.size());
1303 ASSERT_EQ(a3.constSpan(), a1.constSpan());
1305 std::cout <<
"Array a4\n";
1310 ASSERT_EQ(a4.size(), 3);
1312 ASSERT_EQ(a4.allocationOptions(), allocate_options1);
1318 for (
Integer i = 0; i < 2; ++i) {
1321 ASSERT_EQ(array[0].allocationOptions(), allocator3);
1322 ASSERT_EQ(array[1].allocationOptions(), allocator3);
1329TEST(
Array, DebugInfo)
1332 DefaultMemoryAllocator3 m_default_allocator;
1335 String a1_name(
"Array1");
1336 String sa1_name(
"SharedArray1");
1339 std::cout <<
"Array a1\n";
1341 a1.setDebugName(a1_name);
1342 ASSERT_EQ(a1.allocationOptions(), allocate_options2);
1343 ASSERT_EQ(a1.size(), 0);
1344 ASSERT_EQ(a1.capacity(), 0);
1345 ASSERT_EQ(a1.data(),
nullptr);
1346 ASSERT_EQ(a1.debugName(), a1_name);
1348 std::cout <<
"SharedArray sa1\n";
1350 sa1.setDebugName(sa1_name);
1351 ASSERT_EQ(sa1.allocationOptions(), allocate_options2);
1352 ASSERT_EQ(sa1.size(), 0);
1353 ASSERT_EQ(sa1.capacity(), 0);
1354 ASSERT_EQ(sa1.data(),
nullptr);
1355 ASSERT_EQ(sa1.debugName(), sa1_name);
1357 ASSERT_EQ(a1.debugName(), a1_name);
1359 std::cout <<
"Array a2\n";
1361 ASSERT_SAME_ARRAY_INFOS(a2, a1);
1362 ASSERT_EQ(a2.data(),
nullptr);
1363 ASSERT_EQ(a2.debugName(), a1_name);
1370 ASSERT_EQ(a1.size(), 5);
1373 ASSERT_EQ(a2.debugName(), a1_name);
1374 ASSERT_EQ(a2.size(), 2);
1379 ASSERT_EQ(a3.
size(), 2);
1385TEST(Collections, Memory)
#define ASSERT_TRUE(condition)
Checks that condition is true.
String debugName() const
Debug name (null if no name specified).
Abstract base class for a vector.
void _internalSetHostDeviceMemoryLocation(eHostDeviceMemoryLocation location)
Sets the physical location of the memory region.
Integer size() const
Number of elements in the vector.
ArrayIterator< pointer > iterator
Type of the iterator over an array element.
eHostDeviceMemoryLocation hostDeviceMemoryLocation() const
Sets the physical location of the memory region.
ArrayIterator< const_pointer > const_iterator
Type of the constant iterator over an array element.
static constexpr Integer simdAlignment()
Alignment for structures using vectorization.
static AlignedMemoryAllocator * Simd()
Allocator guaranteeing alignment to use vectorization on the target platform.
Information about an allocated memory region.
Int64 size() const
Size in bytes of the used memory region. (-1) if unknown.
ConstIterT< ArrayView< T > > const_iter
Type of a constant iterator over the entire array.
Base class for 1D data vectors.
SmallSpan< const T > smallSpan() const
Immutable view of this array.
reverse_iterator rbegin()
Reverse iterator over the first element of the array.
T & at(Int64 i)
Element at index i. Always checks for overflows.
void resizeNoInit(Int64 s)
Resizes without initializing new values.
Span< const T > span() const
Immutable view of this array.
iterator erase(const_iterator pos)
Removes the element at pos.
void resize(Int64 s)
Changes the number of elements in the array to s.
ConstArrayView< T > subConstView(Int64 abegin, Int32 asize) const
Sub-view starting from element abegin and containing asize elements.
void copy(Span< const T > rhs)
Copies the values from rhs into the instance.
SmallSpan< const T > constSmallSpan() const
Immutable view of this array.
iterator begin()
Iterator over the first element of the array.
void add(ConstReferenceType val)
Adds element val to the end of the array.
ConstArrayView< T > constView() const
Constant view of this array.
ArrayRange< pointer > range()
Iteration range from the first to the last element.
void remove(Int64 index)
Removes the entity at index index.
Span< const T > constSpan() const
Constant view of this array.
void reserve(Int64 new_capacity)
Reserves memory for new_capacity elements.
reverse_iterator rend()
Reverse iterator over the first element after the end of the array.
ArrayView< T > subView(Int64 abegin, Integer asize)
Sub-view starting from element abegin and containing asize elements.
iterator end()
Iterator over the first element after the end of the array.
ArrayView< T > view() const
Mutable view of this array.
ConstIterT< ConstArrayView< T > > const_iter
Type of a constant iterator over the entire array.
Base class for an exception.
Interface for a memory allocator.
Class containing information to specialize allocations.
Options to configure allocations.
Memory allocator via malloc/realloc/free with listing output.
1D vector of data with reference semantics.
SharedArray< T > clone() const
Clones the array.
View of an array of elements of type T.
Unicode character string.
1D data vector with value semantics (STL style).
Allocator for testing arguments.
Concept for allocating, resizing and freeing memory block.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
void swap(UniqueArray2< T > &v1, UniqueArray2< T > &v2)
Swaps the values of v1 and v2.
Int32 Integer
Type representing an integer.
@ MainlyHost
Indicates that the data will primarily be used on the CPU.
@ HostAndDeviceMostlyRead
Indicates that the data will be used both on the accelerator and on the CPU and will not be frequentl...
@ Unknown
Unknown location.
@ ManagedMemoryDevice
The memory is managed memory on the accelerator.
@ Host
The memory is on the host.
@ ManagedMemoryHost
The memory is managed memory on the host.
@ Device
The memory is on the accelerator.
@ HostPinned
Allocates on the host.
@ Unknown
Unknown or uninitialized value.
@ Host
Allocates on the host.
@ UnifiedMemory
Allocates using unified memory.
@ Device
Allocates on the device.