[Orxonox-commit 4982] r9651 - in code/branches/core6: src/libraries/core/class src/libraries/core/object test/core/class

landauf at orxonox.net landauf at orxonox.net
Fri Aug 16 21:21:00 CEST 2013


Author: landauf
Date: 2013-08-16 21:20:59 +0200 (Fri, 16 Aug 2013)
New Revision: 9651

Modified:
   code/branches/core6/src/libraries/core/class/Identifier.h
   code/branches/core6/src/libraries/core/class/IdentifierManager.cc
   code/branches/core6/src/libraries/core/object/Context.cc
   code/branches/core6/src/libraries/core/object/Listable.cc
   code/branches/core6/test/core/class/IdentifierClassHierarchyTest.cc
   code/branches/core6/test/core/class/IdentifierSimpleClassHierarchyTest.cc
Log:
register Listable in the framework

Modified: code/branches/core6/src/libraries/core/class/Identifier.h
===================================================================
--- code/branches/core6/src/libraries/core/class/Identifier.h	2013-08-14 17:04:40 UTC (rev 9650)
+++ code/branches/core6/src/libraries/core/class/Identifier.h	2013-08-16 19:20:59 UTC (rev 9651)
@@ -408,7 +408,8 @@
     template <class T>
     void ClassIdentifier<T>::addObjectToList(T* object, Listable* listable)
     {
-        listable->getContext()->addObject(object);
+        if (listable->getContext())
+            listable->getContext()->addObject(object);
     }
 
     template <class T>

Modified: code/branches/core6/src/libraries/core/class/IdentifierManager.cc
===================================================================
--- code/branches/core6/src/libraries/core/class/IdentifierManager.cc	2013-08-14 17:04:40 UTC (rev 9650)
+++ code/branches/core6/src/libraries/core/class/IdentifierManager.cc	2013-08-16 19:20:59 UTC (rev 9651)
@@ -126,6 +126,10 @@
 
                 initializedIdentifiers.insert(it->second);
             }
+
+            size_t numberOfObjects = temporaryContext.getObjectList<Listable>()->size();
+            if (numberOfObjects > 0)
+                orxout(internal_warning) << "There are still " << numberOfObjects << " listables left after creating the class hierarchy" << endl;
         }
 
         // finish the initialization of all identifiers

Modified: code/branches/core6/src/libraries/core/object/Context.cc
===================================================================
--- code/branches/core6/src/libraries/core/object/Context.cc	2013-08-14 17:04:40 UTC (rev 9650)
+++ code/branches/core6/src/libraries/core/object/Context.cc	2013-08-16 19:20:59 UTC (rev 9651)
@@ -41,15 +41,28 @@
 
     Context* Context::rootContext_s = 0;
 
-    Context::Context(Context* context) : Listable(this), parentContext_(context)
+    Context* getContextForInitializationOfOtherContexts()
     {
-        // we have to call Listable(this) to avoid circular initialization when creating a Context because Listable calls Context::getRootContext() by
-        // default AND we have to set the context again in the constructor because of other classes inheriting from Context (Listable is a virtual base
-        // and each subclass must call its constructor individually, so either all subclasses add Listable(this) to their initialization list or we call
-        // setContext(this) here).
-        this->setContext(this);
+        static size_t count = 0;
+        // the first time this is called, ++count returns 1 and the context is created
+        // the second time this is called, ++count returns 2 and NULL is returned because we're in the constructor of the context itself
+        // for each future call the context (now completely created) is returned
+        if (++count == 2)
+            return NULL;
+        else
+        {
+            static Context context(NULL);
+            return &context;
+        }
+    }
 
+    // Initialize Listable(*) with a special context, only used to initialize other contexts. Later in the constructor we change the context
+    Context::Context(Context* context) : Listable(getContextForInitializationOfOtherContexts()), parentContext_(context)
+    {
         RegisterObject(Context);
+
+        // the context is its own context
+        this->setContext(this);
     }
 
     Context::~Context()

