Arcane  v3.16.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
StringScalarData.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* StringScalarData.cc (C) 2000-2023 */
9/* */
10/* Donnée scalaire de type 'String'. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
15
16#include "arcane/utils/ArgumentException.h"
17#include "arcane/utils/NotSupportedException.h"
18#include "arcane/utils/TraceInfo.h"
19#include "arcane/utils/IHashAlgorithm.h"
20#include "arcane/utils/NotImplementedException.h"
21#include "arcane/utils/Array.h"
22#include "arcane/utils/ArrayShape.h"
23
24#include "arcane/core/datatype/DataAllocationInfo.h"
25#include "arcane/core/datatype/DataStorageTypeInfo.h"
26#include "arcane/core/datatype/DataStorageBuildInfo.h"
27#include "arcane/core/datatype/DataTypeTraits.h"
28
29#include "arcane/impl/SerializedData.h"
30#include "arcane/impl/DataStorageFactory.h"
31
32#include "arcane/core/ISerializer.h"
33#include "arcane/core/IDataVisitor.h"
34
35#include "arcane/core/internal/IDataInternal.h"
36
37/*---------------------------------------------------------------------------*/
38/*---------------------------------------------------------------------------*/
39
40namespace Arcane
41{
42
43
44/*---------------------------------------------------------------------------*/
45/*---------------------------------------------------------------------------*/
49class StringScalarData
51, public IScalarDataT<String>
52{
53 ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS();
54
55 public:
56
57 typedef String DataType;
58 typedef StringScalarData ThatClass;
59 typedef IScalarDataT<String> DataInterfaceType;
60
61 public:
62
63 class Internal
64 : public IDataInternal
65 {
66 public:
67
68 explicit Internal(StringScalarData* p) : m_p(p){}
69
70 public:
71
72 void computeHash(DataHashInfo& hash_info) override
73 {
74 m_p->computeHash(hash_info);
75 }
76
77 private:
78
79 StringScalarData* m_p = nullptr;
80 };
81
82 public:
83
84 explicit StringScalarData(ITraceMng* trace)
85 : m_trace(trace)
86 , m_internal(this) {}
87 explicit StringScalarData(const DataStorageBuildInfo& dsbi);
88 StringScalarData(const StringScalarData& rhs)
89 : m_value(rhs.m_value)
90 , m_trace(rhs.m_trace)
91 , m_internal(this)
92 , m_allocation_info(rhs.m_allocation_info)
93 {}
94
95 public:
96
97 Integer dimension() const override { return 0; }
98 Integer multiTag() const override { return 0; }
99 eDataType dataType() const override { return DataTypeTraitsT<DataType>::type(); }
100 void serialize(ISerializer* sbuf, IDataOperation* operation) override;
101 void serialize(ISerializer* sbuf, Int32ConstArrayView ids, IDataOperation* operation) override;
102 DataType& value() override { return m_value; }
103 const DataType& value() const override { return m_value; }
104 void resize(Integer) override {}
105 IData* clone() override { return cloneTrue(); }
106 IData* cloneEmpty() override { return cloneTrueEmpty(); };
107 Ref<IData> cloneRef() override { return makeRef(cloneTrue()); }
109 DataStorageTypeInfo storageTypeInfo() const override;
110 StringScalarData* cloneTrue() override { return new ThatClass(*this); }
111 StringScalarData* cloneTrueEmpty() override { return new ThatClass(m_trace); }
112 Ref<DataInterfaceType> cloneTrueRef() override { DataInterfaceType* d = new ThatClass(*this); return makeRef(d); }
113 Ref<DataInterfaceType> cloneTrueEmptyRef() override { DataInterfaceType* d = new ThatClass(m_trace); return makeRef(d); }
114 void fillDefault() override
115 {
116 m_value = String();
117 }
118 void setName(const String& name) override;
119 Ref<ISerializedData> createSerializedDataRef(bool use_basic_type) const override;
121 void assignSerializedData(const ISerializedData* sdata) override;
122 void copy(const IData* data) override;
123 void swapValues(IData* data) override;
124 void computeHash(IHashAlgorithm* algo, ByteArray& output) const override;
125 void computeHash(DataHashInfo& hash_info) const;
126 ArrayShape shape() const override { return {}; }
127 void setShape(const ArrayShape&) override { }
128 void setAllocationInfo(const DataAllocationInfo& v) override { m_allocation_info = v; }
129 DataAllocationInfo allocationInfo() const override { return m_allocation_info; }
130 void visit(IScalarDataVisitor* visitor) override
131 {
132 visitor->applyVisitor(this);
133 }
134 void visit(IDataVisitor* visitor) override
135 {
136 visitor->applyDataVisitor(this);
137 }
138 void visitScalar(IScalarDataVisitor* visitor) override;
139 void visitArray(IArrayDataVisitor* visitor) override;
140 void visitArray2(IArray2DataVisitor* visitor) override;
141 IDataInternal* _commonInternal() override { return &m_internal; }
142
143 public:
144
145 static DataStorageTypeInfo staticStorageTypeInfo();
146
147 private:
148
149 DataType m_value;
150 ITraceMng* m_trace;
151 Internal m_internal;
152 DataAllocationInfo m_allocation_info;
153};
154
155/*---------------------------------------------------------------------------*/
156/*---------------------------------------------------------------------------*/
157
158StringScalarData::
159StringScalarData(const DataStorageBuildInfo& dsbi)
160: m_trace(dsbi.traceMng())
161, m_internal(this)
162{
163}
164
165/*---------------------------------------------------------------------------*/
166/*---------------------------------------------------------------------------*/
167
168DataStorageTypeInfo StringScalarData::
169staticStorageTypeInfo()
170{
172 Int32 nb_basic_type = 0;
173 Int32 dimension = 1;
174 Int32 multi_tag = 1;
175 return DataStorageTypeInfo(bdt,nb_basic_type,dimension,multi_tag);
176}
177
178/*---------------------------------------------------------------------------*/
179/*---------------------------------------------------------------------------*/
180
182storageTypeInfo() const
183{
184 return staticStorageTypeInfo();
185}
186
187/*---------------------------------------------------------------------------*/
188/*---------------------------------------------------------------------------*/
189
191createSerializedDataRef(bool use_basic_type) const
192{
193 ARCANE_UNUSED(use_basic_type);
194
195 ByteConstArrayView local_values(m_value.utf8());
196 Int64 nb_element = 1;
197 Int64 len = local_values.size();
198 Int64 nb_base_element = len;
199 Int64UniqueArray extents;
200 extents.add(nb_element);
201 Span<const Byte> base_values = local_values;
202 auto sd = arcaneCreateSerializedDataRef(DT_Byte, base_values.size(), 1, nb_element,
203 nb_base_element, false, extents);
204 sd->setConstBytes(base_values);
205 //m_trace->info() << " WRITE STRING " << m_value << " len=" << len;
206 return sd;
207}
208
209/*---------------------------------------------------------------------------*/
210/*---------------------------------------------------------------------------*/
211
214{
215 if (sdata->baseDataType() != DT_Byte)
216 throw ArgumentException(A_FUNCINFO, "Bad serialized type");
217
218 sdata->allocateMemory(sdata->memorySize());
219}
220
221/*---------------------------------------------------------------------------*/
222/*---------------------------------------------------------------------------*/
223
226{
227 if (sdata->baseDataType() != DT_Byte)
228 throw ArgumentException(A_FUNCINFO, "Bad serialized type");
229
230 Span<const Byte> byte_values = sdata->constBytes();
231 Int64 len = sdata->nbBaseElement();
232 //m_trace->info() << " ASSIGN STRING n=" << len
233 // << " ptr=" << (void*)byte_values.begin();
234 if (len != 0)
235 m_value = String(byte_values);
236 else
237 m_value = String();
238 //m_trace->info() << " READ STRING = " << m_value;
239}
240
241/*---------------------------------------------------------------------------*/
242/*---------------------------------------------------------------------------*/
243
245serialize(ISerializer* sbuf, IDataOperation* operation)
246{
247 ARCANE_UNUSED(operation);
248
249 ISerializer::eMode mode = sbuf->mode();
250 if (mode == ISerializer::ModeReserve) {
251 sbuf->reserve(m_value);
252 }
253 else if (mode == ISerializer::ModePut) {
254 sbuf->put(m_value);
255 }
256 else if (mode == ISerializer::ModeGet) {
257 switch (sbuf->readMode()) {
259 sbuf->get(m_value);
260 break;
262 throw NotSupportedException(A_FUNCINFO, "option 'ReadAdd'");
263 }
264 }
265 else
266 throw NotSupportedException(A_FUNCINFO, "Invalid mode");
267}
268
269/*---------------------------------------------------------------------------*/
270/*---------------------------------------------------------------------------*/
271
274{
275 ARCANE_UNUSED(sbuf);
276 ARCANE_UNUSED(ids);
277 ARCANE_UNUSED(operation);
278 // Rien à faire sur ce type de sérialisation.
279}
280
281/*---------------------------------------------------------------------------*/
282/*---------------------------------------------------------------------------*/
283
285setName(const String& name)
286{
287 ARCANE_UNUSED(name);
288}
289
290/*---------------------------------------------------------------------------*/
291/*---------------------------------------------------------------------------*/
292
294computeHash(IHashAlgorithm* algo, ByteArray& output) const
295{
296 ByteConstArrayView input = m_value.utf8();
297 algo->computeHash64(input, output);
298}
299
300/*---------------------------------------------------------------------------*/
301/*---------------------------------------------------------------------------*/
302
304computeHash(DataHashInfo& hash_info) const
305{
306 hash_info.setVersion(2);
307 hash_info.context()->updateHash(asBytes(m_value.bytes()));
308}
309
310/*---------------------------------------------------------------------------*/
311/*---------------------------------------------------------------------------*/
312
314copy(const IData* data)
315{
316 const DataInterfaceType* true_data = dynamic_cast<const DataInterfaceType*>(data);
317 if (!true_data)
318 throw ArgumentException(A_FUNCINFO, "Can not cast 'IData' to 'IScalarDataT'");
319 m_value = true_data->value();
320}
321
322/*---------------------------------------------------------------------------*/
323/*---------------------------------------------------------------------------*/
324
326swapValues(IData* data)
327{
328 DataInterfaceType* true_data = dynamic_cast<DataInterfaceType*>(data);
329 if (!true_data)
330 throw ArgumentException(A_FUNCINFO, "Can not cast 'IData' to 'IScalarDataT'");
331 std::swap(m_value, true_data->value());
332}
333
334/*---------------------------------------------------------------------------*/
335/*---------------------------------------------------------------------------*/
336
339{
340 visitor->applyVisitor(this);
341}
342
343/*---------------------------------------------------------------------------*/
344/*---------------------------------------------------------------------------*/
345
348{
349 throw NotSupportedException(A_FUNCINFO, "Can not visit array data with scalar data");
350}
351
352/*---------------------------------------------------------------------------*/
353/*---------------------------------------------------------------------------*/
354
357{
358 throw NotSupportedException(A_FUNCINFO, "Can not visit array2 data with scalar data");
359}
360
361/*---------------------------------------------------------------------------*/
362/*---------------------------------------------------------------------------*/
363
364extern "C++" void
365registerStringScalarDataFactory(IDataFactoryMng* dfm)
366{
368}
369
370/*---------------------------------------------------------------------------*/
371/*---------------------------------------------------------------------------*/
372
373/*---------------------------------------------------------------------------*/
374/*---------------------------------------------------------------------------*/
375
376} // End namespace Arcane
377
378/*---------------------------------------------------------------------------*/
379/*---------------------------------------------------------------------------*/
Exception lorsqu'un argument est invalide.
Forme d'un tableau.
Definition ArrayShape.h:40
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
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'.
static void registerDataFactory(IDataFactoryMng *dfm)
Enregistre dans dfm une fabrique pour la donnée DataType.
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 du gestionnaire de fabrique d'une donnée.
Partie interne de IData.
Interface d'une opération sur une donnée.
Interface du pattern visitor pour une donnée.
Interface d'une donnée.
Definition IData.h:33
virtual void updateHash(Span< const std::byte > input)=0
Ajoute le tableau input au hash calculé
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'une donnée scalaire d'un type T.
Definition IData.h:243
virtual DataType & value()=0
Valeur de la donnée.
Interface du pattern visitor pour une donnée scalaire.
Interface d'une donnée sérialisée.
virtual eDataType baseDataType() const =0
Type de la donnée.
virtual Int64 memorySize() const =0
Indique le nombre d'octets qu'il faut allouer pour stocker ou lire les données.
virtual void allocateMemory(Int64 size)=0
Alloue un tableaux pour contenir les éléments sérialisés.
virtual Int64 nbBaseElement() const =0
Nombre d'éléments du type de base.
virtual Span< const Byte > constBytes() const =0
Valeurs sérialisées.
virtual void reserve(eBasicDataType dt, Int64 n)=0
Réserve de la mémoire pour n objets de type dt.
eMode
Mode de fonctionnement du sérialiseur.
@ ModePut
Le sérialiseur attend des reserve()
virtual void put(Span< const Real > values)=0
Ajoute le tableau values.
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 get(ArrayView< Real > values)=0
Récupère le tableau values.
Interface du gestionnaire de traces.
Exception lorsqu'une opération n'est pas supportée.
Référence à une instance.
Implémentation thread-safe d'un compteur de référence.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:212
Vue d'un tableau d'éléments de type T.
Definition Span.h:513
void computeHash(DataHashInfo &hash_info) override
Calcule le hash de la donnée.
Donnée scalaire d'une chaîne de caractères unicode.
DataStorageTypeInfo storageTypeInfo() const override
Informations sur le type de conteneur de la donnée.
IDataInternal * _commonInternal() override
StringScalarData * cloneTrue() override
Clone la donnée.
DataAllocationInfo allocationInfo() const override
Informations sur l'allocation.
Ref< IData > cloneEmptyRef() override
Clone la donnée mais sans éléments.
void visitArray(IArrayDataVisitor *visitor) override
Applique le visiteur à la donnée.
eDataType dataType() const override
Type de la donnée.
DataType & value() override
Valeur de la donnée.
void resize(Integer) override
Redimensionne la donnée.
void serialize(ISerializer *sbuf, IDataOperation *operation) override
Sérialise la donnée en appliquant l'opération operation.
Ref< DataInterfaceType > cloneTrueRef() override
Clone la donnée.
Ref< ISerializedData > createSerializedDataRef(bool use_basic_type) const override
Sérialise la donnée.
void assignSerializedData(const ISerializedData *sdata) override
Assigne à la donnée les valeurs sérialisées sdata.
Integer multiTag() const override
Tag multiple. 0 si non multiple, 1 si multiple, 2 si multiple pour les variable MultiArray (obsolète)
void setAllocationInfo(const DataAllocationInfo &v) override
Positionne les informations sur l'allocation.
void visit(IScalarDataVisitor *visitor) override
Applique le visiteur à la donnée.
void allocateBufferForSerializedData(ISerializedData *sdata) override
Alloue la mémoire pour lire les valeurs sérialisées sdata.
void setShape(const ArrayShape &) override
Positionne la forme du tableau.
IData * cloneEmpty() override
Clone la donnée mais sans éléments. L'instance créée doit être détruite par l'opérateur 'delete'.
void visitScalar(IScalarDataVisitor *visitor) override
Applique le visiteur à la donnée.
IData * clone() override
Clone la donnée. L'instance créée doit être détruite par l'opérateur 'delete'.
void computeHash(IHashAlgorithm *algo, ByteArray &output) const override
Calcul une clé de hashage sur cette donnée.
ArrayShape shape() const override
Forme du tableau pour une donnée 1D ou 2D.
void visitArray2(IArray2DataVisitor *visitor) override
Applique le visiteur à la donnée.
void swapValues(IData *data) override
Échange les valeurs de data avec celles de l'instance.
Ref< IData > cloneRef() override
Clone la donnée.
void visit(IDataVisitor *visitor) override
Applique le visiteur à la donnée.
const DataType & value() const override
Valeur de 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 fillDefault() override
Remplit la donnée avec sa valeur par défaut.
void copy(const IData *data) override
Copie la donnée data dans l'instance courante.
StringScalarData * cloneTrueEmpty() override
Clone la donnée mais sans éléments.
void setName(const String &name) override
Positionne le nom de la donnée (interne)
Ref< DataInterfaceType > cloneTrueEmptyRef() override
Clone la donnée mais sans éléments.
Chaîne de caractères unicode.
Span< const Byte > bytes() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:291
-*- 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.
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:426
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.
Definition UtilsTypes.h:208
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:569
eBasicDataType
Type d'une donnée de base.
impl::SpanTypeFromSize< conststd::byte, SizeType >::SpanType asBytes(const SpanImpl< DataType, SizeType, Extent > &s)
Converti la vue en un tableau d'octets non modifiables.
Definition Span.h:884
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.
Definition UtilsTypes.h:563
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
eDataType
Type d'une donnée.
Definition DataTypes.h:39
@ DT_Byte
Donnée de type octet.
Definition DataTypes.h:40