Arcane  4.2.3.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
TestSerialize.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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#include <gtest/gtest.h>
8
9#include "arccore/serialize/BasicSerializer.h"
10
11#include "arccore/base/Ref.h"
12#include "arccore/base/FatalErrorException.h"
13#include "arccore/base/ValueFiller.h"
15#include "arccore/base/Float128.h"
16#include "arccore/base/Int128.h"
17#include "arccore/common/NumArray.h"
18#include "arccore/collections/Array2.h"
19#include "arccore/serialize/SerializerExtension.h"
20
21using namespace Arccore;
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
27{
28 public:
29
30 virtual ~ISerializeValue() = default;
31
32 virtual void serialize(ISerializer* s) = 0;
33 virtual void checkValid() = 0;
34};
35
36/*---------------------------------------------------------------------------*/
37/*---------------------------------------------------------------------------*/
38namespace
39{
40using Float64 = Real;
41template <typename T> class ValueTraits;
42#define VALUE_TRAITS(type_name,basic_type_name) \
43 template <> class ValueTraits<type_name> \
44 { \
45 public: \
46\
47 static eBasicDataType dataType() { return eBasicDataType::basic_type_name; } \
48 static void getValue(ISerializer* s, type_name& v) { v = s->get##type_name(); } \
49 };
50
51#define VALUE_TRAITS2(type_name) VALUE_TRAITS(type_name,type_name)
52
53VALUE_TRAITS2(Byte);
54VALUE_TRAITS2(Int8);
55VALUE_TRAITS2(Int16);
56VALUE_TRAITS2(Int32)
57VALUE_TRAITS2(Int64);
58VALUE_TRAITS2(Float16);
59VALUE_TRAITS2(Float32);
60VALUE_TRAITS2(BFloat16);
61VALUE_TRAITS(Real,Float64);
62VALUE_TRAITS2(Float128);
63VALUE_TRAITS2(Int128);
64
65} // namespace
66
67/*---------------------------------------------------------------------------*/
68/*---------------------------------------------------------------------------*/
69
70template <typename DataType>
71class SerializeValue
72: public ISerializeValue
73{
74 using ValueTraitsType = ValueTraits<DataType>;
75
76 public:
77
78 SerializeValue()
79 : m_data_type(ValueTraitsType::dataType())
80 {}
81
82 public:
83
84 void serialize(ISerializer* s) override
85 {
86 Int64 size = m_array_values.size();
87 switch (s->mode()) {
88 case ISerializer::ModeReserve:
89 std::cout << "ReserveArray type=" << m_data_type << " size=" << m_array_values.size() << "\n";
90 s->reserveArray(m_array_values);
91 if (size > 0)
92 s->reserve(m_data_type, 1);
93 break;
95 std::cout << "PutArray type=" << m_data_type << " size=" << m_array_values.size() << "\n";
96 s->putArray(m_array_values);
97 if (size > 0)
98 s->put(m_array_values[0]);
99 break;
101 s->getArray(m_result_array_values);
102 if (size > 0)
103 ValueTraitsType::getValue(s, m_unique_value);
104 }
105 }
106
107 void checkValid() override
108 {
109 std::cout << "ref_size=" << m_array_values.size()
110 << " result_size=" << m_result_array_values.size() << "\n";
111 ASSERT_EQ(m_array_values, m_result_array_values);
112 ASSERT_EQ(m_array_values[0], m_unique_value);
113 }
114
115 void resizeAndFill(Int32 size)
116 {
117 m_array_values.resize(size);
118 ValueFiller::fillRandom(542, m_array_values.span());
119 }
120
121 public:
122
123 UniqueArray<DataType> m_array_values;
124 UniqueArray<DataType> m_result_array_values;
125 DataType m_unique_value = {};
127};
128
129/*---------------------------------------------------------------------------*/
130/*---------------------------------------------------------------------------*/
131
132class StringSerializeValue
133: public ISerializeValue
134{
135 public:
136
137 explicit StringSerializeValue(const String& v)
138 {
139 m_ref_string.add(v);
140 }
141 explicit StringSerializeValue(Span<String> v)
142 {
143 m_ref_string.addRange(v);
144 }
145
146 public:
147
148 void serialize(ISerializer* s) override
149 {
150 const Arcane::SerializerExtension se(s);
151 Int64 size = m_ref_string.size();
152 switch (s->mode()) {
153 case ISerializer::ModeReserve:
154 std::cout << "ReserveArray type=String size=" << m_ref_string.size() << "\n";
155 se.reserveArray(m_ref_string);
156 if (size > 0)
157 s->reserve(m_ref_string[0]);
158 break;
160 std::cout << "PutArray type=String size=" << m_ref_string.size() << "\n";
161 se.putArray(m_ref_string);
162 if (size > 0)
163 s->put(m_ref_string[0]);
164 break;
166 se.getArray(m_result_string);
167 if (size > 0)
168 s->get(m_unique_value);
169 }
170 }
171
172 void checkValid() override
173 {
174 std::cout << "ref_size=" << m_ref_string.size()
175 << " result_size=" << m_result_string.size() << "\n";
176 for (Integer i = 0; i < m_ref_string.size(); ++i) {
177 // std::cout << m_ref_string[i] << " == " << m_result_string[i] << std::endl;
178 ASSERT_EQ(m_ref_string[i], m_result_string[i]);
179 }
180 if (!m_ref_string.empty()) {
181 // std::cout << m_ref_string[0] << " == " << m_unique_value << std::endl;
182 ASSERT_EQ(m_ref_string[0], m_unique_value);
183 }
184 }
185
186 public:
187
188 UniqueArray<String> m_ref_string;
189 UniqueArray<String> m_result_string;
190 String m_unique_value;
191};
192
193/*---------------------------------------------------------------------------*/
194/*---------------------------------------------------------------------------*/
195
196template <typename DataType>
197class Serialize2DValue
198: public ISerializeValue
199{
200 using ValueTraitsType = ValueTraits<DataType>;
201
202public:
203
204 Serialize2DValue()
205 : m_data_type(ValueTraitsType::dataType())
206 {}
207
208public:
209
210 void serialize(ISerializer* s) override
211 {
212 const Arcane::SerializerExtension se(s);
213 switch (s->mode()) {
214 case ISerializer::ModeReserve:
215 std::cout << "ReserveArray type=" << m_data_type << " size1=" << m_array_values.dim1Size() << " size2=" << m_array_values.dim2Size() << "\n";
216 se.reserveArray(m_array_values.constSpan());
217 break;
219 std::cout << "PutArray type=" << m_data_type << " size1=" << m_array_values.dim1Size() << " size2=" << m_array_values.dim2Size() << "\n";
220 se.putArray(m_array_values.constSpan());
221 break;
223 se.getArray(m_result_array_values);
224 }
225 }
226
227 void checkValid() override
228 {
229 std::cout << "ref_size1=" << m_array_values.dim1Size()
230 << " ref_size2=" << m_array_values.dim2Size()
231 << " result_size1=" << m_result_array_values.dim1Size()
232 << " result_size2=" << m_result_array_values.dim2Size() << "\n";
233 for (Int32 i = 0; i < m_array_values.dim1Size(); ++i) {
234 ASSERT_EQ(m_array_values[i], m_result_array_values[i]);
235 }
236 }
237
238 void resizeAndFill(Int32 size1, Int32 size2)
239 {
240 m_array_values.resize(size1, size2);
241 ValueFiller::fillRandom(542, m_array_values.to1DSpan());
242 }
243
244public:
245
246 UniqueArray2<DataType> m_array_values;
247 UniqueArray2<DataType> m_result_array_values;
249};
250
251/*---------------------------------------------------------------------------*/
252/*---------------------------------------------------------------------------*/
253
254template <typename DataType, typename Extents>
255class MDSerializeValue
256: public ISerializeValue
257{
258 using ValueTraitsType = ValueTraits<DataType>;
259
260 public:
261
262 MDSerializeValue()
263 : m_data_type(ValueTraitsType::dataType())
264 {}
265
266 public:
267
268 void serialize(ISerializer* s) override
269 {
270 const Arcane::SerializerExtension se(s);
271 switch (s->mode()) {
272 case ISerializer::ModeReserve:
273 std::cout << "ReserveArray type=" << m_data_type << " dim=" << Extents::rank() << " total_size=" << m_array_values.totalNbElement() << "\n";
274 se.reserveArray(m_array_values.constSpan());
275 break;
277 std::cout << "PutArray type=" << m_data_type << " dim=" << Extents::rank() << " total_size=" << m_array_values.totalNbElement() << "\n";
278 se.putArray(m_array_values.constSpan());
279 break;
281 se.getArray(m_result_array_values);
282 }
283 }
284
285 void checkValid() override
286 {
287 std::cout << "ref_size=" << m_array_values.totalNbElement()
288 << " result_size=" << m_result_array_values.totalNbElement() << "\n";
289 //TODO : Vérifier les dimensions.
290 ASSERT_EQ(m_array_values.to1DSpan(), m_result_array_values.to1DSpan());
291 }
292
293 void resizeAndFill(Arcane::MDIndex<Extents::rank(), typename Extents::ExtentIndexType> size)
294 {
295 m_array_values.resize(size);
296 ValueFiller::fillRandom(542, m_array_values.to1DSpan());
297 }
298
299 public:
300
302 Arcane::NumArray<DataType, Extents> m_result_array_values;
304};
305
306/*---------------------------------------------------------------------------*/
307/*---------------------------------------------------------------------------*/
308
310{
311 public:
312
314 {
315 for (ISerializeValue* v : m_values)
316 delete v;
317 }
318 void doSerialize(ISerializer* s)
319 {
320 for (ISerializeValue* v : m_values)
321 v->serialize(s);
322 }
323 void checkValid()
324 {
325 for (ISerializeValue* v : m_values)
326 v->checkValid();
327 }
328
329 template <typename DataType>
330 void add(Int32 size)
331 {
332 auto* sval = new SerializeValue<DataType>();
333 sval->resizeAndFill(size);
334 m_values.add(sval);
335 }
336 void addString(const String& v)
337 {
338 m_values.add(new StringSerializeValue(v));
339 }
340
341 void addString(Span<String> v)
342 {
343 m_values.add(new StringSerializeValue(v));
344 }
345
346 template <typename DataType>
347 void add(Int32 size1, Int32 size2)
348 {
349 auto* sval = new Serialize2DValue<DataType>();
350 sval->resizeAndFill(size1, size2);
351 m_values.add(sval);
352 }
353
354 template <typename DataType, typename Extents>
355 void add(Arcane::MDIndex<Extents::rank(), typename Extents::ExtentIndexType> size)
356 {
357 auto* sval = new MDSerializeValue<DataType, Extents>();
358 sval->resizeAndFill(size);
359 m_values.add(sval);
360 }
361
362 public:
363
365};
366
367/*---------------------------------------------------------------------------*/
368/*---------------------------------------------------------------------------*/
369
370void _doMisc()
371{
372 Ref<ISerializer> serializer_ref = createSerializer();
373 ISerializer* serializer = serializer_ref.get();
374
375 SerializeValueList values;
376
377 values.add<Float16>(12679);
378 values.add<BFloat16>(3212);
379 values.add<Int8>(6357);
380 values.add<Float32>(983);
381 values.add<Int16>(16353);
382 values.add<Real>(29123);
383 values.add<Int32>(16);
384 values.add<Byte>(3289);
385 values.add<Int64>(12932);
386 values.add<Float128>(19328);
387 values.add<Int128>(32422);
388
389 values.addString("Ceci est un test de chaîne de caractères");
390 values.addString(UniqueArray<String>({ "Ceci", "est", "un", "test", "de", "chaîne", "de", "caractères" }));
391
392 values.add<Real>(29, 123);
393 values.add<Int32>(16, 23);
394
395 values.add<Float16, Arcane::MDDim1>(125);
396 values.add<BFloat16, Arcane::MDDim2>({ 51, 21 });
397 values.add<Int8, Arcane::MDDim3>({ 12, 9, 45 });
398 values.add<Float32, Arcane::MDDim4>({ 14, 45, 1, 4 });
399 values.add<Int16, Arcane::MDDim1>(15);
400 values.add<Real, Arcane::MDDim2>({ 84, 31 });
401 values.add<Int32, Arcane::MDDim3>({ 25, 19, 41 });
402 values.add<Byte, Arcane::MDDim4>({ 12, 17, 26, 4 });
403 values.add<Int64, Arcane::MDDim1>(18);
404 values.add<Float128, Arcane::MDDim2>({ 41, 48 });
405
406 serializer->setMode(ISerializer::ModeReserve);
407 values.doSerialize(serializer);
408 serializer->allocateBuffer();
409 serializer->setMode(ISerializer::ModePut);
410 values.doSerialize(serializer);
411 serializer->setMode(ISerializer::ModeGet);
412 values.doSerialize(serializer);
413
414 values.checkValid();
415}
416
417TEST(Serialize, Misc)
418{
419 try {
420 _doMisc();
421 }
422 catch (const Exception& e) {
423 e.write(std::cerr);
424 throw;
425 }
426}
Fichier contenant les définitions des types de données basiques gérés par Arccore.
Gestion des références à une classe C++.
Classe de base d'une exception.
virtual void reserve(eBasicDataType dt, Int64 n)=0
Réserve de la mémoire pour n objets de type dt.
virtual void putArray(Span< const Real > values)=0
Sauve le nombre d'éléments et les values éléments.
virtual void reserveArray(Span< const Real > values)=0
Réserve pour sauver le nombre d'éléments et les values éléments.
virtual void getArray(Array< Real > &values)=0
Redimensionne et remplit values.
@ ModePut
Le sérialiseur attend des reserve().
virtual void allocateBuffer()=0
Alloue la mémoire du sérialiseur.
virtual void put(Span< const Real > values)=0
Ajoute le tableau values.
virtual eMode mode() const =0
Mode de fonctionnement actuel.
virtual void get(ArrayView< Real > values)=0
Récupère le tableau values.
virtual void setMode(eMode new_mode)=0
Positionne le fonctionnement actuel.
Tableaux multi-dimensionnels pour les types numériques accessibles sur accélérateurs.
InstanceType * get() const
Instance associée ou nullptr si aucune.
Référence à une instance.
Classe qui étend les fonctionnalités de l'ISerializer.
void reserveArray(Span2< const Type > values) const
Réserve pour sauver le nombre d'éléments et les values éléments.
void putArray(Span2< const Type > values) const
Sauve le nombre d'éléments et les values éléments.
void getArray(Array2< Type > &values) const
Redimensionne et remplit values.
Vue d'un tableau d'éléments de type T.
Definition Span.h:633
Chaîne de caractères unicode.
Vecteur de données 2D avec sémantique par valeur (style STL).
Vecteur 1D de données avec sémantique par valeur (style STL).
Int32 Integer
Type représentant un entier.
eBasicDataType
Type d'une donnée de base.
@ Unknown
Donnée de type inconnu ou non initialisé
ExtentsV< Int32, DynExtent, DynExtent, DynExtent, DynExtent > MDDim4
Constante pour un tableau dynamique de rang 4.
unsigned char Byte
Type d'un octet.
Definition BaseTypes.h:42
ExtentsV< Int32, DynExtent, DynExtent > MDDim2
Constante pour un tableau dynamique de rang 2.
ExtentsV< Int32, DynExtent > MDDim1
Constante pour un tableau dynamique de rang 1.
ExtentsV< Int32, DynExtent, DynExtent, DynExtent > MDDim3
Constante pour un tableau dynamique de rang 3.
Espace de nom de Arccore.
Arcane::Float128 Float128
Type représentant un floattan sur 128 bits.
Arcane::BFloat16 BFloat16
Type 'Brain Float16'.
float Float32
Type flottant IEEE-753 simple précision (binary32).
Arcane::Float16 Float16
Type 'Float16' (binary16).
ARCCORE_SERIALIZE_EXPORT Ref< ISerializer > createSerializer()
Créé une instance de ISerializer.
Arcane::Int8 Int8
Type représentant un entier sur 8 bits.
Arcane::Int128 Int128
Type représentant un entier sur 128 bits.