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();
98 Int64 m_nb_base_element;
103 UniqueArray<Int32> m_dimensions;
104 UniqueArray<Int64> m_extents;
105 Int64 m_element_size;
108 UniqueArray<Byte> m_stored_buffer;
115 void _copyExtentsToDimensions();
127, m_nb_base_element(0)
128, m_is_multi_size(false)
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();
151 if (!is_multi_size &&
shape.nbDimension() == 0) {
152 if (nb_dimension == 1) {
153 m_shape.setNbDimension(1);
154 m_shape.setDimension(0, 1);
156 else if (nb_dimension > 1) {
157 m_shape.setNbDimension(nb_dimension - 1);
158 for (
Int32 i = 1; i < nb_dimension; ++i)
159 m_shape.setDimension(i - 1, CheckedConvert::toInt32(
extents[i]));
168_copyExtentsToDimensions()
171 m_dimensions.resize(n);
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();
229 m_stored_buffer = UniqueArray<Byte>(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);
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();
315 m_extents.resize(dimensions_size);
317 _copyExtentsToDimensions();
321 std::array<Int32,ArrayShape::MAX_NB_DIMENSION> shape_dims_buf;
322 Span<Int32> shape_dims(shape_dims_buf.data(),shape_nb_dim);
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:
351 sbuf->reserveInt64(1);
352 sbuf->reserveInt32(1);
353 sbuf->reserveInteger(1);
354 sbuf->reserveInt64(1);
355 sbuf->reserveInteger(1);
356 sbuf->reserveInt64(1);
357 sbuf->reserveInt64(1);
358 sbuf->reserveInteger(1);
359 sbuf->reserveInt64(1);
361 sbuf->reserveInt64(1);
364 sbuf->reserveInt32(1);
367 sbuf->reserveInt64(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
405 nb_base_element, is_multi_size, dimensions, shape);
411extern "C++" ARCANE_CORE_EXPORT
418 nb_base_element, is_multi_size, dimensions,
ArrayShape());
424extern "C++" ARCANE_CORE_EXPORT
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
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.
Interface d'un sérialiseur.
virtual Integer getInteger()=0
Récupère une taille.
eMode
Mode de fonctionnement du sérialiseur.
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
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.
@ ReadReplace
Replace les éléments actuels par ceux lus.
@ ReadAdd
Ajoute aux éléments actuels ceux lus.
virtual void getSpan(Span< Real > values)
Récupère le tableau values.
virtual Int32 getInt32()=0
Récupère un entier naturel.
Référence à une instance.
Implémentation thread-safe d'un compteur de référence.
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.
Vue d'un tableau d'éléments de type T.
constexpr view_type smallView()
Vue constante sur cette vue.
constexpr ConstArrayView< value_type > constSmallView() const
Vue constante sur cette vue.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
-*- 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.
Ref< TrueType > createRef(Args &&... args)
Créé une instance de type TrueType avec les arguments Args et retourne une référence dessus.
ArrayView< Byte > ByteArrayView
Equivalent C d'un tableau à une dimension de caractères.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
Array< Byte > ByteArray
Tableau dynamique à une dimension de caractères.
@ Byte
Donnée de type octet.
@ Int32
Donnée de type entier 32 bits.
@ Int64
Donnée de type entier 64 bits.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Ref< ISerializedData > arcaneCreateEmptySerializedDataRef()
Créé des données sérialisées.
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.
unsigned char Byte
Type d'un octet.
eDataType
Type d'une donnée.
@ DT_Unknown
Donnée de type inconnue ou non initialisée.
std::int32_t Int32
Type entier signé sur 32 bits.