Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

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 
38 namespace ogdf {
39 
41 
52 template<class Registry>
53 class RegisteredSet : private RegisteredObserver<Registry> {
55 
56 public:
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
65  Obs::reregister(&R);
66  }
67 
69  explicit RegisteredSet(const Registry* R) : Obs(), m_it() { Obs::reregister(R); }
70 
72  explicit RegisteredSet() : Obs(), m_it() { }
73 
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 
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()) {
149  remove(m_elements.front());
150  }
151  } else {
153  m_elements.clear();
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 
206 private:
210 
213 
214 protected:
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());
231  m_elements.clear();
232  }
233 };
234 
235 }
OGDF_COPY_CONSTR
#define OGDF_COPY_CONSTR(cls)
Declares the copy constructor for class cls.
Definition: copy_move.h:57
ogdf
The namespace for all OGDF objects.
Definition: multilevelmixer.cpp:39
ogdf::RegisteredSet::operator==
friend bool operator==(const RegisteredSet &lhs, const RegisteredSet &rhs)
Definition: RegisteredSet.h:187
ogdf::RegisteredArray
Dynamic arrays indexed with arbitrary keys.
Definition: RegisteredArray.h:869
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::RegisteredSet::remove
bool remove(element_type v)
Removes element v from this set and return true iff v was previously present.
Definition: RegisteredSet.h:125
ogdf::RegisteredSet::RegisteredSet
RegisteredSet(const Registry *R)
Creates an empty set associated with registry R.
Definition: RegisteredSet.h:69
OGDF_MOVE_OP
#define OGDF_MOVE_OP(cls)
Declares the move assignment operation for class cls.
Definition: copy_move.h:63
ogdf::RegisteredSet::contains
bool contains(element_type v) const
Returns the same as isMember()
Definition: RegisteredSet.h:166
ogdf::RegisteredSet::init
void init()
Reinitializes the set. Associates the set with no registry.
Definition: RegisteredSet.h:96
ogdf::ListIteratorBase::valid
bool valid() const
Returns true iff the iterator points to an element.
Definition: List.h:153
ogdf::RegisteredSet::begin
list_type::const_iterator begin() const
Definition: RegisteredSet.h:183
ogdf::RegisteredSet::keysSwapped
void keysSwapped(int index1, int index2) override
Called when an entry is swapped between index1 and index2 in all registered arrays.
Definition: RegisteredSet.h:219
ogdf::Observer< Registry, RegisteredObserver< Registry > >::reregister
void reregister(const Registry *obs)
Associates observer instance with instance obs.
Definition: Observer.h:96
ogdf::RegisteredSet::operator()
bool operator()(element_type v) const
Returns the same as isMember() to use an RegisteredSet instance as filter function.
Definition: RegisteredSet.h:169
Minisat::Internal::copy
static void copy(const T &from, T &to)
Definition: Alg.h:62
ogdf::RegisteredSet::isMember
bool isMember(element_type v) const
Returns true iff element v is contained in this set.
Definition: RegisteredSet.h:163
backward::details::move
const T & move(const T &v)
Definition: backward.hpp:243
ogdf::RegisteredSet::elements
const list_type & elements() const
Returns a reference to the list of elements contained in this set.
Definition: RegisteredSet.h:172
RegisteredArray.h
Declaration and implementation of RegisteredArray class.
ogdf::RegisteredObserver::getRegistry
const Registry * getRegistry() const
Definition: RegisteredArray.h:103
ogdf::List< element_type >
ogdf::RegisteredSet::operator!=
friend bool operator!=(const RegisteredSet &lhs, const RegisteredSet &rhs)
Definition: RegisteredSet.h:202
OGDF_MOVE_CONSTR
#define OGDF_MOVE_CONSTR(cls)
Declares the move constructor for class cls.
Definition: copy_move.h:61
OGDF_COPY_OP
#define OGDF_COPY_OP(cls)
Declares the copy assignment operation for class cls. Don't forget to return *this;.
Definition: copy_move.h:59
ogdf::RegisteredSet
Constant-time set operations.
Definition: RegisteredSet.h:53
ogdf::RegisteredSet::clear
void clear()
Removes all elements from this set.
Definition: RegisteredSet.h:143
ogdf::RegisteredObserver
Abstract Base class for registry observers.
Definition: RegisteredArray.h:76
ogdf::RegisteredSet::init
void init(const Registry &R)
Reinitializes the set. Associates the set with registry R.
Definition: RegisteredSet.h:102
ogdf::RegisteredSet::keyAdded
void keyAdded(typename Registry::key_type v) override
Called by watched registry after a key has been added.
Definition: RegisteredSet.h:217
ogdf::Observer< internal::GraphNodeRegistry, RegisteredObserver< internal::GraphNodeRegistry > >
ogdf::List::del
void del(iterator it)
Removes it from the list.
Definition: List.h:1611
basic.h
Basic declarations, included by all source files.
ogdf::RegisteredSet::registeredAt
const Registry * registeredAt() const
Returns the associated registry.
Definition: RegisteredSet.h:175
ogdf::RegisteredSet::end
list_type::const_iterator end() const
Definition: RegisteredSet.h:185
ogdf::RegisteredSet::RegisteredSet
RegisteredSet()
Creates an empty set associated with no registry.
Definition: RegisteredSet.h:72
ogdf::RegisteredSet< internal::GraphNodeRegistry >::element_type
typename internal::GraphNodeRegistry ::key_type element_type
Definition: RegisteredSet.h:58
List.h
Declaration of doubly linked lists and iterators.
ogdf::RegisteredSet::keyRemoved
void keyRemoved(typename Registry::key_type v) override
Called by watched registry just before a key is deleted.
Definition: RegisteredSet.h:215
ogdf::List::size
int size() const
Returns the number of elements in the list.
Definition: List.h:1488
ogdf::ListIteratorBase
Encapsulates a pointer to a list element.
Definition: List.h:51
ogdf::RegisteredSet::registrationChanged
void registrationChanged(const Registry *old) override
Called after reregister() changed the observed instance.
Definition: RegisteredSet.h:229
ogdf::RegisteredSet::keysCopied
void keysCopied(int toIndex, int fromIndex) override
Called when an entry is copied from fromIndex to toIndex in all registered arrays.
Definition: RegisteredSet.h:223
ogdf::internal::GraphRegistry
Registry for nodes, edges and adjEntries of a graph.
Definition: Graph_d.h:598
ogdf::RegisteredSet::size
int size() const
Returns the number of elements in this set.
Definition: RegisteredSet.h:181
ogdf::List::pushBack
iterator pushBack(const E &x)
Adds element x at the end of the list.
Definition: List.h:1547
ogdf::List::clear
void clear()
Removes all elements from the list.
Definition: List.h:1626
ogdf::RegisteredSet::insert
void insert(element_type v)
Inserts element v into this set.
Definition: RegisteredSet.h:111
ogdf::RegisteredSet::m_it
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...
Definition: RegisteredSet.h:209
ogdf::RegisteredSet::keysCleared
void keysCleared() override
Called by watched registry when its clear function is called, just before things are removed.
Definition: RegisteredSet.h:227
ogdf::RegisteredSet::RegisteredSet
RegisteredSet(const Registry &R)
Creates an empty set associated with registry R.
Definition: RegisteredSet.h:62
ogdf::RegisteredSet::m_elements
list_type m_elements
The list of elements contained in this set.
Definition: RegisteredSet.h:212