[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