Modified: code/branches/core6/src/libraries/core/object/Listable.cc
===================================================================
--- code/branches/core6/src/libraries/core/object/Listable.cc	2013-08-14 17:04:40 UTC (rev 9650)
+++ code/branches/core6/src/libraries/core/object/Listable.cc	2013-08-16 19:20:59 UTC (rev 9651)
@@ -32,11 +32,14 @@
 */
 
 #include "Listable.h"
+#include "core/CoreIncludes.h"
 #include "ObjectListBase.h"
 #include "Context.h"
 
 namespace orxonox
 {
+    RegisterClass(Listable);
+
     /**
         @brief Constructor: Allocates space in the element list.
     */
@@ -44,15 +47,19 @@
     {
         this->context_ = Context::getRootContext();
         this->elements_.reserve(6);
+
+        RegisterObject(Listable);
     }
 
     /**
-        @brief Constructor: Allocates space in the element list and assignes the context
+        @brief Constructor: Allocates space in the element list and assigns the context
     */
     Listable::Listable(Context* context)
     {
         this->context_ = context;
         this->elements_.reserve(6);
+
+        RegisterObject(Listable);
     }
 
     /**
@@ -79,6 +86,7 @@
      */
     void Listable::setContext(Context* context)
     {
+        assert(context);
         std::vector<ObjectListBaseElement*> copy = this->elements_;
         this->elements_.clear();
 

Modified: code/branches/core6/test/core/class/IdentifierClassHierarchyTest.cc
===================================================================
--- code/branches/core6/test/core/class/IdentifierClassHierarchyTest.cc	2013-08-14 17:04:40 UTC (rev 9650)
+++ code/branches/core6/test/core/class/IdentifierClassHierarchyTest.cc	2013-08-16 19:20:59 UTC (rev 9651)
@@ -129,6 +129,8 @@
             public:
                 virtual void SetUp()
                 {
+                    registerClass("Context", new ClassFactoryWithContext<Context>());
+                    registerClass("Listable", new ClassFactoryWithContext<Listable>());
                     registerClass("OrxonoxInterface", new ClassFactoryNoArgs<OrxonoxInterface>());
                     registerClass("OrxonoxClass", new ClassFactoryNoArgs<OrxonoxClass>());
                     registerClass("BaseInterface1", static_cast<ClassFactory<BaseInterface1>*>(NULL), false).inheritsFrom(Class(OrxonoxInterface));
@@ -229,8 +231,9 @@
         EXPECT_EQ(1u, identifier->getDirectParents().size());
         EXPECT_TRUE(contains(identifier->getDirectParents(), Class(OrxonoxInterface)));
 
-        EXPECT_EQ(2u, identifier->getParents().size());
+        EXPECT_EQ(3u, identifier->getParents().size());
         EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
+        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
     }
 
@@ -251,8 +254,9 @@
         EXPECT_EQ(1u, identifier->getDirectParents().size());
         EXPECT_TRUE(contains(identifier->getDirectParents(), Class(OrxonoxInterface)));
 
-        EXPECT_EQ(2u, identifier->getParents().size());
+        EXPECT_EQ(3u, identifier->getParents().size());
         EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
+        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
     }
 
@@ -273,8 +277,9 @@
         EXPECT_EQ(1u, identifier->getDirectParents().size());
         EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseInterface1)));
 
-        EXPECT_EQ(3u, identifier->getParents().size());
+        EXPECT_EQ(4u, identifier->getParents().size());
         EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
+        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(BaseInterface1)));
     }
@@ -294,8 +299,9 @@
         EXPECT_EQ(1u, identifier->getDirectParents().size());
         EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseInterface2)));
 
-        EXPECT_EQ(3u, identifier->getParents().size());
+        EXPECT_EQ(4u, identifier->getParents().size());
         EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
+        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(BaseInterface2)));
     }
@@ -321,8 +327,9 @@
         EXPECT_EQ(1u, identifier->getDirectParents().size());
         EXPECT_TRUE(contains(identifier->getDirectParents(), Class(OrxonoxClass)));
 
