Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

Loading...
Searching...
No Matches
Observer.h
Go to the documentation of this file.
1
32#pragma once
33
34#include <ogdf/basic/List.h>
35#include <ogdf/basic/basic.h>
37
38#ifndef OGDF_MEMORY_POOL_NTS
39# include <mutex>
40#endif
41
42namespace ogdf {
43
52template<typename TObserved, typename TObserver>
53class Observer {
54public:
56
60 Observer() = default;
61
62 OGDF_DEPRECATED("calls registrationChanged with only partially-constructed child classes, "
63 "see copy constructor of Observer for fix")
64
65 explicit Observer(const TObserved* R) { reregister(R); }
66
68
72 virtual ~Observer() {
73 if (m_pObserved) {
74 m_pObserved->unregisterObserver(m_itObsList);
75 m_pObserved = nullptr;
76 }
77 }
78
89
91
96 void reregister(const TObserved* obs) {
97 const TObserved* old = m_pObserved;
98 if (m_pObserved) {
99 m_pObserved->unregisterObserver(m_itObsList);
100 }
101 m_pObserved = obs;
102 if (m_pObserved != nullptr) {
103 m_itObsList = obs->registerObserver(dynamic_cast<TObserver*>(this));
104 }
106 }
107
109 virtual void registrationChanged(const TObserved* old) { }
110
111 const TObserved* getObserved() const { return m_pObserved; }
112
113private:
114 const TObserved* m_pObserved = nullptr;
116};
117
126template<typename TObserver, typename TObserved>
129 friend TObserved;
130 friend TObserver;
131
132#ifndef OGDF_MEMORY_POOL_NTS
133 mutable std::mutex m_mutexRegArrays;
134#endif
136
137public:
138 Observable() = default;
139
146
158
159protected:
161
176 typename ListPure<TObserver*>::iterator registerObserver(TObserver* obs) const {
177#ifndef OGDF_MEMORY_POOL_NTS
178 std::lock_guard<std::mutex> guard(m_mutexRegArrays);
179#endif
180 OGDF_ASSERT(obs != nullptr);
181 return m_regObservers.pushBack(obs);
182 }
183
185
200#ifndef OGDF_MEMORY_POOL_NTS
201 std::lock_guard<std::mutex> guard(m_mutexRegArrays);
202#endif
204 }
205
207
209 while (!m_regObservers.empty()) {
211 obs->reregister(nullptr);
213 || (m_regObservers.front() != obs && m_regObservers.back() != obs));
214 }
215 }
216};
217}
Declaration of doubly linked lists and iterators.
Basic declarations, included by all source files.
Encapsulates a pointer to a list element.
Definition List.h:113
Doubly linked lists.
Definition List.h:233
iterator pushBack(const E &x)
Adds element x at the end of the list.
Definition List.h:612
const_reference front() const
Returns a const reference to the first element.
Definition List.h:305
const_reference back() const
Returns a const reference to the last element.
Definition List.h:323
void del(iterator it)
Removes it from the list.
Definition List.h:765
bool empty() const
Returns true iff the list is empty.
Definition List.h:286
Base class for an observable object that can be tracked by multiple Observer objects.
Definition Observer.h:127
std::mutex m_mutexRegArrays
The critical section for protecting shared access to register/unregister methods.
Definition Observer.h:133
void unregisterObserver(typename ListPure< TObserver * >::iterator it) const
Unregisters an observer.
Definition Observer.h:199
void clearObservers()
Definition Observer.h:208
virtual ~Observable()
Note that all Observers must already be removed once the destructor of this base class is invoked (e....
Definition Observer.h:145
const ListPure< TObserver * > & getObservers() const
Definition Observer.h:206
ListPure< TObserver * > m_regObservers
The registered observers.
Definition Observer.h:135
ListPure< TObserver * >::iterator registerObserver(TObserver *obs) const
Registers an observer.
Definition Observer.h:176
Observable()=default
Base class for an observer for a single Observable object.
Definition Observer.h:53
void reregister(const TObserved *obs)
Associates observer instance with instance obs.
Definition Observer.h:96
const TObserved * m_pObserved
Definition Observer.h:114
Observer()=default
Constructs unregistered instance of Observer class.
ListPure< TObserver * >::iterator m_itObsList
watched instance
Definition Observer.h:115
virtual void registrationChanged(const TObserved *old)
Called after reregister() changed the observed instance.
Definition Observer.h:109
virtual ~Observer()
Destroys the instance, unregisters it from watched instance.
Definition Observer.h:72
const TObserved * getObserved() const
Definition Observer.h:111
Utility macros for declaring copy and move constructors and assignment operations.
#define OGDF_NO_COPY(cls)
Explicitly disables (deletes) copy construction and assignment for class cls.
Definition copy_move.h:37
#define OGDF_NO_MOVE(cls)
Explicitly disables (deletes) move construction and assignment for class cls.
Definition copy_move.h:42
#define OGDF_DEPRECATED(reason)
Mark a class / member / function as deprecated.
Definition config.h:206
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
Definition basic.h:52
The namespace for all OGDF objects.