14#include "arcane/ISerializedData.h"
18#include "arcane/utils/Ref.h"
19#include "arcane/utils/NotImplementedException.h"
20#include "arcane/utils/NotSupportedException.h"
21#include "arcane/utils/FatalErrorException.h"
22#include "arcane/utils/IHashAlgorithm.h"
23#include "arcane/utils/CheckedConvert.h"
24#include "arcane/utils/Array.h"
25#include "arcane/utils/ArrayShape.h"
27#include "arcane/ISerializer.h"
37 const Int64 SERIALIZE_MAGIC_NUMBER = 0x6b90ac81;
50 ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS();
56 Integer nb_dimension, Int64 nb_element, Int64 nb_base_element,
62 Integer
nbDimension()
const override {
return m_nb_dimension; }
63 Int64
nbElement()
const override {
return m_nb_element; }
65 Int64
memorySize()
const override {
return m_memory_size; }
96 Integer m_nb_dimension;
98 Int64 m_nb_base_element;
105 Int64 m_element_size;
115 void _copyExtentsToDimensions();
127, m_nb_base_element(0)
128, m_is_multi_size(false)
137SerializedData(
eDataType base_data_type, Int64 memory_size,
138 Integer nb_dimension, Int64 nb_element, Int64 nb_base_element,
140: m_base_data_type(base_data_type)
141, m_memory_size(memory_size)
142, m_nb_dimension(nb_dimension)
143, m_nb_element(nb_element)
144, m_nb_base_element(nb_base_element)
145, m_is_multi_size(is_multi_size)
150 _copyExtentsToDimensions();
152 if (nb_dimension == 1) {
156 else if (nb_dimension > 1) {
158 for (Int32 i = 1; i < nb_dimension; ++i)
168_copyExtentsToDimensions()
177 for (Integer i = 0; i < n; ++i)
178 m_dimensions[i] =
static_cast<Int32
>(m_extents[i]);
206 m_const_buffer = buffer;
207 m_stored_buffer.
clear();
208 m_memory_size = buffer.
size();
217 m_const_buffer = buffer;
219 m_stored_buffer.
clear();
220 m_memory_size = buffer.
size();
230 m_buffer = m_stored_buffer;
231 m_const_buffer = m_stored_buffer.
view();
232 m_memory_size = size;
243 const Byte* ptr =
reinterpret_cast<const Byte*
>(m_dimensions.
data());
272 case ISerializer::ModeReserve:
281 _serializeRead(sbuf);
297 Int64 magic_number = sbuf->
getInt64();
298 if (magic_number != SERIALIZE_MAGIC_NUMBER)
299 ARCANE_FATAL(
"Bad magic number for SerializedData '{0}", magic_number);
303 ARCANE_FATAL(
"Bad magic number for SerializedData '{0}", magic_number);
309 m_nb_base_element = sbuf->
getInt64();
314 Int64 dimensions_size = sbuf->
getInt64();
315 m_extents.
resize(dimensions_size);
317 _copyExtentsToDimensions();
320 Int32 shape_nb_dim = sbuf->
getInt32();
321 std::array<Int32,ArrayShape::MAX_NB_DIMENSION> shape_dims_buf;
322 Span<Int32> shape_dims(shape_dims_buf.data(),shape_nb_dim);
326 Int64 buffer_size = sbuf->
getInt64();
327 m_stored_buffer.
resize(buffer_size);
328 sbuf->
getSpan(m_stored_buffer);
329 m_buffer = m_stored_buffer;
330 m_const_buffer = m_buffer;
342_serialize(ISerializer* sbuf)
const
345 if (m_extents.
size() != m_dimensions.
size())
346 ARCANE_FATAL(
"Incoherence between extents ({0}) and dimensions ({1})",
347 m_extents.
size(), m_dimensions.
size());
350 case ISerializer::ModeReserve:
353 sbuf->reserveInteger(1);
355 sbuf->reserveInteger(1);
358 sbuf->reserveInteger(1);
371 sbuf->putInt64(SERIALIZE_MAGIC_NUMBER);
373 sbuf->putInteger(m_base_data_type);
374 sbuf->putInt64(m_memory_size);
375 sbuf->putInteger(m_nb_dimension);
376 sbuf->putInt64(m_nb_element);
377 sbuf->putInt64(m_nb_base_element);
378 sbuf->putInteger(m_is_multi_size);
379 sbuf->putInt64(m_element_size);
381 sbuf->putInt64(m_extents.
size());
382 sbuf->putSpan(m_extents);
387 sbuf->putInt64(m_const_buffer.
size());
388 sbuf->putSpan(m_const_buffer);
391 ARCANE_THROW(NotSupportedException,
"ModeGet in const method");
398extern "C++" ARCANE_CORE_EXPORT
401 Integer nb_dim, Int64 nb_element, Int64 nb_base_element,
404 return createRef<SerializedData>(data_type, memory_size, nb_dim, nb_element,
405 nb_base_element, is_multi_size, dimensions, shape);
411extern "C++" ARCANE_CORE_EXPORT
414 Integer nb_dim, Int64 nb_element, Int64 nb_base_element,
418 nb_base_element, is_multi_size, dimensions,
ArrayShape());
424extern "C++" ARCANE_CORE_EXPORT
428 return createRef<SerializedData>();
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
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.
Int32 nbDimension() const
Rang de la forme.
SmallSpan< const Int32 > dimensions() const
Valeurs de chaque dimension.
void setDimensions(Span< const Int32 > dims)
Positionne le nombre et la valeur des dimensions.
Interface d'un algorithme de hashage.
virtual void computeHash64(Span< const Byte > input, ByteArray &output)
Calcule la valeur du hash pour le tableau input.
void serialize(ISerializer *buffer) override
Serialize en lecture ou écriture la donnée.
void computeHash(IHashAlgorithm *algo, ByteArray &output) const override
Calcul une clé de hashage sur cette donnée.
Int64ConstArrayView extents() const override
Tableau contenant le nombre d'éléments pour chaque dimension.
Span< Byte > writableBytes() override
Vue sur les valeurs sérialisées.
void setConstBytes(Span< const Byte > bytes) override
Positionne les valeurs de sérialisation pour la lecture.
void allocateMemory(Int64 size) override
Alloue un tableaux pour contenir les éléments sérialisés.
Integer nbDimension() const override
Dimension. 0 pour un scalaire, 1 pour un tableau mono-dim, ...
Span< const Byte > constBytes() const override
Valeurs sérialisées.
Int64 nbBaseElement() const override
Nombre d'éléments du type de base.
void setBytes(Span< Byte > bytes) override
Positionne les valeurs de sérialisation.
Span< Byte > bytes() override
Valeurs sérialisées.
eDataType baseDataType() const override
Type de la donnée.
bool isMultiSize() const override
Indique s'il s'agit d'un tableau multi-taille. (pertinent uniquement si nbDimension()>1)
void setWritableBytes(Span< Byte > bytes) override
Positionne les valeurs de sérialisation.
Int64 memorySize() const override
Indique le nombre d'octets qu'il faut allouer pour stocker ou lire les données.
void setBytes(Span< const Byte > bytes) override
Positionne les valeurs de sérialisation.
void setBuffer(ByteArrayView buffer) override
Positionne les valeurs de sérialisation.
Int64 nbElement() const override
Nombre d'éléments.
Span< const Byte > bytes() const override
Valeurs sérialisées.
ArrayShape shape() const override
Forme du tableau associé aux données.
Integer size() const
Nombre d'éléments du vecteur.
Vue modifiable d'un tableau d'un type T.
Classe de base des vecteurs 1D de données.
const T * data() const
Accès à la racine du tableau hors toute protection.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
ArrayView< T > view() const
Vue mutable sur ce tableau.
void clear()
Supprime les éléments du tableau.
Vue constante d'un tableau de type T.
Interface d'un sérialiseur.
virtual Int32 getInt32()=0
Récupère un entier naturel.
eMode
Mode de fonctionnement du sérialiseur.
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
virtual Integer getInteger()=0
Récupère une taille.
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 eMode mode() const =0
Mode de fonctionnement actuel.
@ ReadAdd
Ajoute aux éléments actuels ceux lus.
@ ReadReplace
Replace les éléments actuels par ceux lus.
Implémentation thread-safe d'un compteur de référence.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
constexpr view_type smallView()
Vue constante sur cette vue.
constexpr ConstArrayView< value_type > constSmallView() const
Vue constante sur cette vue.
Vue d'un tableau d'éléments de type T.
Vecteur 1D de données avec sémantique par valeur (style STL).
Integer multiply(Integer x, Integer y, Integer z)
Multiplie trois 'Integer' et vérifie que le résultat peut être contenu dans un 'Integer'.
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
ARCANE_DATATYPE_EXPORT Integer dataTypeSize(eDataType type)
Taille du type de donnée type (qui doit être différent de DT_String)
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.
ArrayView< Byte > ByteArrayView
Equivalent C d'un tableau à une dimension de caractères.
Ref< ISerializedData > arcaneCreateEmptySerializedDataRef()
Créé des données sérialisées.
unsigned char Byte
Type d'un octet.
eDataType
Type d'une donnée.
@ DT_Int32
Donnée de type entier 32 bits.
@ DT_Int64
Donnée de type entier 64 bits.
@ DT_Unknown
Donnée de type inconnue ou non initialisée.
@ DT_Byte
Donnée de type octet.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Int32 Integer
Type représentant un entier.