Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ScalarData.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 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/* ScalarData.cc (C) 2000-2023 */
9/* */
10/* Donnée de type scalaire. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
15
16#include "arcane/utils/NotSupportedException.h"
17#include "arcane/utils/ArgumentException.h"
18#include "arcane/utils/TraceInfo.h"
19#include "arcane/utils/IHashAlgorithm.h"
20#include "arcane/utils/NotImplementedException.h"
21#include "arcane/utils/Real2.h"
22#include "arcane/utils/Real3.h"
23#include "arcane/utils/Real2x2.h"
24#include "arcane/utils/Real3x3.h"
25#include "arcane/utils/ArrayShape.h"
26#include "arcane/utils/Array.h"
27#include "arcane/utils/String.h"
28#include "arcane/utils/Ref.h"
29
30#include "arcane/core/IDataFactory.h"
31#include "arcane/core/IData.h"
32#include "arcane/core/IDataVisitor.h"
33
34#include "arcane/core/datatype/DataAllocationInfo.h"
35#include "arcane/core/datatype/DataStorageTypeInfo.h"
36#include "arcane/core/datatype/DataStorageBuildInfo.h"
37#include "arcane/core/datatype/DataTypeTraits.h"
38
39#include "arcane/impl/ScalarData.h"
40#include "arcane/impl/SerializedData.h"
41#include "arcane/impl/DataStorageFactory.h"
42
43#include "arcane/core/ISerializer.h"
44#include "arcane/core/internal/IDataInternal.h"
45
46/*---------------------------------------------------------------------------*/
47/*---------------------------------------------------------------------------*/
48
49namespace Arcane
50{
51
52/*---------------------------------------------------------------------------*/
53/*---------------------------------------------------------------------------*/
57template <class DataType>
60, public IScalarDataT<DataType>
61{
62 ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS();
63
64 public:
65
68
69 public:
70
72 : public IDataInternal
73 {
74 public:
75
76 explicit Internal(ScalarDataT<DataType>* p) : m_p(p){}
77
78 public:
79
81 {
82 m_p->computeHash(hash_info);
83 }
84
85 private:
86
87 ScalarDataT<DataType>* m_p = nullptr;
88 };
89
90 public:
91
92 explicit ScalarDataT(ITraceMng* trace)
93 : m_value(DataTypeTraitsT<DataType>::defaultValue())
94 , m_trace(trace)
95 , m_internal(this)
96 {}
97 explicit ScalarDataT(const DataStorageBuildInfo& dsbi);
98 ScalarDataT(const ScalarDataT<DataType>& rhs)
99 : m_value(rhs.m_value)
100 , m_trace(rhs.m_trace)
101 , m_internal(this)
102 , m_allocation_info(rhs.m_allocation_info)
103 {}
104
105 public:
106
107 Integer dimension() const override { return 0; }
108 Integer multiTag() const override { return 0; }
110 void serialize(ISerializer* sbuf, IDataOperation* operation) override;
111 void serialize(ISerializer* sbuf, Int32ConstArrayView ids, IDataOperation* operation) override;
112 DataType& value() override { return m_value; }
113 const DataType& value() const override { return m_value; }
114 void resize(Integer) override {}
115 IData* clone() override { return _cloneTrue(); }
116 IData* cloneEmpty() override { return _cloneTrueEmpty(); };
117 Ref<IData> cloneRef() override { return makeRef(cloneTrue()); }
118 Ref<IData> cloneEmptyRef() override { return makeRef(cloneTrueEmpty()); }
119 DataStorageTypeInfo storageTypeInfo() const override;
120 DataInterfaceType* cloneTrue() override { return _cloneTrue(); }
121 DataInterfaceType* cloneTrueEmpty() override { return _cloneTrueEmpty(); }
122 Ref<DataInterfaceType> cloneTrueRef() override { auto* d = _cloneTrue(); return makeRef(d); }
123 Ref<DataInterfaceType> cloneTrueEmptyRef() override { auto* d = _cloneTrueEmpty(); return makeRef(d); }
124 void fillDefault() override;
125 void setName(const String& name) override;
128 void assignSerializedData(const ISerializedData* sdata) override;
129 void copy(const IData* data) override;
130 void swapValues(IData* data) override;
131 void computeHash(IHashAlgorithm* algo, ByteArray& output) const override;
133 ArrayShape shape() const override;
134 void setShape(const ArrayShape&) override;
135 void setAllocationInfo(const DataAllocationInfo& v) override { m_allocation_info = v; }
136 DataAllocationInfo allocationInfo() const override { return m_allocation_info; }
138 {
139 visitor->applyVisitor(this);
140 }
141 void visit(IDataVisitor* visitor) override
142 {
143 visitor->applyDataVisitor(this);
144 }
145 void visitScalar(IScalarDataVisitor* visitor) override;
146 void visitArray(IArrayDataVisitor* visitor) override;
147 void visitArray2(IArray2DataVisitor* visitor) override;
148
149 IDataInternal* _commonInternal() override { return &m_internal; }
150
151 public:
152
153 static DataStorageTypeInfo staticStorageTypeInfo();
154
155 private:
156
157 DataType m_value;
158 ITraceMng* m_trace;
159 Internal m_internal;
160 DataAllocationInfo m_allocation_info;
161
162 private:
163
164 DataInterfaceType* _cloneTrue() const { return new ThatClass(*this); }
165 DataInterfaceType* _cloneTrueEmpty() const { return new ThatClass(m_trace); }
166};
167
168/*---------------------------------------------------------------------------*/
169/*---------------------------------------------------------------------------*/
170
171template<typename DataType> ScalarDataT<DataType>::
172ScalarDataT(const DataStorageBuildInfo& dsbi)
173: m_value(DataTypeTraitsT<DataType>::defaultValue())
174, m_trace(dsbi.traceMng())
175, m_internal(this)
176{
177}
178
179/*---------------------------------------------------------------------------*/
180/*---------------------------------------------------------------------------*/
181
182template <typename DataType>
183DataStorageTypeInfo ScalarDataT<DataType>::
184staticStorageTypeInfo()
185{
186 typedef DataTypeTraitsT<DataType> TraitsType;
187 eBasicDataType bdt = TraitsType::basicDataType();
188 Int32 nb_basic_type = TraitsType::nbBasicType();
189 Int32 dimension = 0;
190 Int32 multi_tag = 0;
191 return DataStorageTypeInfo(bdt,nb_basic_type,dimension,multi_tag);
192}
193
194/*---------------------------------------------------------------------------*/
195/*---------------------------------------------------------------------------*/
196
197template<typename DataType>
199storageTypeInfo() const
200{
201 return staticStorageTypeInfo();
202}
203
204/*---------------------------------------------------------------------------*/
205/*---------------------------------------------------------------------------*/
206
207template <typename DataType>
210{
211 typedef typename DataTypeTraitsT<DataType>::BasicType BasicType;
212
213 Integer nb_count = 1;
214 eDataType data_type = dataType();
215 Integer type_size = sizeof(DataType);
216
217 if (use_basic_type) {
220 type_size = sizeof(BasicType);
221 }
222
223 Integer nb_element = 1;
226 ByteConstArrayView base_values(full_size, reinterpret_cast<const Byte*>(&m_value));
227 UniqueArray<Int64> dimensions;
228 dimensions.add(nb_element);
230 nb_base_element, false, dimensions);
231 sd->setConstBytes(base_values);
232 return sd;
233}
234
235/*---------------------------------------------------------------------------*/
236/*---------------------------------------------------------------------------*/
237
238template <typename DataType>
241{
242 typedef typename DataTypeTraitsT<DataType>::BasicType BasicType;
243
244 eDataType data_type = sdata->baseDataType();
246
247 if (data_type != dataType() && data_type != base_data_type)
248 throw ArgumentException(A_FUNCINFO, "Bad serialized type");
249
250 Span<Byte> byte_values(reinterpret_cast<Byte*>(&m_value), sdata->memorySize());
251 sdata->setWritableBytes(byte_values);
252}
253
254/*---------------------------------------------------------------------------*/
255/*---------------------------------------------------------------------------*/
256
257template <typename DataType>
260{
261 // Rien à faire car \a sdata pointe directement vers m_value
262}
263
264/*---------------------------------------------------------------------------*/
265/*---------------------------------------------------------------------------*/
266
267template <typename DataType>
270{
272 typedef typename DataTypeTraitsT<DataType>::BasicType BasicType;
274
275 DataType ttmp = m_value;
276 ArrayView<BasicType> vtmp(1 * nb_count, reinterpret_cast<BasicType*>(&ttmp));
277
278 ISerializer::eMode mode = sbuf->mode();
279 if (mode == ISerializer::ModeReserve)
280 sbuf->reserveSpan(data_type, vtmp.size());
281 else if (mode == ISerializer::ModePut)
282 sbuf->putSpan(vtmp);
283 else if (mode == ISerializer::ModeGet)
284 sbuf->getSpan(vtmp);
285}
286
287/*---------------------------------------------------------------------------*/
288/*---------------------------------------------------------------------------*/
289
290template <typename DataType>
296
297/*---------------------------------------------------------------------------*/
298/*---------------------------------------------------------------------------*/
299
300template <typename DataType>
303{
304 m_value = DataType();
305}
306
307/*---------------------------------------------------------------------------*/
308/*---------------------------------------------------------------------------*/
309
310template <typename DataType>
312setName(const String&)
313{
314}
315
316/*---------------------------------------------------------------------------*/
317/*---------------------------------------------------------------------------*/
318
319template <typename DataType>
322{
323 Integer type_size = sizeof(DataType);
324 const Byte* ptr = reinterpret_cast<const Byte*>(&m_value);
326 algo->computeHash64(input, output);
327}
328
329/*---------------------------------------------------------------------------*/
330/*---------------------------------------------------------------------------*/
331
332template <typename DataType>
335{
336 hash_info.setVersion(2);
338 hash_info.context()->updateHash(asBytes(value_as_span));
339}
340
341/*---------------------------------------------------------------------------*/
342/*---------------------------------------------------------------------------*/
343
344template <typename DataType>
346copy(const IData* data)
347{
348 const DataInterfaceType* true_data = dynamic_cast<const DataInterfaceType*>(data);
349 if (!true_data)
350 ARCANE_THROW(ArgumentException, "Can not cast 'IData' to 'IScalarDataT'");
351 m_value = true_data->value();
352}
353
354/*---------------------------------------------------------------------------*/
355/*---------------------------------------------------------------------------*/
356
357template <typename DataType>
359swapValues(IData* data)
360{
361 DataInterfaceType* true_data = dynamic_cast<DataInterfaceType*>(data);
362 if (!true_data)
363 ARCANE_THROW(ArgumentException, "Can not cast 'IData' to 'IScalarDataT'");
364 std::swap(m_value, true_data->value());
365}
366
367/*---------------------------------------------------------------------------*/
368/*---------------------------------------------------------------------------*/
369
370template <typename DataType>
373{
374 visitor->applyVisitor(this);
375}
376
377/*---------------------------------------------------------------------------*/
378/*---------------------------------------------------------------------------*/
379
380template <typename DataType>
383{
384 ARCANE_THROW(NotSupportedException, "Can not visit array data with scalar data");
385}
386
387/*---------------------------------------------------------------------------*/
388/*---------------------------------------------------------------------------*/
389
390template <typename DataType>
393{
394 ARCANE_THROW(NotSupportedException, "Can not visit array2 data with scalar data");
395}
396
397/*---------------------------------------------------------------------------*/
398/*---------------------------------------------------------------------------*/
399
400template <typename DataType>
402shape() const
403{
404 return {};
405}
406
407/*---------------------------------------------------------------------------*/
408/*---------------------------------------------------------------------------*/
409
410template <typename DataType>
415
416/*---------------------------------------------------------------------------*/
417/*---------------------------------------------------------------------------*/
418
419extern "C++" void
420registerScalarDataFactory(IDataFactoryMng* dfm)
421{
422 DataStorageFactory<ScalarDataT<Byte>>::registerDataFactory(dfm);
423 DataStorageFactory<ScalarDataT<Real>>::registerDataFactory(dfm);
424 DataStorageFactory<ScalarDataT<Int16>>::registerDataFactory(dfm);
425 DataStorageFactory<ScalarDataT<Int32>>::registerDataFactory(dfm);
426 DataStorageFactory<ScalarDataT<Int64>>::registerDataFactory(dfm);
427 DataStorageFactory<ScalarDataT<Real2>>::registerDataFactory(dfm);
428 DataStorageFactory<ScalarDataT<Real3>>::registerDataFactory(dfm);
429 DataStorageFactory<ScalarDataT<Real2x2>>::registerDataFactory(dfm);
430 DataStorageFactory<ScalarDataT<Real3x3>>::registerDataFactory(dfm);
431}
432
433/*---------------------------------------------------------------------------*/
434/*---------------------------------------------------------------------------*/
435
436template class ScalarDataT<Byte>;
437template class ScalarDataT<Real>;
438template class ScalarDataT<Int16>;
439template class ScalarDataT<Int32>;
440template class ScalarDataT<Int64>;
441template class ScalarDataT<Real2>;
442template class ScalarDataT<Real3>;
443template class ScalarDataT<Real2x2>;
444template class ScalarDataT<Real3x3>;
445
446/*---------------------------------------------------------------------------*/
447/*---------------------------------------------------------------------------*/
448
449} // End namespace Arcane
450
451/*---------------------------------------------------------------------------*/
452/*---------------------------------------------------------------------------*/
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
Forme d'un tableau.
Definition ArrayShape.h:40
Tableau d'items de types quelconques.
Informations sur l'allocation d'une donnée.
Informations pour le calcul du hash d'une donnée.
Informations de type pour un conteneur de données.
Interface du pattern visitor pour une donnée tableau 2D.
Interface du pattern visitor pour une donnée tableau.
Interface du gestionnaire de fabrique d'une donnée.
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 d'une donnée scalaire d'un type T.
Definition IData.h:243
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 computeHash(DataHashInfo &hash_info) override
Calcule le hash de la donnée.
Definition ScalarData.cc:80
Donnée scalaire d'un type T.
Definition ScalarData.cc:61
DataType & value() override
Valeur de la donnée.
void assignSerializedData(const ISerializedData *sdata) override
Assigne à la donnée les valeurs sérialisées sdata.
ArrayShape shape() const override
Forme du tableau pour une donnée 1D ou 2D.
void setShape(const ArrayShape &) override
Positionne la forme du tableau.
DataInterfaceType * cloneTrueEmpty() override
Clone la donnée mais sans éléments.
void setAllocationInfo(const DataAllocationInfo &v) override
Positionne les informations sur l'allocation.
Ref< IData > cloneEmptyRef() override
Clone la donnée mais sans éléments.
void copy(const IData *data) override
Copie la donnée data dans l'instance courante.
void resize(Integer) override
Redimensionne la donnée.
IDataInternal * _commonInternal() override
void setName(const String &name) override
Positionne le nom de la donnée (interne)
DataInterfaceType * cloneTrue() override
Clone la donnée.
void visit(IDataVisitor *visitor) override
Applique le visiteur à la donnée.
void visitArray2(IArray2DataVisitor *visitor) override
Applique le visiteur à la donnée.
void fillDefault() override
Remplit la donnée avec sa valeur par défaut.
IData * cloneEmpty() override
Clone la donnée mais sans éléments. L'instance créée doit être détruite par l'opérateur 'delete'.
const DataType & value() const override
Valeur de 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)
DataAllocationInfo allocationInfo() const override
Informations sur l'allocation.
DataType m_value
Donnée.
void swapValues(IData *data) override
Échange les valeurs de data avec celles de l'instance.
Integer dimension() const override
Dimension. 0 pour un scalaire, 1 pour un tableau mono-dim, 2 pour un tableau bi-dim.
void serialize(ISerializer *sbuf, IDataOperation *operation) override
Sérialise la donnée en appliquant l'opération operation.
void computeHash(IHashAlgorithm *algo, ByteArray &output) const override
Calcul une clé de hashage sur cette donnée.
void visitArray(IArrayDataVisitor *visitor) override
Applique le visiteur à la donnée.
Ref< DataInterfaceType > cloneTrueRef() override
Clone la donnée.
Ref< DataInterfaceType > cloneTrueEmptyRef() override
Clone la donnée mais sans éléments.
IData * clone() override
Clone la donnée. L'instance créée doit être détruite par l'opérateur 'delete'.
Ref< ISerializedData > createSerializedDataRef(bool use_basic_type) const override
Sérialise la donnée.
eDataType dataType() const override
Type de la donnée.
Ref< IData > cloneRef() override
Clone la donnée.
DataStorageTypeInfo storageTypeInfo() const override
Informations sur le type de conteneur de la donnée.
void visit(IScalarDataVisitor *visitor) override
Applique le visiteur à la donnée.
void allocateBufferForSerializedData(ISerializedData *sdata) override
Alloue la mémoire pour lire les valeurs sérialisées sdata.
void visitScalar(IScalarDataVisitor *visitor) override
Applique le visiteur à la donnée.
Exception lorsqu'un argument est invalide.
Vue constante d'un tableau de type T.
Interface du gestionnaire de traces.
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 -*-
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
eBasicDataType
Type d'une donnée de base.