-        EXPECT_EQ(2u, identifier->getParents().size());
+        EXPECT_EQ(3u, identifier->getParents().size());
         EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
+        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
     }
 
@@ -337,8 +344,9 @@
         EXPECT_EQ(1u, identifier->getDirectParents().size());
         EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
 
-        EXPECT_EQ(3u, identifier->getParents().size());
+        EXPECT_EQ(4u, identifier->getParents().size());
         EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
+        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
     }
@@ -355,8 +363,9 @@
         EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
         EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Interface1)));
 
-        EXPECT_EQ(6u, identifier->getParents().size());
+        EXPECT_EQ(7u, identifier->getParents().size());
         EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
+        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
@@ -377,8 +386,9 @@
         EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Interface1)));
         EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Interface2)));
 
-        EXPECT_EQ(8u, identifier->getParents().size());
+        EXPECT_EQ(9u, identifier->getParents().size());
         EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
+        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
@@ -401,8 +411,9 @@
         EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Interface1)));
         EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Interface2)));
 
-        EXPECT_EQ(8u, identifier->getParents().size());
+        EXPECT_EQ(9u, identifier->getParents().size());
         EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
+        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
@@ -425,8 +436,9 @@
         EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseInterface1)));
         EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseInterface2)));
 
-        EXPECT_EQ(6u, identifier->getParents().size());
+        EXPECT_EQ(7u, identifier->getParents().size());
         EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
+        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(BaseClass)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));

Modified: code/branches/core6/test/core/class/IdentifierSimpleClassHierarchyTest.cc
===================================================================
--- code/branches/core6/test/core/class/IdentifierSimpleClassHierarchyTest.cc	2013-08-14 17:04:40 UTC (rev 9650)
+++ code/branches/core6/test/core/class/IdentifierSimpleClassHierarchyTest.cc	2013-08-16 19:20:59 UTC (rev 9651)
@@ -45,6 +45,8 @@
             public:
                 virtual void SetUp()
                 {
+                    registerClass("Context", new ClassFactoryWithContext<Context>());
+                    registerClass("Listable", new ClassFactoryWithContext<Listable>());
                     registerClass("OrxonoxInterface", new ClassFactoryNoArgs<OrxonoxInterface>());
                     registerClass("OrxonoxClass", new ClassFactoryNoArgs<OrxonoxClass>());
                     registerClass("Interface", static_cast<ClassFactory<Interface>*>(NULL), false).inheritsFrom(Class(OrxonoxInterface));
@@ -98,8 +100,9 @@
         EXPECT_EQ(1u, identifier->getDirectParents().size());
         EXPECT_TRUE(contains(identifier->getDirectParents(), Class(OrxonoxInterface)));
 
-        EXPECT_EQ(2u, identifier->getParents().size());
+        EXPECT_EQ(3u, identifier->getParents().size());
         EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
+        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
     }
 
@@ -116,8 +119,9 @@
         EXPECT_EQ(1u, identifier->getDirectParents().size());
         EXPECT_TRUE(contains(identifier->getDirectParents(), Class(OrxonoxClass)));
 
-        EXPECT_EQ(2u, identifier->getParents().size());
+        EXPECT_EQ(3u, identifier->getParents().size());
         EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
+        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
     }
 
@@ -133,8 +137,9 @@
         EXPECT_TRUE(contains(identifier->getDirectParents(), Class(Interface)));
         EXPECT_TRUE(contains(identifier->getDirectParents(), Class(BaseClass)));
 
-        EXPECT_EQ(5u, identifier->getParents().size());
+        EXPECT_EQ(6u, identifier->getParents().size());
         EXPECT_TRUE(contains(identifier->getParents(), Class(Identifiable)));
+        EXPECT_TRUE(contains(identifier->getParents(), Class(Listable)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxInterface)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(OrxonoxClass)));
         EXPECT_TRUE(contains(identifier->getParents(), Class(Interface)));




More information about the Orxonox-commit mailing list