Arcane  v4.1.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"
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 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.
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.
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).
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.