Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Event.h
Aller à la documentation de ce fichier.
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 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/* Event.h (C) 2000-2023 */
9/* */
10/* Gestionnaires d'évènements. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_EVENT_H
13#define ARCANE_UTILS_EVENT_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18#include "arcane/utils/Array.h"
19
20#include <functional>
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31class EventObserverBase;
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35/*!
36 * \internal
37 * \brief Classe de base d'un handler d'évènement.
38 */
39class ARCANE_UTILS_EXPORT EventObservableBase
40{
41 friend class EventObserverBase;
42 class Impl;
43 public:
45 virtual ~EventObservableBase();
46 public:
47 bool hasObservers() const;
48 void detachAllObservers();
49 protected:
50 void _attachObserver(EventObserverBase* obs,bool is_auto_destroy);
51 void _detachObserver(EventObserverBase* obs);
52 ConstArrayView<EventObserverBase*> _observers() const;
53 private:
54 Impl* m_p;
55};
56
57/*---------------------------------------------------------------------------*/
58/*---------------------------------------------------------------------------*/
59/*!
60 * \internal
61 * \brief Classe de base d'un observateur d'évènement.
62 *
63 * L'ajoute ou la suppression d'un observeur se fait via les opérateurs
64 * EventObservable::operator+=() et EventObservable::operator-=().
65 */
66class ARCANE_UTILS_EXPORT EventObserverBase
67{
68 friend class EventObservableBase;
69 public:
70 EventObserverBase() : m_observable(nullptr) {}
71 virtual ~EventObserverBase() ARCANE_NOEXCEPT_FALSE;
72 protected:
73 void _notifyDetach();
74 void _notifyAttach(EventObservableBase* obs);
75 private:
76 EventObservableBase* m_observable;
77};
78
79/*---------------------------------------------------------------------------*/
80/*---------------------------------------------------------------------------*/
81/*!
82 * \ingroup Utils
83 * \brief Observateur d'évènements.
84 */
85template<typename... Args>
87: public EventObserverBase
88{
89 public:
90 typedef EventObservable<Args...> ObservableType;
91 public:
92 EventObserver() {}
93 EventObserver(const std::function<void(Args...)>& func)
94 : m_functor(func){}
95 EventObserver(std::function<void(Args...)>&& func)
96 : m_functor(func){}
97 void observerUpdate(Args... args)
98 {
99 if (m_functor)
100 m_functor(args...);
101 }
102 private:
103 std::function<void(Args...)> m_functor;
104};
105
106/*---------------------------------------------------------------------------*/
107/*---------------------------------------------------------------------------*/
108/*!
109 * \brief Conserve des références d'observateurs.
110 */
111class ARCANE_UTILS_EXPORT EventObserverPool
112{
113 public:
115 public:
116 //! Ajoute l'observateur \a x
117 void add(EventObserverBase* x);
118 //! Supprime tous les observateurs associés à cette instance.
119 void clear();
120 private:
122};
123
124/*---------------------------------------------------------------------------*/
125/*---------------------------------------------------------------------------*/
126/*!
127 * \ingroup Utils
128 * \brief Classe de base d'un handler d'évènement.
129 *
130 * Les instances de cette classe ne peuvent pas être copiées.
131 *
132 * Cette classe permet d'enregistrer une liste d'observateurs qui peuvent
133 * être notifiés lors de l'appel à notify(). \a Args contient
134 * la liste des paramètres de notification.
135 *
136 * Il est possible d'ajouter un observateur via la méthode attach(). Si
137 * l'observateur est une fonction lambda, il est nécessaire de
138 * spécifier une instance de EventObserverPool pour gérer la durée
139 * de vie de la lambda, qui sera alors la même que celle de
140 * l'EventObserverPool associé.
141 *
142 \code
143 * //! Evènement appelant une méthode void f(int,double):
144 * EventObservable<int,double> observable;
145 * EventObserverPool pool;
146 * observable.attach(pool,[](int a,double b) { ... });
147 * std::function<int,double> f2(...);
148 * auto o = new EventObserver<int,double>(f2);
149 * observable.attach(o);
150 * observable.notify(1,3.2);
151 \endcode
152 *
153 */
154template<typename... Args>
156: public EventObservableBase
157{
158 public:
159
160 typedef EventObserver<Args...> ObserverType;
161
162 public:
163
164 EventObservable() {}
165
166 public:
167
168 EventObservable(const EventObservable<Args...>& rhs) = delete;
169 void operator=(const EventObservable<Args...>& rhs) = delete;
170
171 public:
172
173 /*!
174 * \brief Attache l'observateur \a o à cet observable.
175 *
176 * Une exception est levée si l'observateur est déjà attaché à un observable.
177 */
178 void attach(ObserverType* o) { _attachObserver(o,false); }
179 /*!
180 * \brief Détache l'observateur \a o de cet observable.
181 *
182 * Une exception est levée si l'observateur n'est pas attaché à cet observable.
183 */
184 void detach(ObserverType* o) { _detachObserver(o); }
185
186 /*!
187 * \brief Ajoute un observateur utilisant la lambda \a lambda
188 * et conserve une référence dans \a pool.
189 */
190 template<typename Lambda>
191 void attach(EventObserverPool& pool,const Lambda& lambda)
192 {
193 auto x = new ObserverType(lambda);
194 _attachObserver(x,false);
195 pool.add(x);
196 }
197
198 //! Appelle les observeurs associés à cet observable.
199 void notify(Args... args)
200 {
201 if (!hasObservers())
202 return;
203 for( auto o : _observers() )
204 ((ObserverType*)o)->observerUpdate(args...);
205 }
206};
207
208/*---------------------------------------------------------------------------*/
209/*---------------------------------------------------------------------------*/
210
211}
212
213/*---------------------------------------------------------------------------*/
214/*---------------------------------------------------------------------------*/
215
216#endif
Déclarations des types utilisés dans Arcane.
Classe de base d'un handler d'évènement.
Definition Event.h:157
void detach(ObserverType *o)
Détache l'observateur o de cet observable.
Definition Event.h:184
void attach(EventObserverPool &pool, const Lambda &lambda)
Ajoute un observateur utilisant la lambda lambda et conserve une référence dans pool.
Definition Event.h:191
void attach(ObserverType *o)
Attache l'observateur o à cet observable.
Definition Event.h:178
void notify(Args... args)
Appelle les observeurs associés à cet observable.
Definition Event.h:199
Conserve des références d'observateurs.
Definition Event.h:112
void add(EventObserverBase *x)
Ajoute l'observateur x.
Definition Event.cc:213
Observateur d'évènements.
Definition Event.h:88
Vue constante d'un tableau de type T.
Vecteur 1D de données avec sémantique par valeur (style STL).
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-