Arcane  v3.14.10.0
Documentation développeur
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/*---------------------------------------------------------------------------*/
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/*---------------------------------------------------------------------------*/
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/*---------------------------------------------------------------------------*/
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/*---------------------------------------------------------------------------*/
111class ARCANE_UTILS_EXPORT EventObserverPool
112{
113 public:
115 public:
117 void add(EventObserverBase* x);
119 void clear();
120 private:
122};
123
124/*---------------------------------------------------------------------------*/
125/*---------------------------------------------------------------------------*/
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
169 void operator=(const EventObservable<Args...>& rhs) = delete;
170
171 public:
172
178 void attach(ObserverType* o) { _attachObserver(o,false); }
184 void detach(ObserverType* o) { _detachObserver(o); }
185
190 template<typename Lambda>
192 {
193 auto x = new ObserverType(lambda);
194 _attachObserver(x,false);
195 pool.add(x);
196 }
197
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:40
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
Classe de base d'un observateur d'évènement.
Definition Event.h:67
Conserve des références d'observateurs.
Definition Event.h:112
Observateur d'évènements.
Definition Event.h:88
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-