Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
StringArrayData.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/* StringArrayData.cc (C) 2000-2023 */
9/* */
10/* Donnée de type 'UniqueArray<String>'. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
15
16#include "arcane/utils/NotSupportedException.h"
17#include "arcane/utils/NotImplementedException.h"
18#include "arcane/utils/ArgumentException.h"
19#include "arcane/utils/TraceInfo.h"
20#include "arcane/utils/ITraceMng.h"
21#include "arcane/utils/IHashAlgorithm.h"
22#include "arcane/utils/Array.h"
23#include "arcane/utils/ArrayShape.h"
24
25#include "arcane/core/datatype/DataAllocationInfo.h"
26#include "arcane/core/datatype/DataStorageTypeInfo.h"
27#include "arcane/core/datatype/DataStorageBuildInfo.h"
28#include "arcane/core/datatype/DataTypeTraits.h"
29
30#include "arcane/impl/SerializedData.h"
31#include "arcane/impl/DataStorageFactory.h"
32
33#include "arcane/core/ISerializer.h"
34#include "arcane/core/IDataVisitor.h"
35
36#include "arcane/core/internal/IDataInternal.h"
37
38/*---------------------------------------------------------------------------*/
39/*---------------------------------------------------------------------------*/
40
41namespace Arcane
42{
43
44/*---------------------------------------------------------------------------*/
45/*---------------------------------------------------------------------------*/
51, public IArrayDataT<String>
52{
53 ARCCORE_DEFINE_REFERENCE_COUNTED_INCLASS_METHODS();
54 class Impl;
55 friend class Impl;
56
57public:
58
59 typedef String DataType;
62
63 public:
64 explicit StringArrayData(ITraceMng* trace);
67 ~StringArrayData() override;
68 public:
69 Integer dimension() const override { return 1; }
70 Integer multiTag() const override { return 0; }
71 eDataType dataType() const override { return DataTypeTraitsT<DataType>::type(); }
72 void serialize(ISerializer* sbuf, IDataOperation* operation) override;
73 void serialize(ISerializer* sbuf, Int32ConstArrayView ids, IDataOperation* operation) override;
74 Array<DataType>& value() override { return m_value; }
75 const Array<DataType>& value() const override { return m_value; }
76 ConstArrayView<DataType> view() const override { return m_value; }
77 ArrayView<DataType> view() override { return m_value; }
78 void resize(Integer new_size) override { m_value.resize(new_size); }
79 IData* clone() override { return cloneTrue(); }
80 IData* cloneEmpty() override { return cloneTrueEmpty(); };
81 Ref<IData> cloneRef() override { return makeRef(cloneTrue()); }
82 Ref<IData> cloneEmptyRef() override { return makeRef(cloneTrueEmpty()); }
83 DataInterfaceType* cloneTrue() override { return _cloneTrue(); }
84 DataInterfaceType* cloneTrueEmpty() override { return _cloneTrueEmpty(); }
85 Ref<DataInterfaceType> cloneTrueRef() override { auto* d = _cloneTrue(); return makeRef(d); }
86 Ref<DataInterfaceType> cloneTrueEmptyRef() override { auto* d = _cloneTrueEmpty(); return makeRef(d); }
87 DataStorageTypeInfo storageTypeInfo() const override;
88 void fillDefault() override { m_value.fill(String()); }
89 void setName(const String& name) override;
92 void assignSerializedData(const ISerializedData* sdata) override;
93 void copy(const IData* data) override;
94 void swapValues(IData* data) override;
95 void computeHash(IHashAlgorithm* algo, ByteArray& output) const override;
97 ArrayShape shape() const override { return {}; }
98 void setShape(const ArrayShape&) override {}
99 void setAllocationInfo(const DataAllocationInfo& v) override { m_allocation_info = v; }
100 DataAllocationInfo allocationInfo() const override { return m_allocation_info; }
102 {
103 visitor->applyVisitor(this);
104 }
105 void visit(IDataVisitor* visitor) override
106 {
107 visitor->applyDataVisitor((IArrayData*)this);
108 }
109 void visitScalar(IScalarDataVisitor* visitor) override;
110 void visitArray(IArrayDataVisitor* visitor) override;
111 void visitArray2(IArray2DataVisitor* visitor) override;
112
113 public:
114
115 IArrayDataInternalT<DataType>* _internal() override { return m_internal; }
116 IDataInternal* _commonInternal() override { return m_internal; }
117
118 public:
119
120 static DataStorageTypeInfo staticStorageTypeInfo();
121
122 private:
123
125 ITraceMng* m_trace;
126 IArrayDataInternalT<String>* m_internal;
127 DataAllocationInfo m_allocation_info;
128
129 private:
130
131 ThatClass* _cloneTrue() const { return new ThatClass(*this); }
132 ThatClass* _cloneTrueEmpty() const { return new ThatClass(m_trace); }
133};
134
135/*---------------------------------------------------------------------------*/
136/*---------------------------------------------------------------------------*/
137// TODO: à fusionner avec l'implémentation commune dans ArrayData.
139: public IArrayDataInternalT<String>
140{
141 public:
142
143 using String = DataType;
144
145 explicit Impl(StringArrayData* p) : m_p(p){}
146
147 public:
148
149 void reserve(Integer new_capacity) override { m_p->m_value.reserve(new_capacity); }
151 Integer capacity() const override { return m_p->m_value.capacity(); }
152 void shrink() const override { m_p->m_value.shrink(); }
153 void resize(Integer new_size) override { m_p->m_value.resize(new_size);}
154 void dispose() override { m_p->m_value.dispose(); }
156 {
158 }
159
160 private:
161
162 StringArrayData* m_p;
163};
164
165/*---------------------------------------------------------------------------*/
166/*---------------------------------------------------------------------------*/
167
168StringArrayData::
169StringArrayData(const DataStorageBuildInfo& dsbi)
170: m_trace(dsbi.traceMng())
171, m_internal(new Impl(this))
172{
173}
174
175StringArrayData::
176StringArrayData(ITraceMng* trace)
177: m_trace(trace)
178, m_internal(new Impl(this))
179{}
180
181StringArrayData::
182StringArrayData(const StringArrayData& rhs)
183: m_value(rhs.m_value)
184, m_trace(rhs.m_trace)
185, m_internal(new Impl(this))
186, m_allocation_info(rhs.m_allocation_info)
187{}
188
189StringArrayData::
190~StringArrayData()
191{
192 delete m_internal;
193}
194
195/*---------------------------------------------------------------------------*/
196/*---------------------------------------------------------------------------*/
197
198/*---------------------------------------------------------------------------*/
199/*---------------------------------------------------------------------------*/
200
201DataStorageTypeInfo StringArrayData::
202staticStorageTypeInfo()
203{
204 eBasicDataType bdt = eBasicDataType::Byte;
205 Int32 nb_basic_type = 0;
206 Int32 dimension = 2;
207 Int32 multi_tag = 1;
208 return DataStorageTypeInfo(bdt,nb_basic_type,dimension,multi_tag);
209}
210
211/*---------------------------------------------------------------------------*/
212/*---------------------------------------------------------------------------*/
213
215storageTypeInfo() const
216{
217 return staticStorageTypeInfo();
218}
219
220/*---------------------------------------------------------------------------*/
221/*---------------------------------------------------------------------------*/
222
225{
226 ARCANE_UNUSED(use_basic_type);
227
228 // Positionne les dimensions et calcule la taille nécessaire pour sérialiser
229 // les valeurs
230 Int64 needed_memory = 0;
231 Int64 nb_element = m_value.largeSize();
232 Int64UniqueArray dimensions(nb_element);
233 for (Integer i = 0; i < nb_element; ++i) {
234 Span<const Byte> str(m_value[i].bytes());
235 Int64 len = str.size();
236 needed_memory += len;
237 dimensions[i] = len;
238 }
241 nb_base_element, true, dimensions);
242 sd->allocateMemory(needed_memory);
243
244 // Recopie les valeurs dans le tableau alloué
245 Span<Byte> svalues = sd->writableBytes();
246 {
247 Int64 index = 0;
248 for (Integer i = 0; i < nb_element; ++i) {
249 Span<const Byte> str(m_value[i].bytes());
250 Int64 len = str.size();
251 // TODO: utiliser directement une méthode de copie.
252 for (Int64 z = 0; z < len; ++z)
253 svalues[index + z] = str[z];
254 index += len;
255 }
256 }
257 return sd;
258}
259
260/*---------------------------------------------------------------------------*/
261/*---------------------------------------------------------------------------*/
262
265{
266 if (sdata->baseDataType() != DT_Byte)
267 throw ArgumentException(A_FUNCINFO, "Bad serialized type");
268
269 sdata->allocateMemory(sdata->memorySize());
270 //m_trace->info() << " ALLOC ARRAY STRING ptr=" << (void*)byte_values.begin();
271}
272
273/*---------------------------------------------------------------------------*/
274/*---------------------------------------------------------------------------*/
275
278{
279 if (sdata->baseDataType() != DT_Byte)
280 throw ArgumentException(A_FUNCINFO, "Bad serialized type");
281
282 Span<const Byte> byte_values = sdata->constBytes();
283 //m_trace->info() << " ASSIGN ARRAY STRING ptr=" << (void*)byte_values.begin();
284 Int64ConstArrayView dimensions = sdata->extents();
285 Integer nb_element = dimensions.size();
287 Int64 index = 0;
288 for (Integer i = 0; i < nb_element; ++i) {
289 Int64 len = dimensions[i];
290 Span<const Byte> v(&byte_values[index], len);
291 m_value[i] = String(v);
292 index += len;
293 //m_trace->info() << " READ STRING i=" << i << " v=" << m_value[i] << " len=" << len << " index=" << index;
294 }
295}
296
297/*---------------------------------------------------------------------------*/
298/*---------------------------------------------------------------------------*/
299
302{
303 // TODO: tester cette méthode.
304 ARCANE_UNUSED(operation);
305
306 ISerializer::eMode mode = sbuf->mode();
307 if (mode == ISerializer::ModeReserve) {
308 Integer size = m_value.size();
309 sbuf->reserveInteger(1);
310 for (Integer z = 0; z < size; ++z)
311 sbuf->reserve(m_value[z]);
312 }
313 else if (mode == ISerializer::ModePut) {
314 Integer size = m_value.size();
315 sbuf->putInteger(size);
316 for (Integer z = 0; z < size; ++z)
317 sbuf->put(m_value[z]);
318 }
319 else if (mode == ISerializer::ModeGet) {
320 switch (sbuf->readMode()) {
322 Integer size = sbuf->getInteger();
323 m_value.resize(size);
324 for (Integer z = 0; z < size; ++z)
325 sbuf->get(m_value[z]);
326 } break;
328 ARCANE_THROW(NotSupportedException, "option 'ReadAdd'");
329 }
330 }
331 else
332 ARCANE_THROW(NotSupportedException, "Invalid mode");
333}
334
335/*---------------------------------------------------------------------------*/
336/*---------------------------------------------------------------------------*/
337
340{
341 ARCANE_UNUSED(sbuf);
342 ARCANE_UNUSED(ids);
343 ARCANE_UNUSED(operation);
344 throw NotImplementedException(A_FUNCINFO);
345}
346
347/*---------------------------------------------------------------------------*/
348/*---------------------------------------------------------------------------*/
349
351setName(const String& name)
352{
353 ARCANE_UNUSED(name);
354}
355
356/*---------------------------------------------------------------------------*/
357/*---------------------------------------------------------------------------*/
358
361{
362 // Pour l'instant, il faut passer par une sérialisation.
363 // TODO supprimer la sérialisation inutile.
365 s->computeHash(algo, output);
366}
367
368/*---------------------------------------------------------------------------*/
369/*---------------------------------------------------------------------------*/
370
373{
374 hash_info.setVersion(2);
375 IHashAlgorithmContext* context = hash_info.context();
376 for( const String& x : m_value )
377 context->updateHash(asBytes(x.bytes()));
378}
379
380/*---------------------------------------------------------------------------*/
381/*---------------------------------------------------------------------------*/
382
384copy(const IData* data)
385{
386 const auto* true_data = dynamic_cast<const DataInterfaceType*>(data);
387 if (!true_data)
388 ARCANE_THROW(ArgumentException, "Can not cast 'IData' to 'StringArrayData'");
389 m_value.copy(true_data->view());
390}
391
392/*---------------------------------------------------------------------------*/
393/*---------------------------------------------------------------------------*/
394
396swapValues(IData* data)
397{
398 auto* true_data = dynamic_cast<ThatClass*>(data);
399 if (!true_data)
400 ARCANE_THROW(ArgumentException, "Can not cast 'IData' to 'StringArrayData'");
401 m_value.swap(true_data->m_value);
402}
403
404/*---------------------------------------------------------------------------*/
405/*---------------------------------------------------------------------------*/
406
409{
410 ARCANE_THROW(NotSupportedException, "Can not visit scalar data with array data");
411}
412
413/*---------------------------------------------------------------------------*/
414/*---------------------------------------------------------------------------*/
415
418{
419 visitor->applyVisitor(this);
420}
421
422/*---------------------------------------------------------------------------*/
423/*---------------------------------------------------------------------------*/
424
427{
428 ARCANE_THROW(NotSupportedException, "Can not visit array2 data with array data");
429}
430
431/*---------------------------------------------------------------------------*/
432/*---------------------------------------------------------------------------*/
433
434extern "C++" void
435registerStringArrayDataFactory(IDataFactoryMng* dfm)
436{
438}
439
440/*---------------------------------------------------------------------------*/
441/*---------------------------------------------------------------------------*/
442
443} // End namespace Arcane
444
445/*---------------------------------------------------------------------------*/
446/*---------------------------------------------------------------------------*/
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
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 d'une donnée tableau d'un type T.
Interface d'une donnée tableau d'un type T.
Definition IData.h:292
Interface du pattern visitor pour une donnée tableau.
Interface d'une donnée tableau 1D.
Definition IData.h:276
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
Contexte pour calculer un hash de manière incrémentale.
Interface d'un algorithme de hashage.
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
Integer capacity() const override
Capacité allouée par le conteneur.
void dispose() override
Vide le conteneur et libère la mémoire alloué.
void resize(Integer new_size) override
Redimensionne le conteneur.
void reserve(Integer new_capacity) override
Réserve de la mémoire pour new_capacity éléments.
void computeHash(DataHashInfo &hash_info) override
Calcule le hash de la donnée.
void shrink() const override
Libère la mémoire additionnelle éventuellement allouée.
Array< DataType > & _internalDeprecatedValue() override
Conteneur associé à la donnée.
Donnée tableau d'une chaîne de caractères unicode (spécialisation)
Ref< IData > cloneEmptyRef() override
Clone la donnée mais sans éléments.
void copy(const IData *data) override
Copie la donnée data dans l'instance courante.
ArrayView< DataType > view() override
Vue sur la donnée.
void setName(const String &name) override
Positionne le nom de la donnée (interne)
Ref< ISerializedData > createSerializedDataRef(bool use_basic_type) const override
Sérialise la donnée.
void resize(Integer new_size) override
Redimensionne la donnée.
Ref< IData > cloneRef() override
Clone la donnée.
void setShape(const ArrayShape &) override
Positionne la forme du tableau.
Integer multiTag() const override
Tag multiple. 0 si non multiple, 1 si multiple, 2 si multiple pour les variable MultiArray (obsolète)
void visitArray(IArrayDataVisitor *visitor) override
Applique le visiteur à la donnée.
IArrayDataInternalT< DataType > * _internal() override
void assignSerializedData(const ISerializedData *sdata) override
Assigne à la donnée les valeurs sérialisées sdata.
Ref< DataInterfaceType > cloneTrueRef() override
Clone la donnée.
eDataType dataType() const override
Type de la donnée.
DataStorageTypeInfo storageTypeInfo() const override
Informations sur le type de conteneur de la donnée.
void visitScalar(IScalarDataVisitor *visitor) override
Applique le visiteur à la donnée.
Integer dimension() const override
Dimension. 0 pour un scalaire, 1 pour un tableau mono-dim, 2 pour un tableau bi-dim.
ArrayShape shape() const override
Forme du tableau pour une donnée 1D ou 2D.
Array< DataType > & value() override
Valeur de la donnée.
void computeHash(IHashAlgorithm *algo, ByteArray &output) const override
Calcul une clé de hashage sur cette donnée.
void setAllocationInfo(const DataAllocationInfo &v) override
Positionne les informations sur l'allocation.
void visit(IArrayDataVisitor *visitor) override
Applique le visiteur à la donnée.
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 swapValues(IData *data) override
Échange les valeurs de data avec celles de l'instance.
void visit(IDataVisitor *visitor) override
Applique le visiteur à la donnée.
UniqueArray< DataType > m_value
Donnée.
void serialize(ISerializer *sbuf, IDataOperation *operation) override
Sérialise la donnée en appliquant l'opération operation.
DataAllocationInfo allocationInfo() const override
Informations sur l'allocation.
DataInterfaceType * cloneTrueEmpty() override
Clone la donnée mais sans éléments.
DataInterfaceType * cloneTrue() override
Clone la donnée.
void fillDefault() override
Remplit la donnée avec sa valeur par défaut.
Ref< DataInterfaceType > cloneTrueEmptyRef() override
Clone la donnée mais sans éléments.
void allocateBufferForSerializedData(ISerializedData *sdata) override
Alloue la mémoire pour lire les valeurs sérialisées sdata.
IDataInternal * _commonInternal() override
void visitArray2(IArray2DataVisitor *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'.
const Array< DataType > & value() const override
Valeur constante de la donnée.
ConstArrayView< DataType > view() const override
Vue constante sur la donnée.
void dispose()
Libère la mémoire utilisée par le tableau.
Integer capacity() const
Capacité (nombre d'éléments alloués) du vecteur.
Integer size() const
Nombre d'éléments du vecteur.
Int64 largeSize() const
Nombre d'éléments du vecteur (en 64 bits)
Exception lorsqu'un argument est invalide.
void copy(Span< const T > rhs)
Copie les valeurs de rhs dans l'instance.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void fill(ConstReferenceType value)
Remplit le tableau avec la valeur value.
void shrink()
Réalloue pour libérer la mémoire non utilisée.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
@ 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 fonction n'est pas implémentée.
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.
Vecteur 1D de données avec sémantique par valeur (style STL).
void swap(UniqueArray< T > &rhs)
Échange les valeurs de l'instance avec celles de rhs.
-*- 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
eBasicDataType
Type d'une donnée de base.