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);
74Integer IntPtrSubClass::count = 0;
79template <
typename Container,
typename SubClass>
91 ARCCORE_UT_CHECK((c.size() == 3),
"Bad size (3)");
92 ARCCORE_UT_CHECK((c[0] == 1),
"Bad value [0]");
93 ARCCORE_UT_CHECK((c[1] == 2),
"Bad value [1]");
94 ARCCORE_UT_CHECK((c[2] == 3),
"Bad value [2]");
96 ARCCORE_UT_CHECK((c.size() == 0),
"Bad size (0)");
98 ARCCORE_UT_CHECK((c.size() == 5),
"Bad size");
100 ARCCORE_UT_CHECK((c.size() == 6),
"Bad size");
101 ARCCORE_UT_CHECK((c[5] == 6),
"Bad value [5]");
103 ASSERT_EQ(c.size(), c.capacity()) <<
"Bad capacity (test 1)";
106 ASSERT_EQ(c.size(), c.capacity()) <<
"Bad capacity (test 2)";
111 ASSERT_EQ(c.capacity(), 0) <<
"Bad capacity (test 3)";
116 for (
Integer i = 0; i < nb; ++i)
119 Int64 current_capacity = c.capacity();
120 ASSERT_EQ(current_capacity, (nb * 2)) <<
"Bad capacity (test 4)";
121 c.shrink(c.capacity() + 5);
122 ASSERT_EQ(c.capacity(), current_capacity) <<
"Bad capacity (test 5)";
124 ASSERT_EQ(c.capacity(), 32) <<
"Bad capacity (test 6)";
126 ASSERT_EQ(c.capacity(), c.size()) <<
"Bad capacity (test 7)";
132 for (Container& c : uc) {
139 for (
Integer i = 0; i < 50; ++i)
140 c.add(SubClass(i + 2));
143 for (
Integer i = 50; i < 100; ++i) {
144 c2.add(SubClass(i + 2));
152 for (
Integer i = 100; i < 150; ++i) {
153 c4.add(SubClass(i + 2));
156 ARCCORE_UT_CHECK((c.size() == 150),
"Bad size (150)");
158 ARCCORE_UT_CHECK((c.capacity() == 300),
"Bad capacity (300)");
159 for (
Integer i = 0; i < 50; ++i) {
162 ARCCORE_UT_CHECK((c.size() == 100),
"Bad size (100)");
163 for (
Integer i = 0; i < 50; ++i) {
165 ARCCORE_UT_CHECK((c[i] == ((i * 2) + 3)),
"Bad value");
167 for (
Integer i = 50; i < 100; ++i) {
169 ARCCORE_UT_CHECK((c[i] == (i + 52)),
"Bad value");
177void _testArrayNewInternal()
180 std::cout <<
"** TEST VECTOR NEW\n";
189 std::cout <<
"** TEST VECTOR NEW 2\n";
193 std::cout <<
"** COUNT = " << IntPtrSubClass::count <<
"\n";
195 std::cout <<
"** TEST VECTOR NEW 3\n";
199 std::cout <<
"** COUNT = " << IntPtrSubClass::count <<
"\n";
207 ARCCORE_UT_CHECK((c2.size() == 3),
"Bad value [3]");
208 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
209 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
210 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
211 ARCCORE_UT_CHECK((c2[0] == 5),
"Bad value [5]");
212 ARCCORE_UT_CHECK((c2[1] == 7),
"Bad value [7]");
213 ARCCORE_UT_CHECK((c2[2] == 3),
"Bad value [7]");
221 ARCCORE_UT_CHECK((c2.size() == 3),
"Bad value [3]");
222 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
223 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
224 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
225 ARCCORE_UT_CHECK((c2[0] == 5),
"Bad value [5]");
226 ARCCORE_UT_CHECK((c2[1] == 7),
"Bad value [7]");
227 ARCCORE_UT_CHECK((c2[2] == 3),
"Bad value [7]");
233 ARCCORE_UT_CHECK((c2.size() == 3),
"Bad value [3]");
234 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
235 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
236 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
240 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
241 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
242 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
246 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
247 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
248 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
254 ARCCORE_UT_CHECK((cx.size() == 5),
"Bad value [5]");
259 ARCCORE_UT_CHECK((c2.size() == 3),
"Bad value [3]");
260 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
261 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
262 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
263 ARCCORE_UT_CHECK((c2[0] == 5),
"Bad value [5]");
264 ARCCORE_UT_CHECK((c2[1] == 7),
"Bad value [7]");
265 ARCCORE_UT_CHECK((c2[2] == 3),
"Bad value [7]");
266 for (
Integer i = 0; i < 50; ++i)
276 ASSERT_EQ(c22.size(), 33);
286 ASSERT_EQ(c2.
size(), c3.size());
287 ASSERT_EQ(c2.
size(), c4.size());
289 ASSERT_EQ(c2.
size(), c3.size());
290 ASSERT_EQ(c2.
size(), c4.size());
295 ARCCORE_UT_CHECK((c2.
size() == 33),
"Bad value [3]");
296 ARCCORE_UT_CHECK((c2[0] == 5),
"Bad value [5]");
297 ARCCORE_UT_CHECK((c2[1] == 7),
"Bad value [7]");
298 ARCCORE_UT_CHECK((c2[32] == 3),
"Bad value [7]");
300 ASSERT_EQ(c2.
size(), 1293);
301 ASSERT_EQ(c22.size(), 2);
305 ASSERT_EQ(values1.
size(), 3);
306 ASSERT_EQ(values1[0], -7);
307 ASSERT_EQ(values1[1], 3);
308 ASSERT_EQ(values1[2], 4);
309 values1 = { 2, -1, 9, 13 };
310 ASSERT_EQ(values1.
size(), 4);
311 ASSERT_EQ(values1[0], 2);
312 ASSERT_EQ(values1[1], -1);
313 ASSERT_EQ(values1[2], 9);
314 ASSERT_EQ(values1[3], 13);
316 ASSERT_EQ(values2, values1);
319 ASSERT_EQ(values1.
size(), 0);
320 ASSERT_EQ(values2.
size(), 0);
327 std::copy(std::begin(values2), std::end(values2), std::back_inserter(values1));
328 std::cout <<
"** VALUES1 = " << values1 <<
"\n";
329 ARCCORE_UT_CHECK((values1.size() == 5),
"BI: Bad size");
330 ARCCORE_UT_CHECK((values1[0] == 2),
"BI: Bad value [0]");
331 ARCCORE_UT_CHECK((values1[1] == 5),
"BI: Bad value [1]");
332 ARCCORE_UT_CHECK((values1[2] == 4),
"BI: Bad value [2]");
333 ARCCORE_UT_CHECK((values1[3] == 9),
"BI: Bad value [3]");
334 ARCCORE_UT_CHECK((values1[4] == 7),
"BI: Bad value [4]");
340 std::cout <<
"V=" << i->m_v <<
" " << ci->m_v <<
'\n';
343 ASSERT_EQ(values1.size(), 2);
344 ASSERT_EQ(values1[0], -7);
345 ASSERT_EQ(values1[1], 3);
348 ASSERT_EQ(values1.size(), 0);
354 values1.
copy(values2);
355 std::cout <<
"** VALUES1 = " << values1 <<
"\n";
356 ARCCORE_UT_CHECK((values1.size() == 5),
"BI: Bad size");
357 ARCCORE_UT_CHECK((values1[0] == 4),
"BI2: Bad value [0]");
358 ARCCORE_UT_CHECK((values1[1] == 9),
"BI2: Bad value [1]");
359 ARCCORE_UT_CHECK((values1[2] == 7),
"BI2: Bad value [2]");
360 ARCCORE_UT_CHECK((values1[3] == 6),
"BI2: Bad value [3]");
361 ARCCORE_UT_CHECK((values1[4] == 3),
"BI2: Bad value [4]");
367 std::cout <<
"V=" << i->m_v <<
" " << ci->m_v <<
'\n';
374 std::cout <<
"V=" << i->m_v <<
" " << ci->m_v <<
'\n';
377 std::cout <<
"V=" << cicvx->m_v <<
'\n';
385 std::cout <<
"V=" << i->m_v <<
" " << ci->m_v <<
" " << (iend - i) <<
'\n';
388 std::cout <<
"V=" << cicvx->m_v <<
'\n';
389 std::copy(std::begin(vx), std::end(vx), std::begin(vx));
394 std::cout << *i <<
'\n';
397 std::cout << *i <<
'\n';
399 for (
auto i : values.
range()) {
400 std::cout << i <<
'\n';
402 for (
auto i : values.
constView().range()) {
403 std::cout << i <<
'\n';
407 auto r1 = std::make_reverse_iterator(values.
end());
408 auto r2 = std::make_reverse_iterator(values.
begin());
409 for (; r1 != r2; ++r1) {
410 std::cout <<
"RVALUE = " << *r1 <<
'\n';
414 auto r1 = values.
rbegin();
427 ARCCORE_UT_CHECK((c2.
size() == 3),
"Bad value [3]");
428 ARCCORE_UT_CHECK((c.
size() == 2),
"Bad value [2]");
429 ARCCORE_UT_CHECK((c[0] == 5),
"Bad value [5]");
430 ARCCORE_UT_CHECK((c[1] == 7),
"Bad value [7]");
431 ARCCORE_UT_CHECK((c2[0] == 5),
"Bad value [5]");
432 ARCCORE_UT_CHECK((c2[1] == 7),
"Bad value [7]");
433 ARCCORE_UT_CHECK((c2[2] == 3),
"Bad value [7]");
450 _testArrayNewInternal();
453 std::cerr <<
"Exception ex=" << ex <<
"\n";
481 ASSERT_EQ(v[0], 1.2);
482 ASSERT_EQ(v[1], -1.3);
483 ASSERT_EQ(v.
at(2), 7.6);
487 std::cout <<
" Value: " << x <<
'\n';
489 v.printInfos(std::cout);
496 v.printInfos(std::cout);
500 v.printInfos(std::cout);
502 v.printInfos(std::cout);
507 v.printInfos(std::cout);
509 std::cout <<
" Value: " << v[i] <<
'\n';
515 for (
int i = 0; i < 10; ++i)
518 std::cout <<
" Value: " << v[i] <<
'\n';
524 for (
int i = 0; i < 27500; ++i) {
528 for (
int i = 0; i < 5000; ++i) {
532 for (
int i = 0; i < 27500; ++i) {
536 std::cout <<
" ValueSize= " << v.
size() <<
" values=" << v <<
'\n';
538 for (
Integer i = 0; i < 100; ++i) {
547 std::cout <<
" Size: " << v.
size() <<
'\n';
548 ASSERT_EQ(v.
size(), 230000);
563 for (Int32 i = 0, n = v.
size(); i < n; ++i)
566 auto sub_view1 = v.
subView(50, 5);
567 ASSERT_EQ(sub_view1.data(),
nullptr);
568 ASSERT_EQ(sub_view1.size(), 0);
570 auto sub_view2 = v.
subView(2, 8);
571 ASSERT_EQ(sub_view2.size(), 8);
572 for (Int32 i = 0, n = sub_view2.size(); i < n; ++i)
573 ASSERT_EQ(sub_view2[i], v[2 + i]);
575 auto sub_view3 = v.
subView(20, 8);
576 ASSERT_EQ(sub_view3.size(), 3);
577 for (Int32 i = 0, n = sub_view3.size(); i < n; ++i)
578 ASSERT_EQ(sub_view3[i], v[20 + i]);
581 ASSERT_EQ(sub_const_view1.data(),
nullptr);
582 ASSERT_EQ(sub_const_view1.size(), 0);
585 ASSERT_EQ(sub_const_view2.size(), 8);
586 for (Int32 i = 0, n = sub_const_view2.size(); i < n; ++i)
587 ASSERT_EQ(sub_const_view2[i], v[2 + i]);
590 ASSERT_EQ(sub_const_view3.size(), 3);
591 for (Int32 i = 0, n = sub_const_view3.size(); i < n; ++i)
592 ASSERT_EQ(sub_const_view3[i], v[20 + i]);
603 NoCopyData(
const NoCopyData& x) =
delete;
606template <
typename DataType>
624 const Int32 ref_value1 = 12;
625 const Int32 ref_value2 = 7;
628 std::cout <<
"C1=" << c <<
"\n";
630 ASSERT_EQ(x, ref_value1);
633 ASSERT_EQ(c.size(), 21);
634 std::cout <<
"C2=" << c <<
"\n";
639 std::cout <<
"C4=" << c <<
"\n";
640 for (Int32 i = 9, s = c.size(); i < s; ++i)
641 ASSERT_EQ(c[i], ref_value2);
642 for (Int32 i = 9, s = c.size(); i < s; ++i)
644 for (Int32 i = 9, s = c.size(); i < s; ++i)
645 ASSERT_EQ(c[i], (i + 2));
656template <
typename ArrayType>
661 static void doTestBase()
670 std::cout <<
"Array a\n";
671 ArrayType a(allocator1);
672 ASSERT_EQ(a.allocator(), allocator1);
678 std::cout <<
"Array b\n";
679 ArrayType b(allocator2);
680 ASSERT_EQ(b.capacity(), 0);
681 ASSERT_EQ(b.size(), 0);
682 ASSERT_EQ(b.allocator(), allocator2);
685 ASSERT_EQ(b.size(), a.size());
686 ASSERT_EQ(b.allocator(), a.allocator());
688 std::cout <<
"Array c\n";
689 ArrayType c(a.clone());
690 ASSERT_EQ(c.allocator(), a.allocator());
691 ASSERT_EQ(c.size(), a.size());
692 ASSERT_EQ(c.constSpan(), a.constSpan());
694 std::cout <<
"Array d\n";
695 ArrayType d(allocator2, a);
696 ASSERT_EQ(d.allocator(), allocator2);
697 ASSERT_EQ(d.size(), a.size());
698 ASSERT_EQ(d.constSpan(), a.constSpan());
700 std::cout <<
"Array e\n";
701 ArrayType e(allocator2, 25);
702 ASSERT_EQ(e.allocator(), allocator2);
703 ASSERT_EQ(e.size(), 25);
705 ArrayType f(allocator2);
707 ASSERT_EQ(f.allocator(), e.allocator());
708 ASSERT_EQ(f.size(), e.size());
711 ASSERT_EQ(f.allocator(), e.allocator());
712 ASSERT_EQ(f.size(), e.size());
734 std::cout <<
"Sizeof(ArrayMetaData)=" <<
sizeof(
ArrayMetaData) <<
"\n";
743 std::cout <<
"Array a1\n";
745 ASSERT_EQ(a1.allocator(), allocator2);
746 ASSERT_EQ(a1.size(), 0);
747 ASSERT_EQ(a1.capacity(), 0);
748 ASSERT_EQ(a1.data(),
nullptr);
750 std::cout <<
"Array a2\n";
752 ASSERT_EQ(a1.allocator(), a2.allocator());
753 ASSERT_EQ(a2.capacity(), 0);
754 ASSERT_EQ(a2.data(),
nullptr);
761 ASSERT_EQ(a1.size(), 5);
763 std::cout <<
"Array a3\n";
768 ASSERT_EQ(a3.size(), 3);
770 ASSERT_EQ(a3.allocator(), a1.allocator());
771 ASSERT_EQ(a3.size(), a1.size());
772 ASSERT_EQ(a3.constSpan(), a1.constSpan());
774 std::cout <<
"Array a4\n";
779 ASSERT_EQ(a4.size(), 3);
781 ASSERT_EQ(a4.allocator(), allocator1);
787 for (
Integer i = 0; i < 2; ++i) {
790 ASSERT_EQ(array[0].allocator(), allocator3);
791 ASSERT_EQ(array[1].allocator(), allocator3);
802 std::cout <<
"Sizeof(ArrayMetaData)=" <<
sizeof(
ArrayMetaData) <<
"\n";
811 std::cout <<
"Array a1\n";
813 ASSERT_EQ(a1.allocator(), allocator2);
814 ASSERT_EQ(a1.size(), 0);
815 ASSERT_EQ(a1.capacity(), 0);
816 ASSERT_EQ(a1.data(),
nullptr);
818 std::cout <<
"Array a2\n";
820 ASSERT_EQ(a1.allocator(), a2.allocator());
821 ASSERT_EQ(a2.capacity(), 0);
822 ASSERT_EQ(a2.data(),
nullptr);
829 ASSERT_EQ(a1.size(), 5);
831 std::cout <<
"Array a3\n";
836 ASSERT_EQ(a3.size(), 3);
838 ASSERT_EQ(a3.allocator(), a1.allocator());
839 ASSERT_EQ(a3.size(), a1.size());
840 ASSERT_EQ(a3.constSpan(), a1.constSpan());
842 std::cout <<
"Array a4\n";
844 ASSERT_EQ(a4.size(), 2);
848 ASSERT_EQ(a4.size(), 5);
854 ASSERT_EQ(a4.allocator(), allocator1);
860 for (
Integer i = 0; i < 2; ++i) {
863 ASSERT_EQ(array[0].allocator(), allocator3);
864 ASSERT_EQ(array[1].allocator(), allocator3);
876:
public IMemoryAllocator3
883 return m_default_allocator.hasRealloc(args);
888 return m_default_allocator.allocate(args, new_size);
893 return m_default_allocator.reallocate(args, current_ptr, new_size);
898 m_default_allocator.deallocate(args, ptr);
900 Int64 adjustedCapacity(
MemoryAllocationArgs args, Int64 wanted_capacity, Int64 element_size)
const override
903 return m_default_allocator.adjustedCapacity(args, wanted_capacity, element_size);
908 return m_default_allocator.guaranteedAlignment(args);
916 ASSERT_EQ(ptr.
size(), 8);
917 m_default_allocator.notifyMemoryArgsChanged(old_args, new_args, ptr);
922 DefaultMemoryAllocator3 m_default_allocator;
931 bool is_valid = v1 || v2 || v3;
936#define ASSERT_SAME_ARRAY_INFOS(a, b) \
937 ASSERT_EQ(a.allocationOptions(), b.allocationOptions()); \
938 ASSERT_EQ(a.size(), b.size()); \
939 ASSERT_EQ(a.capacity(), b.capacity())
941TEST(
Array, AllocatorV2)
951 ASSERT_EQ(opt3, allocate_options1);
954 std::cout <<
"Array a1\n";
956 ASSERT_EQ(a1.allocationOptions(), allocate_options2);
957 ASSERT_EQ(a1.size(), 0);
958 ASSERT_EQ(a1.capacity(), 0);
959 ASSERT_EQ(a1.data(),
nullptr);
961 std::cout <<
"Array a2\n";
963 ASSERT_SAME_ARRAY_INFOS(a2, a1);
964 ASSERT_EQ(a2.data(),
nullptr);
971 ASSERT_EQ(a1.size(), 5);
977 std::cout <<
"Array a3\n";
982 ASSERT_EQ(a3.size(), 3);
984 ASSERT_EQ(a3.allocator(), a1.allocator());
985 ASSERT_EQ(a3.size(), a1.size());
986 ASSERT_EQ(a3.constSpan(), a1.constSpan());
988 std::cout <<
"Array a4\n";
993 ASSERT_EQ(a4.size(), 3);
995 ASSERT_EQ(a4.allocationOptions(), allocate_options1);
1001 for (
Integer i = 0; i < 2; ++i) {
1004 ASSERT_EQ(array[0].allocationOptions(), allocator3);
1005 ASSERT_EQ(array[1].allocationOptions(), allocator3);
1012TEST(
Array, DebugInfo)
1015 DefaultMemoryAllocator3 m_default_allocator;
1018 String a1_name(
"Array1");
1019 String sa1_name(
"SharedArray1");
1022 std::cout <<
"Array a1\n";
1024 a1.setDebugName(a1_name);
1025 ASSERT_EQ(a1.allocationOptions(), allocate_options2);
1026 ASSERT_EQ(a1.size(), 0);
1027 ASSERT_EQ(a1.capacity(), 0);
1028 ASSERT_EQ(a1.data(),
nullptr);
1029 ASSERT_EQ(a1.debugName(), a1_name);
1031 std::cout <<
"SharedArray sa1\n";
1033 sa1.setDebugName(sa1_name);
1034 ASSERT_EQ(sa1.allocationOptions(), allocate_options2);
1035 ASSERT_EQ(sa1.size(), 0);
1036 ASSERT_EQ(sa1.capacity(), 0);
1037 ASSERT_EQ(sa1.data(),
nullptr);
1038 ASSERT_EQ(sa1.debugName(), sa1_name);
1040 ASSERT_EQ(a1.debugName(), a1_name);
1042 std::cout <<
"Array a2\n";
1044 ASSERT_SAME_ARRAY_INFOS(a2, a1);
1045 ASSERT_EQ(a2.data(),
nullptr);
1046 ASSERT_EQ(a2.debugName(), a1_name);
1053 ASSERT_EQ(a1.size(), 5);
1056 ASSERT_EQ(a2.debugName(), a1_name);
1057 ASSERT_EQ(a2.size(), 2);
1062 ASSERT_EQ(a3.
size(), 2);
1068TEST(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.
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.