Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

Loading...
Searching...
No Matches
RegisteredSet.h
Go to the documentation of this file.
1
31#pragma once
32
33#include <ogdf/basic/List.h>
35#include <ogdf/basic/basic.h>
37
38namespace ogdf {
39
41
52template<class Registry>
53class RegisteredSet : private RegisteredObserver<Registry> {
55
56public:
57 using registry_type = Registry;
58 using element_type = typename Registry::key_type;
60
62 explicit RegisteredSet(const Registry& R) : Obs(), m_it() {
63 // parent constructor does not call registrationChanged callback
64 // m_it.init called by registrationChanged callback from reregister
66 }
67
69 explicit RegisteredSet(const Registry* R) : Obs(), m_it() { Obs::reregister(R); }
70
72 explicit RegisteredSet() : Obs(), m_it() { }
73
74 OGDF_COPY_CONSTR(RegisteredSet) : Obs(), m_it() { *this = copy; }
75
77 Obs::reregister(copy.registeredAt());
78 // m_it.init and m_elements.clear called by registrationChanged callback
79 for (element_type v : copy.elements()) {
80 insert(v);
81 }
82 return *this;
83 }
84
85 OGDF_MOVE_CONSTR(RegisteredSet) { *this = std::move(move); }
86
88 Obs::reregister(move.registeredAt());
89 m_it = std::move(move.m_it);
90 m_elements = std::move(move.m_elements);
91 move.init();
92 return *this;
93 }
94
96 void init() {
97 // m_it.init and m_elements.clear called by registrationChanged callback
98 Obs::reregister(nullptr);
99 }
100
102 void init(const Registry& R) { Obs::reregister(&R); }
103
105
113 if (!itV.valid()) {
114 itV = m_elements.pushBack(v);
115 }
116 }
117
119
127 if (itV.valid()) {
128 m_elements.del(itV);
130 return true;
131 } else {
132 return false;
133 }
134 }
135
137
143 void clear() {
144 if (!registeredAt()) {
145 return;
146 }
147 if (size() * 10 < registeredAt()->getArraySize()) {
148 while (!m_elements.empty()) {
150 }
151 } else {
154 }
155 }
156
158
163 bool isMember(element_type v) const { return m_it[v].valid(); }
164
166 bool contains(element_type v) const { return m_it[v].valid(); }
167
169 bool operator()(element_type v) const { return isMember(v); }
170
172 const list_type& elements() const { return m_elements; }
173
175 const Registry* registeredAt() const { return Obs::getRegistry(); }
176
178
181 int size() const { return m_elements.size(); }
182
183 typename list_type::const_iterator begin() const { return m_elements.begin(); }
184
185 typename list_type::const_iterator end() const { return m_elements.end(); }
186
187 friend bool operator==(const RegisteredSet& lhs, const RegisteredSet& rhs) {
188 if (lhs.registeredAt() != rhs.registeredAt()) {
189 return false;
190 }
191 if (lhs.size() != rhs.size()) {
192 return false;
193 }
194 for (const auto& elem : lhs.elements()) {
195 if (!rhs.isMember(elem)) {
196 return false;
197 }
198 }
199 return true;
200 }
201
202 friend bool operator!=(const RegisteredSet& lhs, const RegisteredSet& rhs) {
203 return !(lhs == rhs);
204 }
205
206private:
210
213
214protected:
215 void keyRemoved(typename Registry::key_type v) override { remove(v); }
216
217 void keyAdded(typename Registry::key_type v) override { }
218
219 void keysSwapped(int index1, int index2) override {
220 OGDF_ASSERT(false); // RegisteredSets break on key swapping
221 }
222
223 void keysCopied(int toIndex, int fromIndex) override {
224 OGDF_ASSERT(false); // RegisteredSets break on key copying
225 }
226
227 void keysCleared() override { clear(); }
228
229 void registrationChanged(const Registry* old) override {
230 m_it.init(Obs::getRegistry());
232 }
233};
234
235}
Declaration of doubly linked lists and iterators.
Declaration and implementation of RegisteredArray class.
Basic declarations, included by all source files.
int size() const
Returns the number of elements in the list.
Definition List.h:1488
void clear()
Removes all elements from the list.
Definition List.h:1626
iterator pushBack(const E &x)
Adds element x at the end of the list.
Definition List.h:1547
void del(iterator it)
Removes it from the list.
Definition List.h:1611
Encapsulates a pointer to a list element.
Definition List.h:113
bool valid() const
Returns true iff the iterator points to an element.
Definition List.h:153
iterator begin()
Returns an iterator to the first element of the list.
Definition List.h:391
const_reference front() const
Returns a const reference to the first element.
Definition List.h:305
bool empty() const
Returns true iff the list is empty.
Definition List.h:286
iterator end()
Returns an iterator to one-past-last element of the list.
Definition List.h:409
void reregister(const Registry *obs)
Associates observer instance with instance obs.
Definition Observer.h:96
Dynamic arrays indexed with arbitrary keys.
Abstract Base class for registry observers.
const Registry * getRegistry() const
Constant-time set operations.
list_type m_elements
The list of elements contained in this set.
void keysSwapped(int index1, int index2) override
Called when an entry is swapped between index1 and index2 in all registered arrays.
void keysCopied(int toIndex, int fromIndex) override
Called when an entry is copied from fromIndex to toIndex in all registered arrays.
void init(const Registry &R)
Reinitializes the set. Associates the set with registry R.
RegisteredSet(const Registry *R)
Creates an empty set associated with registry R.
RegisteredSet()
Creates an empty set associated with no registry.
friend bool operator==(const RegisteredSet &lhs, const RegisteredSet &rhs)
void init()
Reinitializes the set. Associates the set with no registry.
list_type::const_iterator end() const
void keyRemoved(typename Registry::key_type v) override
Called by watched registry just before a key is deleted.
void clear()
Removes all elements from this set.
void keysCleared() override
Called by watched registry when its clear function is called, just before things are removed.
void registrationChanged(const Registry *old) override
Called after reregister() changed the observed instance.
friend bool operator!=(const RegisteredSet &lhs, const RegisteredSet &rhs)
bool remove(element_type v)
Removes element v from this set and return true iff v was previously present.
list_type::const_iterator begin() const
typename Registry::key_type element_type
RegisteredArray< Registry, ListIterator< element_type >, false > m_it
m_it[v] contains the list iterator pointing to v if v is contained in this set, or an invalid list it...
bool contains(element_type v) const
Returns the same as isMember()
int size() const
Returns the number of elements in this set.
bool operator()(element_type v) const
Returns the same as isMember() to use an RegisteredSet instance as filter function.
bool isMember(element_type v) const
Returns true iff element v is contained in this set.
const Registry * registeredAt() const
Returns the associated registry.
RegisteredSet(const Registry &R)
Creates an empty set associated with registry R.
void keyAdded(typename Registry::key_type v) override
Called by watched registry after a key has been added.
const list_type & elements() const
Returns a reference to the list of elements contained in this set.
void insert(element_type v)
Inserts element v into this set.
Utility macros for declaring copy and move constructors and assignment operations.
#define OGDF_COPY_CONSTR(cls)
Declares the copy constructor for class cls.
Definition copy_move.h:57
#define OGDF_COPY_OP(cls)
Declares the copy assignment operation for class cls. Don't forget to return *this;.
Definition copy_move.h:59
#define OGDF_MOVE_CONSTR(cls)
Declares the move constructor for class cls.
Definition copy_move.h:61
#define OGDF_MOVE_OP(cls)
Declares the move assignment operation for class cls.
Definition copy_move.h:63
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
Definition basic.h:52
The namespace for all OGDF objects.