diff options
author | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2014-12-17 02:31:54 +0100 |
---|---|---|
committer | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2014-12-17 02:31:54 +0100 |
commit | 076e67fcd2cfd5a5ff9dd28b4ac0e6e5e8cd22c2 (patch) | |
tree | 6632766210baf7c0b50cc78fcd5963139ccc7acc /src/core/managed/ManagedContainer.hpp | |
parent | f97c969d3a184dbb868eca97c850f2adaa72e3b7 (diff) |
updated ManagedContainer class to allow nullptr as owner, making this a list of rooted elements
Diffstat (limited to 'src/core/managed/ManagedContainer.hpp')
-rw-r--r-- | src/core/managed/ManagedContainer.hpp | 50 |
1 files changed, 23 insertions, 27 deletions
diff --git a/src/core/managed/ManagedContainer.hpp b/src/core/managed/ManagedContainer.hpp index 5ce448e..68477e0 100644 --- a/src/core/managed/ManagedContainer.hpp +++ b/src/core/managed/ManagedContainer.hpp @@ -27,6 +27,7 @@ #ifndef _OUSIA_MANAGED_CONTAINER_H_ #define _OUSIA_MANAGED_CONTAINER_H_ +#include <iostream> #include <unordered_map> #include <unordered_set> #include <vector> @@ -124,9 +125,8 @@ private: */ void initialize() { - Manager &manager = this->getManager(); for (const auto &elem : *this) { - addElement(manager, elem); + addElement(elem); } } @@ -137,9 +137,8 @@ private: void finalize() { if (owner) { - Manager &manager = this->getManager(); for (const auto &elem : *this) { - deleteElement(manager, elem); + deleteElement(elem); } } } @@ -160,9 +159,12 @@ protected: * @param elem is a reference to the actual element that is being added to * the underlying container. */ - void addElement(Manager &manager, const value_type &elem) + void addElement(const value_type &elem) { - manager.addRef(accessor.getManaged(elem), owner); + Managed* managed = accessor.getManaged(elem); + Manager &manager = managed->getManager(); + + manager.addRef(managed, owner); listener.addElement(elem, owner); } @@ -171,14 +173,15 @@ protected: * This function makes sure that the association from the owner to the added * element is removed. * - * @param managed is the managed instance that is being deleted from the - * container. * @param elem is a reference to the actual element that is being removed * from the underlying container. */ - void deleteElement(Manager &manager, const value_type &elem) + void deleteElement(const value_type &elem) { - manager.deleteRef(accessor.getManaged(elem), owner); + Managed* managed = accessor.getManaged(elem); + Manager &manager = managed->getManager(); + + manager.deleteRef(managed, owner); listener.deleteElement(elem, owner); } @@ -329,11 +332,6 @@ public: */ Managed *getOwner() const { return owner; } - /** - * Returns the manager instance associated with the owner. - */ - Manager &getManager() const { return owner->getManager(); } - /* State functions */ /** @@ -374,9 +372,7 @@ public: */ void clear() noexcept { - for (const_iterator it = cbegin(); it != cend(); it++) { - deleteElement(this->getManager(), *it); - } + finalize(); c.clear(); } @@ -385,7 +381,7 @@ public: */ iterator insert(iterator position, value_type val) { - addElement(this->getManager(), val); + addElement(val); return c.insert(position, val); } @@ -397,7 +393,7 @@ public: */ iterator erase(iterator position) { - deleteElement(this->getManager(), *position); + deleteElement(*position); return c.erase(position); } @@ -410,7 +406,7 @@ public: iterator erase(iterator first, iterator last) { for (const_iterator it = first; it != last; it++) { - this->deleteElement(this->getManager(), *it); + this->deleteElement(*it); } return c.erase(first, last); } @@ -487,16 +483,16 @@ public: return Base::cend(); } - void push_back(Handle<T> h) + void push_back(const value_type &val) { - this->addElement(this->getManager(), h.get()); - Base::c.push_back(h.get()); + this->addElement(val); + Base::c.push_back(val); } void pop_back() { if (!Base::empty()) { - this->deleteElement(this->getManager(), back()); + this->deleteElement(back()); } Base::c.pop_back(); } @@ -526,13 +522,13 @@ public: std::pair<iterator, bool> insert(value_type val) { - this->addElement(this->getManager(), val); + this->addElement(val); return Base::c.insert(val); } iterator insert(const_iterator position, value_type val) { - this->addElement(this->getManager(), val); + this->addElement(val); return Base::c.insert(position, val); } |