17#include "arcane/utils/NumArray.h"
18#include "arcane/utils/NotSupportedException.h"
19#include "arcane/utils/Real2.h"
20#include "arcane/utils/Real2x2.h"
21#include "arcane/utils/Real3.h"
22#include "arcane/utils/Real3x3.h"
23#include "arcane/utils/IHashAlgorithm.h"
24#include "arcane/utils/NotImplementedException.h"
25#include "arcane/utils/ArgumentException.h"
26#include "arcane/utils/FatalErrorException.h"
27#include "arcane/utils/ITraceMng.h"
28#include "arcane/utils/CheckedConvert.h"
29#include "arcane/utils/ArrayShape.h"
31#include "arccore/base/Span2.h"
33#include "arcane/core/datatype/DataAllocationInfo.h"
34#include "arcane/core/datatype/IDataOperation.h"
35#include "arcane/core/datatype/DataStorageTypeInfo.h"
36#include "arcane/core/datatype/DataStorageBuildInfo.h"
37#include "arcane/core/datatype/DataTypeTraits.h"
39#include "arcane/core/ISerializer.h"
40#include "arcane/core/IData.h"
41#include "arcane/core/IDataVisitor.h"
43#include "arcane/core/internal/IDataInternal.h"
45#include "arcane/impl/SerializedData.h"
46#include "arcane/impl/DataStorageFactory.h"
56 const Int64 SERIALIZE2_MAGIC_NUMBER = 0x923abd20;
61template <
class DataType,
int RankValue>
90template <
class DataType,
int RankValue>
95 ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS();
179 void swapValuesDirect(ThatClass*
true_data);
197 void _resizeDim1(
Int32 dim1_size);
198 Int64 _getDim2Size()
const;
199 Span2<DataType> _valueAsSpan2();
200 Span2<const DataType> _valueAsConstSpan2();
206template<
typename DataType,
int RankValue> NumArrayDataT<DataType,RankValue>::
207NumArrayDataT(ITraceMng* trace)
215template<
typename DataType,
int RankValue> NumArrayDataT<DataType,RankValue>::
216NumArrayDataT(
const NumArrayDataT<DataType,RankValue>& rhs)
217: m_value(rhs.m_value)
218, m_trace(rhs.m_trace)
219, m_allocation_info(rhs.m_allocation_info)
226template<
typename DataType,
int RankValue> NumArrayDataT<DataType,RankValue>::
227NumArrayDataT(
const DataStorageBuildInfo& dsbi)
228: m_trace(dsbi.traceMng())
235template<
typename DataType,
int RankValue> NumArrayDataT<DataType,RankValue>::
246template<
typename DataType,
int RankValue> DataStorageTypeInfo NumArrayDataT<DataType,RankValue>::
247staticStorageTypeInfo()
249 typedef DataTypeTraitsT<DataType> TraitsType;
251 Int32 nb_basic_type = TraitsType::nbBasicType();
252 Int32 dimension = RankValue;
254 String impl_name =
"NumArray";
255 return DataStorageTypeInfo(bdt,nb_basic_type,dimension,multi_tag,impl_name);
264 return staticStorageTypeInfo();
274 auto extents = m_value.extents();
275 extents.setExtent0(dim1_size);
276 m_value.
resize(extents.dynamicExtents());
282template<
typename DataType,
int RankValue>
Int64
283NumArrayDataT<DataType,RankValue>::
288 auto extents = m_value.extents();
289 auto std_extents = extents.asStdArray();
291 for( Integer i=0; i<RankValue; ++i )
292 dim2_size *= std_extents[i];
300template<
typename DataType,
int RankValue> Span2<DataType>
301NumArrayDataT<DataType,RankValue>::
304 Int64 dim1_size = m_value.dim1Size();
305 Int64 dim2_size = _getDim2Size();
306 Span2<DataType> value_as_span2(m_value.to1DSpan().data(),dim1_size,dim2_size);
307 return value_as_span2;
316template<
typename DataType,
int RankValue> Span2<const DataType>
317NumArrayDataT<DataType,RankValue>::
320 Int64 dim1_size = m_value.dim1Size();
321 Int64 dim2_size = _getDim2Size();
322 Span2<const DataType> value_as_span2(m_value.to1DSpan().data(),dim1_size,dim2_size);
323 return value_as_span2;
357 const Byte*
bt =
reinterpret_cast<const Byte*
>(m_value.to1DSpan().data());
359 auto extents = m_value.extents();
395 m_value.resize(extents.dynamicExtents());
408 ARCANE_UNUSED(
sdata);
425 if (mode==ISerializer::ModeReserve){
433 sbuf->reserveSpan(m_value.to1DSpan());
436 Int64 total = m_value.totalNbElement();
442 auto ext = m_value.extents().asStdArray();
445 sbuf->putSpan(m_value.to1DSpan());
448 Int64 n[2] = { 0, 0 };
457 switch(
sbuf->readMode()){
464 BasicType*
bt =
reinterpret_cast<BasicType*
>(m_value.to1DSpan().data());
481 BasicType*
bt =
reinterpret_cast<BasicType*
>(m_value.to1DSpan().data()+
current_total);
497 ARCANE_UNUSED(operation);
504 if (mode==ISerializer::ModeReserve){
513 auto sub_extent = m_value.extents().removeFirstExtent();
517 Int32 count = ids.size();
518 Int64 dim2_size = _getDim2Size();
535 auto ext = m_value.extents().asStdArray();
543 for( Int32 i=0, n=count; i<n; ++i ){
544 const BasicType*
sub_a =
reinterpret_cast<const BasicType*
>(
value_as_span2[ids[i]].data());
555 switch(
sbuf->readMode()){
558 Int64 n[3] = { 0, 0, 0 };
561 Int64 dim2_size = n[2];
562 Int64 total = count * dim2_size;
585 ARCANE_FATAL(
"serialized data should have the same dim2Size current={0} found={1}",
588 _resizeDim1(m_value.dim1Size());
607 for( Int32 i=0, n=count; i<n; ++i ){
609 for( Int64 z=0,
iz=dim2_size; z<
iz; ++z ){
624 for( Int32 i=0, n=count; i<n; ++i ){
626 for( Int64 z=0,
iz=dim2_size; z<
iz; ++z ){
647 m_value.fill(DataType());
670 const Byte*
ptr =
reinterpret_cast<const Byte*
>(values.data());
677 auto ext = m_value.extents().asStdArray();
720registerNumArrayDataFactory(IDataFactoryMng* dfm)
722 DataStorageFactory<NumArrayDataT<Real,1>>::registerDataFactory(dfm);
725 DataStorageFactory<NumArrayDataT<Int64,1>>::registerDataFactory(dfm);
727 DataStorageFactory<NumArrayDataT<Real,2>>::registerDataFactory(dfm);
730 DataStorageFactory<NumArrayDataT<Int64,2>>::registerDataFactory(dfm);
732 DataStorageFactory<NumArrayDataT<Real,3>>::registerDataFactory(dfm);
735 DataStorageFactory<NumArrayDataT<Int64,3>>::registerDataFactory(dfm);
737 DataStorageFactory<NumArrayDataT<Real,4>>::registerDataFactory(dfm);
740 DataStorageFactory<NumArrayDataT<Int64,4>>::registerDataFactory(dfm);
#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++.
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 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 du pattern visitor pour une donnée tableau.
Interface d'une opération sur une donnée.
Interface du pattern visitor pour une donnée.
Interface d'un algorithme de hashage.
Interface d'un 'IData' dont le conteneur repose sur un 'NumArray'.
virtual Ref< ThatClass > cloneTrueEmptyRef()=0
Clone la donnée mais sans éléments.
virtual MDSpan< const DataType, ExtentType > view() const =0
Vue constante sur la donnée.
virtual MDSpan< DataType, ExtentType > view()=0
Vue sur la donnée.
virtual Ref< ThatClass > cloneTrueRef()=0
Clone la donnée.
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.
void computeHash(DataHashInfo &) override
Calcule le hash de la donnée.
Implémentation d'un 'IData' dont le conteneur repose sur un 'NumArray'.
void setShape(const ArrayShape &new_shape) override
Positionne la forme du tableau.
void copy(const IData *data) override
Copie la donnée data dans l'instance courante.
Ref< ISerializedData > createSerializedDataRef(bool use_basic_type) const override
Sérialise la donnée.
Integer dimension() const override
Dimension. 0 pour un scalaire, 1 pour un tableau mono-dim, 2 pour un tableau bi-dim.
Integer multiTag() const override
Tag multiple. 0 si non multiple, 1 si multiple, 2 si multiple pour les variable MultiArray (obsolète)
NumArray< DataType, ExtentType > m_value
Donnée.
Ref< IData > cloneEmptyRef() 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'.
void visitArray(IArrayDataVisitor *) 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.
void swapValues(IData *data) override
Échange les valeurs de data avec celles de l'instance.
void serialize(ISerializer *sbuf, IDataOperation *operation) override
Sérialise la donnée en appliquant l'opération operation.
IDataInternal * _commonInternal() override
Ref< IData > cloneRef() override
Clone la donnée.
void fillDefault() override
Remplit la donnée avec sa valeur par défaut.
MDSpan< DataType, ExtentType > view() override
Vue sur la donnée.
void assignSerializedData(const ISerializedData *sdata) override
Assigne à la donnée les valeurs sérialisées sdata.
IData * cloneEmpty() override
Clone la donnée mais sans éléments. L'instance créée doit être détruite par l'opérateur 'delete'.
eDataType dataType() const override
Type de la donnée.
MDSpan< const DataType, ExtentType > view() const override
Vue constante sur la donnée.
ArrayShape shape() const override
Forme du tableau pour une donnée 1D ou 2D.
void resize(Integer new_size) override
Redimensionne la donnée.
void allocateBufferForSerializedData(ISerializedData *sdata) override
Alloue la mémoire pour lire les valeurs sérialisées sdata.
void computeHash(IHashAlgorithm *algo, ByteArray &output) const override
Calcul une clé de hashage sur cette donnée.
void setAllocationInfo(const DataAllocationInfo &v) override
Positionne les informations sur l'allocation.
void setName(const String &name) override
Positionne le nom de la donnée (interne)
void visitArray2(IArray2DataVisitor *) override
Applique le visiteur à la donnée.
void visitScalar(IScalarDataVisitor *) override
Applique le visiteur à la donnée.
DataAllocationInfo allocationInfo() const override
Informations sur l'allocation.
DataStorageTypeInfo storageTypeInfo() const override
Informations sur le type de conteneur de la donnée.
void visit(IDataVisitor *visitor) override
Applique le visiteur à la donnée.
MDSpanType mdspan()
Vue multi-dimension sur l'instance.
Exception lorsqu'un argument est invalide.
Vue constante d'un tableau de type T.
Interface d'un sérialiseur.
eMode
Mode de fonctionnement du sérialiseur.
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
@ ReadAdd
Ajoute aux éléments actuels ceux lus.
@ ReadReplace
Replace les éléments actuels par ceux lus.
Interface du gestionnaire de traces.
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.
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.
@ DT_Int32
Donnée de type entier 32 bits.
@ DT_Int64
Donnée de type entier 64 bits.
eBasicDataType
Type d'une donnée de base.