[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