Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
VariableRef.h
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/*---------------------------------------------------------------------------*/
8/* VariableRef.h (C) 2000-2024 */
9/* */
10/* Classe gérant une référence sur une variable. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_VARIABLEREF_H
13#define ARCANE_CORE_VARIABLEREF_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/String.h"
18
19#include "arcane/core/IVariable.h"
20#include "arcane/core/VariableComputeFunction.h"
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31class IModule;
32class IVariableComputeFunction;
33class VariableBuildInfo;
34typedef VariableBuildInfo VariableBuilder;
35
36/*---------------------------------------------------------------------------*/
37/*---------------------------------------------------------------------------*/
38/*!
39 * \ingroup Variable
40 * \brief Référence à une variable.
41 *
42 * Cette classe gère une référence sur une variable (IVariable).
43 *
44 * Si la variable n'est pas associée à un module, la méthode module() retourne 0.
45 *
46 * Cette classe doit obligatoirement être dérivée.
47 *
48 * La classe la plus dérivée de cette classe doit appeler _internalInit()
49 * dans son constructeur. Elle seule doit le faire, et dans le constructeur
50 * pour garantir que la référence à la variable est valide dès que
51 * l'objet est construit et que les méthodes virtuelles qui doivent être appelés
52 * lors de cette initialisation correspondent à l'instance en cours
53 * de création.
54 */
55class ARCANE_CORE_EXPORT VariableRef
56{
57 public:
58
60 friend class UpdateNotifyFunctorList;
61
62 protected:
63
64 //! Construit une référence sur une variable avec les infos \a vbi
65 explicit VariableRef(const VariableBuildInfo& vbi);
66 //! Constructeur de copie
67 VariableRef(const VariableRef& from);
68 //! Construit une référence sur une variable \a var
69 explicit VariableRef(IVariable* var);
70 //! Opérateur de recopie
71 VariableRef& operator=(const VariableRef& from);
72 //! Constructeur vide
74
75 public:
76
77 //! Libère les ressources
78 virtual ~VariableRef();
79
80 public:
81
82 //! Sous-domaine associé à la variable (TODO rendre obsolète fin 2023)
83 ISubDomain* subDomain() const;
84
85 public:
86
87 //! Gestionnaire de variable associé à la variable.
88 IVariableMng* variableMng() const;
89
90 //! Nom de la variable
91 String name() const;
92
93 public:
94
95 //TODO Supprimer virtual
96 //! Type de la variable (Real, Integer, ...)
97 virtual eDataType dataType() const;
98
99 //! Affiche la valeur de la variable
100 virtual void print(std::ostream& o) const;
101
102 //TODO Supprimer virtual
103 //! Module associé à la variable (ou nullptr, s'il n'y en a pas)
104 virtual IModule* module() const { return m_module; }
105
106 //TODO Supprimer virtual
107 //! Propriétés de la variable
108 virtual int property() const;
109
110 //! Propriétés de la référence (interne)
111 virtual int referenceProperty() const;
112
113 //! Positionne la propriété \a property
114 virtual void setProperty(int property);
115
116 //! Supprime la propriété \a property
117 virtual void unsetProperty(int property);
118
119 //! Enregistre la variable (interne)
120 virtual void registerVariable();
121
122 //! Supprime l'enregistrement de la variable (interne)
123 virtual void unregisterVariable();
124
125 //! Variable associée
126 IVariable* variable() const { return m_variable; }
127
128 /*! \brief Vérifie si la variable est bien synchronisée.
129 * \sa IVariable::checkIfSync()
130 */
131 virtual Integer checkIfSync(int max_print = 0);
132
133 /*!
134 * \brief Vérifie si la variable a les mêmes valeurs sur tous les réplicas.
135 * \sa IVariable::checkIfSameOnAllReplica()
136 */
137 virtual Integer checkIfSameOnAllReplica(int max_print = 0);
138
139 //! Mise à jour à partir de la partie interne
140 virtual void updateFromInternal();
141
142 //! Si la variable est un tableau, retourne sa dimension, sinon retourne 0
143 virtual Integer arraySize() const { return 0; }
144
145 public:
146
147 void setUsed(bool v) { m_variable->setUsed(v); }
148 bool isUsed() const { return m_variable->isUsed(); }
149
150 virtual void internalSetUsed(bool /*v*/) {}
151
152 public:
153
154 /*!
155 * \brief Pile d'appel au moment de l'assignation de cette instance.
156 *
157 * La pile n'est accessible qu'en mode vérification ou débug. Si
158 * ce n'est pas le cas, retourne une chaîne nulle.
159 */
160 const String& assignmentStackTrace() const { return m_assignment_stack_trace; }
161
162 public:
163
164 //@{ @name Gestion des tags
165 //! Ajoute le tag \a tagname avev la valeur \a tagvalue
166 void addTag(const String& tagname, const String& tagvalue);
167 /*! \brief Supprime le tag \a tagname
168 *
169 * Si le tag \a tagname n'est pas dans la liste, rien ne se passe.
170 */
171 void removeTag(const String& tagname);
172 //! \a true si la variable possède le tag \a tagname
173 bool hasTag(const String& tagname) const;
174 //! Valeur du tag \a tagname. La chaîne est nulle si le tag n'existe pas.
175 String tagValue(const String& tagname) const;
176 //@}
177
178 public:
179
180 /*!
181 * \name Gestion des dépendances
182 *
183 * Opérations liées à la gestion des dépendances des variables.
184 */
185 //@{
186 /*! \brief Recalcule la variable si nécessaire
187 *
188 * Par le mécanisme de dépendances, cette opération est appelée récursivement
189 * sur toutes les variables dont dépend l'instance. La fonction de recalcul
190 * computeFunction() est ensuite appelée s'il s'avère qu'une des variables
191 * dont elle dépend a été modifiée plus récemment.
192 */
193 void update();
194
195 /*! \brief Indique que la variable vient d'être mise à jour.
196 *
197 * Pour une gestion correcte des dépendances, il faut que cette propriété
198 * soit appelée toutes les fois où la mise à jour d'une variable a été
199 * effectuée.
200 */
201 void setUpToDate();
202
203 //! Temps auquel la variable a été mise à jour
204 Int64 modifiedTime();
205
206 //! Ajoute \a var à la liste des dépendances au temps courant
207 void addDependCurrentTime(const VariableRef& var);
208
209 //! Ajoute \a var à la liste des dépendances au temps courant avec les infos de trace \a tinfo
210 void addDependCurrentTime(const VariableRef& var, const TraceInfo& tinfo);
211
212 //! Ajoute \a var à la liste des dépendances au temps précédent
213 void addDependPreviousTime(const VariableRef& var);
214
215 //! Ajoute \a var à la liste des dépendances au temps précédent avec les infos de trace \a tinfo
216 void addDependPreviousTime(const VariableRef& var, const TraceInfo& tinfo);
217
218 /*! \brief Supprime \a var de la liste des dépendances
219 */
220 void removeDepend(const VariableRef& var);
221
222 /*!
223 * \brief Positionne la fonction de recalcule de la variable.
224 *
225 * Si une fonction de recalcule existait déjà, elle est détruite
226 * et remplacée par celle-ci.
227 */
228 template <typename ClassType> void
229 setComputeFunction(ClassType* instance, void (ClassType::*func)())
230 {
231 _setComputeFunction(new VariableComputeFunction(instance, func));
232 }
233
234 /*!
235 * \brief Positionne la fonction de recalcule de la variable.
236 *
237 * Si une fonction de recalcule existait déjà, elle est détruite
238 * et remplacée par celle-ci.
239 * \a tinfo contient les infos permettant de savoir où est défini la fonction (pour le débug)
240 */
241 template <typename ClassType> void
242 setComputeFunction(ClassType* instance, void (ClassType::*func)(), const TraceInfo& tinfo)
243 {
244 _setComputeFunction(new VariableComputeFunction(instance, func, tinfo));
245 }
246 //@}
247
248 public:
249
250 //! Référence précédente (ou null) sur variable()
251 VariableRef* previousReference();
252
253 //! Référence suivante (ou null) sur variable()
254 VariableRef* nextReference();
255
256 /*!
257 * \internal
258 * \brief Positionne la référence précédente.
259 *
260 * For internal use only.
261 */
262 void setPreviousReference(VariableRef* v);
263
264 /*!
265 * \internal
266 * \brief Positionne la référence suivante.
267 *
268 * For internal use only.
269 */
270 void setNextReference(VariableRef* v);
271
272 public:
273
274 static void setTraceCreation(bool v);
275 static bool hasTraceCreation();
276
277 protected:
278
279 void _setComputeFunction(IVariableComputeFunction* v);
280
281 /*!
282 * \brief Initialisation interne de la variable.
283 *
284 * \warning Cette méthode doit <strong>obligatoirement</strong> être
285 * appelée dans le constructeur de la classe dérivée
286 * avant toute utilisation de la référence.
287 */
288 void _internalInit(IVariable*);
289
290 /*!
291 * \brief Variable référencée.
292 *
293 * Cette méthode vérifie qu'une variable est bien référencée.
294 */
296 {
297 _checkValid();
298 return m_variable;
299 }
300
301 private:
302
303 //! Variable associée
304 IVariable* m_variable = nullptr;
305
306 //! Module associé (ou 0 si aucun)
307 IModule* m_module = nullptr;
308
309 //! \a true si la variable a été enregistrée
310 bool m_is_registered = false;
311
312 //! Propriétés de la référence
313 int m_reference_property = 0;
314
315 //! Référence précédente sur \a m_variable
316 VariableRef* m_previous_reference = nullptr;
317
318 //! Référence suivante sur \a m_variable
319 VariableRef* m_next_reference = nullptr;
320
321 /*!
322 * \brief Pile d'appel lors de l'assignation de la variable.
323 *
324 * Utilisé uniquement lorsque les traces sont actives.
325 */
326 String m_assignment_stack_trace;
327
328 protected:
329
330 void _executeUpdateFunctors();
331
332 bool m_has_trace = false;
333
334 private:
335
336 void _checkValid() const
337 {
338#ifdef ARCANE_CHECK
339 if (!m_variable)
340 _throwInvalid();
341#endif
342 }
343 void _throwInvalid() const;
344 bool _checkValidPropertyChanged(int property);
345 void _setAssignmentStackTrace();
346
347 protected:
348
349 void _internalAssignVariable(const VariableRef& var);
350
351 private:
352
353 static bool m_static_has_trace_creation;
354 UpdateNotifyFunctorList* m_notify_functor_list = nullptr;
355};
356
357/*---------------------------------------------------------------------------*/
358/*---------------------------------------------------------------------------*/
359
360} // End variable Arcane
361
362/*---------------------------------------------------------------------------*/
363/*---------------------------------------------------------------------------*/
364
365#endif
366
367//TODO: a supprimer quand tous les codes inclueront directement ce fichier
368#include "arcane/VariableList.h"
Interface d'un module.
Definition IModule.h:39
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
Interface de la classe fonctor de recalcul d'une variable.
Interface du gestionnaire de variables.
Paramètres nécessaires à la construction d'une variable.
Interface de la classe fonctor de recalcul d'une variable.
Classe interne pour gérer les fonctor appelés lors de la mise à jour de la variable.
Référence à une variable.
Definition VariableRef.h:56
virtual IModule * module() const
Module associé à la variable (ou nullptr, s'il n'y en a pas)
void setComputeFunction(ClassType *instance, void(ClassType::*func)(), const TraceInfo &tinfo)
Positionne la fonction de recalcule de la variable.
IVariable * variable() const
Variable associée.
const String & assignmentStackTrace() const
Pile d'appel au moment de l'assignation de cette instance.
virtual Integer arraySize() const
Si la variable est un tableau, retourne sa dimension, sinon retourne 0.
void setComputeFunction(ClassType *instance, void(ClassType::*func)())
Positionne la fonction de recalcule de la variable.
IVariable * _variable() const
Variable référencée.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eDataType
Type d'une donnée.
Definition DataTypes.h:39