Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

RegisteredArray.h
Go to the documentation of this file.
1 
32 #pragma once
33 
34 #include <ogdf/basic/Math.h>
35 
36 #include <list>
37 #include <memory>
38 
39 #ifndef OGDF_MEMORY_POOL_NTS
40 
41 # include <mutex>
42 
43 #endif
44 
45 namespace ogdf {
46 namespace internal {
47 template<typename Registry>
49 }
50 
52 static constexpr int MIN_TABLE_SIZE = (1 << 4);
53 
55 
58 inline int calculateTableSize(int actualCount) {
59  return Math::nextPower2(MIN_TABLE_SIZE, actualCount);
60 }
61 
63 
94 template<typename Key, typename Registry, typename Iterator = void>
95 class RegistryBase {
96 public:
98  using key_type = Key;
99  using registry_type = Registry;
100  using iterator_type = Iterator;
101  using registration_list_type =
102  std::list<registered_array_type*, OGDFAllocator<registered_array_type*>>;
103  using registration_iterator_type = typename registration_list_type::iterator;
104 
105 private:
107  bool m_autoShrink = false;
108  int m_size = 0;
109 
110 #ifndef OGDF_MEMORY_POOL_NTS
111  mutable std::mutex m_mutexRegArrays;
112 #endif
113 
114 protected:
115  RegistryBase() = default;
116 
117 public:
119  virtual ~RegistryBase() noexcept { unregisterArrays(); }
120 
121  RegistryBase(const RegistryBase& copy) = delete;
122 
123  RegistryBase(RegistryBase&& move) noexcept = delete;
124 
125  RegistryBase& operator=(const RegistryBase& other) = delete;
126 
127  RegistryBase& operator=(RegistryBase&& other) noexcept = delete;
128 
130 
136 #ifndef OGDF_MEMORY_POOL_NTS
137  std::lock_guard<std::mutex> guard(m_mutexRegArrays);
138 #endif
139  return m_registeredArrays.emplace(m_registeredArrays.end(), pArray);
140  }
141 
143 
146  void unregisterArray(registration_iterator_type it) const noexcept {
147 #ifndef OGDF_MEMORY_POOL_NTS
148  std::lock_guard<std::mutex> guard(m_mutexRegArrays);
149 #endif
150  m_registeredArrays.erase(it);
151  }
152 
155 #ifndef OGDF_MEMORY_POOL_NTS
156  std::lock_guard<std::mutex> guard(m_mutexRegArrays);
157 #endif
158  *it = pArray;
159  }
160 
162  void keyAdded(Key key) {
163  if (static_cast<Registry*>(this)->keyToIndex(key) >= m_size) {
164  resizeArrays();
165  }
166  }
167 
169  void keyRemoved(Key key) {
170  if (m_autoShrink) {
171  resizeArrays();
172  }
173  }
174 
176  void keysCleared() { resizeArrays(0); }
177 
180  void resizeArrays() { resizeArrays(static_cast<Registry*>(this)->calculateArraySize(0)); }
181 
183  void resizeArrays(int size) { resizeArrays(size, m_autoShrink); }
184 
186  void resizeArrays(int size, bool shrink) {
187  if (size == m_size) {
188  return;
189  }
190  m_size = size = max(size, 0);
192  ab->resize(size, shrink);
193  }
194  }
195 
197  void reserveSpace(int new_keys) {
198  resizeArrays(static_cast<Registry*>(this)->calculateArraySize(new_keys));
199  }
200 
202  void swapArrayEntries(int index1, int index2) {
204  ab->swapEntries(index1, index2);
205  }
206  }
207 
209  void copyArrayEntries(int toIndex, int fromIndex) {
211  ab->copyEntry(toIndex, fromIndex);
212  }
213  }
214 
216  void unregisterArrays() noexcept {
217  while (!m_registeredArrays.empty()) {
218 #ifdef OGDF_DEBUG
219  auto size = m_registeredArrays.size();
220 #endif
221  m_registeredArrays.front()->unregister();
222  OGDF_ASSERT(m_registeredArrays.size() < size);
223  }
224  }
225 
228 
230  bool isAutoShrink() const { return m_autoShrink; }
231 
233  void setAutoShrink(bool mAutoShrink) { m_autoShrink = mAutoShrink; }
234 
236  int getArraySize() const { return m_size; }
237 };
238 
239 namespace internal {
241 
247 template<class Registry>
248 class RegisteredArrayBase {
249  using registry_type = Registry;
250  using registration_iterator_type = typename Registry::registration_iterator_type;
251 
253  const Registry* m_pRegistry = nullptr;
254 
255 public:
257  RegisteredArrayBase() = default;
258 
261 
264  moveRegister(move_from);
265  }
266 
269  reregister(copy.m_pRegistry);
270  return *this;
271  }
272 
275  moveRegister(move_from);
276  return *this;
277  }
278 
280  virtual ~RegisteredArrayBase() noexcept {
281  if (m_pRegistry) {
282  m_pRegistry->unregisterArray(m_registration);
283  }
284  }
285 
287  virtual void resize(int size, bool shrink) = 0;
288 
290  virtual void swapEntries(int index1, int index2) = 0;
291 
293  virtual void copyEntry(int newIndex, int oldIndex) = 0;
294 
296  void unregister() noexcept {
297  resize(0, true);
298  reregister(nullptr);
299  }
300 
301 protected:
303  void reregister(const Registry* registry) {
304  if (m_pRegistry) {
305  m_pRegistry->unregisterArray(m_registration);
306  }
307  m_pRegistry = registry;
308  if (m_pRegistry != nullptr) {
309  m_registration = m_pRegistry->registerArray(this);
310  } else {
312  }
313  }
314 
317  if (m_pRegistry) {
318  m_pRegistry->unregisterArray(m_registration);
319  }
320  m_pRegistry = move_from.m_pRegistry;
321  m_registration = move_from.m_registration;
322  move_from.m_pRegistry = nullptr;
323  move_from.m_registration = registration_iterator_type();
324  if (m_pRegistry != nullptr) {
325  m_pRegistry->moveRegisterArray(m_registration, this);
326  }
327  }
328 
329 public:
331  const Registry* registeredAt() const { return m_pRegistry; }
332 };
333 }
334 
336 
343 template<class ArrayType, class KeyIterator, bool isConst = false>
345 public:
346  using registry_type = typename ArrayType::registry_type;
347  using key_type = typename ArrayType::key_type;
348  using value_type = typename std::conditional<isConst, const typename ArrayType::value_type,
349  typename ArrayType::value_type>::type;
351 
352 private:
353  KeyIterator m_it;
355 
356 public:
359 
361 
366  : m_it(mIt), m_array(mArray) { }
367 
369  key_type key() const { return *m_it; }
370 
372  value_type& value() const { return (*m_array)[*m_it]; }
373 
375  value_type& operator*() const { return (*m_array)[*m_it]; }
376 
379  return m_it == iter.m_it && m_array == iter.m_array;
380  }
381 
384  return !operator==(iter);
385  }
386 
389  ++m_it;
390  return *this;
391  }
392 
396  ++m_it;
397  return iter;
398  }
399 
402  --m_it;
403  return *this;
404  }
405 
409  --m_it;
410  return iter;
411  }
412 };
413 
414 namespace internal {
416 
427 template<class Registry, class Value>
429 protected:
430  using key_iterator = typename Registry::iterator_type;
433 
434 public:
435  using registry_type = Registry;
436  using key_type = typename Registry::key_type;
437  using vector_type = std::vector<Value, OGDFAllocator<Value>>;
438  using value_type = typename vector_type::value_type;
439  using value_ref_type = typename vector_type::reference;
440  using value_const_ref_type = typename vector_type::const_reference;
441 
444 
445 protected:
447 
448 public:
451 
453  explicit RegisteredArrayWithoutDefaultOrIndexAccess(const Registry* registry) {
454  // during base class initialization, no part of the derived class exists, so this will always call our base init
455  // so base classes should call their own init themselves
456  registered_array::init(registry);
457  }
458 
460  void init(const Registry* registry = nullptr) {
461  if (registry == nullptr) {
462  resize(0, true);
463  } else {
464  OGDF_ASSERT(registry->maxKeyIndex() < registry->getArraySize());
465  resize(0, false);
466  resize(registry->getArraySize(), true);
467  }
469  }
470 
472  void fill(value_const_ref_type x) { m_data.assign(m_data.size(), x); }
473 
476  OGDF_ASSERT(getRegistry().isKeyAssociated(key));
477 #ifdef OGDF_DEBUG
478  return m_data.at(registeredAt()->keyToIndex(key));
479 #else
480  return m_data[registeredAt()->keyToIndex(key)];
481 #endif
482  }
483 
486  OGDF_ASSERT(getRegistry().isKeyAssociated(key));
487 #ifdef OGDF_DEBUG
488  return m_data.at(registeredAt()->keyToIndex(key));
489 #else
490  return m_data[registeredAt()->keyToIndex(key)];
491 #endif
492  }
493 
496  OGDF_ASSERT(getRegistry().isKeyAssociated(key));
497 #ifdef OGDF_DEBUG
498  return m_data.at(registeredAt()->keyToIndex(key));
499 #else
500  return m_data[registeredAt()->keyToIndex(key)];
501 #endif
502  }
503 
506  OGDF_ASSERT(getRegistry().isKeyAssociated(key));
507 #ifdef OGDF_DEBUG
508  return m_data.at(registeredAt()->keyToIndex(key));
509 #else
510  return m_data[registeredAt()->keyToIndex(key)];
511 #endif
512  }
513 
516  using std::begin;
517  return iterator(begin(getRegistry()), this);
518  }
519 
522  using std::begin;
523  return const_iterator(begin(getRegistry()), this);
524  }
525 
528  using std::begin;
529  return const_iterator(begin(getRegistry()), this);
530  }
531 
534  using std::end;
535  return iterator(end(getRegistry()), this);
536  }
537 
539  const_iterator end() const {
540  using std::end;
541  return const_iterator(end(getRegistry()), this);
542  }
543 
546  using std::end;
547  return const_iterator(end(getRegistry()), this);
548  }
549 
551 
553  bool valid() const {
554  OGDF_ASSERT(registeredAt() == nullptr || registeredAt()->maxKeyIndex() < 0
555  || ((size_t)registeredAt()->maxKeyIndex()) < m_data.size());
556  return registeredAt();
557  }
558 
559 protected:
561  inline const Registry& getRegistry() const {
563  OGDF_ASSERT(valid());
564  return *registeredAt();
565  }
566 
567  void resize(int size, bool shrink) override {
568  m_data.resize(size);
569  if (shrink) {
570  m_data.shrink_to_fit();
571  }
572  }
573 
574  void swapEntries(int index1, int index2) override {
575  std::swap(m_data.at(index1), m_data.at(index2));
576  }
577 
579  void copyEntry(int toIndex, int fromIndex) override {
580  // silently ignored
581  }
582 };
583 
585 template<class Registry, class Value>
587  : public RegisteredArrayWithoutDefaultOrIndexAccess<Registry, Value> {
589 
590 public:
592 
593  explicit RegisteredArrayWithoutDefaultWithIndexAccess(const Registry* registry)
594  : RA(registry) { }
595 
596  using RA::operator[];
597 
599  typename RA::value_const_ref_type operator[](int idx) const {
600 #ifdef OGDF_DEBUG
601  return RA::m_data.at(idx);
602 #else
603  return RA::m_data[idx];
604 #endif
605  }
606 
608  typename RA::value_ref_type operator[](int idx) {
609 #ifdef OGDF_DEBUG
610  return RA::m_data.at(idx);
611 #else
612  return RA::m_data[idx];
613 #endif
614  }
615 };
616 
618 template<class Registry, class Value>
620  typename std::conditional_t<std::is_integral_v<typename Registry::key_type>,
621  RegisteredArrayWithoutDefaultOrIndexAccess<Registry, Value>,
623 
625 
637 template<class Registry, class Value>
640  Value m_default;
641 
642  static_assert(std::is_copy_constructible_v<Value>,
643  "This RegisteredArrayWithDefault<Value> instantiation (e.g. NodeArray<Graph>) is "
644  "invalid because Value is not copy-constructible! "
645  "Use, e.g., NodeArrayP<Graph> or NodeArray<unique_ptr<Graph>, false> instead.");
646 
647 public:
650 
652  explicit RegisteredArrayWithDefault(const Registry* registry) : RA(), m_default() {
653  // call init from here, as our virtual override of init is not available during initialization of the base class
654  RA::init(registry);
655  };
656 
658  explicit RegisteredArrayWithDefault(const Value& def) : RA(), m_default(def) {};
659 
661  explicit RegisteredArrayWithDefault(const Registry* registry, const Value& def)
662  : RA(), m_default(def) {
663  // call init from here, as our virtual override of init is not available during initialization of the base class
664  RA::init(registry);
665  };
666 
668  explicit RegisteredArrayWithDefault(Value&& def) : RA(), m_default(std::forward<Value>(def)) {};
669 
671  explicit RegisteredArrayWithDefault(const Registry* registry, Value&& def)
672  : RA(), m_default(std::forward<Value>(def)) {
673  // call init from here, as our virtual override of init is not available during initialization of the base class
674  RA::init(registry);
675  };
676 
678  void setDefault(Value&& def) { m_default = std::forward<Value>(def); }
679 
681  void setDefault(const Value& def) { m_default = def; }
682 
684  const Value& getDefault() const { return m_default; }
685 
687  Value& getDefault() { return m_default; }
688 
690  void fillWithDefault() { RA::m_data.assign(RA::getRegistry().getArraySize(), m_default); }
691 
692 protected:
694  void copyEntry(int toIndex, int fromIndex) override {
695  RA::m_data.at(toIndex) = RA::m_data.at(fromIndex);
696  }
697 
698  void resize(int size, bool shrink) override {
699  RA::m_data.resize(size, m_default);
700  if (shrink) {
701  RA::m_data.shrink_to_fit();
702  }
703  }
704 };
705 }
706 
708 
807 template<class Registry, class Value, bool WithDefault = true, class Base = Registry>
809  : public std::conditional<WithDefault, internal::RegisteredArrayWithDefault<Registry, Value>,
810  internal::RegisteredArrayWithoutDefault<Registry, Value>>::type {
811  using RA =
812  typename std::conditional<WithDefault, internal::RegisteredArrayWithDefault<Registry, Value>,
814 
815  static inline const Registry* cast(const Base* base) {
816  if (base != nullptr) {
817  // unpack the pointer to invoke the conversion operator
818  return &((const Registry&)*base);
819  } else {
820  return nullptr;
821  }
822  }
823 
824 public:
826  RegisteredArray() : RA() {};
827 
829  explicit RegisteredArray(const Base& base) : RA(cast(&base)) {};
830 
836  RegisteredArray(const Base& base, const Value& def) : RA(cast(&base), def) {};
837 
839  explicit RegisteredArray(const Base* base) : RA(cast(base)) {};
840 
846  RegisteredArray(const Base* base, const Value& def) : RA(cast(base), def) {};
847 
849  void init(const Base* base = nullptr) { RA::init(cast(base)); }
850 
852  void init(const Base& base) { RA::init(cast(&base)); }
853 
859  void init(const Base& base, const Value& new_default) {
860  RA::setDefault(new_default);
861  RA::init(cast(&base));
862  }
863 
864  void init(const Base* base, const Value& new_default) {
865  RA::setDefault(new_default);
866  RA::init(cast(base));
867  }
868 };
869 
871 template<class Registry, bool WithDefault, class Base>
872 class RegisteredArray<Registry, bool, WithDefault, Base>
873  : public RegisteredArray<Registry, unsigned char, WithDefault, Base> {
876 
877 public:
878  using RA::RA;
879 
880  using key_type = typename RA::key_type;
881  using value_type = bool;
882  using value_const_ref_type = const bool&;
883  using value_ref_type = bool&;
886 
888  return reinterpret_cast<value_const_ref_type>(RA::operator[](key));
889  }
890 
892  return reinterpret_cast<value_ref_type>(RA::operator[](key));
893  }
894 
896  return reinterpret_cast<value_const_ref_type>(RA::operator()(key));
897  }
898 
900  return reinterpret_cast<value_ref_type>(RA::operator()(key));
901  }
902 
904  return reinterpret_cast<value_const_ref_type>(RA::operator[](idx));
905  }
906 
908  return reinterpret_cast<value_ref_type>(RA::operator[](idx));
909  }
910 
911  value_ref_type getDefault() { return reinterpret_cast<value_ref_type>(RA::getDefault()); }
912 
914  return reinterpret_cast<value_const_ref_type>(RA::getDefault());
915  }
916 
918  using std::begin;
919  return iterator(begin(RA::getRegistry()), this);
920  }
921 
923  using std::begin;
924  return const_iterator(begin(RA::getRegistry()), this);
925  }
926 
928  using std::begin;
929  return const_iterator(begin(RA::getRegistry()), this);
930  }
931 
933  using std::end;
934  return iterator(end(RA::getRegistry()), this);
935  }
936 
937  const_iterator end() const {
938  using std::end;
939  return const_iterator(end(RA::getRegistry()), this);
940  }
941 
943  using std::end;
944  return const_iterator(end(RA::getRegistry()), this);
945  }
946 };
947 }
948 
949 template<typename RA1, typename RA2>
951 inline void invertRegisteredArray(const RA1& from, RA2& to) {
952  OGDF_ASSERT(from.registeredAt() != nullptr);
953  for (const auto& key : *from.registeredAt()) {
954  to[from[key]] = key;
955  }
956 }
957 
958 /* The following macro will be expanded in the docs, see doc/ogdf-doxygen.cfg:EXPAND_AS_DEFINED */
959 
960 #define OGDF_DECL_REG_ARRAY(NAME) \
961  template<typename Value, bool WithDefault = true> \
962  using NAME = OGDF_DECL_REG_ARRAY_TYPE(Value, WithDefault); \
963  \
967  template<typename Value> \
968  using NAME##P = NAME<std::unique_ptr<Value>, false>;
ogdf::RegisteredArrayIterator::key_type
typename ArrayType::key_type key_type
Definition: RegisteredArray.h:347
ogdf::RegistryBase
Abstract base class for registries.
Definition: RegisteredArray.h:95
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::RegisteredArrayWithoutDefaultOrIndexAccess
RegisteredArrayWithoutDefaultOrIndexAccess(const Registry *registry)
Creates a new registered array associated with registry.
Definition: RegisteredArray.h:453
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::key_type
typename Registry::key_type key_type
Definition: RegisteredArray.h:436
ogdf::RegisteredArray
Dynamic arrays indexed with arbitrary keys.
Definition: RegisteredArray.h:808
ogdf::RegisteredArrayIterator::operator!=
bool operator!=(const RegisteredArrayIterator< ArrayType, KeyIterator, isConst > &iter) const
Inequality operator.
Definition: RegisteredArray.h:383
ogdf::RegistryBase::copyArrayEntries
void copyArrayEntries(int toIndex, int fromIndex)
Copies the entry from fromIndex to toIndex in all registered arrays.
Definition: RegisteredArray.h:209
ogdf::MIN_TABLE_SIZE
static constexpr int MIN_TABLE_SIZE
The default minimum table size for registered arrays.
Definition: RegisteredArray.h:52
ogdf::RegisteredArrayIterator::RegisteredArrayIterator
RegisteredArrayIterator()
Creates a new iterator associated with no array.
Definition: RegisteredArray.h:358
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::value_ref_type
typename vector_type::reference value_ref_type
Definition: RegisteredArray.h:439
ogdf::RegistryBase::~RegistryBase
virtual ~RegistryBase() noexcept
Destructor. Unregisters all associated arrays.
Definition: RegisteredArray.h:119
ogdf::internal::RegisteredArrayWithDefault::m_default
Value m_default
Definition: RegisteredArray.h:640
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::swapEntries
void swapEntries(int index1, int index2) override
Swaps the entries stored at index1 and index2.
Definition: RegisteredArray.h:574
ogdf::internal::RegisteredArrayBase::reregister
void reregister(const Registry *registry)
Associates the array with a new registry.
Definition: RegisteredArray.h:303
ogdf::RegistryBase::resizeArrays
void resizeArrays(int size)
Resizes all arrays to size. Only shrinks the arrays if auto shrink is enabled.
Definition: RegisteredArray.h:183
ogdf::RegisteredArray::RegisteredArray
RegisteredArray(const Base &base)
Creates a new registered array associated with the matching registry of base.
Definition: RegisteredArray.h:829
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >::end
iterator end()
Definition: RegisteredArray.h:932
OGDF_ASSERT
#define OGDF_ASSERT(expr)
Assert condition expr. See doc/build.md for more information.
Definition: basic.h:54
ogdf::RegisteredArrayIterator::operator==
bool operator==(const RegisteredArrayIterator< ArrayType, KeyIterator, isConst > &iter) const
Equality operator.
Definition: RegisteredArray.h:378
ogdf::RegistryBase::m_mutexRegArrays
std::mutex m_mutexRegArrays
Definition: RegisteredArray.h:111
ogdf::RegisteredArrayIterator::operator++
RegisteredArrayIterator< ArrayType, KeyIterator, isConst > & operator++()
Increment operator (prefix).
Definition: RegisteredArray.h:388
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >::operator[]
value_const_ref_type operator[](int idx) const
Definition: RegisteredArray.h:903
ogdf::RegistryBase::keyRemoved
void keyRemoved(Key key)
Records the deletion of a key and resizes all registered arrays if auto shrink is enabled.
Definition: RegisteredArray.h:169
ogdf::RegisteredArray::RA
typename std::conditional< WithDefault, internal::RegisteredArrayWithDefault< Registry, Value >, internal::RegisteredArrayWithoutDefault< Registry, Value > >::type RA
Definition: RegisteredArray.h:813
ogdf::begin
HypergraphRegistry< HypernodeElement >::iterator begin(const HypergraphRegistry< HypernodeElement > &self)
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::operator[]
value_ref_type operator[](key_type key)
Returns a reference to the element associated with key.
Definition: RegisteredArray.h:485
ogdf::RegistryBase::resizeArrays
void resizeArrays(int size, bool shrink)
Resizes all arrays to size. If shrink is true, the arrays may also shrink.
Definition: RegisteredArray.h:186
ogdf::RegistryBase::registerArray
OGDF_NODISCARD registration_iterator_type registerArray(registered_array_type *pArray) const
Registers a new array with this registry.
Definition: RegisteredArray.h:135
ogdf::RegisteredArrayIterator::value
value_type & value() const
Returns the value of key() in the registered array.
Definition: RegisteredArray.h:372
ogdf::RegisteredArrayIterator::operator--
RegisteredArrayIterator< ArrayType, KeyIterator, isConst > & operator--()
Decrement operator (prefix).
Definition: RegisteredArray.h:401
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >::operator()
value_const_ref_type operator()(key_type key) const
Definition: RegisteredArray.h:895
ogdf::RegistryBase< Key *, GraphRegistry< Key, GraphObjectContainer< Key >, 1 >, GraphObjectContainer< Key > ::iterator >::registration_list_type
std::list< registered_array_type *, OGDFAllocator< registered_array_type * > > registration_list_type
Definition: RegisteredArray.h:102
ogdf::internal::RegisteredArrayBase::~RegisteredArrayBase
virtual ~RegisteredArrayBase() noexcept
Destructor.
Definition: RegisteredArray.h:280
ogdf::internal::RegisteredArrayWithoutDefaultWithIndexAccess
RegisteredArrayWithoutDefaultOrIndexAccess that also allows accessing its values directly by their in...
Definition: RegisteredArray.h:586
ogdf::internal::RegisteredArrayBase::operator=
RegisteredArrayBase & operator=(RegisteredArrayBase< Registry > &&move_from) noexcept
Assignment operator (move semantics).
Definition: RegisteredArray.h:274
ogdf::internal::RegisteredArrayWithDefault::RegisteredArrayWithDefault
RegisteredArrayWithDefault(const Value &def)
Creates a new registered array associated with no registry and default value def.
Definition: RegisteredArray.h:658
ogdf::internal::RegisteredArrayWithDefault::RA
RegisteredArrayWithoutDefault< Registry, Value > RA
Definition: RegisteredArray.h:639
ogdf::internal::RegisteredArrayBase
Abstract base class for registered arrays.
Definition: RegisteredArray.h:48
ogdf::internal::RegisteredArrayWithDefault::RegisteredArrayWithDefault
RegisteredArrayWithDefault(const Registry *registry, Value &&def)
Creates a new registered array associated with registry and default value def.
Definition: RegisteredArray.h:671
ogdf::RegistryBase::isAutoShrink
bool isAutoShrink() const
Returns whether the registry allows arrays to shrink when keys are removed.
Definition: RegisteredArray.h:230
ogdf::RegistryBase::moveRegisterArray
void moveRegisterArray(registration_iterator_type it, registered_array_type *pArray) const
Stores array pArray at position it in the list of registered arrays.
Definition: RegisteredArray.h:154
ogdf::internal::RegisteredArrayWithDefault::resize
void resize(int size, bool shrink) override
Definition: RegisteredArray.h:698
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::vector_type
std::vector< Value, OGDFAllocator< Value > > vector_type
Definition: RegisteredArray.h:437
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >::operator[]
value_ref_type operator[](int idx)
Definition: RegisteredArray.h:907
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::iterator
RegisteredArrayIterator< registered_array, key_iterator, false > iterator
Definition: RegisteredArray.h:442
ogdf::RegisteredArrayIterator::operator++
RegisteredArrayIterator< ArrayType, KeyIterator, isConst > operator++(int)
Increment operator (postfix).
Definition: RegisteredArray.h:394
ogdf::RegistryBase::getRegisteredArrays
const registration_list_type & getRegisteredArrays() const
Returns a reference to the list of all registered arrays.
Definition: RegisteredArray.h:227
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >::cend
const_iterator cend() const
Definition: RegisteredArray.h:942
ogdf::internal::RegisteredArrayBase::swapEntries
virtual void swapEntries(int index1, int index2)=0
Swaps the entries stored at index1 and index2.
ogdf::internal::RegisteredArrayWithDefault::RegisteredArrayWithDefault
RegisteredArrayWithDefault(const Registry *registry)
Creates a new registered array associated with registry and a default-constructed default value.
Definition: RegisteredArray.h:652
ogdf::RegistryBase::setAutoShrink
void setAutoShrink(bool mAutoShrink)
Specifies whether the registry allows arrays to shrink when keys are removed.
Definition: RegisteredArray.h:233
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::fill
void fill(value_const_ref_type x)
Fills all entries with value x.
Definition: RegisteredArray.h:472
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >::value_ref_type
bool & value_ref_type
Definition: RegisteredArray.h:883
ogdf::internal::RegisteredArrayBase::m_registration
registration_iterator_type m_registration
Definition: RegisteredArray.h:252
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::operator()
value_ref_type operator()(key_type key)
Returns a reference to the element associated with key.
Definition: RegisteredArray.h:505
ogdf::RegisteredArrayIterator::value_type
typename std::conditional< isConst, const typename ArrayType::value_type, typename ArrayType::value_type >::type value_type
Definition: RegisteredArray.h:349
ogdf::internal::RegisteredArrayBase::registry_type
Registry registry_type
Definition: RegisteredArray.h:249
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >
Specialization to work around vector<bool>.
Definition: RegisteredArray.h:872
ogdf::internal::RegisteredArrayWithoutDefaultWithIndexAccess::RegisteredArrayWithoutDefaultWithIndexAccess
RegisteredArrayWithoutDefaultWithIndexAccess(const Registry *registry)
Definition: RegisteredArray.h:593
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::getRegistry
const Registry & getRegistry() const
Returns a reference to the associated registry.
Definition: RegisteredArray.h:561
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >::begin
iterator begin()
Definition: RegisteredArray.h:917
ogdf::RegisteredArrayIterator::registry_type
typename ArrayType::registry_type registry_type
Definition: RegisteredArray.h:346
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::operator[]
value_const_ref_type operator[](key_type key) const
Returns a const reference to the element associated with key.
Definition: RegisteredArray.h:475
ogdf::RegistryBase::m_size
int m_size
Definition: RegisteredArray.h:108
Minisat::Internal::copy
static void copy(const T &from, T &to)
Definition: Alg.h:61
ogdf::internal::RegisteredArrayWithDefault::setDefault
void setDefault(const Value &def)
Sets a new default value for new keys.
Definition: RegisteredArray.h:681
ogdf::internal::RegisteredArrayBase::RegisteredArrayBase
RegisteredArrayBase()=default
Creates a registered array associated with no registry.
ogdf::RegisteredArrayIterator::operator*
value_type & operator*() const
Returns the value of key() in the registered array.
Definition: RegisteredArray.h:375
invertRegisteredArray
void invertRegisteredArray(const RA1 &from, RA2 &to)
Copy data from a ABCArray<XYZ> to an XYZArray<ABC>
Definition: RegisteredArray.h:951
backward::Color::type
type
Definition: backward.hpp:1716
ogdf::RegistryBase::unregisterArray
void unregisterArray(registration_iterator_type it) const noexcept
Unregisters an array associated with this registry.
Definition: RegisteredArray.h:146
OGDF_NODISCARD
#define OGDF_NODISCARD
Indicate that the result of a function call should not be discarded.
Definition: config.h:203
ogdf::internal::RegisteredArrayWithoutDefaultWithIndexAccess::operator[]
RA::value_const_ref_type operator[](int idx) const
Returns a const reference to the element with index idx.
Definition: RegisteredArray.h:599
backward::details::move
const T & move(const T &v)
Definition: backward.hpp:243
ogdf::internal::RegisteredArrayWithDefault::RegisteredArrayWithDefault
RegisteredArrayWithDefault(const Registry *registry, const Value &def)
Creates a new registered array associated with registry and default value def.
Definition: RegisteredArray.h:661
ogdf::internal::RegisteredArrayWithDefault::getDefault
const Value & getDefault() const
Returns the current default value for new keys.
Definition: RegisteredArray.h:684
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >::end
const_iterator end() const
Definition: RegisteredArray.h:937
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::cbegin
const_iterator cbegin() const
Returns a const iterator to the first key-value pair in the array.
Definition: RegisteredArray.h:527
ogdf::internal::RegisteredArrayWithoutDefaultWithIndexAccess::RegisteredArrayWithoutDefaultWithIndexAccess
RegisteredArrayWithoutDefaultWithIndexAccess()=default
ogdf::internal::RegisteredArrayBase::unregister
void unregister() noexcept
Clears the array and associates it with no registry.
Definition: RegisteredArray.h:296
ogdf::calculateTableSize
int calculateTableSize(int actualCount)
The default growth function for registered arrays.
Definition: RegisteredArray.h:58
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::RegisteredArrayWithoutDefaultOrIndexAccess
RegisteredArrayWithoutDefaultOrIndexAccess()=default
Creates a new registered array associated with no registry.
ogdf::internal::RegisteredArrayBase::moveRegister
void moveRegister(RegisteredArrayBase< Registry > &move_from)
Moves array registration from move_from to this array.
Definition: RegisteredArray.h:316
ogdf::RegisteredArrayIterator::key
key_type key() const
Returns the current key.
Definition: RegisteredArray.h:369
ogdf::internal::RegisteredArrayWithDefault::fillWithDefault
void fillWithDefault()
Overwrites all values with the current default value.
Definition: RegisteredArray.h:690
ogdf::internal::RegisteredArrayBase::operator=
RegisteredArrayBase & operator=(const RegisteredArrayBase< Registry > &copy)
Assignment operator.
Definition: RegisteredArray.h:268
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::copyEntry
void copyEntry(int toIndex, int fromIndex) override
This operation is not supported for registered arrays without default.
Definition: RegisteredArray.h:579
ogdf::internal::RegisteredArrayWithDefault
Registered arrays with default values.
Definition: RegisteredArray.h:638
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >::getDefault
value_const_ref_type getDefault() const
Definition: RegisteredArray.h:913
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::cend
const_iterator cend() const
Returns the const past-the-end iterator of the array.
Definition: RegisteredArray.h:545
ogdf::RegistryBase< Key *, GraphRegistry< Key, GraphObjectContainer< Key >, 1 >, GraphObjectContainer< Key > ::iterator >::registry_type
GraphRegistry< Key, GraphObjectContainer< Key >, 1 > registry_type
Definition: RegisteredArray.h:99
ogdf::RegistryBase::keyAdded
void keyAdded(Key key)
Records the addition of a new key and resizes all registered arrays if necessary.
Definition: RegisteredArray.h:162
ogdf::RegistryBase< Key *, GraphRegistry< Key, GraphObjectContainer< Key >, 1 >, GraphObjectContainer< Key > ::iterator >::key_type
Key * key_type
Definition: RegisteredArray.h:98
ogdf::RegistryBase::swapArrayEntries
void swapArrayEntries(int index1, int index2)
Swaps the entries at index1 and index2 in all registered arrays.
Definition: RegisteredArray.h:202
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::begin
iterator begin()
Returns an iterator to the first key-value pair in the array.
Definition: RegisteredArray.h:515
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >::key_type
typename RA::key_type key_type
Definition: RegisteredArray.h:880
ogdf::RegisteredArray::init
void init(const Base &base)
Reinitializes the array. Associates the array with the matching registry of base.
Definition: RegisteredArray.h:852
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::resize
void resize(int size, bool shrink) override
Resizes the registered array to size. The array will only shrink if shrink is true.
Definition: RegisteredArray.h:567
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >::operator[]
value_ref_type operator[](key_type key)
Definition: RegisteredArray.h:891
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::m_data
vector_type m_data
Definition: RegisteredArray.h:446
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::begin
const_iterator begin() const
Returns a const iterator to the first key-value pair in the array.
Definition: RegisteredArray.h:521
ogdf::RegisteredArrayIterator::operator--
RegisteredArrayIterator< ArrayType, KeyIterator, isConst > operator--(int)
Decrement operator (postfix).
Definition: RegisteredArray.h:407
ogdf::internal::RegisteredArrayBase::m_pRegistry
const Registry * m_pRegistry
Definition: RegisteredArray.h:253
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >::value_const_ref_type
const bool & value_const_ref_type
Definition: RegisteredArray.h:882
ogdf::internal::RegisteredArrayBase::RegisteredArrayBase
RegisteredArrayBase(RegisteredArrayBase< Registry > &&move_from) noexcept
Moves the registration of move_from to this registered array.
Definition: RegisteredArray.h:263
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::key_iterator
typename Registry::iterator_type key_iterator
Definition: RegisteredArray.h:430
Math.h
Mathematical Helpers.
ogdf::RegistryBase::RegistryBase
RegistryBase()=default
ogdf::internal::RegisteredArrayWithoutDefault
typename std::conditional_t< std::is_integral_v< typename Registry::key_type >, RegisteredArrayWithoutDefaultOrIndexAccess< Registry, Value >, RegisteredArrayWithoutDefaultWithIndexAccess< Registry, Value > > RegisteredArrayWithoutDefault
Registered arrays without default values that automatically allows by-index access to values if Regis...
Definition: RegisteredArray.h:622
ogdf::internal::RegisteredArrayWithDefault::getDefault
Value & getDefault()
Returns the current default value for new keys.
Definition: RegisteredArray.h:687
ogdf::internal::RegisteredArrayWithDefault::copyEntry
void copyEntry(int toIndex, int fromIndex) override
Copies the entry stored at oldIndex to newIndex.
Definition: RegisteredArray.h:694
ogdf::RegistryBase::operator=
RegistryBase & operator=(const RegistryBase &other)=delete
ogdf::graphics::init
void init()
Definition: graphics.h:446
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess
Registered arrays without default values or by-index access to values.
Definition: RegisteredArray.h:428
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >::operator[]
value_const_ref_type operator[](key_type key) const
Definition: RegisteredArray.h:887
ogdf::internal::RegisteredArrayBase::RegisteredArrayBase
RegisteredArrayBase(const RegisteredArrayBase< Registry > &copy)
Creates a registered array associated with the same registry as copy.
Definition: RegisteredArray.h:260
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::operator()
value_const_ref_type operator()(key_type key) const
Returns a const reference to the element associated with key.
Definition: RegisteredArray.h:495
ogdf::RegisteredArrayIterator::m_it
KeyIterator m_it
Definition: RegisteredArray.h:353
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::value_type
typename vector_type::value_type value_type
Definition: RegisteredArray.h:438
ogdf::RegisteredArray::RegisteredArray
RegisteredArray(const Base *base, const Value &def)
Creates a new registered array associated with the matching registry of base and initializes all valu...
Definition: RegisteredArray.h:846
ogdf::RegisteredArrayIterator::m_array
array_pointer_type m_array
Definition: RegisteredArray.h:354
ogdf::RegisteredArrayIterator::RegisteredArrayIterator
RegisteredArrayIterator(KeyIterator mIt, array_pointer_type mArray)
Creates a new iterator.
Definition: RegisteredArray.h:365
std
Definition: GML.h:110
ogdf::end
HypergraphRegistry< HypernodeElement >::iterator end(const HypergraphRegistry< HypernodeElement > &self)
ogdf::RegisteredArray::cast
static const Registry * cast(const Base *base)
Definition: RegisteredArray.h:815
ogdf::internal::RegisteredArrayBase::copyEntry
virtual void copyEntry(int newIndex, int oldIndex)=0
Copies the entry stored at oldIndex to newIndex.
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::end
const_iterator end() const
Returns the const past-the-end iterator of the array.
Definition: RegisteredArray.h:539
ogdf::internal::RegisteredArrayBase::registeredAt
const Registry * registeredAt() const
Returns a pointer to the associated registry.
Definition: RegisteredArray.h:331
ogdf::RegisteredArrayIterator
Iterator for registered arrays.
Definition: RegisteredArray.h:344
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::value_const_ref_type
typename vector_type::const_reference value_const_ref_type
Definition: RegisteredArray.h:440
ogdf::RegisteredArray::RegisteredArray
RegisteredArray(const Base *base)
Creates a new registered array associated with the matching registry of base.
Definition: RegisteredArray.h:839
ogdf::RegistryBase< Key *, GraphRegistry< Key, GraphObjectContainer< Key >, 1 >, GraphObjectContainer< Key > ::iterator >::iterator_type
GraphObjectContainer< Key > ::iterator iterator_type
Definition: RegisteredArray.h:100
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >::operator()
value_ref_type operator()(key_type key)
Definition: RegisteredArray.h:899
ogdf::RegistryBase::resizeArrays
void resizeArrays()
Resizes all arrays to the size requested by calculateArraySize(). Only shrinks the arrays if auto shr...
Definition: RegisteredArray.h:180
ogdf::internal::RegisteredArrayWithDefault::setDefault
void setDefault(Value &&def)
Sets a new default value for new keys.
Definition: RegisteredArray.h:678
ogdf::Math::nextPower2
T nextPower2(T x)
Returns the smallest power of 2 that is no less than the given (integral) argument.
Definition: Math.h:78
ogdf::RegisteredArray::init
void init(const Base *base=nullptr)
Reinitializes the array. Associates the array with the matching registry of base.
Definition: RegisteredArray.h:849
ogdf::RegistryBase< Key *, GraphRegistry< Key, GraphObjectContainer< Key >, 1 >, GraphObjectContainer< Key > ::iterator >::registration_iterator_type
typename registration_list_type::iterator registration_iterator_type
Definition: RegisteredArray.h:103
ogdf::RegistryBase::keysCleared
void keysCleared()
Records that all keys have been cleared. If auto shrink is enabled, all arrays are cleared and resize...
Definition: RegisteredArray.h:176
ogdf::internal::RegisteredArrayBase::registration_iterator_type
typename Registry::registration_iterator_type registration_iterator_type
Definition: RegisteredArray.h:250
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >::cbegin
const_iterator cbegin() const
Definition: RegisteredArray.h:927
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >::begin
const_iterator begin() const
Definition: RegisteredArray.h:922
ogdf::RegistryBase::getArraySize
int getArraySize() const
Returns the current size of all registered arrays.
Definition: RegisteredArray.h:236
ogdf::RegisteredArray::RegisteredArray
RegisteredArray()
Creates a new registered array associated with no registry.
Definition: RegisteredArray.h:826
ogdf::RegistryBase::m_registeredArrays
registration_list_type m_registeredArrays
Definition: RegisteredArray.h:106
ogdf::RegistryBase::m_autoShrink
bool m_autoShrink
Definition: RegisteredArray.h:107
ogdf::internal::RegisteredArrayBase::resize
virtual void resize(int size, bool shrink)=0
Resizes the registered array to size. The array will only shrink if shrink is true.
ogdf::internal::RegisteredArrayWithDefault::RegisteredArrayWithDefault
RegisteredArrayWithDefault()
Creates a new registered array associated with no registry and a default-constructed default value.
Definition: RegisteredArray.h:649
ogdf::RegisteredArray::init
void init(const Base *base, const Value &new_default)
Definition: RegisteredArray.h:864
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >::getDefault
value_ref_type getDefault()
Definition: RegisteredArray.h:911
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::end
iterator end()
Returns the past-the-end iterator of the array.
Definition: RegisteredArray.h:533
ogdf::RegistryBase::unregisterArrays
void unregisterArrays() noexcept
Unregister all associated arrays.
Definition: RegisteredArray.h:216
ogdf::RegisteredArrayIterator::array_pointer_type
typename std::conditional< isConst, const ArrayType *, ArrayType * >::type array_pointer_type
Definition: RegisteredArray.h:350
ogdf::RegisteredArray::RegisteredArray
RegisteredArray(const Base &base, const Value &def)
Creates a new registered array associated with the matching registry of base and initializes all valu...
Definition: RegisteredArray.h:836
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::init
void init(const Registry *registry=nullptr)
Associates the array with registry. All entries are initialized using the default constructor of Valu...
Definition: RegisteredArray.h:460
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::const_iterator
RegisteredArrayIterator< registered_array, key_iterator, true > const_iterator
Definition: RegisteredArray.h:443
ogdf::RegistryBase::reserveSpace
void reserveSpace(int new_keys)
Resizes all arrays to make space of new_keys new keys.
Definition: RegisteredArray.h:197
ogdf::RegisteredArray::init
void init(const Base &base, const Value &new_default)
Reinitializes the array with default value new_default.
Definition: RegisteredArray.h:859
ogdf::RegisteredArray< Registry, bool, WithDefault, Base >::value_type
bool value_type
Definition: RegisteredArray.h:881
ogdf::internal::RegisteredArrayWithDefault::RegisteredArrayWithDefault
RegisteredArrayWithDefault(Value &&def)
Creates a new registered array associated with no registry and default value def.
Definition: RegisteredArray.h:668
ogdf::internal::RegisteredArrayWithoutDefaultWithIndexAccess::operator[]
RA::value_ref_type operator[](int idx)
Returns a reference to the element with index idx.
Definition: RegisteredArray.h:608
ogdf::internal::RegisteredArrayWithoutDefaultOrIndexAccess::valid
bool valid() const
Returns true iff the array is associated with a registry.
Definition: RegisteredArray.h:553