Arcane  v3.16.0.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-2024 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
18using namespace Arccore;
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
24{
25 public:
26
27 virtual ~ISerializeValue() = default;
28
29 virtual void serialize(ISerializer* s) = 0;
30 virtual void checkValid() = 0;
31};
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35namespace
36{
37using Float64 = Real;
38template <typename T> class ValueTraits;
39#define VALUE_TRAITS(type_name,basic_type_name) \
40 template <> class ValueTraits<type_name> \
41 { \
42 public: \
43\
44 static eBasicDataType dataType() { return eBasicDataType::basic_type_name; } \
45 static void getValue(ISerializer* s, type_name& v) { v = s->get##type_name(); } \
46 };
47
48#define VALUE_TRAITS2(type_name) VALUE_TRAITS(type_name,type_name)
49
50VALUE_TRAITS2(Byte);
51VALUE_TRAITS2(Int8);
52VALUE_TRAITS2(Int16);
53VALUE_TRAITS2(Int32)
54VALUE_TRAITS2(Int64);
55VALUE_TRAITS2(Float16);
56VALUE_TRAITS2(Float32);
57VALUE_TRAITS2(BFloat16);
58VALUE_TRAITS(Real,Float64);
59VALUE_TRAITS2(Float128);
60VALUE_TRAITS2(Int128);
61
62} // namespace
63
64/*---------------------------------------------------------------------------*/
65/*---------------------------------------------------------------------------*/
66
67template <typename DataType>
68class SerializeValue
69: public ISerializeValue
70{
71 using ValueTraitsType = ValueTraits<DataType>;
72
73 public:
74
75 SerializeValue()
76 : m_data_type(ValueTraitsType::dataType())
77 {}
78
79 public:
80
81 void serialize(ISerializer* s) override
82 {
83 Int64 size = m_array_values.size();
84 switch (s->mode()) {
85 case ISerializer::ModeReserve:
86 std::cout << "ReserveArray type=" << m_data_type << " size=" << m_array_values.size() << "\n";
87 s->reserveArray(m_array_values);
88 if (size > 0)
89 s->reserve(m_data_type, 1);
90 break;
92 std::cout << "PutArray type=" << m_data_type << " size=" << m_array_values.size() << "\n";
93 s->putArray(m_array_values);
94 if (size > 0)
95 s->put(m_array_values[0]);
96 break;
98 s->getArray(m_result_array_values);
99 if (size > 0)
100 ValueTraitsType::getValue(s, m_unique_value);
101 }
102 }
103
104 void checkValid() override
105 {
106 std::cout << "ref_size=" << m_array_values.size()
107 << " result_size=" << m_result_array_values.size() << "\n";
108 ASSERT_EQ(m_array_values, m_result_array_values);
109 ASSERT_EQ(m_array_values[0], m_unique_value);
110 }
111
112 void resizeAndFill(Int32 size)
113 {
114 m_array_values.resize(size);
115 ValueFiller::fillRandom(542, m_array_values.span());
116 }
117
118 public:
119
120 UniqueArray<DataType> m_array_values;
121 UniqueArray<DataType> m_result_array_values;
122 DataType m_unique_value = {};
123 eBasicDataType m_data_type = eBasicDataType::Unknown;
124};
125
126/*---------------------------------------------------------------------------*/
127/*---------------------------------------------------------------------------*/
128
129class StringSerializeValue
130: public ISerializeValue
131{
132 public:
133
134 explicit StringSerializeValue(const String& v)
135 : m_ref_string(v)
136 {}
137
138 public:
139
140 void serialize(ISerializer* s) override
141 {
142 switch (s->mode()) {
143 case ISerializer::ModeReserve:
144 s->reserve(m_ref_string);
145 break;
147 s->put(m_ref_string);
148 break;
150 s->get(m_result_string);
151 }
152 }
153
154 void checkValid() override
155 {
156 ASSERT_EQ(m_ref_string, m_result_string);
157 }
158
159 public:
160
161 String m_ref_string;
162 String m_result_string;
163};
164
165/*---------------------------------------------------------------------------*/
166/*---------------------------------------------------------------------------*/
167
169{
170 public:
171
173 {
174 for (ISerializeValue* v : m_values)
175 delete v;
176 }
177 void doSerialize(ISerializer* s)
178 {
179 for (ISerializeValue* v : m_values)
180 v->serialize(s);
181 }
182 void checkValid()
183 {
184 for (ISerializeValue* v : m_values)
185 v->checkValid();
186 }
187
188 template <typename DataType> void add(Int32 size)
189 {
190 auto* sval = new SerializeValue<DataType>();
191 sval->resizeAndFill(size);
192 m_values.add(sval);
193 }
194 void addString(const String& v)
195 {
196 m_values.add(new StringSerializeValue(v));
197 }
198
199 public:
200
202};
203
204/*---------------------------------------------------------------------------*/
205/*---------------------------------------------------------------------------*/
206
207void _doMisc()
208{
209 Ref<ISerializer> serializer_ref = createSerializer();
210 ISerializer* serializer = serializer_ref.get();
211
212 SerializeValueList values;
213
214 values.add<Float16>(12679);
215 values.add<BFloat16>(3212);
216 values.add<Int8>(6357);
217 values.add<Float32>(983);
218 values.add<Int16>(16353);
219 values.add<Real>(29123);
220 values.add<Int32>(16);
221 values.add<Byte>(3289);
222 values.add<Int64>(12932);
223 values.add<Float128>(19328);
224 values.add<Int128>(32422);
225 values.addString("Ceci est un test de chaîne de caractères");
226
227 serializer->setMode(ISerializer::ModeReserve);
228 values.doSerialize(serializer);
229 serializer->allocateBuffer();
230 serializer->setMode(ISerializer::ModePut);
231 values.doSerialize(serializer);
232 serializer->setMode(ISerializer::ModeGet);
233 values.doSerialize(serializer);
234
235 values.checkValid();
236}
237
238TEST(Serialize, Misc)
239{
240 try {
241 _doMisc();
242 }
243 catch (const Exception& e) {
244 e.write(std::cerr);
245 throw;
246 }
247}
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 allocateBuffer()=0
Alloue la mémoire du sérialiseur.
virtual void setMode(eMode new_mode)=0
Positionne le fonctionnement actuel.
Référence à une instance.
InstanceType * get() const
Instance associée ou nullptr si aucune.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
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 eMode mode() const =0
Mode de fonctionnement actuel.
virtual void getArray(Array< Real > &values)=0
Redimensionne et remplit values.
virtual void put(Span< const Real > values)=0
Ajoute le tableau values.
virtual void get(ArrayView< Real > values)=0
Récupère le tableau values.
eBasicDataType
Type d'une donnée de base.
unsigned char Byte
Type d'un octet.
Definition BaseTypes.h:43
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.