[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