Arcane  v4.1.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Observable.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* Observable.cc (C) 2000-2025 */
9/* */
10/* Observateur. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arccore/base/Observable.h"
15#include "arccore/base/Observer.h"
16
17/*---------------------------------------------------------------------------*/
18/*---------------------------------------------------------------------------*/
19
20namespace Arcane
21{
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
28{
29 if (arccoreIsCheck()) {
30 if (!m_observers.empty())
31 std::cout << "** WARNING: Observable p=" << this
32 << " is destroyed but has n="
33 << m_observers.size() << " observer(s) attached\n";
34 }
35}
36
37/*---------------------------------------------------------------------------*/
38/*---------------------------------------------------------------------------*/
39
42{
43 // Vérifie que l'observeur n'est pas dans la liste.
44 if (m_observers.contains(obs))
45 return;
46 obs->attachToObservable(this);
47 m_observers.add(obs);
48}
49
50/*---------------------------------------------------------------------------*/
51/*---------------------------------------------------------------------------*/
52
55{
56 //std::cout << "DETACH OB this=" << this << " o=" << obs
57 // << " destroyed=" << m_is_destroyed << '\n';
58 if (m_is_destroyed)
59 return;
60 m_observers.removeValue(obs);
61}
62
63/*---------------------------------------------------------------------------*/
64/*---------------------------------------------------------------------------*/
65
68{
69 if (m_observers.empty())
70 return;
71 for( IObserver* o : m_observers)
72 o->observerUpdate(this);
73}
74
75/*---------------------------------------------------------------------------*/
76/*---------------------------------------------------------------------------*/
77
79hasObservers() const
80{
81 return (!m_observers.empty());
82}
83
84/*---------------------------------------------------------------------------*/
85/*---------------------------------------------------------------------------*/
86
87void Observable::
88_detachAllObservers()
89{
90 //std::cout << "DESTROY this=" << this << '\n';
91 for (IObserver* o : m_observers) {
92 o->detach();
93 }
94 m_observers.clear();
95}
96
97/*---------------------------------------------------------------------------*/
98/*---------------------------------------------------------------------------*/
99
102{
103 _detachAllObservers();
104}
105
106/*---------------------------------------------------------------------------*/
107/*---------------------------------------------------------------------------*/
108
109IObservable* IObservable::
110createDefault()
111{
112 return new Observable();
113}
114
115/*---------------------------------------------------------------------------*/
116/*---------------------------------------------------------------------------*/
117
118/*---------------------------------------------------------------------------*/
119/*---------------------------------------------------------------------------*/
120
121AutoDetachObservable::
122~AutoDetachObservable()
123{
124 _detachAllObservers();
125}
126
127/*---------------------------------------------------------------------------*/
128/*---------------------------------------------------------------------------*/
129
130} // End namespace Arcane
131
132/*---------------------------------------------------------------------------*/
133/*---------------------------------------------------------------------------*/
virtual void attachToObservable(IObservable *obs)=0
S'attache à l'observable obs.
Classe de base d'un observable.
void attachObserver(IObserver *obs) override
Attache l'observateur obs à cette observable.
Definition Observable.cc:41
void detachAllObservers() override
Détache tous les observeurs associés à cette instance.
bool hasObservers() const override
Vrai si des observers sont attachées à cette observable.
Definition Observable.cc:79
void detachObserver(IObserver *obs) override
Détache l'observateur obs de cette observable.
Definition Observable.cc:54
~Observable() override
Libère les ressources.
Definition Observable.cc:27
void notifyAllObservers() override
Notifie tous les observateurs.
Definition Observable.cc:67
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
ARCCORE_BASE_EXPORT bool arccoreIsCheck()
Vrai si on est en mode vérification.