Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
PropertyMng.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* PropertyMng.cc (C) 2000-2022 */
9/* */
10/* Gestionnaire des protections. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/TraceAccessor.h"
15#include "arcane/utils/String.h"
16#include "arcane/utils/Ref.h"
17
18#include "arcane/IPropertyMng.h"
19#include "arcane/Properties.h"
20#include "arcane/ISerializer.h"
21#include "arcane/SerializeBuffer.h"
22#include "arcane/VariableTypes.h"
23#include "arcane/Observable.h"
24
25#include <map>
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
39: public TraceAccessor
40, public IPropertyMng
41{
42 public:
43 static const Int32 SERIALIZE_VERSION = 1;
44
45 public:
46 explicit PropertyMng(ITraceMng* tm);
47 ~PropertyMng() override;
48
49 public:
50 void build();
51
52 public:
53 ITraceMng* traceMng() const override { return TraceAccessor::traceMng(); }
54
55 public:
57 void destroyProperties(const Properties& p) override;
58 void registerProperties(const Properties& p) override;
59 void serialize(ISerializer* serializer) override;
60 void writeTo(ByteArray& bytes) override;
61 void readFrom(Span<const Byte> bytes) override;
62 void print(std::ostream& o) const override;
63 IObservable* writeObservable() override { return &m_write_observable; }
64 IObservable* readObservable() override { return &m_read_observable; }
65
66 private:
67 private:
68 typedef std::map<String, Properties> PropertiesMapType;
69
70 PropertiesMapType m_properties_map;
71 VariableArrayByte* m_property_values_var;
72 AutoDetachObservable m_write_observable;
73 AutoDetachObservable m_read_observable;
74};
75
76/*---------------------------------------------------------------------------*/
77/*---------------------------------------------------------------------------*/
78
79extern "C++" IPropertyMng*
80arcaneCreatePropertyMng(ITraceMng* tm)
81{
82 auto pm = new PropertyMng(tm);
83 pm->build();
84 return pm;
85}
86
87/*---------------------------------------------------------------------------*/
88/*---------------------------------------------------------------------------*/
89
90extern "C++" Ref<IPropertyMng>
91arcaneCreatePropertyMngReference(ITraceMng* tm)
92{
93 auto pm = arcaneCreatePropertyMng(tm);
94 return makeRef(pm);
95}
96
97/*---------------------------------------------------------------------------*/
98/*---------------------------------------------------------------------------*/
99
100PropertyMng::
101PropertyMng(ITraceMng* tm)
102: TraceAccessor(tm)
103, m_property_values_var(nullptr)
104{
105}
106
107/*---------------------------------------------------------------------------*/
108/*---------------------------------------------------------------------------*/
109
110PropertyMng::
111~PropertyMng()
112{
113 delete m_property_values_var;
114}
115
116/*---------------------------------------------------------------------------*/
117/*---------------------------------------------------------------------------*/
118
119/*---------------------------------------------------------------------------*/
120/*---------------------------------------------------------------------------*/
121
122void PropertyMng::
123build()
124{
125}
126
127/*---------------------------------------------------------------------------*/
128/*---------------------------------------------------------------------------*/
129
132{
133 //info() << "GETTING PROPERTIES name=" << full_name;
134 auto v = m_properties_map.find(full_name);
135 if (v != m_properties_map.end())
136 return v->second.impl();
137 return 0;
138}
139
140/*---------------------------------------------------------------------------*/
141/*---------------------------------------------------------------------------*/
142
145{
146 //TODO: vérifier pas encore présent.
147 m_properties_map.insert(std::make_pair(p.fullName(), p));
148}
149
150/*---------------------------------------------------------------------------*/
151/*---------------------------------------------------------------------------*/
152
155{
156 auto v = m_properties_map.find(p.fullName());
157 if (v != m_properties_map.end())
158 m_properties_map.erase(v);
159}
160
161/*---------------------------------------------------------------------------*/
162/*---------------------------------------------------------------------------*/
163
165serialize(ISerializer* serializer)
166{
167 switch (serializer->mode()) {
168 case ISerializer::ModeReserve:
169
170 {
171 serializer->reserve(DT_Int32, 1); // SERIALIZE_VERSION
172 serializer->reserve(DT_Int64, 1); // Nombre d'éléments dans la map
173
174 for (auto& v : m_properties_map) {
175 serializer->reserve(v.first);
176 //info() << "SERIALIZE RESERVE name=" << v->first;
177 v.second.serialize(serializer);
178 }
179 } break;
181 serializer->putInt32(SERIALIZE_VERSION); // SERIALIZE_VERSION
182 serializer->putInt64(m_properties_map.size()); // Nombre d'éléments dans la map
183
184 for (auto& v : m_properties_map) {
185 serializer->put(v.first);
186 //info() << "SERIALIZE PUT name=" << v->first;
187 v.second.serialize(serializer);
188 }
189 } break;
191
192 Int64 version = serializer->getInt32();
193 if (version != SERIALIZE_VERSION) {
194 // La relecture se fait avec une protection issue d'une ancienne version de Arcane
195 // et qui n'est pas compatible. Affiche un avertissement et ne fait rien.
196 // (NOTE: cela risque quand même de poser problême pour ceux qui utilisent les
197 // propriétés donc il faudrait peut-être faire un fatal ?)
198 pwarning() << "Can not reading properties from imcompatible checkpoint";
199 return;
200 }
201
202 Int64 n = serializer->getInt64();
203 String name;
204 for (Integer i = 0; i < n; ++i) {
205 serializer->get(name);
206 Properties p(this, name);
207 //info() << "SERIALIZE GET name=" << name;
208 p.serialize(serializer);
209 }
210 break;
211 }
212}
213
214/*---------------------------------------------------------------------------*/
215/*---------------------------------------------------------------------------*/
216
218writeTo(ByteArray& bytes)
219{
220 m_write_observable.notifyAllObservers();
221
223 sb.setSerializeTypeInfo(true);
224 sb.setMode(ISerializer::ModeReserve);
225 this->serialize(&sb);
226 sb.allocateBuffer();
227 sb.setMode(ISerializer::ModePut);
228 this->serialize(&sb);
229
230 Span<const Byte> buf_bytes = sb.globalBuffer();
231 info(4) << "SaveProperties nb_byte=" << buf_bytes.size();
232 bytes.copy(buf_bytes);
233}
234
235/*---------------------------------------------------------------------------*/
236/*---------------------------------------------------------------------------*/
237
240{
241 info(4) << "ReadProperties nb_read_byte=" << bytes.size();
242
244 sb.setSerializeTypeInfo(true);
245 sb.initFromBuffer(bytes);
246 this->serialize(&sb);
247
248 m_read_observable.notifyAllObservers();
249}
250
251/*---------------------------------------------------------------------------*/
252/*---------------------------------------------------------------------------*/
253
258print(std::ostream& o) const
259{
260 for (const auto& v : m_properties_map) {
261 const Properties& p = v.second;
262 o << '[' << p.fullName() << "]\n";
263 p.print(o);
264 o << '\n';
265 }
266}
267
268/*---------------------------------------------------------------------------*/
269/*---------------------------------------------------------------------------*/
270
271} // End namespace Arcane
272
273/*---------------------------------------------------------------------------*/
274/*---------------------------------------------------------------------------*/
Tableau d'items de types quelconques.
Observable qui appelle automatiquement IObservable::detachAllObservers() dans le destructeur.
Interface d'un observable.
virtual void build()=0
Construit l'instance.
Interface du gestionnaire des propriétés.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
void notifyAllObservers() override
Notifie tous les observateurs.
Definition Observable.cc:72
Liste de propriétés.
Definition Properties.h:64
Gestionnaire des protections.
void print(std::ostream &o) const override
Affiche les propriétés et leurs valeurs sur le flot o.
void destroyProperties(const Properties &p) override
Supprime les propriétés référencées par p.
IObservable * readObservable() override
Observable pour la lecture.
IObservable * writeObservable() override
Observable pour l'écriture.
void serialize(ISerializer *serializer) override
Effectue la sérialisation.
PropertiesImpl * getPropertiesImpl(const String &full_name) override
Récupère la liste de propriétés de nom complet full_name.
void writeTo(ByteArray &bytes) override
Sérialise les informations de propriété dans bytes.
void registerProperties(const Properties &p) override
Enregister les propriétés référencées par p.
void readFrom(Span< const Byte > bytes) override
Relit les informations sérialisées contenues dans bytes.
Implémentation d'un tampon pour la sérialisation.
virtual void get(RealArrayView values)=0
Récupère le tableau values.
virtual Int32 getInt32()=0
Récupère un entier naturel.
virtual void putInt32(Int32 value)=0
Ajoute l'entier value.
virtual Int64 getInt64()=0
Récupère une taille.
virtual void reserve(eDataType dt, Int64 n)=0
Réserve de la mémoire pour n objets de type dt.
virtual eMode mode() const =0
Mode de fonctionnement actuel.
virtual void put(Span< const Real > values)=0
Ajoute le tableau values.
virtual void putInt64(Int64 value)=0
Ajoute l'entier value.
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
TraceMessage pwarning() const
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessage info() const
Flot pour un message d'information.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
@ DT_Int32
Donnée de type entier 32 bits.
Definition DataTypes.h:43
@ DT_Int64
Donnée de type entier 64 bits.
Definition DataTypes.h:44
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.