Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
Array2Data.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* Array2Data.cc (C) 2000-2024 */
9/* */
10/* Donnée du type 'Array2'. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
15#include "arccore/base/Ref.h"
16
17#include "arcane/utils/IDataCompressor.h"
18#include "arcane/utils/Array2.h"
19#include "arcane/utils/NotSupportedException.h"
20#include "arcane/utils/Real2.h"
21#include "arcane/utils/Real2x2.h"
22#include "arcane/utils/Real3.h"
23#include "arcane/utils/Real3x3.h"
24#include "arcane/utils/IHashAlgorithm.h"
25#include "arcane/utils/NotImplementedException.h"
26#include "arcane/utils/ArgumentException.h"
27#include "arcane/utils/FatalErrorException.h"
28#include "arcane/utils/ITraceMng.h"
29#include "arcane/utils/CheckedConvert.h"
30#include "arcane/utils/ArrayShape.h"
31#include "arcane/utils/MemoryAllocator.h"
32#include "arcane/utils/MemoryView.h"
33
34#include "arcane/core/datatype/DataAllocationInfo.h"
35#include "arcane/core/datatype/DataStorageBuildInfo.h"
36#include "arcane/core/datatype/IDataOperation.h"
37#include "arcane/core/datatype/DataStorageTypeInfo.h"
38#include "arcane/core/datatype/DataTypeTraits.h"
39
40#include "arcane/core/ISerializer.h"
41#include "arcane/core/IData.h"
42#include "arcane/core/IDataVisitor.h"
43
44#include "arcane/core/internal/IDataInternal.h"
45
46#include "arcane/impl/SerializedData.h"
47#include "arcane/impl/DataStorageFactory.h"
48
49/*---------------------------------------------------------------------------*/
50/*---------------------------------------------------------------------------*/
51
52namespace Arcane
53{
54
55namespace
56{
57 const Int64 SERIALIZE2_MAGIC_NUMBER = 0x12ff7789;
58}
59
60
61/*---------------------------------------------------------------------------*/
62/*---------------------------------------------------------------------------*/
66template <class DataType>
69, public IArray2DataT<DataType>
70{
71 ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS();
72 class Impl;
73 friend class Impl;
74
75 public:
76
79
80 public:
81
82 explicit Array2DataT(ITraceMng* trace);
83 explicit Array2DataT(const DataStorageBuildInfo& dsbi);
85 ~Array2DataT() override;
86
87 public:
88
89 Integer dimension() const override { return 2; }
90 Integer multiTag() const override { return 0; }
91 eDataType dataType() const override { return DataTypeTraitsT<DataType>::type(); }
92 void serialize(ISerializer* sbuf, IDataOperation* operation) override;
93 void serialize(ISerializer* sbuf, Int32ConstArrayView ids, IDataOperation* operation) override;
94 Array2<DataType>& value() override { return m_value; }
95 const Array2<DataType>& value() const override { return m_value; }
96 Array2View<DataType> view() override { return m_value; }
97 ConstArray2View<DataType> view() const override { return m_value; }
98 void resize(Integer new_size) override;
99 IData* clone() override { return _cloneTrue(); }
100 IData* cloneEmpty() override { return _cloneTrueEmpty(); };
101 Ref<IData> cloneRef() override { return makeRef(cloneTrue()); }
102 Ref<IData> cloneEmptyRef() override { return makeRef(cloneTrueEmpty()); }
103 DataStorageTypeInfo storageTypeInfo() const override;
104 DataInterfaceType* cloneTrue() override { return _cloneTrue(); }
105 DataInterfaceType* cloneTrueEmpty() override { return _cloneTrueEmpty(); }
106 Ref<DataInterfaceType> cloneTrueRef() override { auto* d = _cloneTrue(); return makeRef(d); }
107 Ref<DataInterfaceType> cloneTrueEmptyRef() override { auto* d = _cloneTrueEmpty(); return makeRef(d); }
108 void fillDefault() override;
109 void setName(const String& name) override;
112 void assignSerializedData(const ISerializedData* sdata) override;
113 void copy(const IData* data) override;
114 void swapValues(IData* data) override;
115 void computeHash(IHashAlgorithm* algo, ByteArray& output) const override;
117 ArrayShape shape() const override { return m_shape; }
118 void setShape(const ArrayShape& new_shape) override { m_shape = new_shape; }
119 void setAllocationInfo(const DataAllocationInfo& v) override;
120 DataAllocationInfo allocationInfo() const override { return m_allocation_info; }
121
122 void visit(IArray2DataVisitor* visitor)
123 {
124 visitor->applyVisitor(this);
125 }
126 void visit(IDataVisitor* visitor) override
127 {
128 visitor->applyDataVisitor(this);
129 }
131 {
132 ARCANE_THROW(NotSupportedException, "Can not visit scalar data with array2 data");
133 }
135 {
136 ARCANE_THROW(NotSupportedException, "Can not visit array data with array2 data");
137 }
139 {
140 visitor->applyVisitor(this);
141 }
142
143 public:
144
145 void swapValuesDirect(ThatClass* true_data);
146 void changeAllocator(const MemoryAllocationOptions& alloc_info);
147
148 public:
149
150 IArray2DataInternalT<DataType>* _internal() override { return m_internal; }
151 IDataInternal* _commonInternal() override { return m_internal; }
152
153 public:
154
155 static DataStorageTypeInfo staticStorageTypeInfo();
156
157 private:
158
160 ITraceMng* m_trace;
162 ArrayShape m_shape;
163 DataAllocationInfo m_allocation_info;
164
165 private:
166
167 IArray2DataT<DataType>* _cloneTrue() const { return new ThatClass(*this); }
168 IArray2DataT<DataType>* _cloneTrueEmpty() const { return new ThatClass(m_trace); }
169};
170
171/*---------------------------------------------------------------------------*/
172/*---------------------------------------------------------------------------*/
173
174template<typename DataType>
175class Array2DataT<DataType>::Impl
176: public IArray2DataInternalT<DataType>
178{
179 public:
180
181 explicit Impl(Array2DataT<DataType>* p) : m_p(p){}
182
183 public:
184
185 void reserve(Integer new_capacity) override { m_p->m_value.reserve(new_capacity); }
186 void resizeOnlyDim1(Int32 new_dim1_size) override
187 {
188 m_p->m_value.resize(new_dim1_size,m_p->m_value.dim2Size());
189 }
190 void resize(Int32 new_dim1_size, Int32 new_dim2_size) override
191 {
192 if (new_dim1_size < 0)
193 ARCANE_FATAL("Bad value '{0}' for dim1_size", new_dim1_size);
194 if (new_dim2_size < 0)
195 ARCANE_FATAL("Bad value '{0}' for dim2_size", new_dim2_size);
196 // Cette méthode est appelée si on modifie la deuxième dimension.
197 // Dans ce cas cela invalide l'ancienne valeur de shape.
198 bool need_reshape = false;
199 if (new_dim2_size != m_p->m_value.dim2Size())
200 need_reshape = true;
201 m_p->m_value.resize(new_dim1_size, new_dim2_size);
202 if (need_reshape) {
203 m_p->m_shape.setNbDimension(1);
204 m_p->m_shape.setDimension(0, new_dim2_size);
205 }
206 }
207 Array2<DataType>& _internalDeprecatedValue() override { return m_p->m_value; }
208 void shrink() const override { m_p->m_value.shrink(); }
210 {
211 IDataCompressor* compressor = buf.m_compressor;
212 if (!compressor)
213 return false;
214 Span<const DataType> values = m_p->m_value.to1DSpan();
215 Span<const std::byte> bytes = asBytes(values);
216 compressor->compress(bytes,buf.m_buffer);
217 buf.m_original_dim1_size = m_p->m_value.dim1Size();
218 buf.m_original_dim2_size = m_p->m_value.dim2Size();
219 m_p->m_value.clear();
220 m_p->m_value.shrink();
221 return true;
222 }
224 {
225 IDataCompressor* compressor = buf.m_compressor;
226 if (!compressor)
227 return false;
228 m_p->m_value.resize(buf.m_original_dim1_size,buf.m_original_dim2_size);
229 Span<DataType> values = m_p->m_value.to1DSpan();
230 compressor->decompress(buf.m_buffer,asWritableBytes(values));
231 return true;
232 }
233
235 {
236 Array2View<DataType> value = m_p->view();
237 Int32 dim1_size = value.dim1Size();
238 Int32 dim2_size = value.dim2Size();
239 DataStorageTypeInfo storage_info = m_p->storageTypeInfo();
240 Int32 nb_basic_element = storage_info.nbBasicElement();
241 Int32 datatype_size = basicDataTypeSize(storage_info.basicDataType()) * nb_basic_element;
242 return makeMutableMemoryView(value.data(), datatype_size * dim2_size, dim1_size);
243 }
244 Int32 extent0() const override
245 {
246 return m_p->view().dim1Size();
247 }
248 INumericDataInternal* numericData() override { return this; }
249 void changeAllocator(const MemoryAllocationOptions& v) override { m_p->changeAllocator(v); }
251 {
252 m_p->computeHash(hash_info);
253 }
254
255 private:
256
258};
259
260/*---------------------------------------------------------------------------*/
261/*---------------------------------------------------------------------------*/
262
263template<typename DataType> Array2DataT<DataType>::
265: m_value(AlignedMemoryAllocator::Simd())
266, m_trace(trace)
267, m_internal(new Impl(this))
268{
269}
270
271/*---------------------------------------------------------------------------*/
272/*---------------------------------------------------------------------------*/
273
274template<typename DataType> Array2DataT<DataType>::
275Array2DataT(const Array2DataT<DataType>& rhs)
276: m_value(AlignedMemoryAllocator::Simd())
277, m_trace(rhs.m_trace)
278, m_internal(new Impl(this))
279, m_allocation_info(rhs.m_allocation_info)
280{
281 m_value = rhs.m_value;
282}
283
284/*---------------------------------------------------------------------------*/
285/*---------------------------------------------------------------------------*/
286
287template<typename DataType> Array2DataT<DataType>::
288Array2DataT(const DataStorageBuildInfo& dsbi)
289: m_value(dsbi.memoryAllocator())
290, m_trace(dsbi.traceMng())
291, m_internal(new Impl(this))
292{
293}
294
295/*---------------------------------------------------------------------------*/
296/*---------------------------------------------------------------------------*/
297
298template<typename DataType> Array2DataT<DataType>::
299~Array2DataT()
300{
301 delete m_internal;
302}
303
304/*---------------------------------------------------------------------------*/
305/*---------------------------------------------------------------------------*/
306
307/*---------------------------------------------------------------------------*/
308/*---------------------------------------------------------------------------*/
309
310template<typename DataType> DataStorageTypeInfo Array2DataT<DataType>::
311staticStorageTypeInfo()
312{
313 typedef DataTypeTraitsT<DataType> TraitsType;
314 eBasicDataType bdt = TraitsType::basicDataType();
315 Int32 nb_basic_type = TraitsType::nbBasicType();
316 Int32 dimension = 2;
317 Int32 multi_tag = 0;
318 return DataStorageTypeInfo(bdt,nb_basic_type,dimension,multi_tag);
319}
320
321/*---------------------------------------------------------------------------*/
322/*---------------------------------------------------------------------------*/
323
325storageTypeInfo() const
326{
327 return staticStorageTypeInfo();
328}
329
330/*---------------------------------------------------------------------------*/
331/*---------------------------------------------------------------------------*/
332
333template<typename DataType> void Array2DataT<DataType>::
334resize(Integer new_size)
335{
337}
338
339/*---------------------------------------------------------------------------*/
340/*---------------------------------------------------------------------------*/
341
344{
345 typedef typename DataTypeTraitsT<DataType>::BasicType BasicType;
346
347 Int64 nb_count = 1;
349 Int64 type_size = sizeof(DataType);
350
351 if (use_basic_type){
354 type_size = sizeof(BasicType);
355 }
356
360 const Byte* bt = reinterpret_cast<const Byte*>(m_value.to1DSpan().data());
362 UniqueArray<Int64> dimensions;
363 dimensions.resize(2);
364 dimensions[0] = m_value.dim1Size();
365 dimensions[1] = m_value.dim2Size();
366
368 nb_base_element,false,dimensions,shape());
369 sd->setConstBytes(base_values);
370 return sd;
371}
372
373/*---------------------------------------------------------------------------*/
374/*---------------------------------------------------------------------------*/
375
376template<typename DataType> void Array2DataT<DataType>::
378{
379 typedef typename DataTypeTraitsT<DataType>::BasicType BasicType;
380
381 eDataType data_type = sdata->baseDataType();
383
385 ARCANE_FATAL("Bad serialized type");
386 bool is_multi_size = sdata->isMultiSize();
387 if (is_multi_size)
388 ARCANE_FATAL("Can not allocate multi-size array");
389
390 Int64 dim1_size = sdata->extents()[0];
391 Int64 dim2_size = sdata->extents()[1];
392 //m_trace->info() << " ASSIGN DATA dim1=" << dim1_size
393 // << " dim2=" << dim2_size
394 // << " addr=" << m_value.viewAsArray().unguardedBasePointer();
395
396 m_value.resize(dim1_size,dim2_size);
397 m_shape = sdata->shape();
398
399 Byte* byte_data = reinterpret_cast<Byte*>(m_value.to1DSpan().data());
400 Span<Byte> bytes_view(byte_data,sdata->memorySize());
401 sdata->setWritableBytes(bytes_view);
402}
403
404/*---------------------------------------------------------------------------*/
405/*---------------------------------------------------------------------------*/
406
407template<typename DataType> void Array2DataT<DataType>::
409{
410 ARCANE_UNUSED(sdata);
411 // Rien à faire car \a sdata pointe directement vers m_value
412}
413
414/*---------------------------------------------------------------------------*/
415/*---------------------------------------------------------------------------*/
416
417template<typename DataType> void Array2DataT<DataType>::
419{
421 typedef typename DataTypeTraitsT<DataType>::BasicType BasicType;
423
424 ISerializer::eMode mode = sbuf->mode();
425 if (mode==ISerializer::ModeReserve){
426 // Réserve la mémoire pour
427 // - le nombre d'éléments de la première dimension
428 // - le nombre d'éléments de la deuxième dimension
429 // - le nombre d'éléments de ids.
430 // - le nombre magique pour verification
431 sbuf->reserveSpan(DT_Int64,4);
432 // Réserve la mémoire pour les valeurs
435 }
436 else if (mode==ISerializer::ModePut){
437 Int64 count = m_value.dim1Size();
438 Int64 total = m_value.totalNbElement();
439 Int64 n[4];
440 n[0] = count;
441 n[1] = m_value.dim2Size();
442 n[2] = total;
444 sbuf->putSpan(Span<const Int64>(n,4));
445 BasicType* bt = reinterpret_cast<BasicType*>(m_value.to1DSpan().data());
447 //m_trace->info() << "PUT array nb_elem=" << (total*nb_count) << " sizeof=" << sizeof(BasicType);
448 sbuf->putSpan(v);
449 }
450 else if (mode==ISerializer::ModeGet){
451 Int64 n[4] = { 0, 0, 0, 0 };
452 sbuf->getSpan(Span<Int64>(n,4));
453 Int64 count = n[0];
454 Int64 dim2_size = n[1];
455 Int64 total = n[2];
456 if (n[3]!=SERIALIZE2_MAGIC_NUMBER)
457 ARCANE_FATAL("Bad magic number");
458 switch(sbuf->readMode()){
460 {
461 //m_trace->info() << "READ REPLACE count=" << count << " dim2_size=" << dim2_size;
462 m_value.resize(count,dim2_size);
463 if (operation)
464 throw NotImplementedException(A_FUNCINFO,"serialize(ReadReplace) with IDataOperation");
465 BasicType* bt = reinterpret_cast<BasicType*>(m_value.to1DSpan().data());
466 Span<BasicType> v(bt,total*nb_count);
467 sbuf->getSpan(v);
468 }
469 break;
471 {
472 Int64 current_size = m_value.dim1Size();
474 //m_trace->info() << "READ ADD NEW_SIZE=" << current_size << " COUNT=" << count
475 // << " dim2_size=" << dim2_size << " current_dim2_size=" << m_value.dim2Size()
476 // << " current_total=" << current_total << " read_elem=" << (total*nb_count);
477 m_value.resize(current_size + count,dim2_size);
478 if (operation)
479 throw NotImplementedException(A_FUNCINFO,"serialize(ReadAdd) with IDataOperation");
480 BasicType* bt = reinterpret_cast<BasicType*>(m_value.to1DSpan().data()+current_total);
481 //m_trace->info() << "GET array nb_elem=" << (total*nb_count) << " sizeof=" << sizeof(BasicType);
482 Span<BasicType> v(bt,total*nb_count);
483 sbuf->getSpan(v);
484 }
485 break;
486 }
487 }
488}
489
490/*---------------------------------------------------------------------------*/
491/*---------------------------------------------------------------------------*/
492
493template<typename DataType> void Array2DataT<DataType>::
495{
497 typedef typename DataTypeTraitsT<DataType>::BasicType BasicType;
499
500 ISerializer::eMode mode = sbuf->mode();
501 if (mode==ISerializer::ModeReserve){
502 // Réserve la mémoire pour
503 // - le nombre d'éléments de la première dimension
504 // - le nombre d'éléments de la deuxième dimension
505 // - le nombre d'éléments de ids.
506 // - le nombre magique pour verification
507 sbuf->reserveSpan(DT_Int64,4);
508 // Réserve la mémoire pour les valeurs
509 Int64 total_nb_value = ((Int64)ids.size()) * ((Int64)m_value.dim2Size());
511
512 }
513 else if (mode==ISerializer::ModePut){
514 Int32 count = ids.size();
515 Int64 dim2_size = m_value.dim2Size();
516 Int64 total_nb_value = count * dim2_size;
517 Int64 total = total_nb_value;
518 Int64 n[4];
519 n[0] = m_value.dim1Size();
520 n[1] = m_value.dim2Size();
521 n[2] = count;
523 /*m_trace->info() << "PUT COUNT = " << count << " total=" << total
524 << " dim1 (n[0])=" << n[0]
525 << " dim2 (n[1])=" << n[1]
526 << " count (n[2])=" << n[2]
527 << " magic=" << n[3]
528 << " this=" << this;*/
529 sbuf->putSpan(Span<const Int64>(n,4));
531 {
532 Integer index = 0;
533 for( Int32 i=0, is=count; i<is; ++i ){
534 const BasicType* sub_a = reinterpret_cast<const BasicType*>(m_value[ids[i]].data());
535 for( Int64 z=0, iz=dim2_size*nb_count; z<iz; ++z ){
536 v[index] = sub_a[z];
537 ++index;
538 }
539 }
540 }
541 sbuf->putSpan(v);
542 }
543 else if (mode==ISerializer::ModeGet){
544 switch(sbuf->readMode()){
546 {
547 Int64 n[4] = { 0, 0, 0, 0 };
548 sbuf->getSpan(Span<Int64>(n,4));
549 //Integer dim1_size = n[0];
550 Int64 dim2_size = n[1];
551 Int32 count = CheckedConvert::toInt32(n[2]);
552 Int64 total = count * dim2_size;
553 // One dim
554 /*m_trace->info() << "COUNT = " << count << " total=" << total
555 << " dim1 (n[0])=" << n[0]
556 << " dim1 current=" << m_value.dim1Size()
557 << " dim2 (n[1])=" << n[1]
558 << " dim2 current=" << m_value.dim2Size()
559 << " count (n[2])=" << n[2]
560 << " magic=" << n[3]
561 << " this=" << this;*/
562 if (n[3]!=SERIALIZE2_MAGIC_NUMBER)
563 ARCANE_FATAL("Bad magic number");
564 Int64 current_dim2_size = m_value.dim2Size();
565 if (dim2_size!=current_dim2_size){
566 if (current_dim2_size!=0 && dim2_size!=0)
567 ARCANE_FATAL("serialized data should have the same dim2Size current={0} found={1}",
568 current_dim2_size,dim2_size);
569 else
570 m_value.resize(m_value.dim1Size(),dim2_size);
571 }
572 Int64 nb_value = count;
573 //Array<BasicType> v(total*nb_count);
575
576 sbuf->getSpan(base_value);
577
578 Span<DataType> data_value(reinterpret_cast<DataType*>(base_value.data()),nb_value*dim2_size);
581
582 // Si on applique une transformantion, effectue la transformation dans un
583 // tableau temporaire 'current_value'.
584 if (operation && nb_value!=0) {
585 current_value.resize(data_value.size());
586
587 Int64 index = 0;
588 for( Int32 i=0, n=count; i<n; ++i ){
589 Span<const DataType> a(m_value[ids[i]]);
590 for( Int64 z=0, iz=dim2_size; z<iz; ++z ){
591 current_value[index] = a[z];
592 ++index;
593 }
594 }
595
597 operation->applySpan(transformed_value,data_value);
598 }
599 else {
600 transformed_value = data_value;
601 }
602
603 {
604 Int64 index = 0;
605 for( Int32 i=0, n=count; i<n; ++i ){
606 Span<DataType> a(m_value[ids[i]]);
607 for( Int64 z=0, iz=dim2_size; z<iz; ++z ){
608 a[z] = transformed_value[index];
609 ++index;
610 }
611 }
612 }
613 }
614 break;
616 throw NotImplementedException(A_FUNCINFO,"option 'ReadAdd'");
617 break;
618 }
619 }
620}
621
622/*---------------------------------------------------------------------------*/
623/*---------------------------------------------------------------------------*/
624
625template<typename DataType> void Array2DataT<DataType>::
627{
628 m_value.fill(DataType());
629}
630
631/*---------------------------------------------------------------------------*/
632/*---------------------------------------------------------------------------*/
633
634template<typename DataType> void Array2DataT<DataType>::
635setName(const String& name)
636{
637 m_value.setDebugName(name);
638}
639
640/*---------------------------------------------------------------------------*/
641/*---------------------------------------------------------------------------*/
642
643template<typename DataType> void Array2DataT<DataType>::
645{
646 //TODO: passer en 64 bits
648
649 // Calcule la fonction de hashage pour les valeurs
650 Int64 type_size = sizeof(DataType);
651 Int64 nb_element = values.size();
652 const Byte* ptr = reinterpret_cast<const Byte*>(values.data());
654 algo->computeHash64(input,output);
655
656 // Calcule la fonction de hashage pour les tailles
657 UniqueArray<Int64> dimensions(2);
658 dimensions[0] = m_value.dim1Size();
659 dimensions[1] = m_value.dim2Size();
660 ptr = reinterpret_cast<const Byte*>(dimensions.data());
661 Int64 array_len = dimensions.size() * sizeof(Int64);
663 algo->computeHash64(input,output);
664}
665
666/*---------------------------------------------------------------------------*/
667/*---------------------------------------------------------------------------*/
668
669template<typename DataType> void Array2DataT<DataType>::
671{
672 hash_info.setVersion(2);
673 IHashAlgorithmContext* context = hash_info.context();
674
675 // Calcule la fonction de hashage pour les tailles
676 Int64 dimensions[2];
677 dimensions[0] = m_value.dim1Size();
678 dimensions[1] = m_value.dim2Size();
679 Span<const Int64> dimension_span(dimensions,2);
680 context->updateHash(asBytes(dimension_span));
681
682 // Calcule la fonction de hashage pour les valeurs
683 context->updateHash(asBytes(m_value.to1DSpan()));
684}
685
686/*---------------------------------------------------------------------------*/
687/*---------------------------------------------------------------------------*/
688
689template<typename DataType> void Array2DataT<DataType>::
690copy(const IData* data)
691{
692 auto* true_data = dynamic_cast< const DataInterfaceType* >(data);
693 if (!true_data)
694 throw ArgumentException(A_FUNCINFO,"Can not cast 'IData' to 'IArray2DataT'");
695 m_value.copy(true_data->view());
696}
697
698/*---------------------------------------------------------------------------*/
699/*---------------------------------------------------------------------------*/
700
701template<typename DataType> void Array2DataT<DataType>::
702swapValues(IData* data)
703{
704 auto* true_data = dynamic_cast<ThatClass*>(data);
705 if (!true_data)
706 throw ArgumentException(A_FUNCINFO,"Can not cast 'IData' to 'Array2DataT'");
707 swapValuesDirect(true_data);
708}
709
710/*---------------------------------------------------------------------------*/
711/*---------------------------------------------------------------------------*/
712
713template<typename DataType> void Array2DataT<DataType>::
714swapValuesDirect(ThatClass* true_data)
715{
716 m_value.swap(true_data->m_value);
717}
718
719/*---------------------------------------------------------------------------*/
720/*---------------------------------------------------------------------------*/
721
722template<typename DataType> void Array2DataT<DataType>::
724{
725 if (m_allocation_info==v)
726 return;
727 m_allocation_info = v;
728 m_value.setMemoryLocationHint(v.memoryLocationHint());
729}
730
731/*---------------------------------------------------------------------------*/
732/*---------------------------------------------------------------------------*/
733
734template<typename DataType> void Array2DataT<DataType>::
736{
737 ARCANE_UNUSED(alloc_info);
738 ARCANE_THROW(NotImplementedException,"changeAllocator for 2D Array");
739}
740
741/*---------------------------------------------------------------------------*/
742/*---------------------------------------------------------------------------*/
743
744extern "C++" void
745registerArray2DataFactory(IDataFactoryMng* dfm)
746{
747 DataStorageFactory<Array2DataT<Byte>>::registerDataFactory(dfm);
748 DataStorageFactory<Array2DataT<Real>>::registerDataFactory(dfm);
749 DataStorageFactory<Array2DataT<Int16>>::registerDataFactory(dfm);
750 DataStorageFactory<Array2DataT<Int32>>::registerDataFactory(dfm);
751 DataStorageFactory<Array2DataT<Int64>>::registerDataFactory(dfm);
752 DataStorageFactory<Array2DataT<Real2>>::registerDataFactory(dfm);
753 DataStorageFactory<Array2DataT<Real3>>::registerDataFactory(dfm);
754 DataStorageFactory<Array2DataT<Real2x2>>::registerDataFactory(dfm);
755 DataStorageFactory<Array2DataT<Real3x3>>::registerDataFactory(dfm);
756}
757
758/*---------------------------------------------------------------------------*/
759/*---------------------------------------------------------------------------*/
760
761template class Array2DataT<Byte>;
762template class Array2DataT<Real>;
763template class Array2DataT<Int16>;
764template class Array2DataT<Int32>;
765template class Array2DataT<Int64>;
766template class Array2DataT<Real2>;
767template class Array2DataT<Real2x2>;
768template class Array2DataT<Real3>;
769template class Array2DataT<Real3x3>;
770
771/*---------------------------------------------------------------------------*/
772/*---------------------------------------------------------------------------*/
773
774} // End namespace Arcane
775
776/*---------------------------------------------------------------------------*/
777/*---------------------------------------------------------------------------*/
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Gestion des références à une classe C++.
Int32 extent0() const override
Nombre d'éléments de la première dimension.
void resizeOnlyDim1(Int32 new_dim1_size) override
Redimensionne le conteneur.
Array2< DataType > & _internalDeprecatedValue() override
Conteneur associé à la donnée.
MutableMemoryView memoryView() override
Vue mémoire sur la donnée.
bool decompressAndFill(DataCompressionBuffer &buf) override
Décompresse les données et remplit les valeurs de la donnée.
void resize(Int32 new_dim1_size, Int32 new_dim2_size) override
Redimensionne le conteneur.
void changeAllocator(const MemoryAllocationOptions &v) override
Change l'allocateur de la variable.
bool compressAndClear(DataCompressionBuffer &buf) override
Compresse les données et libère la mémoire associée.
void computeHash(DataHashInfo &hash_info) override
Calcule le hash de la donnée.
void reserve(Integer new_capacity) override
Réserve de la mémoire pour new_capacity éléments.
INumericDataInternal * numericData() override
Interface générique pour les données numériques (nullptr si la donnée n'est pas numérique)
void shrink() const override
Libère la mémoire additionnelle éventuellement allouée.
Donnée tableau bi-dimensionnel d'un type DataType.
Definition Array2Data.cc:70
ConstArray2View< DataType > view() const override
Vue constante sur la donnée.
Definition Array2Data.cc:97
void fillDefault() override
Remplit la donnée avec sa valeur par défaut.
void assignSerializedData(const ISerializedData *sdata) override
Assigne à la donnée les valeurs sérialisées sdata.
void resize(Integer new_size) override
Redimensionne la donnée.
IData * clone() override
Clone la donnée. L'instance créée doit être détruite par l'opérateur 'delete'.
Definition Array2Data.cc:99
const Array2< DataType > & value() const override
Valeur de la donnée.
Definition Array2Data.cc:95
void visitArray2(IArray2DataVisitor *visitor) override
Applique le visiteur à la donnée.
UniqueArray2< DataType > m_value
Donnée.
DataAllocationInfo allocationInfo() const override
Informations sur l'allocation.
IData * cloneEmpty() override
Clone la donnée mais sans éléments. L'instance créée doit être détruite par l'opérateur 'delete'.
Ref< DataInterfaceType > cloneTrueRef() override
Clone la donnée.
IDataInternal * _commonInternal() override
void computeHash(IHashAlgorithm *algo, ByteArray &output) const override
Calcul une clé de hashage sur cette donnée.
Ref< IData > cloneRef() override
Clone la donnée.
void serialize(ISerializer *sbuf, IDataOperation *operation) override
Sérialise la donnée en appliquant l'opération operation.
Ref< IData > cloneEmptyRef() override
Clone la donnée mais sans éléments.
Ref< ISerializedData > createSerializedDataRef(bool use_basic_type) const override
Sérialise la donnée.
DataInterfaceType * cloneTrueEmpty() override
Clone la donnée mais sans éléments.
void allocateBufferForSerializedData(ISerializedData *sdata) override
Alloue la mémoire pour lire les valeurs sérialisées sdata.
DataStorageTypeInfo storageTypeInfo() const override
Informations sur le type de conteneur de la donnée.
IArray2DataInternalT< DataType > * _internal() override
Array2< DataType > & value() override
Valeur de la donnée.
Definition Array2Data.cc:94
Integer dimension() const override
Dimension. 0 pour un scalaire, 1 pour un tableau mono-dim, 2 pour un tableau bi-dim.
Definition Array2Data.cc:89
DataInterfaceType * cloneTrue() override
Clone la donnée.
Ref< DataInterfaceType > cloneTrueEmptyRef() override
Clone la donnée mais sans éléments.
void swapValues(IData *data) override
Échange les valeurs de data avec celles de l'instance.
Array2View< DataType > view() override
Vue sur la donnée.
Definition Array2Data.cc:96
void visit(IDataVisitor *visitor) override
Applique le visiteur à la donnée.
Integer multiTag() const override
Tag multiple. 0 si non multiple, 1 si multiple, 2 si multiple pour les variable MultiArray (obsolète)
Definition Array2Data.cc:90
void visitScalar(IScalarDataVisitor *) override
Applique le visiteur à la donnée.
void setAllocationInfo(const DataAllocationInfo &v) override
Positionne les informations sur l'allocation.
void setShape(const ArrayShape &new_shape) override
Positionne la forme du tableau.
eDataType dataType() const override
Type de la donnée.
Definition Array2Data.cc:91
ArrayShape shape() const override
Forme du tableau pour une donnée 1D ou 2D.
void visitArray(IArrayDataVisitor *) override
Applique le visiteur à la donnée.
void copy(const IData *data) override
Copie la donnée data dans l'instance courante.
void setName(const String &name) override
Positionne le nom de la donnée (interne)
Forme d'un tableau.
Definition ArrayShape.h:40
Tableau d'items de types quelconques.
Informations sur l'allocation d'une donnée.
Classe pour gérer la compression/décompression des données.
Informations pour le calcul du hash d'une donnée.
Informations pour construire une instance de 'IData'.
Informations de type pour un conteneur de données.
Interface d'une donnée tableau bi-dimensionnel d'un type T.
Interface d'une donnée tableau bi-dimensionnel d'un type T.
Definition IData.h:363
Interface du pattern visitor pour une donnée tableau 2D.
Interface du pattern visitor pour une donnée tableau.
Interface d'un service permettant de compresser/décompresser des données.
Partie interne de IData.
Interface d'une opération sur une donnée.
Interface du pattern visitor pour une donnée.
Interface d'une donnée.
Definition IData.h:33
Contexte pour calculer un hash de manière incrémentale.
virtual void updateHash(Span< const std::byte > input)=0
Ajoute le tableau input au hash calculé
Interface d'un algorithme de hashage.
Interface pour un 'IData' d'un type numérique.
Interface du pattern visitor pour une donnée scalaire.
Interface d'une donnée sérialisée.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
void setMemoryLocationHint(eMemoryLocationHint new_hint)
Modifie les informations sur la localisation mémoire.
Allocateur mémoire avec alignement mémoire spécifique.
Exception lorsqu'un argument est invalide.
Integer totalNbElement() const
Nombre total d'éléments (dim1Size()*dim2Size())
void setDebugName(const String &name)
Positionne le nom du tableau pour les informations de debug.
void copy(Span2< const DataType > rhs)
Redimensionne l'instance à partir des dimensions de rhs et copie dedans les valeurs de rhs.
void resize(Int64 new_size)
Redimensionne uniquement la première dimension en laissant la deuxième à l'identique.
Span< DataType > to1DSpan()
Vue du tableau sous forme de tableau 1D.
Vue constante d'un tableau de type T.
@ ReadAdd
Ajoute aux éléments actuels ceux lus.
@ ReadReplace
Replace les éléments actuels par ceux lus.
Interface du gestionnaire de traces.
Options pour configurer les allocations.
Exception lorsqu'une fonction n'est pas implémentée.
Exception lorsqu'une opération n'est pas supportée.
Implémentation thread-safe d'un compteur de référence.
constexpr ARCCORE_HOST_DEVICE pointer data() const noexcept
Pointeur sur le début de la vue.
Definition Span.h:419
Chaîne de caractères unicode.
void swap(UniqueArray2< T > &rhs) ARCCORE_NOEXCEPT
Échange les valeurs de l'instance avec celles de rhs.
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Ref< ISerializedData > arcaneCreateSerializedDataRef(eDataType data_type, Int64 memory_size, Integer nb_dim, Int64 nb_element, Int64 nb_base_element, bool is_multi_size, Int64ConstArrayView dimensions)
Créé des données sérialisées.
eDataType
Type d'une donnée.
Definition DataTypes.h:39
@ DT_Int64
Donnée de type entier 64 bits.
Definition DataTypes.h:44
eBasicDataType
Type d'une donnée de base.