Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
utils/Observer.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* Observer.h (C) 2000-2021 */
9/* */
10/* Observateur. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_OBSERVER_H
13#define ARCANE_UTILS_OBSERVER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/IObserver.h"
18#include "arcane/utils/IObservable.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23namespace Arcane
24{
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28/*!
29 * \internal
30 * \brief Classe de base d'un observateur.
31 */
32class ARCANE_UTILS_EXPORT AbstractObserver
33: public IObserver
34{
35 public:
36
37 AbstractObserver() : m_observable(nullptr) {}
38 virtual ~AbstractObserver();
39
40 public:
41
42 //! S'attache à l'observable \a obs
43 void attachToObservable(IObservable* obs) override;
44
45 //! Se détache de l'observable
46 void detach() override;
47
48 private:
49
50 IObservable* m_observable;
51};
52
53/*---------------------------------------------------------------------------*/
54/*---------------------------------------------------------------------------*/
55/*!
56 * \ingroup Core
57 * \brief Observateur pour un type T
58 */
59template<class T>
61: public AbstractObserver
62{
63 public:
64
65 typedef void (T::*Func0Ptr)(); //!< Type du pointeur sur la méthode
66 typedef void (T::*Func1Ptr)(const IObservable&); //!< Type du pointeur sur la méthode
67
68 public:
69
70 //! Constructeur
71 ObserverT(T* object,Func1Ptr funcptr)
72 : m_object(object), m_function0(nullptr), m_function1(funcptr) {}
73 ObserverT(T* object,Func0Ptr funcptr)
74 : m_object(object), m_function0(funcptr), m_function1(nullptr) {}
75
76 public:
77
78
79 public:
80
81 //! Exécute la méthode associé
82 void observerUpdate(IObservable* iob) override
83 {
84 if (m_function1)
85 (m_object->*m_function1)(*iob);
86 if (m_function0)
87 (m_object->*m_function0)();
88 }
89
90 private:
91
92 T* m_object; //!< Objet associé.
93 Func0Ptr m_function0; //!< Pointeur vers la méthode associée.
94 Func1Ptr m_function1; //!< Pointeur vers la méthode associée.
95};
96
97/*---------------------------------------------------------------------------*/
98/*---------------------------------------------------------------------------*/
99
100} // End namespace Arcane
101
102/*---------------------------------------------------------------------------*/
103/*---------------------------------------------------------------------------*/
104
105#endif
106
Interface d'un observable.
Observateur pour un type T.
void(T::* Func0Ptr)()
Type du pointeur sur la méthode.
void observerUpdate(IObservable *iob) override
Exécute la méthode associé
void(T::* Func1Ptr)(const IObservable &)
Type du pointeur sur la méthode.
ObserverT(T *object, Func1Ptr funcptr)
Constructeur.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-