[Orxonox-commit 4939] r9608 - in code/branches/core6: src/libraries/core/object test/core/object
landauf at orxonox.net
landauf at orxonox.net
Sat Mar 30 22:40:48 CET 2013
Author: landauf
Date: 2013-03-30 22:40:48 +0100 (Sat, 30 Mar 2013)
New Revision: 9608
Modified:
code/branches/core6/src/libraries/core/object/Context.cc
code/branches/core6/src/libraries/core/object/Context.h
code/branches/core6/src/libraries/core/object/Listable.cc
code/branches/core6/src/libraries/core/object/Listable.h
code/branches/core6/src/libraries/core/object/ObjectListBase.cc
code/branches/core6/src/libraries/core/object/ObjectListBase.h
code/branches/core6/test/core/object/ListableTest.cc
code/branches/core6/test/core/object/ObjectListBaseTest.cc
Log:
implemented method to change the context of a Listable. the object will then be added to the object lists of the new context
Modified: code/branches/core6/src/libraries/core/object/Context.cc
===================================================================
--- code/branches/core6/src/libraries/core/object/Context.cc 2013-03-30 20:38:52 UTC (rev 9607)
+++ code/branches/core6/src/libraries/core/object/Context.cc 2013-03-30 21:40:48 UTC (rev 9608)
@@ -46,7 +46,7 @@
/*static*/ Context* Context::getRootContext()
{
- static Context rootContext(NULL);
+ static Context rootContext;
return &rootContext;
}
Modified: code/branches/core6/src/libraries/core/object/Context.h
===================================================================
--- code/branches/core6/src/libraries/core/object/Context.h 2013-03-30 20:38:52 UTC (rev 9607)
+++ code/branches/core6/src/libraries/core/object/Context.h 2013-03-30 21:40:48 UTC (rev 9608)
@@ -38,8 +38,6 @@
#include <vector>
-#include "ObjectListBase.h"
-
namespace orxonox
{
class _CoreExport Context
@@ -47,7 +45,7 @@
public:
static Context* getRootContext();
- Context(Context* context);
+ Context(Context* context = NULL);
virtual ~Context();
inline Context* getParentContext() const
Modified: code/branches/core6/src/libraries/core/object/Listable.cc
===================================================================
--- code/branches/core6/src/libraries/core/object/Listable.cc 2013-03-30 20:38:52 UTC (rev 9607)
+++ code/branches/core6/src/libraries/core/object/Listable.cc 2013-03-30 21:40:48 UTC (rev 9608)
@@ -63,4 +63,16 @@
delete this->elements_[i];
this->elements_.clear();
}
+
+ /**
+ * @brief Changes the context.
+ * The object is removed from the current context and added to the new one. This also applies to all object lists the object is registered in.
+ */
+ void Listable::setContext(Context* context)
+ {
+ this->context_ = context;
+ for (size_t i = 0; i < this->elements_.size(); ++i)
+ this->elements_[i]->changeContext(context);
+ }
+
}
Modified: code/branches/core6/src/libraries/core/object/Listable.h
===================================================================
--- code/branches/core6/src/libraries/core/object/Listable.h 2013-03-30 20:38:52 UTC (rev 9607)
+++ code/branches/core6/src/libraries/core/object/Listable.h 2013-03-30 21:40:48 UTC (rev 9608)
@@ -56,8 +56,7 @@
void unregisterObject();
- inline void setContext(Context* context)
- { this->context_ = context; }
+ void setContext(Context* context);
inline Context* getContext() const
{ return this->context_; }
Modified: code/branches/core6/src/libraries/core/object/ObjectListBase.cc
===================================================================
--- code/branches/core6/src/libraries/core/object/ObjectListBase.cc 2013-03-30 20:38:52 UTC (rev 9607)
+++ code/branches/core6/src/libraries/core/object/ObjectListBase.cc 2013-03-30 21:40:48 UTC (rev 9608)
@@ -40,12 +40,18 @@
namespace orxonox
{
- ObjectListBaseElement::~ObjectListBaseElement()
+ // ###############################
+ // ### ObjectListBaseElement ###
+ // ###############################
+ void ObjectListBaseElement::removeFromList()
{
if (this->list_)
this->list_->removeElement(this);
}
+ // ###############################
+ // ### ObjectListBase ###
+ // ###############################
/**
@brief Constructor: Sets default values.
*/
Modified: code/branches/core6/src/libraries/core/object/ObjectListBase.h
===================================================================
--- code/branches/core6/src/libraries/core/object/ObjectListBase.h 2013-03-30 20:38:52 UTC (rev 9607)
+++ code/branches/core6/src/libraries/core/object/ObjectListBase.h 2013-03-30 21:40:48 UTC (rev 9608)
@@ -41,6 +41,7 @@
#include "core/CorePrereqs.h"
#include <vector>
+#include "Context.h"
namespace orxonox
{
@@ -56,12 +57,17 @@
@param objectBase The object to store
*/
ObjectListBaseElement(Listable* object) : next_(0), prev_(0), objectBase_(object), list_(0) {}
- ~ObjectListBaseElement();
+ virtual ~ObjectListBaseElement() { this->removeFromList(); }
+ virtual void changeContext(Context* context) = 0;
+
ObjectListBaseElement* next_; //!< The next element in the list
ObjectListBaseElement* prev_; //!< The previous element in the list
Listable* objectBase_; //!< The object
ObjectListBase* list_; //!< The list
+
+ protected:
+ void removeFromList();
};
@@ -74,6 +80,13 @@
{
public:
ObjectListElement(T* object) : ObjectListBaseElement(static_cast<Listable*>(object)), object_(object) {}
+
+ virtual void changeContext(Context* context)
+ {
+ this->removeFromList();
+ context->getObjectList<T>()->addElement(this);
+ }
+
T* object_; //!< The object
};
Modified: code/branches/core6/test/core/object/ListableTest.cc
===================================================================
--- code/branches/core6/test/core/object/ListableTest.cc 2013-03-30 20:38:52 UTC (rev 9607)
+++ code/branches/core6/test/core/object/ListableTest.cc 2013-03-30 21:40:48 UTC (rev 9608)
@@ -19,9 +19,10 @@
};
template <class T>
- bool objectListContains(T* element)
+ bool objectListContains(T* element, Context* context = Context::getRootContext())
{
- for (typename ObjectList<T>::iterator it = ObjectList<T>::begin(); it != ObjectList<T>::end(); ++it)
+ for (typename ObjectList<T>::iterator it = static_cast<ObjectListElement<T>*>(context->getObjectList<T>()->begin());
+ it != static_cast<ObjectListElement<T>*>(context->getObjectList<T>()->end()); ++it)
if (*it == element)
return true;
return false;
@@ -76,4 +77,33 @@
EXPECT_EQ(0u, ObjectList<ListableTest>::size());
EXPECT_EQ(0u, ObjectList<ListableSubclassTest>::size());
}
+
+ TEST(ListableTest, CanChangeContext)
+ {
+ Context* rootContext = Context::getRootContext();
+ Context newContext;
+ ListableSubclassTest test;
+
+ EXPECT_EQ(1u, rootContext->getObjectList<ListableTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableTest>(&test, rootContext));
+ EXPECT_EQ(1u, rootContext->getObjectList<ListableSubclassTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, rootContext));
+
+ EXPECT_EQ(0u, newContext.getObjectList<ListableTest>()->size());
+ EXPECT_FALSE(objectListContains<ListableTest>(&test, &newContext));
+ EXPECT_EQ(0u, newContext.getObjectList<ListableSubclassTest>()->size());
+ EXPECT_FALSE(objectListContains<ListableSubclassTest>(&test, &newContext));
+
+ test.setContext(&newContext);
+
+ EXPECT_EQ(0u, rootContext->getObjectList<ListableTest>()->size());
+ EXPECT_FALSE(objectListContains<ListableTest>(&test, rootContext));
+ EXPECT_EQ(0u, rootContext->getObjectList<ListableSubclassTest>()->size());
+ EXPECT_FALSE(objectListContains<ListableSubclassTest>(&test, rootContext));
+
+ EXPECT_EQ(1u, newContext.getObjectList<ListableTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableTest>(&test, &newContext));
+ EXPECT_EQ(1u, newContext.getObjectList<ListableSubclassTest>()->size());
+ EXPECT_TRUE(objectListContains<ListableSubclassTest>(&test, &newContext));
+ }
}
Modified: code/branches/core6/test/core/object/ObjectListBaseTest.cc
===================================================================
--- code/branches/core6/test/core/object/ObjectListBaseTest.cc 2013-03-30 20:38:52 UTC (rev 9607)
+++ code/branches/core6/test/core/object/ObjectListBaseTest.cc 2013-03-30 21:40:48 UTC (rev 9608)
@@ -1,6 +1,7 @@
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "core/object/ObjectListBase.h"
+#include "core/class/Identifier.h"
namespace orxonox
{
@@ -22,7 +23,7 @@
TEST(ObjectListBaseTest, CanAddElement)
{
ObjectListBase list;
- ObjectListBaseElement* element = new ObjectListBaseElement(NULL);
+ ObjectListBaseElement* element = new ObjectListElement<Listable>(NULL);
list.addElement(element);
EXPECT_EQ(1u, list.size());
}
@@ -30,7 +31,7 @@
TEST(ObjectListBaseTest, CanRemoveElement)
{
ObjectListBase list;
- ObjectListBaseElement* element = new ObjectListBaseElement(NULL);
+ ObjectListBaseElement* element = new ObjectListElement<Listable>(NULL);
list.addElement(element);
EXPECT_EQ(1u, list.size());
list.removeElement(element);
@@ -50,15 +51,15 @@
ObjectListBase list;
EXPECT_EQ(0u, list.size());
{
- ObjectListBaseElement element1(NULL);
+ ObjectListElement<Listable> element1(NULL);
list.addElement(&element1);
EXPECT_EQ(1u, list.size());
{
- ObjectListBaseElement element1(NULL);
+ ObjectListElement<Listable> element1(NULL);
list.addElement(&element1);
EXPECT_EQ(2u, list.size());
{
- ObjectListBaseElement element1(NULL);
+ ObjectListElement<Listable> element1(NULL);
list.addElement(&element1);
EXPECT_EQ(3u, list.size());
}
@@ -74,7 +75,7 @@
ObjectListBase list;
ObjectListElementRemovalListenerMock listener;
list.registerRemovalListener(&listener);
- ObjectListBaseElement* element = new ObjectListBaseElement(NULL);
+ ObjectListBaseElement* element = new ObjectListElement<Listable>(NULL);
list.addElement(element);
EXPECT_CALL(listener, removedElement(element));
list.removeElement(element);
More information about the Orxonox-commit
mailing list