[Orxonox-commit 4930] r9599 - code/branches/core6/src/libraries/core/object
landauf at orxonox.net
landauf at orxonox.net
Fri Mar 29 14:33:04 CET 2013
Author: landauf
Date: 2013-03-29 14:33:04 +0100 (Fri, 29 Mar 2013)
New Revision: 9599
Modified:
code/branches/core6/src/libraries/core/object/IteratorBase.h
code/branches/core6/src/libraries/core/object/ObjectListBase.cc
code/branches/core6/src/libraries/core/object/ObjectListBase.h
Log:
added proper interface (ObjectListElementRemovalListener) to notify iterators about removed elements
Modified: code/branches/core6/src/libraries/core/object/IteratorBase.h
===================================================================
--- code/branches/core6/src/libraries/core/object/IteratorBase.h 2013-03-29 13:12:41 UTC (rev 9598)
+++ code/branches/core6/src/libraries/core/object/IteratorBase.h 2013-03-29 13:33:04 UTC (rev 9599)
@@ -46,7 +46,7 @@
It serves as base class for @ref ObjectListIterator and @ref Iterator
*/
template <class T, class I>
- class IteratorBase
+ class IteratorBase : public ObjectListElementRemovalListener
{
public:
/**
@@ -168,12 +168,12 @@
}
/**
- @brief Increments the Iterator if it points at the given object.
+ @brief Increments the Iterator if it points at the given element.
@param object The object to compare with
*/
- inline void incrementIfEqual(Listable* object)
+ virtual void removedElement(ObjectListBaseElement* element)
{
- if (this->element_ && this->element_->objectBase_ == object)
+ if (this->element_ == element)
this->operator++();
}
@@ -193,7 +193,7 @@
if (this->element_)
{
this->list_ = this->element_->list_;
- this->list_->registerIterator(this);
+ this->list_->registerRemovalListener(this);
}
else
this->list_ = NULL;
@@ -205,7 +205,7 @@
inline void unregisterIterator()
{
if (this->list_)
- this->list_->unregisterIterator(this);
+ this->list_->unregisterRemovalListener(this);
}
ObjectListBaseElement* element_; //!< The element the Iterator points at
Modified: code/branches/core6/src/libraries/core/object/ObjectListBase.cc
===================================================================
--- code/branches/core6/src/libraries/core/object/ObjectListBase.cc 2013-03-29 13:12:41 UTC (rev 9598)
+++ code/branches/core6/src/libraries/core/object/ObjectListBase.cc 2013-03-29 13:33:04 UTC (rev 9599)
@@ -69,15 +69,14 @@
}
/**
- @brief Increases all Iterators that currently point on the given element (because it gets removed).
- @param object The object that gets removed
+ @brief Notifies all listeners that the given element is about to get removed.
+ @param element The element that gets removed
+ This is mainly used for iterators which point at the removed element
*/
- void ObjectListBase::notifyIterators(Listable* object) const
+ void ObjectListBase::notifyRemovalListeners(ObjectListBaseElement* element) const
{
- for (std::vector<void*>::const_iterator it = this->iterators_.begin(); it != this->iterators_.end(); ++it)
- ((Iterator<Listable>*)(*it))->incrementIfEqual(object);
- for (std::vector<void*>::const_iterator it = this->objectListIterators_.begin(); it != this->objectListIterators_.end(); ++it)
- ((ObjectListIterator<Listable>*)(*it))->incrementIfEqual(object);
+ for (std::vector<ObjectListElementRemovalListener*>::const_iterator it = this->listeners_.begin(); it != this->listeners_.end(); ++it)
+ (*it)->removedElement(element);
}
/**
@@ -108,7 +107,7 @@
void ObjectListBase::removeElement(ObjectListBaseElement* element)
{
orxout(verbose, context::object_list) << "Removing Object from " << element->objectBase_->getIdentifier()->getName() << "-list." << endl;
- this->notifyIterators(element->objectBase_);
+ this->notifyRemovalListeners(element);
if (element->next_)
element->next_->prev_ = element->prev_;
Modified: code/branches/core6/src/libraries/core/object/ObjectListBase.h
===================================================================
--- code/branches/core6/src/libraries/core/object/ObjectListBase.h 2013-03-29 13:12:41 UTC (rev 9598)
+++ code/branches/core6/src/libraries/core/object/ObjectListBase.h 2013-03-29 13:33:04 UTC (rev 9599)
@@ -78,6 +78,17 @@
};
+ // ########################################
+ // ### ObjectListElementRemovalListener ###
+ // ########################################
+ /// Gets called by the object list if an element is removed
+ class _CoreExport ObjectListElementRemovalListener
+ {
+ public:
+ virtual ~ObjectListElementRemovalListener() {}
+ virtual void removedElement(ObjectListBaseElement* element) = 0;
+ };
+
// ###############################
// ### ObjectListBase ###
// ###############################
@@ -118,37 +129,25 @@
/// Returns a pointer to the element in front of the first element in the list. Works only with Iterator.
inline ObjectListBaseElement* rend() { return 0; }
- inline void registerIterator(void* iterator) { this->iterators_.push_back(iterator); }
- inline void unregisterIterator(void* iterator)
+ inline void registerRemovalListener(ObjectListElementRemovalListener* listener) { this->listeners_.push_back(listener); }
+ inline void unregisterRemovalListener(ObjectListElementRemovalListener* listener)
{
- for (unsigned int i = 0; i < this->iterators_.size(); ++i)
+ for (unsigned int i = 0; i < this->listeners_.size(); ++i)
{
- if (iterators_[i] == iterator)
+ if (listeners_[i] == listener)
{
- iterators_.erase(iterators_.begin() + i);
+ listeners_.erase(listeners_.begin() + i);
break;
}
}
}
- inline void registerObjectListIterator(void* iterator) { this->objectListIterators_.push_back(iterator); }
- inline void unregisterObjectListIterator(void* iterator)
- {
- for (unsigned int i = 0; i < this->objectListIterators_.size(); ++i)
- {
- if (objectListIterators_[i] == iterator)
- {
- objectListIterators_.erase(objectListIterators_.begin() + i);
- break;
- }
- }
- }
- void notifyIterators(Listable* object) const;
private:
- ObjectListBaseElement* first_; //!< The first element in the list
- ObjectListBaseElement* last_; //!< The last element in the list
- std::vector<void*> iterators_; //!< A list of Iterators pointing on an element in this list
- std::vector<void*> objectListIterators_; //!< A list of ObjectListIterators pointing on an element in this list
+ void notifyRemovalListeners(ObjectListBaseElement* element) const;
+
+ ObjectListBaseElement* first_; //!< The first element in the list
+ ObjectListBaseElement* last_; //!< The last element in the list
+ std::vector<ObjectListElementRemovalListener*> listeners_; //!< A list of Iterators pointing on an element in this list
};
}
More information about the Orxonox-commit
mailing list