Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ArrayData.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/* ArrayData.cc (C) 2000-2024 */
9/* */
10/* Donnée du type 'Array'. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
15#include "arccore/base/Ref.h"
16
17#include "arcane/utils/IDataCompressor.h"
18#include "arcane/utils/Real2.h"
19#include "arcane/utils/Real2x2.h"
20#include "arcane/utils/Real3.h"
21#include "arcane/utils/Real3x3.h"
22#include "arcane/utils/IHashAlgorithm.h"
23#include "arcane/utils/NotImplementedException.h"
24#include "arcane/utils/NotSupportedException.h"
25#include "arcane/utils/ArgumentException.h"
26#include "arcane/utils/FatalErrorException.h"
27#include "arcane/utils/IndexOutOfRangeException.h"
28#include "arcane/utils/ITraceMng.h"
29#include "arcane/utils/Array.h"
30#include "arcane/utils/ArrayShape.h"
31#include "arcane/utils/MemoryAllocator.h"
32#include "arcane/utils/MemoryView.h"
33#include "arcane/utils/MemoryUtils.h"
34#include "arcane/utils/PlatformUtils.h"
35
36#include "arcane/core/datatype/DataAllocationInfo.h"
37#include "arcane/core/datatype/DataStorageBuildInfo.h"
38#include "arcane/core/datatype/IDataOperation.h"
39#include "arcane/core/datatype/DataStorageTypeInfo.h"
40#include "arcane/core/datatype/DataTypeTraits.h"
41
42#include "arcane/core/ISerializer.h"
43#include "arcane/core/IData.h"
44#include "arcane/core/IDataVisitor.h"
45
46#include "arcane/core/internal/IDataInternal.h"
47
48#include "arcane/impl/SerializedData.h"
49#include "arcane/impl/DataStorageFactory.h"
50
51/*---------------------------------------------------------------------------*/
52/*---------------------------------------------------------------------------*/
53
54namespace Arcane
55{
56
57namespace
58{
59 const Int64 SERIALIZE_MAGIC_NUMBER = 0x456ff989;
60}
61
62/*---------------------------------------------------------------------------*/
63/*---------------------------------------------------------------------------*/
67template<class DataType>
70, public IArrayDataT<DataType>
71{
72 ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS();
73 class Impl;
74 friend class Impl;
75
76 public:
77
80
81 public:
82
83 explicit ArrayDataT(ITraceMng* trace);
84 explicit ArrayDataT(const DataStorageBuildInfo& dsbi);
86 ~ArrayDataT() override;
87
88 public:
89
90 Integer dimension() const override { return 1; }
91 Integer multiTag() const override { return 0; }
92 eDataType dataType() const override { return DataTypeTraitsT<DataType>::type(); }
93 void serialize(ISerializer* sbuf,IDataOperation* operation) override;
94 void serialize(ISerializer* sbuf,Int32ConstArrayView ids,IDataOperation* operation) override;
95 Array<DataType>& value() override { return m_value; }
96 const Array<DataType>& value() const override { return m_value; }
97 ConstArrayView<DataType> view() const override { return m_value; }
98 ArrayView<DataType> view() override { return m_value; }
99 void resize(Integer new_size) override { m_value.resize(new_size); }
100 IData* clone() override { return _cloneTrue(); }
101 IData* cloneEmpty() override { return _cloneTrueEmpty(); };
102 Ref<IData> cloneRef() override { return makeRef(cloneTrue()); }
103 Ref<IData> cloneEmptyRef() override { return makeRef(cloneTrueEmpty()); }
104 DataStorageTypeInfo storageTypeInfo() const override;
105 DataInterfaceType* cloneTrue() override { return _cloneTrue(); }
106 DataInterfaceType* cloneTrueEmpty() override { return _cloneTrueEmpty(); }
107 Ref<DataInterfaceType> cloneTrueRef() override { auto* d = _cloneTrue(); return makeRef(d); }
108 Ref<DataInterfaceType> cloneTrueEmptyRef() override { auto* d = _cloneTrueEmpty(); return makeRef(d); }
109 void fillDefault() override;
110 void setName(const String& name) override;
113 void assignSerializedData(const ISerializedData* sdata) override;
114 void copy(const IData* data) override;
115 void swapValues(IData* data) override;
116 void computeHash(IHashAlgorithm* algo,ByteArray& output) const override;
118 ArrayShape shape() const override { return m_shape; }
119 void setShape(const ArrayShape& new_shape) override { m_shape = new_shape; }
120 void setAllocationInfo(const DataAllocationInfo& v) override;
121 DataAllocationInfo allocationInfo() const override { return m_allocation_info; }
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 array data");
133 }
135 {
136 visitor->applyVisitor(this);
137 }
139 {
140 ARCANE_THROW(NotSupportedException,"Can not visit array2 data with array data");
141 }
142
143 public:
144
145 void swapValuesDirect(ThatClass* true_data);
146 void changeAllocator(const MemoryAllocationOptions& alloc_info);
147
148 public:
149
150 IArrayDataInternalT<DataType>* _internal() override { return m_internal; }
151 IDataInternal* _commonInternal() override { return m_internal; }
152
153 public:
154
155 static DataStorageTypeInfo staticStorageTypeInfo();
156
157 public:
158
159
160 private:
161
163 ITraceMng* m_trace;
165 ArrayShape m_shape;
166 DataAllocationInfo m_allocation_info;
167
168 private:
169
170 void _serialize(ISerializer* sbuf,Span<const Int32> ids,IDataOperation* operation);
171 IArrayDataT<DataType>* _cloneTrue() const { return new ThatClass(*this); }
172 IArrayDataT<DataType>* _cloneTrueEmpty() const { return new ThatClass(m_trace); }
173 void _setShape();
174};
175
176/*---------------------------------------------------------------------------*/
177/*---------------------------------------------------------------------------*/
178
179template<typename DataType>
180class ArrayDataT<DataType>::Impl
181: public IArrayDataInternalT<DataType>
183{
184 public:
185
186 explicit Impl(ArrayDataT<DataType>* p) : m_p(p){}
187
188 public:
189
190 void reserve(Integer new_capacity) override { m_p->m_value.reserve(new_capacity); }
191 Array<DataType>& _internalDeprecatedValue() override { return m_p->m_value; }
192 Integer capacity() const override { return m_p->m_value.capacity(); }
193 void shrink() const override { m_p->m_value.shrink(); }
194 void resize(Integer new_size) override { m_p->m_value.resize(new_size);}
195 void dispose() override { m_p->m_value.dispose(); }
197 {
198 IDataCompressor* compressor = buf.m_compressor;
199 if (!compressor)
200 return false;
201 Span<const DataType> values = m_p->m_value;
202 Span<const std::byte> bytes = asBytes(values);
203 compressor->compress(bytes,buf.m_buffer);
204 buf.m_original_dim1_size = values.size();
205 m_p->m_value.clear();
206 m_p->m_value.shrink();
207 return true;
208 }
210 {
211 IDataCompressor* compressor = buf.m_compressor;
212 if (!compressor)
213 return false;
214 m_p->m_value.resize(buf.m_original_dim1_size);
215 Span<DataType> values = m_p->m_value;
216 compressor->decompress(buf.m_buffer,asWritableBytes(values));
217 return true;
218 }
220 {
221 return makeMutableMemoryView<DataType>(m_p->view());
222 }
223 Int32 extent0() const override
224 {
225 return m_p->view().size();
226 }
227 INumericDataInternal* numericData() override { return this; }
228 void changeAllocator(const MemoryAllocationOptions& v) override { m_p->changeAllocator(v); }
230 {
231 m_p->computeHash(hash_info);
232 }
233
234 private:
235
237};
238
239/*---------------------------------------------------------------------------*/
240/*---------------------------------------------------------------------------*/
241
242template<typename DataType> ArrayDataT<DataType>::
243ArrayDataT(ITraceMng* trace)
244: m_value(AlignedMemoryAllocator::Simd())
245, m_trace(trace)
246, m_internal(new Impl(this))
247{
248 _setShape();
249}
250
251/*---------------------------------------------------------------------------*/
252/*---------------------------------------------------------------------------*/
253
254template<typename DataType> ArrayDataT<DataType>::
255ArrayDataT(const ArrayDataT<DataType>& rhs)
256: m_value(AlignedMemoryAllocator::Simd())
257, m_trace(rhs.m_trace)
258, m_internal(new Impl(this))
259, m_shape(rhs.m_shape)
260, m_allocation_info(rhs.m_allocation_info)
261{
262 m_value = rhs.m_value.constSpan();
263}
264
265/*---------------------------------------------------------------------------*/
266/*---------------------------------------------------------------------------*/
267
268template<typename DataType> ArrayDataT<DataType>::
269ArrayDataT(const DataStorageBuildInfo& dsbi)
270: m_value(dsbi.memoryAllocator())
271, m_trace(dsbi.traceMng())
272, m_internal(new Impl(this))
273{
274 _setShape();
275}
276
277/*---------------------------------------------------------------------------*/
278/*---------------------------------------------------------------------------*/
279
280template<typename DataType> ArrayDataT<DataType>::
281~ArrayDataT()
282{
283 delete m_internal;
284}
285
286/*---------------------------------------------------------------------------*/
287/*---------------------------------------------------------------------------*/
288
289/*---------------------------------------------------------------------------*/
290/*---------------------------------------------------------------------------*/
291
292template<typename DataType> DataStorageTypeInfo ArrayDataT<DataType>::
293staticStorageTypeInfo()
294{
295 typedef DataTypeTraitsT<DataType> TraitsType;
296 eBasicDataType bdt = TraitsType::basicDataType();
297 Int32 nb_basic_type = TraitsType::nbBasicType();
298 Int32 dimension = 1;
299 Int32 multi_tag = 0;
300 return DataStorageTypeInfo(bdt,nb_basic_type,dimension,multi_tag);
301}
302
303/*---------------------------------------------------------------------------*/
304/*---------------------------------------------------------------------------*/
305
307storageTypeInfo() const
308{
309 return staticStorageTypeInfo();
310}
311
312/*---------------------------------------------------------------------------*/
313/*---------------------------------------------------------------------------*/
314
317{
318 typedef typename DataTypeTraitsT<DataType>::BasicType BasicType;
319
320 Integer nb_count = 1;
322 Integer type_size = sizeof(DataType);
323
324 if (use_basic_type){
327 type_size = sizeof(BasicType);
328 }
329
330 Int64 nb_element = m_value.largeSize();
333 Span<const Byte> base_values(reinterpret_cast<const Byte*>(m_value.data()),full_size);
334 UniqueArray<Int64> extents;
335 extents.add(nb_element);
337 nb_base_element,false,extents,shape());
338 sd->setConstBytes(base_values);
339 return sd;
340}
341
342/*---------------------------------------------------------------------------*/
343/*---------------------------------------------------------------------------*/
344
345template<typename DataType> void ArrayDataT<DataType>::
347{
348 typedef typename DataTypeTraitsT<DataType>::BasicType BasicType;
349
350 eDataType data_type = sdata->baseDataType();
352
354 ARCANE_THROW(ArgumentException,"Bad serialized type");
355
356 Int64 nb_element = sdata->nbElement();
357
358 //m_trace->info() << " ASSIGN DATA nb_element=" << nb_element
359 // << " this=" << this;
361 m_shape = sdata->shape();
362 Byte* byte_data = reinterpret_cast<Byte*>(m_value.data());
363 Span<Byte> buffer(byte_data,sdata->memorySize());
364 sdata->setWritableBytes(buffer);
365}
366
367/*---------------------------------------------------------------------------*/
368/*---------------------------------------------------------------------------*/
369
370template<typename DataType> void ArrayDataT<DataType>::
372{
373 ARCANE_UNUSED(sdata);
374 // Rien à faire car \a sdata pointe directement vers m_value
375}
376
377/*---------------------------------------------------------------------------*/
378/*---------------------------------------------------------------------------*/
379
380template<typename DataType> void ArrayDataT<DataType>::
382{
384 typedef typename DataTypeTraitsT<DataType>::BasicType BasicType;
386 bool is_debug = arcaneIsDebug();
387
388 switch(sbuf->mode()){
389 case ISerializer::ModeReserve:
390 {
391 Int64 nb_value = m_value.largeSize();
393 m_trace->debug(Trace::High) << " ArrayDataT::serialize (full) reserve datatype="
395 << " ids=" << nb_value << " totalsize=" << total_size;
396 sbuf->reserve(DT_Int64,2); // 1 pour magic number et 1 pour la taille
397 sbuf->reserveSpan(data_type,total_size);
398 }
399 break;
401 {
402 Int64 nb_value = m_value.largeSize();
404 m_trace->debug(Trace::High) << " ArrayDataT::serialize (full) put datatype="
406 << " ids=" << nb_value << " totalsize=" << total_size;
407 if (is_debug)
408 for( Int64 i=0; i<nb_value; ++i )
409 m_trace->debug(Trace::Highest) << "Put i=" << i << " value =" << m_value[i];
410
411 Span<const BasicType> base_value(reinterpret_cast<BasicType*>(m_value.data()),total_size);
412 sbuf->putInt64(SERIALIZE_MAGIC_NUMBER);
413 sbuf->putInt64(nb_value);
414 sbuf->putSpan(base_value);
415 }
416 break;
418 {
419 Int64 saved_magic_number = sbuf->getInt64();
420 Int64 nb_value = sbuf->getInt64();
421
423 ARCANE_FATAL("Internal errror: bad magic number for serialisation expected={0} current={1}",
425
426 Int64 total_size = nb_value * nb_count;
427
428 m_trace->debug(Trace::High) << " ArrayDataT::serialize (full) get mode=" << sbuf->readMode()
429 << " datatype=" << dataTypeName(data_type)
430 << " ids=" << nb_value << " totalsize=" << total_size;
431 switch(sbuf->readMode()){
433 {
434 m_value.resize(nb_value); // must resize using resizeFromGroup ?
435
436 if (operation) {
438 sbuf->getSpan(base_value);
439 Span<const DataType> data_value(reinterpret_cast<DataType*>(base_value.data()),nb_value);
440 operation->applySpan(m_value,data_value);
441 if (is_debug)
442 for( Int64 i=0; i<nb_value; ++i )
443 m_trace->debug(Trace::Highest) << "Get i=" << i << " value="
444 << data_value[i] << " transformed value=" << m_value[i];
445 }
446 else{
447 Span<BasicType> base_value(reinterpret_cast<BasicType*>(m_value.data()), total_size);
448 sbuf->getSpan(base_value);
449 if (is_debug)
450 for( Int64 i=0; i<nb_value; ++i )
451 m_trace->debug(Trace::Highest) << "Get i=" << i << " value=" << m_value[i];
452 }
453 }
454 break;
456 {
458 m_value.resize(current_size+nb_value); // must resize using resizeFromGroup ?
459 Span<BasicType> base_value(reinterpret_cast<BasicType*>(m_value.data()+current_size),total_size);
460 if (operation)
461 ARCANE_THROW(NotImplementedException,"ArrayData::serialize : Cannot deserialize using operation in ReadAdd mode");
462 sbuf->getSpan(base_value);
463 if (is_debug)
464 for( Int64 i=0; i<nb_value; ++i )
465 m_trace->debug(Trace::Highest) << "Get i=" << i << " value=" << m_value[i];
466 }
467 }
468 break;
469 }
470 break;
471 }
472}
473
474/*---------------------------------------------------------------------------*/
475/*---------------------------------------------------------------------------*/
476
477template<typename DataType> void ArrayDataT<DataType>::
479{
480 _serialize(sbuf,ids,operation);
481}
482
483/*---------------------------------------------------------------------------*/
484/*---------------------------------------------------------------------------*/
485
486template<typename DataType> void ArrayDataT<DataType>::
488{
490 typedef typename DataTypeTraitsT<DataType>::BasicType BasicType;
492 bool is_debug = arcaneIsDebug();
493
494 Int64 nb_value = ids.size();
496
497 switch(sbuf->mode()){
498 case ISerializer::ModeReserve:
499 {
500 m_trace->debug(Trace::High) << " ArrayDataT::serialize (partial) reserve datatype="
502 << " ids=" << nb_value << " totalsize=" << total_size;
503 sbuf->reserve(DT_Int64,2);
504 sbuf->reserveSpan(data_type,total_size);
505 }
506 break;
508 {
509 m_trace->debug(Trace::High) << " ArrayDataT::serialize (partial) put datatype="
510 << dataTypeName(data_type)
511 << " ids=" << nb_value << " totalsize=" << total_size;
512 if (is_debug){
513 // Vérifie les valeurs
514 for( Integer i=0, max_value=m_value.size(); i<nb_value; ++i )
515 if (ids[i]>max_value)
516 throw IndexOutOfRangeException(A_FUNCINFO,
517 String::format(" put,serialize : bad sizes i={0} ids[i]={1} nb_value={2} this={3}",
518 i,ids[i], max_value, this),
519 i,0,max_value);
520 }
521
522 UniqueArray<BasicType> base_value;
523 base_value.reserve(total_size);
524 for( Int64 i=0; i<nb_value; ++i ){
525#ifdef ARCANE_DEBUG
526 m_trace->debug(Trace::Highest) << "Put i=" << i << " index=" << ids[i] << " value=" << m_value[ids[i]];
527#endif /* ARCANE_DEBUG */
528 ConstArrayView<BasicType> current_value(nb_count, reinterpret_cast<BasicType*>(&m_value[ids[i]]));
529 base_value.addRange(current_value);
530 }
531 sbuf->putInt64(SERIALIZE_MAGIC_NUMBER);
532 sbuf->putInt64(nb_value);
533 sbuf->putSpan(base_value);
534 }
535 break;
537 {
538 m_trace->debug(Trace::High) << " ArrayDataT::serialize (partial) get mode=" << sbuf->readMode()
539 << " datatype=" << dataTypeName(data_type)
540 << " ids=" << nb_value << " totalsize=" << total_size;
541 if (is_debug){
542 // Vérifie les valeurs
543 for( Integer i=0, max_value=m_value.size(); i<nb_value; ++i )
544 if (ids[i]>max_value)
545 throw IndexOutOfRangeException(A_FUNCINFO,
546 String::format(" put,serialize : bad sizes i={0} ids[i]={1} nb_value={2} this={3}",
547 i,ids[i], max_value, this),
548 i,0,max_value);
549 }
550
551 switch(sbuf->readMode()){
553 {
554 Int64 saved_magic_number = sbuf->getInt64();
555 Int64 saved_nb_value = sbuf->getInt64();
556
557 if (saved_magic_number!=SERIALIZE_MAGIC_NUMBER)
558 ARCANE_FATAL("Internal errror: bad magic number for serialisation expected={0} current={1}",
559 SERIALIZE_MAGIC_NUMBER,saved_magic_number);
560
561 if (saved_nb_value!=nb_value)
562 ARCANE_FATAL("Internal errror: bad size for serialisation expected={0} found={1}",
563 nb_value,saved_nb_value);
564
565 UniqueArray<BasicType> base_value(total_size);
566 sbuf->getSpan(base_value);
567
568 Span<DataType> data_value(reinterpret_cast<DataType*>(base_value.data()),nb_value);
569 UniqueArray<DataType> current_value;
570 Span<DataType> transformed_value;
571
572 if (operation && nb_value!=0) {
573 current_value.resize(ids.size());
574 Arccore::sampleSpan(m_value.constSpan(),ids,current_value.span());
575 transformed_value = current_value.view();
576 operation->applySpan(transformed_value,data_value);
577 }
578 else {
579 transformed_value = data_value;
580 }
581
582 if (is_debug){
583 if (operation)
584 for( Int64 i=0; i<nb_value; ++i )
585 m_trace->debug(Trace::Highest) << "Get i=" << i << " index=" << ids[i]
586 << " value=" << data_value[i] << " transformed value=" << transformed_value[i];
587 else
588 for( Int64 i=0; i<nb_value; ++i )
589 m_trace->debug(Trace::Highest) << "Get i=" << i << " index=" << ids[i]
590 << " value=" << data_value[i];
591 }
592
593 for( Int64 i=0; i<nb_value; ++i ) {
594 m_value[ids[i]] = transformed_value[i];
595 }
596 }
597 break;
599 ARCANE_THROW(NotImplementedException,"ArrayData::serialize : Cannot deserialize with ReadAdd mode");
600 break;
601 }
602 }
603 break;
604 }
605}
606
607/*---------------------------------------------------------------------------*/
608/*---------------------------------------------------------------------------*/
609
610template<typename DataType> void ArrayDataT<DataType>::
612{
613 m_value.fill(DataType());
614}
615
616/*---------------------------------------------------------------------------*/
617/*---------------------------------------------------------------------------*/
618
619template<typename DataType> void ArrayDataT<DataType>::
620setName(const String& name)
621{
622 m_value.setDebugName(name);
623}
624
625/*---------------------------------------------------------------------------*/
626/*---------------------------------------------------------------------------*/
627
628template<typename DataType> void ArrayDataT<DataType>::
630{
631 Int64 type_size = sizeof(DataType);
632 Int64 nb_element = m_value.largeSize();
633 const Byte* ptr = reinterpret_cast<const Byte*>(m_value.data());
635 algo->computeHash64(input,output);
636}
637
638/*---------------------------------------------------------------------------*/
639/*---------------------------------------------------------------------------*/
640
641template<typename DataType> void ArrayDataT<DataType>::
643{
644 hash_info.setVersion(2);
645 hash_info.context()->updateHash(asBytes(m_value.span()));
646}
647
648/*---------------------------------------------------------------------------*/
649/*---------------------------------------------------------------------------*/
650
651template<typename DataType> void ArrayDataT<DataType>::
652copy(const IData* data)
653{
654 auto* true_data = dynamic_cast< const DataInterfaceType* >(data);
655 if (!true_data)
656 ARCANE_THROW(ArgumentException,"Can not cast 'IData' to 'IArrayDataT'");
657 m_value.copy(true_data->view());
658}
659
660/*---------------------------------------------------------------------------*/
661/*---------------------------------------------------------------------------*/
662
663template<typename DataType> void ArrayDataT<DataType>::
664swapValues(IData* data)
665{
666 auto* true_data = dynamic_cast<ThatClass*>(data);
667 if (!true_data)
668 ARCANE_THROW(ArgumentException,"Can not cast 'IData' to 'ArrayDataT'");
669 swapValuesDirect(true_data);
670}
671
672/*---------------------------------------------------------------------------*/
673/*---------------------------------------------------------------------------*/
674
675template<typename DataType> void ArrayDataT<DataType>::
676swapValuesDirect(ThatClass* true_data)
677{
678 m_value.swap(true_data->m_value);
679}
680
681/*---------------------------------------------------------------------------*/
682/*---------------------------------------------------------------------------*/
683
684template<typename DataType> void ArrayDataT<DataType>::
685_setShape()
686{
687 m_shape.setNbDimension(1);
688 m_shape.setDimension(0,1);
689}
690
691/*---------------------------------------------------------------------------*/
692/*---------------------------------------------------------------------------*/
693
694template<typename DataType> void ArrayDataT<DataType>::
696{
697 if (m_allocation_info==v)
698 return;
699 m_allocation_info = v;
700 m_value.setMemoryLocationHint(v.memoryLocationHint());
701}
702
703/*---------------------------------------------------------------------------*/
704/*---------------------------------------------------------------------------*/
705
706template<typename DataType> void ArrayDataT<DataType>::
708{
710
711 // Copie \a m_value dans \a new_value
712 // Tant qu'il n'y a pas l'API dans Arccore, il faut faire la copie à la
713 // main pour ne pas avoir de plantage si l'allocateur est uniquement sur
714 // un accélérateur
715 MemoryUtils::copy(new_value.span(), m_value.constSpan());
716
717 std::swap(m_value,new_value);
718 m_allocation_info.setMemoryLocationHint(alloc_info.memoryLocationHint());
719}
720
721/*---------------------------------------------------------------------------*/
722/*---------------------------------------------------------------------------*/
723
724extern "C++" void
725registerArrayDataFactory(IDataFactoryMng* dfm)
726{
727 DataStorageFactory<ArrayDataT<Byte>>::registerDataFactory(dfm);
728 DataStorageFactory<ArrayDataT<Real>>::registerDataFactory(dfm);
729 DataStorageFactory<ArrayDataT<Int16>>::registerDataFactory(dfm);
730 DataStorageFactory<ArrayDataT<Int32>>::registerDataFactory(dfm);
731 DataStorageFactory<ArrayDataT<Int64>>::registerDataFactory(dfm);
732 DataStorageFactory<ArrayDataT<Real2>>::registerDataFactory(dfm);
733 DataStorageFactory<ArrayDataT<Real3>>::registerDataFactory(dfm);
734 DataStorageFactory<ArrayDataT<Real2x2>>::registerDataFactory(dfm);
735 DataStorageFactory<ArrayDataT<Real3x3>>::registerDataFactory(dfm);
736}
737
738/*---------------------------------------------------------------------------*/
739/*---------------------------------------------------------------------------*/
740
741template class ArrayDataT<Byte>;
742template class ArrayDataT<Real>;
743template class ArrayDataT<Int16>;
744template class ArrayDataT<Int32>;
745template class ArrayDataT<Int64>;
746template class ArrayDataT<Real2>;
747template class ArrayDataT<Real2x2>;
748template class ArrayDataT<Real3>;
749template class ArrayDataT<Real3x3>;
750
751/*---------------------------------------------------------------------------*/
752/*---------------------------------------------------------------------------*/
753
754} // End namesapce Arcane
755
756/*---------------------------------------------------------------------------*/
757/*---------------------------------------------------------------------------*/
#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++.
void computeHash(DataHashInfo &hash_info) override
Calcule le hash de la donnée.
Definition ArrayData.cc:229
void reserve(Integer new_capacity) override
Réserve de la mémoire pour new_capacity éléments.
Definition ArrayData.cc:190
void resize(Integer new_size) override
Redimensionne le conteneur.
Definition ArrayData.cc:194
INumericDataInternal * numericData() override
Interface générique pour les données numériques (nullptr si la donnée n'est pas numérique)
Definition ArrayData.cc:227
bool decompressAndFill(DataCompressionBuffer &buf) override
Décompresse les données et remplit les valeurs de la donnée.
Definition ArrayData.cc:209
Integer capacity() const override
Capacité allouée par le conteneur.
Definition ArrayData.cc:192
Array< DataType > & _internalDeprecatedValue() override
Conteneur associé à la donnée.
Definition ArrayData.cc:191
void changeAllocator(const MemoryAllocationOptions &v) override
Change l'allocateur de la variable.
Definition ArrayData.cc:228
void dispose() override
Vide le conteneur et libère la mémoire alloué.
Definition ArrayData.cc:195
void shrink() const override
Libère la mémoire additionnelle éventuellement allouée.
Definition ArrayData.cc:193
Int32 extent0() const override
Nombre d'éléments de la première dimension.
Definition ArrayData.cc:223
MutableMemoryView memoryView() override
Vue mémoire sur la donnée.
Definition ArrayData.cc:219
bool compressAndClear(DataCompressionBuffer &buf) override
Compresse les données et libère la mémoire associée.
Definition ArrayData.cc:196
Donnée tableau d'un type T.
Definition ArrayData.cc:71
IData * cloneEmpty() override
Clone la donnée mais sans éléments. L'instance créée doit être détruite par l'opérateur 'delete'.
Definition ArrayData.cc:101
ArrayView< DataType > view() override
Vue sur la donnée.
Definition ArrayData.cc:98
eDataType dataType() const override
Type de la donnée.
Definition ArrayData.cc:92
ConstArrayView< DataType > view() const override
Vue constante sur la donnée.
Definition ArrayData.cc:97
Ref< ISerializedData > createSerializedDataRef(bool use_basic_type) const override
Sérialise la donnée.
Definition ArrayData.cc:316
void serialize(ISerializer *sbuf, IDataOperation *operation) override
Sérialise la donnée en appliquant l'opération operation.
Definition ArrayData.cc:381
void allocateBufferForSerializedData(ISerializedData *sdata) override
Alloue la mémoire pour lire les valeurs sérialisées sdata.
Definition ArrayData.cc:346
void visitScalar(IScalarDataVisitor *) override
Applique le visiteur à la donnée.
Definition ArrayData.cc:130
void computeHash(IHashAlgorithm *algo, ByteArray &output) const override
Calcul une clé de hashage sur cette donnée.
Definition ArrayData.cc:629
DataStorageTypeInfo storageTypeInfo() const override
Informations sur le type de conteneur de la donnée.
Definition ArrayData.cc:307
ArrayShape shape() const override
Forme du tableau pour une donnée 1D ou 2D.
Definition ArrayData.cc:118
Ref< IData > cloneRef() override
Clone la donnée.
Definition ArrayData.cc:102
const Array< DataType > & value() const override
Valeur constante de la donnée.
Definition ArrayData.cc:96
void setName(const String &name) override
Positionne le nom de la donnée (interne)
Definition ArrayData.cc:620
void visitArray2(IArray2DataVisitor *) override
Applique le visiteur à la donnée.
Definition ArrayData.cc:138
void visitArray(IArrayDataVisitor *visitor) override
Applique le visiteur à la donnée.
Definition ArrayData.cc:134
DataAllocationInfo allocationInfo() const override
Informations sur l'allocation.
Definition ArrayData.cc:121
DataInterfaceType * cloneTrue() override
Clone la donnée.
Definition ArrayData.cc:105
void visit(IArrayDataVisitor *visitor) override
Applique le visiteur à la donnée.
Definition ArrayData.cc:122
void swapValues(IData *data) override
Échange les valeurs de data avec celles de l'instance.
Definition ArrayData.cc:664
void assignSerializedData(const ISerializedData *sdata) override
Assigne à la donnée les valeurs sérialisées sdata.
Definition ArrayData.cc:371
DataInterfaceType * cloneTrueEmpty() override
Clone la donnée mais sans éléments.
Definition ArrayData.cc:106
UniqueArray< DataType > m_value
Donnée.
Definition ArrayData.cc:162
Array< DataType > & value() override
Valeur de la donnée.
Definition ArrayData.cc:95
Integer multiTag() const override
Tag multiple. 0 si non multiple, 1 si multiple, 2 si multiple pour les variable MultiArray (obsolète)
Definition ArrayData.cc:91
void fillDefault() override
Remplit la donnée avec sa valeur par défaut.
Definition ArrayData.cc:611
void visit(IDataVisitor *visitor) override
Applique le visiteur à la donnée.
Definition ArrayData.cc:126
Integer dimension() const override
Dimension. 0 pour un scalaire, 1 pour un tableau mono-dim, 2 pour un tableau bi-dim.
Definition ArrayData.cc:90
void copy(const IData *data) override
Copie la donnée data dans l'instance courante.
Definition ArrayData.cc:652
Ref< DataInterfaceType > cloneTrueEmptyRef() override
Clone la donnée mais sans éléments.
Definition ArrayData.cc:108
Ref< IData > cloneEmptyRef() override
Clone la donnée mais sans éléments.
Definition ArrayData.cc:103
void resize(Integer new_size) override
Redimensionne la donnée.
Definition ArrayData.cc:99
IData * clone() override
Clone la donnée. L'instance créée doit être détruite par l'opérateur 'delete'.
Definition ArrayData.cc:100
void setAllocationInfo(const DataAllocationInfo &v) override
Positionne les informations sur l'allocation.
Definition ArrayData.cc:695
void setShape(const ArrayShape &new_shape) override
Positionne la forme du tableau.
Definition ArrayData.cc:119
IDataInternal * _commonInternal() override
Definition ArrayData.cc:151
Ref< DataInterfaceType > cloneTrueRef() override
Clone la donnée.
Definition ArrayData.cc:107
IArrayDataInternalT< DataType > * _internal() override
Definition ArrayData.cc:150
Forme d'un tableau.
Definition ArrayShape.h:40
void setNbDimension(Int32 nb_value)
Positionne le rang de la forme.
Definition ArrayShape.cc:39
void setDimension(Int32 index, Int32 value)
Positionne la valeur de la index-ème dimension à value.
Definition ArrayShape.h:72
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 du pattern visitor pour une donnée tableau 2D.
Interface d'une donnée tableau d'un type T.
Interface d'une donnée tableau d'un type T.
Definition IData.h:292
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
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 setDebugName(const String &name)
Positionne le nom du tableau pour les informations de debug.
void setMemoryLocationHint(eMemoryLocationHint new_hint)
Modifie les informations sur la localisation mémoire.
Integer size() const
Nombre d'éléments du vecteur.
Int64 largeSize() const
Nombre d'éléments du vecteur (en 64 bits)
Allocateur mémoire avec alignement mémoire spécifique.
Exception lorsqu'un argument est invalide.
Span< const T > span() const
Vue immutable sur ce tableau.
const T * data() const
Accès à la racine du tableau hors toute protection.
void copy(Span< const T > rhs)
Copie les valeurs de rhs dans l'instance.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void fill(ConstReferenceType value)
Remplit le tableau avec la valeur value.
Span< const T > constSpan() const
Vue constante sur ce tableau.
Vue constante d'un tableau de type T.
virtual void putSpan(Span< const Real > values)
Ajoute le tableau values.
virtual void getSpan(Span< Real > values)
Récupère le tableau values.
virtual Int64 getInt64()=0
Récupère une taille.
virtual eReadMode readMode() const =0
Mode de lecture.
virtual void putInt64(Int64 value)=0
Ajoute l'entier value.
@ ReadAdd
Ajoute aux éléments actuels ceux lus.
@ ReadReplace
Replace les éléments actuels par ceux lus.
Interface du gestionnaire de traces.
virtual TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium)=0
Flot pour un message de debug.
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.
Chaîne de caractères unicode.
void swap(UniqueArray< T > &rhs)
Échange les valeurs de l'instance avec celles de rhs.
-*- 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.
bool arcaneIsDebug()
Vrai si la macro ARCANE_DEBUG est définie.
Definition Misc.cc:163
eDataType
Type d'une donnée.
Definition DataTypes.h:39
@ DT_Int64
Donnée de type entier 64 bits.
Definition DataTypes.h:44
const char * dataTypeName(eDataType type)
Nom du type de donnée.
Definition DataTypes.cc:70
eBasicDataType
Type d'une donnée de base.
void sampleSpan(Span< const DataType > values, Span< const Int64 > indexes, Span< DataType > result)
Extrait un sous-tableau à à partir d'une liste d'index.
Definition Span.h:855