Arcane  v3.14.10.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/*---------------------------------------------------------------------------*/
51, public IScalarDataT<String>
52{
53 ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS();
54
55 public:
56
57 typedef String DataType;
60
61 public:
62
64 : public IDataInternal
65 {
66 public:
67
68 explicit Internal(StringScalarData* p) : m_p(p){}
69
70 public:
71
73 {
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()); }
108 Ref<IData> cloneEmptyRef() override { return makeRef(cloneTrueEmpty()); }
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;
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;
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; }
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
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{
171 eBasicDataType bdt = eBasicDataType::Byte;
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
192{
193 ARCANE_UNUSED(use_basic_type);
194
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);
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)
236 else
237 m_value = String();
238 //m_trace->info() << " READ STRING = " << m_value;
239}
240
241/*---------------------------------------------------------------------------*/
242/*---------------------------------------------------------------------------*/
243
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
295{
297 algo->computeHash64(input, output);
298}
299
300/*---------------------------------------------------------------------------*/
301/*---------------------------------------------------------------------------*/
302
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/*---------------------------------------------------------------------------*/
Forme d'un tableau.
Definition ArrayShape.h:40
Tableau d'items de types quelconques.
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
Interface d'un algorithme de hashage.
Interface d'une donnée scalaire d'un type T.
Definition IData.h:243
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.
Definition Lima.cc:120
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.
Exception lorsqu'un argument est invalide.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vue constante d'un tableau de type T.
@ ReadAdd
Ajoute aux éléments actuels ceux lus.
@ ReadReplace
Replace les éléments actuels par ceux lus.
Interface du gestionnaire de traces.
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.
ByteConstArrayView utf8() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:275
Span< const Byte > bytes() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:291
Vecteur 1D de données avec sémantique par valeur (style STL).
-*- 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.
eDataType
Type d'une donnée.
Definition DataTypes.h:39
@ DT_Byte
Donnée de type octet.
Definition DataTypes.h:40