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);
308 ArrayType a = { 42 };
309 ASSERT_EQ(a.size(), 1);
312 auto it = a.erase(a.begin());
313 ASSERT_EQ(a.size(), 0);
314 ASSERT_EQ(it, a.end());
317 a.assign(1l, value_type(99));
318 ASSERT_EQ(a.size(), 1);
323 ASSERT_EQ(a.size(), 0);
327 ASSERT_EQ(a.size(), 1);
328 ASSERT_EQ(a[0], 123);
333 ArrayType a = { 1, 2, 3 };
334 auto begin = a.begin();
336 a.assign(begin, end);
337 ASSERT_EQ(a.size(), 3);
348 _testArrayAssign<UniqueArray<Int32>>();
349 _testArrayAssign<SharedArray<Int32>>();
350 _testArrayAssign<UniqueArray<IntSubClass>>();
351 _testArrayAssign<SharedArray<IntSubClass>>();
356 _testArrayErase<UniqueArray<Int32>>();
357 _testArrayErase<SharedArray<Int32>>();
358 _testArrayErase<UniqueArray<IntSubClass>>();
359 _testArrayErase<SharedArray<IntSubClass>>();
364 _testArrayPopBack<UniqueArray<Int32>>();
365 _testArrayPopBack<SharedArray<Int32>>();
366 _testArrayPopBack<UniqueArray<IntSubClass>>();
367 _testArrayPopBack<SharedArray<IntSubClass>>();
370TEST(
Array, EmplaceBack)
372 _testArrayEmplaceBack<UniqueArray<Int32>>();
373 _testArrayEmplaceBack<SharedArray<Int32>>();
374 _testArrayEmplaceBack<UniqueArray<IntSubClass>>();
375 _testArrayEmplaceBack<SharedArray<IntSubClass>>();
378TEST(
Array, EdgeCases)
380 _testArrayEdgeCases<UniqueArray<Int32>>();
381 _testArrayEdgeCases<SharedArray<Int32>>();
382 _testArrayEdgeCases<UniqueArray<IntSubClass>>();
383 _testArrayEdgeCases<SharedArray<IntSubClass>>();
389Integer IntPtrSubClass::count = 0;
394template <
typename Container,
typename SubClass>
406 ARCCORE_UT_CHECK((c.size() == 3),
"Bad size (3)");
407 ARCCORE_UT_CHECK((c[0] == 1),
"Bad value [0]");
408 ARCCORE_UT_CHECK((c[1] == 2),
"Bad value [1]");
409 ARCCORE_UT_CHECK((c[2] == 3),
"Bad value [2]");
411 ARCCORE_UT_CHECK((c.size() == 0),
"Bad size (0)");
413 ARCCORE_UT_CHECK((c.size() == 5),
"Bad size");
415 ARCCORE_UT_CHECK((c.size() == 6),
"Bad size");
416 ARCCORE_UT_CHECK((c[5] == 6),
"Bad value [5]");
418 ASSERT_EQ(c.size(), c.capacity()) <<
"Bad capacity (test 1)";
421 ASSERT_EQ(c.size(), c.capacity()) <<
"Bad capacity (test 2)";
426 ASSERT_EQ(c.capacity(), 0) <<
"Bad capacity (test 3)";
431 for (
Integer i = 0; i < nb; ++i)
434 Int64 current_capacity = c.capacity();
435 ASSERT_EQ(current_capacity, (nb * 2)) <<
"Bad capacity (test 4)";
436 c.shrink(c.capacity() + 5);
437 ASSERT_EQ(c.capacity(), current_capacity) <<
"Bad capacity (test 5)";
439 ASSERT_EQ(c.capacity(), 32) <<
"Bad capacity (test 6)";
441 ASSERT_EQ(c.capacity(), c.size()) <<
"Bad capacity (test 7)";
447 for (Container& c : uc) {
454 for (
Integer i = 0; i < 50; ++i)
455 c.add(SubClass(i + 2));
458 for (
Integer i = 50; i < 100; ++i) {
459 c2.add(SubClass(i + 2));
467 for (
Integer i = 100; i < 150; ++i) {
468 c4.add(SubClass(i + 2));
471 ARCCORE_UT_CHECK((c.size() == 150),
"Bad size (150)");
473 ARCCORE_UT_CHECK((c.capacity() == 300),
"Bad capacity (300)");
474 for (
Integer i = 0; i < 50; ++i) {
477 ARCCORE_UT_CHECK((c.size() == 100),
"Bad size (100)");
478 for (
Integer i = 0; i < 50; ++i) {
480 ARCCORE_UT_CHECK((c[i] == ((i * 2) + 3)),
"Bad value");
482 for (
Integer i = 50; i < 100; ++i) {
484 ARCCORE_UT_CHECK((c[i] == (i + 52)),
"Bad value");
492void _testArrayNewInternal()
495 std::cout <<
"** TEST VECTOR NEW\n";
504 std::cout <<
"** TEST VECTOR NEW 2\n";
508 std::cout <<
"** COUNT = " << IntPtrSubClass::count <<
"\n";
510 std::cout <<
"** TEST VECTOR NEW 3\n";
514 std::cout <<
"** COUNT = " << IntPtrSubClass::count <<
"\n";
522 ARCCORE_UT_CHECK((c2.size() == 3),
"Bad value [3]");
523 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
524 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
525 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
526 ARCCORE_UT_CHECK((c2[0] == 5),
"Bad value [5]");
527 ARCCORE_UT_CHECK((c2[1] == 7),
"Bad value [7]");
528 ARCCORE_UT_CHECK((c2[2] == 3),
"Bad value [7]");
536 ARCCORE_UT_CHECK((c2.size() == 3),
"Bad value [3]");
537 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
538 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
539 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
540 ARCCORE_UT_CHECK((c2[0] == 5),
"Bad value [5]");
541 ARCCORE_UT_CHECK((c2[1] == 7),
"Bad value [7]");
542 ARCCORE_UT_CHECK((c2[2] == 3),
"Bad value [7]");
548 ARCCORE_UT_CHECK((c2.size() == 3),
"Bad value [3]");
549 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
550 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
551 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
555 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
556 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
557 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
561 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
562 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
563 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
569 ARCCORE_UT_CHECK((cx.size() == 5),
"Bad value [5]");
574 ARCCORE_UT_CHECK((c2.size() == 3),
"Bad value [3]");
575 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
576 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
577 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
578 ARCCORE_UT_CHECK((c2[0] == 5),
"Bad value [5]");
579 ARCCORE_UT_CHECK((c2[1] == 7),
"Bad value [7]");
580 ARCCORE_UT_CHECK((c2[2] == 3),
"Bad value [7]");
581 for (
Integer i = 0; i < 50; ++i)
591 ASSERT_EQ(c22.size(), 33);
601 ASSERT_EQ(c2.
size(), c3.size());
602 ASSERT_EQ(c2.
size(), c4.size());
604 ASSERT_EQ(c2.
size(), c3.size());
605 ASSERT_EQ(c2.
size(), c4.size());
610 ARCCORE_UT_CHECK((c2.
size() == 33),
"Bad value [3]");
611 ARCCORE_UT_CHECK((c2[0] == 5),
"Bad value [5]");
612 ARCCORE_UT_CHECK((c2[1] == 7),
"Bad value [7]");
613 ARCCORE_UT_CHECK((c2[32] == 3),
"Bad value [7]");
615 ASSERT_EQ(c2.
size(), 1293);
616 ASSERT_EQ(c22.size(), 2);
620 ASSERT_EQ(values1.
size(), 3);
621 ASSERT_EQ(values1[0], -7);
622 ASSERT_EQ(values1[1], 3);
623 ASSERT_EQ(values1[2], 4);
624 values1 = { 2, -1, 9, 13 };
625 ASSERT_EQ(values1.
size(), 4);
626 ASSERT_EQ(values1[0], 2);
627 ASSERT_EQ(values1[1], -1);
628 ASSERT_EQ(values1[2], 9);
629 ASSERT_EQ(values1[3], 13);
631 ASSERT_EQ(values2, values1);
634 ASSERT_EQ(values1.
size(), 0);
635 ASSERT_EQ(values2.
size(), 0);
642 std::copy(std::begin(values2), std::end(values2), std::back_inserter(values1));
643 std::cout <<
"** VALUES1 = " << values1 <<
"\n";
644 ARCCORE_UT_CHECK((values1.size() == 5),
"BI: Bad size");
645 ARCCORE_UT_CHECK((values1[0] == 2),
"BI: Bad value [0]");
646 ARCCORE_UT_CHECK((values1[1] == 5),
"BI: Bad value [1]");
647 ARCCORE_UT_CHECK((values1[2] == 4),
"BI: Bad value [2]");
648 ARCCORE_UT_CHECK((values1[3] == 9),
"BI: Bad value [3]");
649 ARCCORE_UT_CHECK((values1[4] == 7),
"BI: Bad value [4]");
655 std::cout <<
"V=" << i->m_v <<
" " << ci->m_v <<
'\n';
658 ASSERT_EQ(values1.size(), 2);
659 ASSERT_EQ(values1[0], -7);
660 ASSERT_EQ(values1[1], 3);
663 ASSERT_EQ(values1.size(), 0);
669 values1.
copy(values2);
670 std::cout <<
"** VALUES1 = " << values1 <<
"\n";
671 ARCCORE_UT_CHECK((values1.size() == 5),
"BI: Bad size");
672 ARCCORE_UT_CHECK((values1[0] == 4),
"BI2: Bad value [0]");
673 ARCCORE_UT_CHECK((values1[1] == 9),
"BI2: Bad value [1]");
674 ARCCORE_UT_CHECK((values1[2] == 7),
"BI2: Bad value [2]");
675 ARCCORE_UT_CHECK((values1[3] == 6),
"BI2: Bad value [3]");
676 ARCCORE_UT_CHECK((values1[4] == 3),
"BI2: Bad value [4]");
682 std::cout <<
"V=" << i->m_v <<
" " << ci->m_v <<
'\n';
689 std::cout <<
"V=" << i->m_v <<
" " << ci->m_v <<
'\n';
692 std::cout <<
"V=" << cicvx->m_v <<
'\n';
700 std::cout <<
"V=" << i->m_v <<
" " << ci->m_v <<
" " << (iend - i) <<
'\n';
703 std::cout <<
"V=" << cicvx->m_v <<
'\n';
704 std::copy(std::begin(vx), std::end(vx), std::begin(vx));
709 std::cout << *i <<
'\n';
712 std::cout << *i <<
'\n';
714 for (
auto i : values.
range()) {
715 std::cout << i <<
'\n';
717 for (
auto i : values.
constView().range()) {
718 std::cout << i <<
'\n';
722 auto r1 = std::make_reverse_iterator(values.
end());
723 auto r2 = std::make_reverse_iterator(values.
begin());
724 for (; r1 != r2; ++r1) {
725 std::cout <<
"RVALUE = " << *r1 <<
'\n';
729 auto r1 = values.
rbegin();
742 ARCCORE_UT_CHECK((c2.
size() == 3),
"Bad value [3]");
743 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
744 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
745 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
746 ARCCORE_UT_CHECK((c2[0] == 5),
"Bad value [5]");
747 ARCCORE_UT_CHECK((c2[1] == 7),
"Bad value [7]");
748 ARCCORE_UT_CHECK((c2[2] == 3),
"Bad value [7]");
765 _testArrayNewInternal();
768 std::cerr <<
"Exception ex=" << ex <<
"\n";
796 ASSERT_EQ(v[0], 1.2);
797 ASSERT_EQ(v[1], -1.3);
798 ASSERT_EQ(v.
at(2), 7.6);
802 std::cout <<
" Value: " << x <<
'\n';
804 v.printInfos(std::cout);
811 v.printInfos(std::cout);
815 v.printInfos(std::cout);
817 v.printInfos(std::cout);
822 v.printInfos(std::cout);
824 std::cout <<
" Value: " << v[i] <<
'\n';
830 for (
int i = 0; i < 10; ++i)
833 std::cout <<
" Value: " << v[i] <<
'\n';
839 for (
int i = 0; i < 27500; ++i) {
843 for (
int i = 0; i < 5000; ++i) {
847 for (
int i = 0; i < 27500; ++i) {
851 std::cout <<
" ValueSize= " << v.
size() <<
" values=" << v <<
'\n';
853 for (
Integer i = 0; i < 100; ++i) {
862 std::cout <<
" Size: " << v.
size() <<
'\n';
863 ASSERT_EQ(v.
size(), 230000);
878 for (Int32 i = 0, n = v.
size(); i < n; ++i)
881 auto sub_view1 = v.
subView(50, 5);
882 ASSERT_EQ(sub_view1.data(),
nullptr);
883 ASSERT_EQ(sub_view1.size(), 0);
885 auto sub_view2 = v.
subView(2, 8);
886 ASSERT_EQ(sub_view2.size(), 8);
887 for (Int32 i = 0, n = sub_view2.size(); i < n; ++i)
888 ASSERT_EQ(sub_view2[i], v[2 + i]);
890 auto sub_view3 = v.
subView(20, 8);
891 ASSERT_EQ(sub_view3.size(), 3);
892 for (Int32 i = 0, n = sub_view3.size(); i < n; ++i)
893 ASSERT_EQ(sub_view3[i], v[20 + i]);
896 ASSERT_EQ(sub_const_view1.data(),
nullptr);
897 ASSERT_EQ(sub_const_view1.size(), 0);
900 ASSERT_EQ(sub_const_view2.size(), 8);
901 for (Int32 i = 0, n = sub_const_view2.size(); i < n; ++i)
902 ASSERT_EQ(sub_const_view2[i], v[2 + i]);
905 ASSERT_EQ(sub_const_view3.size(), 3);
906 for (Int32 i = 0, n = sub_const_view3.size(); i < n; ++i)
907 ASSERT_EQ(sub_const_view3[i], v[20 + i]);
918 NoCopyData(
const NoCopyData& x) =
delete;
921template <
typename DataType>
939 const Int32 ref_value1 = 12;
940 const Int32 ref_value2 = 7;
943 std::cout <<
"C1=" << c <<
"\n";
945 ASSERT_EQ(x, ref_value1);
948 ASSERT_EQ(c.size(), 21);
949 std::cout <<
"C2=" << c <<
"\n";
954 std::cout <<
"C4=" << c <<
"\n";
955 for (Int32 i = 9, s = c.size(); i < s; ++i)
956 ASSERT_EQ(c[i], ref_value2);
957 for (Int32 i = 9, s = c.size(); i < s; ++i)
959 for (Int32 i = 9, s = c.size(); i < s; ++i)
960 ASSERT_EQ(c[i], (i + 2));
971template <
typename ArrayType>
976 static void doTestBase()
985 std::cout <<
"Array a\n";
986 ArrayType a(allocator1);
987 ASSERT_EQ(a.allocator(), allocator1);
993 std::cout <<
"Array b\n";
994 ArrayType b(allocator2);
995 ASSERT_EQ(b.capacity(), 0);
996 ASSERT_EQ(b.size(), 0);
997 ASSERT_EQ(b.allocator(), allocator2);
1000 ASSERT_EQ(b.size(), a.size());
1001 ASSERT_EQ(b.allocator(), a.allocator());
1003 std::cout <<
"Array c\n";
1004 ArrayType c(a.clone());
1005 ASSERT_EQ(c.allocator(), a.allocator());
1006 ASSERT_EQ(c.size(), a.size());
1007 ASSERT_EQ(c.constSpan(), a.constSpan());
1009 std::cout <<
"Array d\n";
1010 ArrayType d(allocator2, a);
1011 ASSERT_EQ(d.allocator(), allocator2);
1012 ASSERT_EQ(d.size(), a.size());
1013 ASSERT_EQ(d.constSpan(), a.constSpan());
1015 std::cout <<
"Array e\n";
1016 ArrayType e(allocator2, 25);
1017 ASSERT_EQ(e.allocator(), allocator2);
1018 ASSERT_EQ(e.size(), 25);
1020 ArrayType f(allocator2);
1022 ASSERT_EQ(f.allocator(), e.allocator());
1023 ASSERT_EQ(f.size(), e.size());
1026 ASSERT_EQ(f.allocator(), e.allocator());
1027 ASSERT_EQ(f.size(), e.size());
1049 std::cout <<
"Sizeof(ArrayMetaData)=" <<
sizeof(
ArrayMetaData) <<
"\n";
1058 std::cout <<
"Array a1\n";
1060 ASSERT_EQ(a1.allocator(), allocator2);
1061 ASSERT_EQ(a1.size(), 0);
1062 ASSERT_EQ(a1.capacity(), 0);
1063 ASSERT_EQ(a1.data(),
nullptr);
1065 std::cout <<
"Array a2\n";
1067 ASSERT_EQ(a1.allocator(), a2.allocator());
1068 ASSERT_EQ(a2.capacity(), 0);
1069 ASSERT_EQ(a2.data(),
nullptr);
1076 ASSERT_EQ(a1.size(), 5);
1078 std::cout <<
"Array a3\n";
1083 ASSERT_EQ(a3.size(), 3);
1085 ASSERT_EQ(a3.allocator(), a1.allocator());
1086 ASSERT_EQ(a3.size(), a1.size());
1087 ASSERT_EQ(a3.constSpan(), a1.constSpan());
1089 std::cout <<
"Array a4\n";
1094 ASSERT_EQ(a4.size(), 3);
1096 ASSERT_EQ(a4.allocator(), allocator1);
1102 for (
Integer i = 0; i < 2; ++i) {
1105 ASSERT_EQ(array[0].allocator(), allocator3);
1106 ASSERT_EQ(array[1].allocator(), allocator3);
1117 std::cout <<
"Sizeof(ArrayMetaData)=" <<
sizeof(
ArrayMetaData) <<
"\n";
1126 std::cout <<
"Array a1\n";
1128 ASSERT_EQ(a1.allocator(), allocator2);
1129 ASSERT_EQ(a1.size(), 0);
1130 ASSERT_EQ(a1.capacity(), 0);
1131 ASSERT_EQ(a1.data(),
nullptr);
1133 std::cout <<
"Array a2\n";
1135 ASSERT_EQ(a1.allocator(), a2.allocator());
1136 ASSERT_EQ(a2.capacity(), 0);
1137 ASSERT_EQ(a2.data(),
nullptr);
1144 ASSERT_EQ(a1.size(), 5);
1146 std::cout <<
"Array a3\n";
1151 ASSERT_EQ(a3.size(), 3);
1153 ASSERT_EQ(a3.allocator(), a1.allocator());
1154 ASSERT_EQ(a3.size(), a1.size());
1155 ASSERT_EQ(a3.constSpan(), a1.constSpan());
1157 std::cout <<
"Array a4\n";
1159 ASSERT_EQ(a4.size(), 2);
1163 ASSERT_EQ(a4.size(), 5);
1164 ASSERT_EQ(a4[2], 4);
1165 ASSERT_EQ(a4[3], 6);
1166 ASSERT_EQ(a4[4], 2);
1169 ASSERT_EQ(a4.allocator(), allocator1);
1175 for (
Integer i = 0; i < 2; ++i) {
1178 ASSERT_EQ(array[0].allocator(), allocator3);
1179 ASSERT_EQ(array[1].allocator(), allocator3);
1191:
public IMemoryAllocator3
1198 return m_default_allocator.hasRealloc(args);
1203 return m_default_allocator.allocate(args, new_size);
1208 return m_default_allocator.reallocate(args, current_ptr, new_size);
1213 m_default_allocator.deallocate(args, ptr);
1215 Int64 adjustedCapacity(
MemoryAllocationArgs args, Int64 wanted_capacity, Int64 element_size)
const override
1218 return m_default_allocator.adjustedCapacity(args, wanted_capacity, element_size);
1223 return m_default_allocator.guaranteedAlignment(args);
1231 ASSERT_EQ(ptr.
size(), 8);
1232 m_default_allocator.notifyMemoryArgsChanged(old_args, new_args, ptr);
1237 DefaultMemoryAllocator3 m_default_allocator;
1246 bool is_valid = v1 || v2 || v3;
1251#define ASSERT_SAME_ARRAY_INFOS(a, b) \
1252 ASSERT_EQ(a.allocationOptions(), b.allocationOptions()); \
1253 ASSERT_EQ(a.size(), b.size()); \
1254 ASSERT_EQ(a.capacity(), b.capacity())
1256TEST(
Array, AllocatorV2)
1266 ASSERT_EQ(opt3, allocate_options1);
1269 std::cout <<
"Array a1\n";
1271 ASSERT_EQ(a1.allocationOptions(), allocate_options2);
1272 ASSERT_EQ(a1.size(), 0);
1273 ASSERT_EQ(a1.capacity(), 0);
1274 ASSERT_EQ(a1.data(),
nullptr);
1276 std::cout <<
"Array a2\n";
1278 ASSERT_SAME_ARRAY_INFOS(a2, a1);
1279 ASSERT_EQ(a2.data(),
nullptr);
1286 ASSERT_EQ(a1.size(), 5);
1292 std::cout <<
"Array a3\n";
1297 ASSERT_EQ(a3.size(), 3);
1299 ASSERT_EQ(a3.allocator(), a1.allocator());
1300 ASSERT_EQ(a3.size(), a1.size());
1301 ASSERT_EQ(a3.constSpan(), a1.constSpan());
1303 std::cout <<
"Array a4\n";
1308 ASSERT_EQ(a4.size(), 3);
1310 ASSERT_EQ(a4.allocationOptions(), allocate_options1);
1316 for (
Integer i = 0; i < 2; ++i) {
1319 ASSERT_EQ(array[0].allocationOptions(), allocator3);
1320 ASSERT_EQ(array[1].allocationOptions(), allocator3);
1327TEST(
Array, DebugInfo)
1330 DefaultMemoryAllocator3 m_default_allocator;
1333 String a1_name(
"Array1");
1334 String sa1_name(
"SharedArray1");
1337 std::cout <<
"Array a1\n";
1339 a1.setDebugName(a1_name);
1340 ASSERT_EQ(a1.allocationOptions(), allocate_options2);
1341 ASSERT_EQ(a1.size(), 0);
1342 ASSERT_EQ(a1.capacity(), 0);
1343 ASSERT_EQ(a1.data(),
nullptr);
1344 ASSERT_EQ(a1.debugName(), a1_name);
1346 std::cout <<
"SharedArray sa1\n";
1348 sa1.setDebugName(sa1_name);
1349 ASSERT_EQ(sa1.allocationOptions(), allocate_options2);
1350 ASSERT_EQ(sa1.size(), 0);
1351 ASSERT_EQ(sa1.capacity(), 0);
1352 ASSERT_EQ(sa1.data(),
nullptr);
1353 ASSERT_EQ(sa1.debugName(), sa1_name);
1355 ASSERT_EQ(a1.debugName(), a1_name);
1357 std::cout <<
"Array a2\n";
1359 ASSERT_SAME_ARRAY_INFOS(a2, a1);
1360 ASSERT_EQ(a2.data(),
nullptr);
1361 ASSERT_EQ(a2.debugName(), a1_name);
1368 ASSERT_EQ(a1.size(), 5);
1371 ASSERT_EQ(a2.debugName(), a1_name);
1372 ASSERT_EQ(a2.size(), 2);
1377 ASSERT_EQ(a3.
size(), 2);
1383TEST(Collections, Memory)
#define ASSERT_TRUE(condition)
Vérifie que condition est vrai.
String debugName() const
Nom de debug (nul si aucun nom spécifié).
Classe abstraite de base d'un vecteur.
void _internalSetHostDeviceMemoryLocation(eHostDeviceMemoryLocation location)
Positionne l'emplacement physique de la zone mémoire.
Integer size() const
Nombre d'éléments du vecteur.
ArrayIterator< pointer > iterator
Type de l'itérateur sur un élément du tableau.
eHostDeviceMemoryLocation hostDeviceMemoryLocation() const
Positionne l'emplacement physique de la zone mémoire.
ArrayIterator< const_pointer > const_iterator
Type de l'itérateur constant sur un élément du tableau.
static constexpr Integer simdAlignment()
Alignement pour les structures utilisant la vectorisation.
static AlignedMemoryAllocator * Simd()
Allocateur garantissant l'alignement pour utiliser la vectorisation sur la plateforme cible.
Informations sur une zone mémoire allouée.
Int64 size() const
Taille en octets de la zone mémoire utilisée. (-1) si inconnue.
ConstIterT< ArrayView< T > > const_iter
Type d'un itérateur constant sur tout le tableau.
Tableau d'items de types quelconques.
iterator end()
Itérateur sur le premier élément après la fin du tableau.
ConstArrayView< T > constView() const
Vue constante sur ce tableau.
void remove(Int64 index)
Supprime l'entité ayant l'indice index.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
ArrayView< T > subView(Int64 abegin, Integer asize)
Sous-vue à partir de l'élément abegin et contenant asize éléments.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
reverse_iterator rbegin()
Itérateur inverse sur le premier élément du tableau.
T & at(Int64 i)
Elément d'indice i. Vérifie toujours les débordements.
void resizeNoInit(Int64 s)
Redimensionne sans initialiser les nouvelles valeurs.
ConstArrayView< T > subConstView(Int64 abegin, Int32 asize) const
Sous-vue à partir de l'élément abegin et contenant asize éléments.
SmallSpan< const T > smallSpan() const
Vue immutable sur ce tableau.
SmallSpan< const T > constSmallSpan() const
Vue immutable sur ce tableau.
void copy(Span< const T > rhs)
Copie les valeurs de rhs dans l'instance.
ArrayView< T > view() const
Vue mutable sur ce tableau.
Span< const T > span() const
Vue immutable sur ce tableau.
reverse_iterator rend()
Itérateur inverse sur le premier élément après la fin du tableau.
iterator begin()
Itérateur sur le premier élément du tableau.
Span< const T > constSpan() const
Vue constante sur ce tableau.
iterator erase(const_iterator pos)
Supprime l'élément à la position pos.
ArrayRange< pointer > range()
Intervalle d'itération du premier au dernièr élément.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
ConstIterT< ConstArrayView< T > > const_iter
Type d'un itérateur constant sur tout le tableau.
Classe de base d'une exception.
Interface d'un allocateur pour la mémoire.
Classe contenant des informations pour spécialiser les allocations.
Options pour configurer les allocations.
Allocateur mémoire via malloc/realloc/free avec impression listing.
Vecteur 1D de données avec sémantique par référence.
SharedArray< T > clone() const
Clone le tableau.
Vue d'un tableau d'éléments de type T.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
Allocateur pour tester les 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)
Échange les valeurs de v1 et v2.
Int32 Integer
Type représentant un entier.
@ MainlyHost
Indique que la donnée sera plutôt utilisée sur CPU.
@ HostAndDeviceMostlyRead
Indique que la donnée sera utilisée à la fois sur accélérateur et sur CPU et qu'elle ne sera pas souv...
@ Unknown
Localisation inconnue.
@ ManagedMemoryDevice
La mémoire est de la mémoire managée sur accélérateur.
@ Host
La mémoire est sur l'hôte.
@ ManagedMemoryHost
La mémoire est de la mémoire managée sur l'hôte.
@ Device
La mémoire est sur accélérateur.
@ HostPinned
Alloue sur l'hôte.
@ Unknown
Valeur inconnue ou non initialisée.
@ UnifiedMemory
Alloue en utilisant la mémoire unifiée.
@ Device
Alloue sur le device.
Espace de nom de Arccore.