Arcane  v3.14.10.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"
14
15using namespace Arccore;
16
17/*---------------------------------------------------------------------------*/
18/*---------------------------------------------------------------------------*/
19
21{
22 public:
23
24 virtual ~ISerializeValue() = default;
25
26 virtual void serialize(ISerializer* s) = 0;
27 virtual void checkValid() = 0;
28};
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32namespace
33{
34template <typename T> class ValueTraits;
35#define VALUE_TRAITS(type_name) \
36 template <> class ValueTraits<type_name> \
37 { \
38 public: \
39\
40 static ISerializer::eDataType dataType() { return ISerializer::DT_##type_name; } \
41 static void getValue(ISerializer* s, type_name& v) { v = s->get##type_name(); } \
42 };
43
44VALUE_TRAITS(Byte);
45VALUE_TRAITS(Int8);
46VALUE_TRAITS(Int16);
47VALUE_TRAITS(Int32)
48VALUE_TRAITS(Int64);
49VALUE_TRAITS(Float16);
50VALUE_TRAITS(Float32);
51VALUE_TRAITS(BFloat16);
52VALUE_TRAITS(Real);
53
54} // namespace
55
56/*---------------------------------------------------------------------------*/
57/*---------------------------------------------------------------------------*/
58
59template <typename DataType>
61: public ISerializeValue
62{
63 using ValueTraitsType = ValueTraits<DataType>;
64
65 public:
66
68 : m_data_type(ValueTraitsType::dataType())
69 {}
70
71 public:
72
73 void serialize(ISerializer* s) override
74 {
75 Int64 size = m_array_values.size();
76 switch (s->mode()) {
77 case ISerializer::ModeReserve:
78 s->reserveArray(m_array_values);
79 if (size > 0)
80 s->reserve(m_data_type, 1);
81 break;
83 s->putArray(m_array_values);
84 if (size > 0)
85 s->put(m_array_values[0]);
86 break;
88 s->getArray(m_result_array_values);
89 if (size > 0)
90 ValueTraitsType::getValue(s, m_unique_value);
91 }
92 }
93
94 void checkValid() override
95 {
96 std::cout << "ref_size=" << m_array_values.size()
97 << " result_size=" << m_result_array_values.size() << "\n";
98 ASSERT_EQ(m_array_values, m_result_array_values);
99 ASSERT_EQ(m_array_values[0], m_unique_value);
100 }
101
102 void resizeAndFill(Int32 size)
103 {
104 m_array_values.resize(size);
105 ValueFiller::fillRandom(542, m_array_values.span());
106 }
107
108 public:
109
110 UniqueArray<DataType> m_array_values;
111 UniqueArray<DataType> m_result_array_values;
112 DataType m_unique_value = {};
113 ISerializer::eDataType m_data_type;
114};
115
116/*---------------------------------------------------------------------------*/
117/*---------------------------------------------------------------------------*/
118
120: public ISerializeValue
121{
122 public:
123
124 explicit StringSerializeValue(const String& v)
125 : m_ref_string(v)
126 {}
127
128 public:
129
130 void serialize(ISerializer* s) override
131 {
132 switch (s->mode()) {
133 case ISerializer::ModeReserve:
134 s->reserve(m_ref_string);
135 break;
137 s->put(m_ref_string);
138 break;
140 s->get(m_result_string);
141 }
142 }
143
144 void checkValid() override
145 {
146 ASSERT_EQ(m_ref_string, m_result_string);
147 }
148
149 public:
150
151 String m_ref_string;
152 String m_result_string;
153};
154
155/*---------------------------------------------------------------------------*/
156/*---------------------------------------------------------------------------*/
157
159{
160 public:
161
163 {
164 for (ISerializeValue* v : m_values)
165 delete v;
166 }
167 void doSerialize(ISerializer* s)
168 {
169 for (ISerializeValue* v : m_values)
170 v->serialize(s);
171 }
172 void checkValid()
173 {
174 for (ISerializeValue* v : m_values)
175 v->checkValid();
176 }
177
178 template <typename DataType> void add(Int32 size)
179 {
180 auto* sval = new SerializeValue<DataType>();
181 sval->resizeAndFill(size);
182 m_values.add(sval);
183 }
184 void addString(const String& v)
185 {
186 m_values.add(new StringSerializeValue(v));
187 }
188
189 public:
190
192};
193
194/*---------------------------------------------------------------------------*/
195/*---------------------------------------------------------------------------*/
196
197void _doMisc()
198{
199 Ref<ISerializer> serializer_ref = createSerializer();
200 ISerializer* serializer = serializer_ref.get();
201
202 SerializeValueList values;
203
204 values.add<Float16>(12679);
205 values.add<BFloat16>(3212);
206 values.add<Int8>(6357);
207 values.add<Float32>(983);
208 values.add<Int16>(16353);
209 values.add<Real>(29123);
210 values.add<Int32>(16);
211 values.add<Byte>(3289);
212 values.add<Int64>(12932);
213 values.addString("Ceci est un test de chaîne de caractères");
214
215 serializer->setMode(ISerializer::ModeReserve);
216 values.doSerialize(serializer);
217 serializer->allocateBuffer();
218 serializer->setMode(ISerializer::ModePut);
219 values.doSerialize(serializer);
220 serializer->setMode(ISerializer::ModeGet);
221 values.doSerialize(serializer);
222
223 values.checkValid();
224}
225
226TEST(Serialize, Misc)
227{
228 try {
229 _doMisc();
230 }
231 catch (const Exception& e) {
232 e.write(std::cerr);
233 throw;
234 }
235}
Gestion des références à une classe C++.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Integer size() const
Nombre d'éléments du vecteur.
Span< const T > span() const
Vue immutable sur ce tableau.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Classe de base d'une exception.
Type flottant demi-précision.
virtual void get(RealArrayView values)=0
Récupère le tableau values.
virtual void allocateBuffer()=0
Alloue la mémoire du sérialiseur.
virtual void getArray(Array< Real > &values)=0
Redimensionne et remplit values.
virtual void reserve(eDataType 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 eMode mode() const =0
Mode de fonctionnement actuel.
virtual void put(Span< const Real > values)=0
Ajoute le tableau values.
virtual void setMode(eMode new_mode)=0
Positionne le fonctionnement actuel.
virtual void reserveArray(Span< const Real > values)=0
Réserve pour sauver le nombre d'éléments et les values éléments.
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).
Espace de nom de Arccore.
Definition ArcaneTypes.h:24
ARCCORE_SERIALIZE_EXPORT Ref< ISerializer > createSerializer()
Créé une instance de ISerializer.
float Float32
Type flottant IEEE-753 simple précision.
std::int64_t Int64
Type entier signé sur 64 bits.
std::int32_t Int32
Type entier signé sur 32 bits.
std::int8_t Int8
Type entier signé sur 8 bits.
unsigned char Byte
Type d'un octet.
Definition BaseTypes.h:43