summaryrefslogtreecommitdiff
path: root/src/core/managed
diff options
context:
space:
mode:
authorAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2014-12-17 02:31:54 +0100
committerAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2014-12-17 02:31:54 +0100
commit076e67fcd2cfd5a5ff9dd28b4ac0e6e5e8cd22c2 (patch)
tree6632766210baf7c0b50cc78fcd5963139ccc7acc /src/core/managed
parentf97c969d3a184dbb868eca97c850f2adaa72e3b7 (diff)
updated ManagedContainer class to allow nullptr as owner, making this a list of rooted elements
Diffstat (limited to 'src/core/managed')
-rw-r--r--src/core/managed/ManagedContainer.hpp50
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);
}