Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

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 
42 namespace ogdf {
43 
52 template<typename TObserved, typename TObserver>
53 class Observer {
54 public:
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 
90 
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  }
105  registrationChanged(old);
106  }
107 
109  virtual void registrationChanged(const TObserved* old) { }
110 
111  const TObserved* getObserved() const { return m_pObserved; }
112 
113 private:
114  const TObserved* m_pObserved = nullptr;
116 };
117 
126 template<typename TObserver, typename TObserved>
127 class Observable {
129  friend TObserved;
130  friend TObserver;
131 
132 #ifndef OGDF_MEMORY_POOL_NTS
133  mutable std::mutex m_mutexRegArrays;
134 #endif
136 
137 public:
138  Observable() = default;
139 
146 
158 
159 protected:
161 
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
203  m_regObservers.del(it);
204  }
205 
207 
208  void clearObservers() {
209  while (!m_regObservers.empty()) {
210  TObserver* obs = m_regObservers.front();
211  obs->reregister(nullptr);
213  || (m_regObservers.front() != obs && m_regObservers.back() != obs));
214  }
215  }
216 };
217 }
ogdf
The namespace for all OGDF objects.
Definition: multilevelmixer.cpp:39
ogdf::Observer::getObserved
const TObserved * getObserved() const
Definition: Observer.h:111
OGDF_ASSERT
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
Definition: basic.h:66
copy_move.h
Utility macros for declaring copy and move constructors and assignment operations.
OGDF_DEPRECATED
#define OGDF_DEPRECATED(reason)
Mark a class / member / function as deprecated.
Definition: config.h:206
ogdf::ListPure::back
const_reference back() const
Returns a const reference to the last element.
Definition: List.h:323
ogdf::Observable::registerObserver
ListPure< TObserver * >::iterator registerObserver(TObserver *obs) const
Registers an observer.
Definition: Observer.h:176
ogdf::Observer::reregister
void reregister(const TObserved *obs)
Associates observer instance with instance obs.
Definition: Observer.h:96
OGDF_NO_MOVE
#define OGDF_NO_MOVE(cls)
Explicitly disables (deletes) move construction and assignment for class cls.
Definition: copy_move.h:42
ogdf::Observer::m_pObserved
const TObserved * m_pObserved
Definition: Observer.h:114
ogdf::Observable::unregisterObserver
void unregisterObserver(typename ListPure< TObserver * >::iterator it) const
Unregisters an observer.
Definition: Observer.h:199
ogdf::Observable
Base class for an observable object that can be tracked by multiple Observer objects.
Definition: Observer.h:127
ogdf::Observable::getObservers
const ListPure< TObserver * > & getObservers() const
Definition: Observer.h:206
ogdf::Observer::Observer
Observer()=default
Constructs unregistered instance of Observer class.
OGDF_NO_COPY
#define OGDF_NO_COPY(cls)
Explicitly disables (deletes) copy construction and assignment for class cls.
Definition: copy_move.h:37
ogdf::Observer::m_itObsList
ListPure< TObserver * >::iterator m_itObsList
watched instance
Definition: Observer.h:115
ogdf::Observable::~Observable
virtual ~Observable()
Note that all Observers must already be removed once the destructor of this base class is invoked (e....
Definition: Observer.h:145
ogdf::ListPure
Doubly linked lists.
Definition: List.h:55
ogdf::Observable::Observable
Observable()=default
ogdf::Observer
Base class for an observer for a single Observable object.
Definition: Observer.h:53
basic.h
Basic declarations, included by all source files.
ogdf::Observable::clearObservers
void clearObservers()
Definition: Observer.h:208
ogdf::Observer::~Observer
virtual ~Observer()
Destroys the instance, unregisters it from watched instance.
Definition: Observer.h:72
ogdf::Observable::TObserved
friend TObserved
Definition: Observer.h:129
List.h
Declaration of doubly linked lists and iterators.
ogdf::ListPure::front
const_reference front() const
Returns a const reference to the first element.
Definition: List.h:305
ogdf::Observer::registrationChanged
virtual void registrationChanged(const TObserved *old)
Called after reregister() changed the observed instance.
Definition: Observer.h:109
ogdf::Observable::m_mutexRegArrays
std::mutex m_mutexRegArrays
The critical section for protecting shared access to register/unregister methods.
Definition: Observer.h:133
ogdf::Observable::m_regObservers
ListPure< TObserver * > m_regObservers
The registered observers.
Definition: Observer.h:135
ogdf::ListPure::del
void del(iterator it)
Removes it from the list.
Definition: List.h:765
ogdf::Observable::TObserver
friend TObserver
Definition: Observer.h:130
ogdf::ListPure::empty
bool empty() const
Returns true iff the list is empty.
Definition: List.h:286
ogdf::ListPure::pushBack
iterator pushBack(const E &x)
Adds element x at the end of the list.
Definition: List.h:612