Arcane  v3.15.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
Array2Data.h
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.h (C) 2000-2024 */
9/* */
10/* Donnée du type 'Array2'. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_IMPL_INTERNAL_ARRAY2DATA_H
13#define ARCANE_IMPL_INTERNAL_ARRAY2DATA_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18
19#include "arcane/utils/ArrayShape.h"
20#include "arcane/utils/String.h"
21#include "arcane/utils/IDataCompressor.h"
22#include "arcane/utils/Array2.h"
23#include "arcane/utils/MemoryView.h"
24#include "arcane/utils/Ref.h"
25#include "arcane/utils/FatalErrorException.h"
26
27#include "arcane/core/IData.h"
28#include "arcane/core/IDataVisitor.h"
29#include "arcane/core/internal/IDataInternal.h"
30#include "arcane/core/datatype/DataAllocationInfo.h"
31#include "arcane/core/datatype/DataTypeTraits.h"
32#include "arcane/core/datatype/DataStorageTypeInfo.h"
33
34/*---------------------------------------------------------------------------*/
35/*---------------------------------------------------------------------------*/
36
37namespace Arcane
38{
39
40/*---------------------------------------------------------------------------*/
41/*---------------------------------------------------------------------------*/
45template <class DataType>
48, public IArray2DataT<DataType>
49{
50 ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS();
51 class Impl;
52 friend class Impl;
53
54 public:
55
58
59 public:
60
61 explicit Array2DataT(ITraceMng* trace);
62 explicit Array2DataT(const DataStorageBuildInfo& dsbi);
64 ~Array2DataT() override;
65
66 public:
67
68 Integer dimension() const override { return 2; }
69 Integer multiTag() const override { return 0; }
70 eDataType dataType() const override { return DataTypeTraitsT<DataType>::type(); }
71 void serialize(ISerializer* sbuf, IDataOperation* operation) override;
72 void serialize(ISerializer* sbuf, Int32ConstArrayView ids, IDataOperation* operation) override;
73 Array2<DataType>& value() override { return m_value; }
74 const Array2<DataType>& value() const override { return m_value; }
75 Array2View<DataType> view() override { return m_value; }
76 ConstArray2View<DataType> view() const override { return m_value; }
77 void resize(Integer new_size) override;
78 IData* clone() override { return _cloneTrue(); }
79 IData* cloneEmpty() override { return _cloneTrueEmpty(); };
80 Ref<IData> cloneRef() override { return makeRef(cloneTrue()); }
81 Ref<IData> cloneEmptyRef() override { return makeRef(cloneTrueEmpty()); }
82 DataStorageTypeInfo storageTypeInfo() const override;
83 DataInterfaceType* cloneTrue() override { return _cloneTrue(); }
84 DataInterfaceType* cloneTrueEmpty() override { return _cloneTrueEmpty(); }
86 {
87 auto* d = _cloneTrue();
88 return makeRef(d);
89 }
91 {
92 auto* d = _cloneTrueEmpty();
93 return makeRef(d);
94 }
95 void fillDefault() override;
96 void setName(const String& name) override;
99 void assignSerializedData(const ISerializedData* sdata) override;
100 void copy(const IData* data) override;
101 void swapValues(IData* data) override;
102 void computeHash(IHashAlgorithm* algo, ByteArray& output) const override;
104 ArrayShape shape() const override { return m_shape; }
105 void setShape(const ArrayShape& new_shape) override { m_shape = new_shape; }
106 void setAllocationInfo(const DataAllocationInfo& v) override;
107 DataAllocationInfo allocationInfo() const override { return m_allocation_info; }
108
109 void visit(IArray2DataVisitor* visitor)
110 {
111 visitor->applyVisitor(this);
112 }
113 void visit(IDataVisitor* visitor) override
114 {
115 visitor->applyDataVisitor(this);
116 }
118 {
119 ARCANE_THROW(NotSupportedException, "Can not visit scalar data with array2 data");
120 }
122 {
123 ARCANE_THROW(NotSupportedException, "Can not visit array data with array2 data");
124 }
126 {
127 visitor->applyVisitor(this);
128 }
129
130 public:
131
132 void swapValuesDirect(ThatClass* true_data);
133 void changeAllocator(const MemoryAllocationOptions& alloc_info);
134
135 public:
136
137 IArray2DataInternalT<DataType>* _internal() override { return m_internal; }
138 IDataInternal* _commonInternal() override { return m_internal; }
139
140 public:
141
142 static DataStorageTypeInfo staticStorageTypeInfo();
143
144 private:
145
147 ITraceMng* m_trace;
149 ArrayShape m_shape;
150 DataAllocationInfo m_allocation_info;
151
152 private:
153
154 IArray2DataT<DataType>* _cloneTrue() const { return new ThatClass(*this); }
155 IArray2DataT<DataType>* _cloneTrueEmpty() const { return new ThatClass(m_trace); }
156};
157
158/*---------------------------------------------------------------------------*/
159/*---------------------------------------------------------------------------*/
160
161template <typename DataType>
162class Array2DataT<DataType>::Impl
163: public IArray2DataInternalT<DataType>
165{
166 public:
167
168 explicit Impl(Array2DataT<DataType>* p)
169 : m_p(p)
170 {}
171
172 public:
173
174 void reserve(Integer new_capacity) override { m_p->m_value.reserve(new_capacity); }
175 void resizeOnlyDim1(Int32 new_dim1_size) override
176 {
177 m_p->m_value.resize(new_dim1_size, m_p->m_value.dim2Size());
178 }
179 void resize(Int32 new_dim1_size, Int32 new_dim2_size) override
180 {
181 if (new_dim1_size < 0)
182 ARCANE_FATAL("Bad value '{0}' for dim1_size", new_dim1_size);
183 if (new_dim2_size < 0)
184 ARCANE_FATAL("Bad value '{0}' for dim2_size", new_dim2_size);
185 // Cette méthode est appelée si on modifie la deuxième dimension.
186 // Dans ce cas cela invalide l'ancienne valeur de shape.
187 bool need_reshape = false;
188 if (new_dim2_size != m_p->m_value.dim2Size())
189 need_reshape = true;
190 m_p->m_value.resize(new_dim1_size, new_dim2_size);
191 if (need_reshape) {
192 m_p->m_shape.setNbDimension(1);
193 m_p->m_shape.setDimension(0, new_dim2_size);
194 }
195 }
196 Array2<DataType>& _internalDeprecatedValue() override { return m_p->m_value; }
197 void shrink() const override { m_p->m_value.shrink(); }
199 {
200 IDataCompressor* compressor = buf.m_compressor;
201 if (!compressor)
202 return false;
203 Span<const DataType> values = m_p->m_value.to1DSpan();
204 Span<const std::byte> bytes = asBytes(values);
205 compressor->compress(bytes, buf.m_buffer);
206 buf.m_original_dim1_size = m_p->m_value.dim1Size();
207 buf.m_original_dim2_size = m_p->m_value.dim2Size();
208 m_p->m_value.clear();
209 m_p->m_value.shrink();
210 return true;
211 }
213 {
214 IDataCompressor* compressor = buf.m_compressor;
215 if (!compressor)
216 return false;
217 m_p->m_value.resize(buf.m_original_dim1_size, buf.m_original_dim2_size);
218 Span<DataType> values = m_p->m_value.to1DSpan();
219 compressor->decompress(buf.m_buffer, asWritableBytes(values));
220 return true;
221 }
222
224 {
225 Array2View<DataType> value = m_p->view();
226 Int32 dim1_size = value.dim1Size();
227 Int32 dim2_size = value.dim2Size();
228 DataStorageTypeInfo storage_info = m_p->storageTypeInfo();
229 Int32 nb_basic_element = storage_info.nbBasicElement();
230 Int32 datatype_size = basicDataTypeSize(storage_info.basicDataType()) * nb_basic_element;
231 return makeMutableMemoryView(value.data(), datatype_size * dim2_size, dim1_size);
232 }
233 Int32 extent0() const override
234 {
235 return m_p->view().dim1Size();
236 }
237 INumericDataInternal* numericData() override { return this; }
238 void changeAllocator(const MemoryAllocationOptions& v) override { m_p->changeAllocator(v); }
240 {
241 m_p->computeHash(hash_info);
242 }
243
244 private:
245
247};
248
249/*---------------------------------------------------------------------------*/
250/*---------------------------------------------------------------------------*/
251
252} // namespace Arcane
253
254/*---------------------------------------------------------------------------*/
255/*---------------------------------------------------------------------------*/
256
257#endif
258
259/*---------------------------------------------------------------------------*/
260/*---------------------------------------------------------------------------*/
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Int32 extent0() const override
Nombre d'éléments de la première dimension.
Definition Array2Data.h:233
void resizeOnlyDim1(Int32 new_dim1_size) override
Redimensionne le conteneur.
Definition Array2Data.h:175
Array2< DataType > & _internalDeprecatedValue() override
Conteneur associé à la donnée.
Definition Array2Data.h:196
MutableMemoryView memoryView() override
Vue mémoire sur la donnée.
Definition Array2Data.h:223
bool decompressAndFill(DataCompressionBuffer &buf) override
Décompresse les données et remplit les valeurs de la donnée.
Definition Array2Data.h:212
void resize(Int32 new_dim1_size, Int32 new_dim2_size) override
Redimensionne le conteneur.
Definition Array2Data.h:179
void changeAllocator(const MemoryAllocationOptions &v) override
Change l'allocateur de la variable.
Definition Array2Data.h:238
bool compressAndClear(DataCompressionBuffer &buf) override
Compresse les données et libère la mémoire associée.
Definition Array2Data.h:198
void computeHash(DataHashInfo &hash_info) override
Calcule le hash de la donnée.
Definition Array2Data.h:239
void reserve(Integer new_capacity) override
Réserve de la mémoire pour new_capacity éléments.
Definition Array2Data.h:174
INumericDataInternal * numericData() override
Interface générique pour les données numériques (nullptr si la donnée n'est pas numérique)
Definition Array2Data.h:237
void shrink() const override
Libère la mémoire additionnelle éventuellement allouée.
Definition Array2Data.h:197
Donnée tableau bi-dimensionnel d'un type DataType.
Definition Array2Data.h:49
ConstArray2View< DataType > view() const override
Vue constante sur la donnée.
Definition Array2Data.h:76
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.h:78
const Array2< DataType > & value() const override
Valeur de la donnée.
Definition Array2Data.h:74
void visitArray2(IArray2DataVisitor *visitor) override
Applique le visiteur à la donnée.
Definition Array2Data.h:125
UniqueArray2< DataType > m_value
Donnée.
Definition Array2Data.h:146
DataAllocationInfo allocationInfo() const override
Informations sur l'allocation.
Definition Array2Data.h:107
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 Array2Data.h:79
Ref< DataInterfaceType > cloneTrueRef() override
Clone la donnée.
Definition Array2Data.h:85
IDataInternal * _commonInternal() override
Definition Array2Data.h:138
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.
Definition Array2Data.h:80
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.
Definition Array2Data.h:81
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.
Definition Array2Data.h:84
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
Definition Array2Data.h:137
Array2< DataType > & value() override
Valeur de la donnée.
Definition Array2Data.h:73
Integer dimension() const override
Dimension. 0 pour un scalaire, 1 pour un tableau mono-dim, 2 pour un tableau bi-dim.
Definition Array2Data.h:68
DataInterfaceType * cloneTrue() override
Clone la donnée.
Definition Array2Data.h:83
Ref< DataInterfaceType > cloneTrueEmptyRef() override
Clone la donnée mais sans éléments.
Definition Array2Data.h:90
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.h:75
void visit(IDataVisitor *visitor) override
Applique le visiteur à la donnée.
Definition Array2Data.h:113
Integer multiTag() const override
Tag multiple. 0 si non multiple, 1 si multiple, 2 si multiple pour les variable MultiArray (obsolète)
Definition Array2Data.h:69
void visitScalar(IScalarDataVisitor *) override
Applique le visiteur à la donnée.
Definition Array2Data.h:117
void setAllocationInfo(const DataAllocationInfo &v) override
Positionne les informations sur l'allocation.
void setShape(const ArrayShape &new_shape) override
Positionne la forme du tableau.
Definition Array2Data.h:105
eDataType dataType() const override
Type de la donnée.
Definition Array2Data.h:70
ArrayShape shape() const override
Forme du tableau pour une donnée 1D ou 2D.
Definition Array2Data.h:104
void visitArray(IArrayDataVisitor *) override
Applique le visiteur à la donnée.
Definition Array2Data.h:121
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
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:149
Vue constante d'un tableau de type T.
Interface du gestionnaire de traces.
Options pour configurer les allocations.
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.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eDataType
Type d'une donnée.
Definition DataTypes.h:39