14#include "arcane/utils/ArcanePrecomp.h"
15#include "arcane/utils/ITraceMng.h"
16#include "arcane/utils/InvalidArgumentException.h"
17#include "arcane/utils/IStackTraceService.h"
18#include "arcane/utils/TraceInfo.h"
19#include "arcane/utils/PlatformUtils.h"
21#include "arcane/VariableRef.h"
22#include "arcane/VariableBuildInfo.h"
23#include "arcane/ISubDomain.h"
24#include "arcane/IModule.h"
25#include "arcane/IVariableMng.h"
26#include "arcane/ArcaneException.h"
55 typedef void (*ChangedFunc)();
57 UpdateNotifyFunctorList() : m_is_destroyed(
false){}
59 std::set<ChangedFunc> m_funcs;
64 std::set<ChangedFunc>::const_iterator begin = m_funcs.begin();
65 std::set<ChangedFunc>::const_iterator end = m_funcs.end();
66 for( ; begin!=end; ++begin ){
67 ChangedFunc f = *begin;
76 m_is_destroyed =
true;
81 void add(ChangedFunc f)
86 void remove(ChangedFunc f)
99 if (!var->m_notify_functor_list){
102 var->m_notify_functor_list->add(func);
103 return var->m_notify_functor_list;
105 static void _remove(UpdateNotifyFunctorList* functor_list,
111 functor_list->remove(func);
117 if (m_is_destroyed && m_funcs.empty())
128, m_reference_property(vbi.
property())
132 _setAssignmentStackTrace();
141, m_reference_property(var->
property())
145 _setAssignmentStackTrace();
167: m_variable(from.m_variable)
168, m_module(from.m_module)
169, m_reference_property(from.m_reference_property)
171 _setAssignmentStackTrace();
187 if (rhs.m_variable != m_variable)
188 _internalAssignVariable(rhs);
202 if (m_notify_functor_list)
203 m_notify_functor_list->destroy();
212_setAssignmentStackTrace()
214 m_assignment_stack_trace =
String();
215 if (hasTraceCreation()){
230 m_variable->removeVariableRef(
this);
231 m_is_registered =
false;
241 m_variable->addVariableRef(
this);
242 m_is_registered =
true;
267 return m_variable->dataType();
274print(std::ostream& o)
const
277 m_variable->print(o);
287 return m_variable->name();
297 return m_variable->property();
307 return m_variable->subDomain();
317 return m_variable->variableMng();
327 return m_variable->checkIfSync(max_print);
337 return m_variable->checkIfSameOnAllReplica(max_print);
346 return m_reference_property;
363 String msg(
"Using a reference on a uninitialized variable");
373 if (!_checkValidPropertyChanged(
property))
376 m_variable->notifyReferencePropertyChanged();
385 if (!_checkValidPropertyChanged(
property))
388 m_variable->notifyReferencePropertyChanged();
397_checkValidPropertyChanged(
int property)
428 m_variable->update();
437 m_variable->setUpToDate();
446 return m_variable->modifiedTime();
455 m_variable->addDepend(var.
variable(),IVariable::DPT_CurrentTime);
464 m_variable->addDepend(var.
variable(),IVariable::DPT_PreviousTime);
473 m_variable->addDepend(var.
variable(),IVariable::DPT_CurrentTime,tinfo);
482 m_variable->addDepend(var.
variable(),IVariable::DPT_PreviousTime,tinfo);
491 m_variable->removeDepend(var.
variable());
509 m_variable->addTag(tagname,tagvalue);
518 m_variable->removeTag(tagname);
527 return m_variable->hasTag(tagname);
536 return m_variable->tagValue(tagname);
545 return m_previous_reference;
554 return m_next_reference;
563 m_previous_reference = v;
570setNextReference(VariableRef* v)
572 m_next_reference = v;
581bool VariableRef::m_static_has_trace_creation =
false;
587setTraceCreation(
bool v)
589 m_static_has_trace_creation = v;
598 return m_static_has_trace_creation;
605_executeUpdateFunctors()
607 if (m_notify_functor_list)
608 m_notify_functor_list->execute();
617 _setAssignmentStackTrace();
620 m_module = var.m_module;
621 m_variable = var.m_variable;
622 m_reference_property = var.m_reference_property;
638extern "C" ARCANE_CORE_EXPORT
void*
639_AddVariableChangedDelegate(
VariableRef* var,
void (*func)())
641 return VariableRef::UpdateNotifyFunctorList::_add(var,func);
648extern "C" ARCANE_CORE_EXPORT
void
652 VariableRef::UpdateNotifyFunctorList::_remove(functor_list,func);
virtual StackTrace stackTrace(int first_function=0)=0
Chaîne de caractère indiquant la pile d'appel.
Interface du gestionnaire d'un sous-domaine.
Interface de la classe fonctor de recalcul d'une variable.
Interface du gestionnaire de variables.
@ PSubDomainDepend
Indique que la valeur de la variable est dépendante du sous-domaine.
@ PNoExchange
Indique que la variable ne doit pas être échangée.
@ PNoReplicaSync
Indique que la variable n'a pas forcément la même valeur entre les réplicas.
@ PExecutionDepend
Indique que la valeur de la variable est dépendante de l'exécution.
@ PHasTrace
Indique que la variable est tracée (uniquement en mode trace)
@ PPrivate
Indique que la variable est privée.
@ PPersistant
Indique que la variable est persistante.
@ PNoRestore
Indique que la variable ne doit pas être restaurée.
@ PSubDomainPrivate
Indique que la variable est privée au sous-domaine.
@ PNoNeedSync
Indique que la variable n'est pas nécessairement synchronisée.
@ PNoDump
Indique que la variable ne doit pas être sauvegardée.
virtual void setComputeFunction(IVariableComputeFunction *v)=0
Positionne la fonction de recalcul de la variable.
Exception lorsqu'une erreur fatale est survenue.
const String & toString() const
Chaîne de caractères indiquant la pile d'appel.
Chaîne de caractères unicode.
Paramètres nécessaires à la construction 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.
virtual Integer checkIfSameOnAllReplica(int max_print=0)
Vérifie si la variable a les mêmes valeurs sur tous les réplicas.
virtual void updateFromInternal()
Mise à jour à partir de la partie interne.
VariableRef(const VariableBuildInfo &vbi)
Construit une référence sur une variable avec les infos vbi.
VariableRef & operator=(const VariableRef &from)
Opérateur de recopie.
virtual void setProperty(int property)
Positionne la propriété property.
VariableRef()
Constructeur vide.
virtual eDataType dataType() const
Type de la variable (Real, Integer, ...)
void removeTag(const String &tagname)
Supprime le tag tagname.
virtual Integer checkIfSync(int max_print=0)
Vérifie si la variable est bien synchronisée.
virtual void print(std::ostream &o) const
Affiche la valeur de la variable.
virtual int property() const
Propriétés de la variable.
virtual void unsetProperty(int property)
Supprime la propriété property.
void addTag(const String &tagname, const String &tagvalue)
Ajoute le tag tagname avev la valeur tagvalue.
Int64 modifiedTime()
Temps auquel la variable a été mise à jour.
virtual IModule * module() const
Module associé à la variable (ou nullptr, s'il n'y en a pas)
VariableRef * previousReference()
Référence précédente (ou null) sur variable()
String tagValue(const String &tagname) const
Valeur du tag tagname. La chaîne est nulle si le tag n'existe pas.
void setUpToDate()
Indique que la variable vient d'être mise à jour.
void addDependCurrentTime(const VariableRef &var)
Ajoute var à la liste des dépendances au temps courant.
IVariable * variable() const
Variable associée.
void update()
Recalcule la variable si nécessaire.
void _internalInit(IVariable *)
Initialisation interne de la variable.
virtual void unregisterVariable()
Supprime l'enregistrement de la variable (interne)
String name() const
Nom de la variable.
ISubDomain * subDomain() const
Sous-domaine associé à la variable (TODO rendre obsolète fin 2023)
virtual void registerVariable()
Enregistre la variable (interne)
virtual int referenceProperty() const
Propriétés de la référence (interne)
bool hasTag(const String &tagname) const
true si la variable possède le tag tagname
void removeDepend(const VariableRef &var)
Supprime var de la liste des dépendances.
IVariableMng * variableMng() const
Gestionnaire de variable associé à la variable.
void addDependPreviousTime(const VariableRef &var)
Ajoute var à la liste des dépendances au temps précédent.
virtual ~VariableRef()
Libère les ressources.
VariableRef * nextReference()
Référence suivante (ou null) sur variable()
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé
eDataType
Type d'une donnée.