[Orxonox-commit 4935] r9604 - code/branches/core6/src/libraries/core/object

landauf at orxonox.net landauf at orxonox.net
Sat Mar 30 15:38:02 CET 2013


Author: landauf
Date: 2013-03-30 15:38:02 +0100 (Sat, 30 Mar 2013)
New Revision: 9604

Modified:
   code/branches/core6/src/libraries/core/object/ObjectList.h
   code/branches/core6/src/libraries/core/object/ObjectListBase.cc
   code/branches/core6/src/libraries/core/object/ObjectListBase.h
   code/branches/core6/src/libraries/core/object/ObjectListIterator.h
Log:
added some checks and a size() function to object list

Modified: code/branches/core6/src/libraries/core/object/ObjectList.h
===================================================================
--- code/branches/core6/src/libraries/core/object/ObjectList.h	2013-03-29 22:26:53 UTC (rev 9603)
+++ code/branches/core6/src/libraries/core/object/ObjectList.h	2013-03-30 14:38:02 UTC (rev 9604)
@@ -67,6 +67,12 @@
         public:
             typedef ObjectListIterator<T> iterator;
 
+            /// Returns the size of the list
+            inline static size_t size()
+            {
+                return ClassIdentifier<T>::getIdentifier()->getObjects()->size();
+            }
+
             /// Returns an Iterator to the first element in the list.
             inline static ObjectListElement<T>* begin()
             {

Modified: code/branches/core6/src/libraries/core/object/ObjectListBase.cc
===================================================================
--- code/branches/core6/src/libraries/core/object/ObjectListBase.cc	2013-03-29 22:26:53 UTC (rev 9603)
+++ code/branches/core6/src/libraries/core/object/ObjectListBase.cc	2013-03-30 14:38:02 UTC (rev 9604)
@@ -42,7 +42,8 @@
 {
     ObjectListBaseElement::~ObjectListBaseElement()
     {
-        this->list_->removeElement(this);
+        if (this->list_)
+            this->list_->removeElement(this);
     }
 
     /**
@@ -52,6 +53,7 @@
     {
         this->first_ = 0;
         this->last_ = 0;
+        this->size_ = 0;
     }
 
     /**
@@ -59,13 +61,8 @@
     */
     ObjectListBase::~ObjectListBase()
     {
-        ObjectListBaseElement* temp;
         while (this->first_)
-        {
-            temp = this->first_->next_;
             delete this->first_;
-            this->first_ = temp;
-        }
     }
 
     /**
@@ -85,20 +82,29 @@
     */
     void ObjectListBase::addElement(ObjectListBaseElement* element)
     {
+        if (element->list_)
+        {
+            orxout(internal_error) << "Element is already registered in another list" << endl;
+            return;
+        }
+
         if (!this->last_)
         {
             // If the list is empty
             this->last_ = element;
-            this->first_ = this->last_; // There's only one object in the list now
+            this->first_ = element; // There's only one object in the list now
         }
         else
         {
             // If the list isn't empty
             ObjectListBaseElement* temp = this->last_;
             this->last_ = element;
-            this->last_->prev_ = temp;
-            temp->next_ = this->last_;
+            element->prev_ = temp;
+            temp->next_ = element;
         }
+
+        element->list_ = this;
+        ++this->size_;
     }
 
     /**
@@ -106,7 +112,14 @@
      */
     void ObjectListBase::removeElement(ObjectListBaseElement* element)
     {
-        orxout(verbose, context::object_list) << "Removing Object from " << element->objectBase_->getIdentifier()->getName() << "-list." << endl;
+        if (element->list_ != this)
+        {
+            orxout(internal_error) << "Element is not registered in this list" << endl;
+            return;
+        }
+
+        if (element->objectBase_)
+            orxout(verbose, context::object_list) << "Removing Object from " << element->objectBase_->getIdentifier()->getName() << "-list." << endl;
         this->notifyRemovalListeners(element);
 
         if (element->next_)
@@ -118,5 +131,10 @@
             element->prev_->next_ = element->next_;
         else
             this->first_ = element->next_; // If there is no prev_, we deleted the first object and have to update the first_ pointer of the list
+
+        element->list_ = 0;
+        element->next_ = 0;
+        element->prev_ = 0;
+        --this->size_;
     }
 }

Modified: code/branches/core6/src/libraries/core/object/ObjectListBase.h
===================================================================
--- code/branches/core6/src/libraries/core/object/ObjectListBase.h	2013-03-29 22:26:53 UTC (rev 9603)
+++ code/branches/core6/src/libraries/core/object/ObjectListBase.h	2013-03-30 14:38:02 UTC (rev 9604)
@@ -55,7 +55,7 @@
                 @brief Constructor: Creates the list-element with an object.
                 @param objectBase The object to store
             */
-            ObjectListBaseElement(Listable* object, ObjectListBase* list) : next_(0), prev_(0), objectBase_(object), list_(list) {}
+            ObjectListBaseElement(Listable* object) : next_(0), prev_(0), objectBase_(object), list_(0) {}
             ~ObjectListBaseElement();
 
             ObjectListBaseElement* next_;       //!< The next element in the list
@@ -73,7 +73,7 @@
     class ObjectListElement : public ObjectListBaseElement
     {
         public:
-            ObjectListElement(T* object, ObjectListBase* list) : ObjectListBaseElement(static_cast<Listable*>(object), list), object_(object) {}
+            ObjectListElement(T* object) : ObjectListBaseElement(static_cast<Listable*>(object)), object_(object) {}
             T* object_;              //!< The object
     };
 
@@ -112,7 +112,7 @@
             template <class T>
             inline ObjectListBaseElement* add(T* object)
             {
-                ObjectListBaseElement* element = new ObjectListElement<T>(object, this);
+                ObjectListBaseElement* element = new ObjectListElement<T>(object);
                 this->addElement(element);
                 return element;
             }
@@ -120,6 +120,8 @@
             void addElement(ObjectListBaseElement* element);
             void removeElement(ObjectListBaseElement* element);
 
+            size_t size() const { return this->size_; }
+
             /// Returns a pointer to the first element in the list. Works only with Iterator.
             inline ObjectListBaseElement* begin() { return this->first_; }
             /// Returns a pointer to the element after the last element in the list. Works only with Iterator.
@@ -147,6 +149,7 @@
 
             ObjectListBaseElement* first_;                              //!< The first element in the list
             ObjectListBaseElement* last_;                               //!< The last element in the list
+            size_t size_;                                               //!< The number of elements in the list
             std::vector<ObjectListElementRemovalListener*> listeners_;  //!< A list of Iterators pointing on an element in this list
     };
 }

Modified: code/branches/core6/src/libraries/core/object/ObjectListIterator.h
===================================================================
--- code/branches/core6/src/libraries/core/object/ObjectListIterator.h	2013-03-29 22:26:53 UTC (rev 9603)
+++ code/branches/core6/src/libraries/core/object/ObjectListIterator.h	2013-03-30 14:38:02 UTC (rev 9604)
@@ -69,9 +69,6 @@
     template <class T>
     class ObjectListIterator : public IteratorBase<T, ObjectListIterator<T> >
     {
-        template <class I>
-        friend class Iterator;
-
         public:
             /**
                 @brief Constructor: Sets the element, whereon the ObjectListIterator points, to zero.




More information about the Orxonox-commit mailing list