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;
105 Int64 m_element_size;
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)
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();
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.
Integer size() const
Nombre d'éléments du vecteur.
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.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
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.
Vecteur 1D de données avec sémantique par valeur (style STL).
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.
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.
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.