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"
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"
42#include "arcane/core/ISerializer.h"
43#include "arcane/core/IData.h"
44#include "arcane/core/IDataVisitor.h"
46#include "arcane/core/internal/IDataInternal.h"
48#include "arcane/impl/SerializedData.h"
49#include "arcane/impl/DataStorageFactory.h"
59 const Int64 SERIALIZE_MAGIC_NUMBER = 0x456ff989;
67template<
class DataType>
72 ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS();
91 Integer
multiTag()
const override {
return 0; }
128 visitor->applyDataVisitor(
this);
145 void swapValuesDirect(ThatClass*
true_data);
179template<
typename DataType>
192 Integer
capacity()
const override {
return m_p->m_value.capacity(); }
193 void shrink()
const override { m_p->m_value.shrink(); }
195 void dispose()
override { m_p->m_value.dispose(); }
204 buf.m_original_dim1_size = values.size();
205 m_p->m_value.clear();
206 m_p->m_value.shrink();
214 m_p->m_value.resize(buf.m_original_dim1_size);
216 compressor->decompress(buf.m_buffer,asWritableBytes(values));
225 return m_p->view().size();
246, m_internal(
new Impl(this))
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)
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))
280template<
typename DataType> ArrayDataT<DataType>::
292template<
typename DataType> DataStorageTypeInfo ArrayDataT<DataType>::
293staticStorageTypeInfo()
295 typedef DataTypeTraitsT<DataType> TraitsType;
297 Int32 nb_basic_type = TraitsType::nbBasicType();
300 return DataStorageTypeInfo(bdt,nb_basic_type,
dimension,multi_tag);
309 return staticStorageTypeInfo();
361 m_shape =
sdata->shape();
364 sdata->setWritableBytes(buffer);
373 ARCANE_UNUSED(
sdata);
388 switch(
sbuf->mode()){
389 case ISerializer::ModeReserve:
393 m_trace->
debug(
Trace::High) <<
" ArrayDataT::serialize (full) reserve datatype="
404 m_trace->
debug(
Trace::High) <<
" ArrayDataT::serialize (full) put datatype="
423 ARCANE_FATAL(
"Internal errror: bad magic number for serialisation expected={0} current={1}",
431 switch(
sbuf->readMode()){
440 operation->applySpan(
m_value,data_value);
444 << data_value[i] <<
" transformed value=" <<
m_value[i];
480 _serialize(
sbuf,ids,operation);
497 switch(
sbuf->mode()){
498 case ISerializer::ModeReserve:
500 m_trace->
debug(
Trace::High) <<
" ArrayDataT::serialize (partial) reserve datatype="
509 m_trace->
debug(
Trace::High) <<
" ArrayDataT::serialize (partial) put datatype="
511 <<
" ids=" << nb_value <<
" totalsize=" << total_size;
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),
522 UniqueArray<BasicType> base_value;
523 base_value.reserve(total_size);
524 for(
Int64 i=0; i<nb_value; ++i ){
528 ConstArrayView<BasicType> current_value(nb_count,
reinterpret_cast<BasicType*
>(&
m_value[ids[i]]));
529 base_value.addRange(current_value);
531 sbuf->
putInt64(SERIALIZE_MAGIC_NUMBER);
540 <<
" ids=" << nb_value <<
" totalsize=" << total_size;
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),
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);
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);
565 UniqueArray<BasicType> base_value(total_size);
568 Span<DataType> data_value(
reinterpret_cast<DataType*
>(base_value.data()),nb_value);
569 UniqueArray<DataType> current_value;
570 Span<DataType> transformed_value;
572 if (operation && nb_value!=0) {
573 current_value.resize(ids.size());
575 transformed_value = current_value.view();
576 operation->applySpan(transformed_value,data_value);
579 transformed_value = data_value;
584 for(
Int64 i=0; i<nb_value; ++i )
586 <<
" value=" << data_value[i] <<
" transformed value=" << transformed_value[i];
588 for(
Int64 i=0; i<nb_value; ++i )
590 <<
" value=" << data_value[i];
593 for(
Int64 i=0; i<nb_value; ++i ) {
594 m_value[ids[i]] = transformed_value[i];
599 ARCANE_THROW(NotImplementedException,
"ArrayData::serialize : Cannot deserialize with ReadAdd mode");
684template<
typename DataType>
void ArrayDataT<DataType>::
697 if (m_allocation_info==v)
699 m_allocation_info = v;
718 m_allocation_info.setMemoryLocationHint(
alloc_info.memoryLocationHint());
725registerArrayDataFactory(IDataFactoryMng* dfm)
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);
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>;
#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.
void reserve(Integer new_capacity) override
Réserve de la mémoire pour new_capacity éléments.
void resize(Integer new_size) override
Redimensionne le conteneur.
INumericDataInternal * numericData() override
Interface générique pour les données numériques (nullptr si la donnée n'est pas numérique)
bool decompressAndFill(DataCompressionBuffer &buf) override
Décompresse les données et remplit les valeurs de la donnée.
Integer capacity() const override
Capacité allouée par le conteneur.
Array< DataType > & _internalDeprecatedValue() override
Conteneur associé à la donnée.
void changeAllocator(const MemoryAllocationOptions &v) override
Change l'allocateur de la variable.
void dispose() override
Vide le conteneur et libère la mémoire alloué.
void shrink() const override
Libère la mémoire additionnelle éventuellement allouée.
Int32 extent0() const override
Nombre d'éléments de la première dimension.
MutableMemoryView memoryView() override
Vue mémoire sur la donnée.
bool compressAndClear(DataCompressionBuffer &buf) override
Compresse les données et libère la mémoire associée.
Donnée tableau d'un type T.
IData * cloneEmpty() override
Clone la donnée mais sans éléments. L'instance créée doit être détruite par l'opérateur 'delete'.
ArrayView< DataType > view() override
Vue sur la donnée.
eDataType dataType() const override
Type de la donnée.
ConstArrayView< DataType > view() const override
Vue constante sur la donnée.
Ref< ISerializedData > createSerializedDataRef(bool use_basic_type) const override
Sérialise la donnée.
void serialize(ISerializer *sbuf, IDataOperation *operation) override
Sérialise la donnée en appliquant l'opération operation.
void allocateBufferForSerializedData(ISerializedData *sdata) override
Alloue la mémoire pour lire les valeurs sérialisées sdata.
void visitScalar(IScalarDataVisitor *) override
Applique le visiteur à la donnée.
void computeHash(IHashAlgorithm *algo, ByteArray &output) const override
Calcul une clé de hashage sur cette donnée.
DataStorageTypeInfo storageTypeInfo() const override
Informations sur le type de conteneur de la donnée.
ArrayShape shape() const override
Forme du tableau pour une donnée 1D ou 2D.
Ref< IData > cloneRef() override
Clone la donnée.
const Array< DataType > & value() const override
Valeur constante de la donnée.
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 visitArray(IArrayDataVisitor *visitor) override
Applique le visiteur à la donnée.
DataAllocationInfo allocationInfo() const override
Informations sur l'allocation.
DataInterfaceType * cloneTrue() override
Clone la donnée.
void visit(IArrayDataVisitor *visitor) override
Applique le visiteur à la donnée.
void swapValues(IData *data) override
Échange les valeurs de data avec celles de l'instance.
void assignSerializedData(const ISerializedData *sdata) override
Assigne à la donnée les valeurs sérialisées sdata.
DataInterfaceType * cloneTrueEmpty() override
Clone la donnée mais sans éléments.
UniqueArray< DataType > m_value
Donnée.
Array< DataType > & value() 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)
void fillDefault() override
Remplit la donnée avec sa valeur par défaut.
void visit(IDataVisitor *visitor) override
Applique le visiteur à la donnée.
Integer dimension() const override
Dimension. 0 pour un scalaire, 1 pour un tableau mono-dim, 2 pour un tableau bi-dim.
void copy(const IData *data) override
Copie la donnée data dans l'instance courante.
Ref< DataInterfaceType > cloneTrueEmptyRef() override
Clone la donnée mais sans éléments.
Ref< IData > cloneEmptyRef() override
Clone la donnée mais sans éléments.
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'.
void setAllocationInfo(const DataAllocationInfo &v) override
Positionne les informations sur l'allocation.
void setShape(const ArrayShape &new_shape) override
Positionne la forme du tableau.
IDataInternal * _commonInternal() override
Ref< DataInterfaceType > cloneTrueRef() override
Clone la donnée.
IArrayDataInternalT< DataType > * _internal() override
void setNbDimension(Int32 nb_value)
Positionne le rang de la forme.
void setDimension(Int32 index, Int32 value)
Positionne la valeur de la index-ème dimension à value.
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.
Interface du pattern visitor pour une donnée tableau.
Interface d'un service permettant de compresser/décompresser des données.
Interface d'une opération sur une donnée.
Interface du pattern visitor pour une donnée.
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.
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.
Interface d'un sérialiseur.
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
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.
eDataType
Type d'une donnée.
@ DT_Int64
Donnée de type entier 64 bits.
const char * dataTypeName(eDataType type)
Nom du type de donnée.
@ Highest
Niveau le plus élevé
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.