[Orxonox-commit 6078] r10736 - in code/branches/cpp11_v2: src/libraries/core/object test/core test/core/object

landauf at orxonox.net landauf at orxonox.net
Sat Oct 31 23:50:18 CET 2015


Author: landauf
Date: 2015-10-31 23:50:17 +0100 (Sat, 31 Oct 2015)
New Revision: 10736

Added:
   code/branches/cpp11_v2/test/core/object/ObjectListTest.cc
Modified:
   code/branches/cpp11_v2/src/libraries/core/object/Iterator.h
   code/branches/cpp11_v2/src/libraries/core/object/IteratorBase.h
   code/branches/cpp11_v2/src/libraries/core/object/ObjectList.h
   code/branches/cpp11_v2/src/libraries/core/object/ObjectListBase.h
   code/branches/cpp11_v2/src/libraries/core/object/ObjectListIterator.h
   code/branches/cpp11_v2/test/core/CMakeLists.txt
   code/branches/cpp11_v2/test/core/object/IteratorTest.cc
   code/branches/cpp11_v2/test/core/object/ObjectListIteratorTest.cc
Log:
fixed range based for-loop: ObjectList now returns an iterator
added tests and refactored construction of Iterator/IteratorBase/ObjectListIterator

Modified: code/branches/cpp11_v2/src/libraries/core/object/Iterator.h
===================================================================
--- code/branches/cpp11_v2/src/libraries/core/object/Iterator.h	2015-10-31 18:15:11 UTC (rev 10735)
+++ code/branches/cpp11_v2/src/libraries/core/object/Iterator.h	2015-10-31 22:50:17 UTC (rev 10736)
@@ -78,16 +78,11 @@
             inline Iterator() : IteratorBase<T, Iterator<T> >() {}
 
             /**
-                @brief Constructor: Sets this element to a given element
-                @param element The element
-            */
-            inline Iterator(ObjectListBaseElement* element) : IteratorBase<T, Iterator<T> >(element) {}
-
-            /**
                 @brief Constructor: Sets this element to the element of another Iterator.
                 @param other The other Iterator
             */
-            inline Iterator(const IteratorBase<T, Iterator<T> >& other) : IteratorBase<T, Iterator<T> >(other) {}
+            template <class OT, class OI>
+            inline Iterator(const IteratorBase<OT, OI>& other) : IteratorBase<T, Iterator<T> >(other) {}
 
             /**
                 @brief Assigns a given element.

Modified: code/branches/cpp11_v2/src/libraries/core/object/IteratorBase.h
===================================================================
--- code/branches/cpp11_v2/src/libraries/core/object/IteratorBase.h	2015-10-31 18:15:11 UTC (rev 10735)
+++ code/branches/cpp11_v2/src/libraries/core/object/IteratorBase.h	2015-10-31 22:50:17 UTC (rev 10736)
@@ -53,23 +53,11 @@
     {
         BOOST_STATIC_ASSERT((boost::is_base_of<Listable, T>::value));
 
-        protected:
-            /**
-                @brief Constructor: Sets the element, whereon the iterator points, to the given element.
-                This constructor is protected and only for internal usage (don't mess with the BaseElements directly).
-            */
-            inline IteratorBase(ObjectListBaseElement* element = NULL)
-            {
-                this->element_ = element;
-                this->registerIterator();
-            }
-
-
         public:
             /**
                 @brief Constructor: Sets the element, whereon the iterator points, to the given element.
             */
-            inline IteratorBase(ObjectListElement<T>* element)
+            inline IteratorBase(ObjectListElement<T>* element = NULL)
             {
                 this->element_ = element;
                 this->registerIterator();
@@ -79,25 +67,14 @@
                 @brief Constructor: Sets the element, whereon the iterator points, to the given element of another type.
                 The element's type O must be a derivative of the Iterator's type T.
             */
-            template <class O>
-            inline IteratorBase(ObjectListElement<O>* element)
+            template <class OT, class OI>
+            inline IteratorBase(const IteratorBase<OT, OI>& other)
             {
-                (void)static_cast<T*>((O*)NULL); // Check type: The element's type O must be a derivative of the Iterator's type T.
-                this->element_ = element;
+                this->element_ = other.getElement();
                 this->registerIterator();
             }
 
             /**
-                @brief Constructor: Sets this element to the element of another Iterator.
-                @param other The other Iterator
-            */
-            inline IteratorBase(const IteratorBase& other)
-            {
-                this->element_ = other.element_;
-                this->registerIterator();
-            }
-
-            /**
                 @brief Unregisters the Iterator from the ObjectList.
             */
             inline ~IteratorBase()
@@ -206,6 +183,11 @@
                     this->operator++();
             }
 
+            inline ObjectListBaseElement* getElement() const
+            {
+                return this->element_;
+            }
+
         protected:
             inline void setElement(ObjectListBaseElement* element)
             {

Modified: code/branches/cpp11_v2/src/libraries/core/object/ObjectList.h
===================================================================
--- code/branches/cpp11_v2/src/libraries/core/object/ObjectList.h	2015-10-31 18:15:11 UTC (rev 10735)
+++ code/branches/cpp11_v2/src/libraries/core/object/ObjectList.h	2015-10-31 22:50:17 UTC (rev 10736)
@@ -83,40 +83,40 @@
             }
 
             /// Returns an Iterator to the first element in the list (for the root context).
-            inline static ObjectListElement<T>* begin()
+            inline static ObjectListIterator<T> begin()
             {   return begin(Context::getRootContext());   }
             /// Returns an Iterator to the first element in the list.
-            inline static ObjectListElement<T>* begin(Context* context)
+            inline static ObjectListIterator<T> begin(Context* context)
             {
                 ObjectListBase* list = context->getObjectList<T>();
                 return static_cast<ObjectListElement<T>*>(list->begin());
             }
 
             /// Returns an Iterator to the element after the last element in the list (for the root context).
-            inline static ObjectListElement<T>* end()
+            inline static ObjectListIterator<T> end()
             {   return end(Context::getRootContext());   }
             /// Returns an Iterator to the element after the last element in the list.
-            inline static ObjectListElement<T>* end(Context* context)
+            inline static ObjectListIterator<T> end(Context* context)
             {
                 ObjectListBase* list = context->getObjectList<T>();
                 return static_cast<ObjectListElement<T>*>(list->end());
             }
 
             /// Returns an Iterator to the last element in the list (for the root context).
-            inline static ObjectListElement<T>* rbegin()
+            inline static ObjectListIterator<T> rbegin()
             {   return rbegin(Context::getRootContext());   }
             /// Returns an Iterator to the last element in the list.
-            inline static ObjectListElement<T>* rbegin(Context* context)
+            inline static ObjectListIterator<T> rbegin(Context* context)
             {
                 ObjectListBase* list = context->getObjectList<T>();
                 return static_cast<ObjectListElement<T>*>(list->rbegin());
             }
 
             /// Returns an Iterator to the element before the first element in the list (for the root context).
-            inline static ObjectListElement<T>* rend()
+            inline static ObjectListIterator<T> rend()
             {   return rend(Context::getRootContext());   }
             /// Returns an Iterator to the element before the first element in the list.
-            inline static ObjectListElement<T>* rend(Context* context)
+            inline static ObjectListIterator<T> rend(Context* context)
             {
                 ObjectListBase* list = context->getObjectList<T>();
                 return static_cast<ObjectListElement<T>*>(list->rend());

Modified: code/branches/cpp11_v2/src/libraries/core/object/ObjectListBase.h
===================================================================
--- code/branches/cpp11_v2/src/libraries/core/object/ObjectListBase.h	2015-10-31 18:15:11 UTC (rev 10735)
+++ code/branches/cpp11_v2/src/libraries/core/object/ObjectListBase.h	2015-10-31 22:50:17 UTC (rev 10736)
@@ -92,11 +92,6 @@
                 this->removeFromList();
             }
 
-            operator T*()
-            {
-                return object_;
-            }
-
             T* object_;              //!< The object
     };
 

Modified: code/branches/cpp11_v2/src/libraries/core/object/ObjectListIterator.h
===================================================================
--- code/branches/cpp11_v2/src/libraries/core/object/ObjectListIterator.h	2015-10-31 18:15:11 UTC (rev 10735)
+++ code/branches/cpp11_v2/src/libraries/core/object/ObjectListIterator.h	2015-10-31 22:50:17 UTC (rev 10736)
@@ -85,7 +85,8 @@
                 @brief Constructor: Sets this element to the element of another ObjectListIterator.
                 @param other The other ObjectListIterator
             */
-            inline ObjectListIterator(const IteratorBase<T, ObjectListIterator<T> >& other) : IteratorBase<T, ObjectListIterator<T> >(other) {}
+            template <class OI>
+            inline ObjectListIterator(const IteratorBase<T, OI>& other) : IteratorBase<T, ObjectListIterator<T> >(other) {}
 
             /**
                 @brief Overloading of the *it operator: returns the pointer to the object.

Modified: code/branches/cpp11_v2/test/core/CMakeLists.txt
===================================================================
--- code/branches/cpp11_v2/test/core/CMakeLists.txt	2015-10-31 18:15:11 UTC (rev 10735)
+++ code/branches/cpp11_v2/test/core/CMakeLists.txt	2015-10-31 22:50:17 UTC (rev 10736)
@@ -24,6 +24,7 @@
     object/IteratorTest.cc
     object/ListableTest.cc
     object/ObjectListBaseTest.cc
+    object/ObjectListTest.cc
     object/ObjectListIteratorTest.cc
     object/StrongPtrTest.cc
     object/WeakPtrTest.cc

Modified: code/branches/cpp11_v2/test/core/object/IteratorTest.cc
===================================================================
--- code/branches/cpp11_v2/test/core/object/IteratorTest.cc	2015-10-31 18:15:11 UTC (rev 10735)
+++ code/branches/cpp11_v2/test/core/object/IteratorTest.cc	2015-10-31 22:50:17 UTC (rev 10736)
@@ -79,4 +79,62 @@
         for (Iterator<TestClass> it = ObjectList<TestInterface>::begin(); it != ObjectList<TestInterface>::end(); ++it)
             it->test();
     }
+
+    TEST_F(IteratorTest, CanIterateOverInterfaceListWithInterfaceIterator)
+    {
+        TestClass testClass;
+        TestInterface testInterface;
+
+        size_t i = 0;
+        for (Iterator<TestInterface> it = ObjectList<TestInterface>::begin(); it != ObjectList<TestInterface>::end(); ++it)
+        {
+            ++i;
+            if (i == 1u) EXPECT_EQ(&testClass, *it);
+            if (i == 2u) EXPECT_EQ(&testInterface, *it);
+        }
+        EXPECT_EQ(2u, i);
+    }
+
+    TEST_F(IteratorTest, CanIterateOverClassListWithClassIterator)
+    {
+        TestClass testClass;
+        TestInterface testInterface;
+
+        size_t i = 0;
+        for (Iterator<TestClass> it = ObjectList<TestClass>::begin(); it != ObjectList<TestClass>::end(); ++it)
+        {
+            ++i;
+            if (i == 1u) EXPECT_EQ(&testClass, *it);
+        }
+        EXPECT_EQ(1u, i);
+    }
+
+    TEST_F(IteratorTest, CanIterateOverInterfaceListWithClassIterator)
+    {
+        TestClass testClass;
+        TestInterface testInterface;
+
+        size_t i = 0;
+        for (Iterator<TestClass> it = ObjectList<TestInterface>::begin(); it != ObjectList<TestInterface>::end(); ++it)
+        {
+            ++i;
+            if (i == 1u) EXPECT_EQ(&testClass, *it);
+            if (i == 2u) EXPECT_EQ(NULL, *it);
+        }
+        EXPECT_EQ(2u, i);
+    }
+
+    TEST_F(IteratorTest, CanIterateOverClassListWithInterfaceIterator)
+    {
+        TestClass testClass;
+        TestInterface testInterface;
+
+        size_t i = 0;
+        for (Iterator<TestInterface> it = ObjectList<TestClass>::begin(); it != ObjectList<TestClass>::end(); ++it)
+        {
+            ++i;
+            if (i == 1u) EXPECT_EQ(&testClass, *it);
+        }
+        EXPECT_EQ(1u, i);
+    }
 }

Modified: code/branches/cpp11_v2/test/core/object/ObjectListIteratorTest.cc
===================================================================
--- code/branches/cpp11_v2/test/core/object/ObjectListIteratorTest.cc	2015-10-31 18:15:11 UTC (rev 10735)
+++ code/branches/cpp11_v2/test/core/object/ObjectListIteratorTest.cc	2015-10-31 22:50:17 UTC (rev 10736)
@@ -2,7 +2,8 @@
 #include <gmock/gmock.h>
 
 #include "core/object/ObjectListIterator.h"
-#include "core/object/Listable.h"
+#include "core/class/OrxonoxClass.h"
+#include "core/class/OrxonoxInterface.h"
 #include "core/CoreIncludes.h"
 #include "core/module/ModuleInstance.h"
 
@@ -10,14 +11,21 @@
 {
     namespace
     {
-        class ListableTest : public Listable
+        class TestInterface : virtual public OrxonoxInterface
         {
             public:
-                ListableTest() { RegisterObject(ListableTest); }
+            TestInterface() { RegisterObject(TestInterface); }
+        };
+
+        class TestClass : public OrxonoxClass, public TestInterface
+        {
+            public:
+                TestClass() { RegisterObject(TestClass); }
                 MOCK_METHOD0(test, void());
         };
 
-        RegisterClassNoArgs(ListableTest);
+        RegisterClassNoArgs(TestInterface);
+        RegisterClassNoArgs(TestClass);
 
         // Fixture
         class ObjectListIteratorTest : public ::testing::Test
@@ -41,30 +49,31 @@
 
     TEST_F(ObjectListIteratorTest, CanCreateIterator)
     {
-        ObjectListIterator<ListableTest> it;
+        ObjectListIterator<TestClass> it;
     }
 
     TEST_F(ObjectListIteratorTest, CanAssignIterator)
     {
-        ObjectListIterator<ListableTest> it = ObjectList<ListableTest>::begin();
+        ObjectListIterator<TestClass> it = ObjectList<TestClass>::begin();
     }
 
     TEST_F(ObjectListIteratorTest, CanIterateOverEmptyList)
     {
         size_t i = 0;
-        for (ObjectListIterator<ListableTest> it = ObjectList<ListableTest>::begin(); it != ObjectList<ListableTest>::end(); ++it)
+        for (ObjectListIterator<TestClass> it = ObjectList<TestClass>::begin(); it != ObjectList<TestClass>::end(); ++it)
             ++i;
         EXPECT_EQ(0u, i);
     }
 
     TEST_F(ObjectListIteratorTest, CanIterateOverFullList)
     {
-        ListableTest test1;
-        ListableTest test2;
-        ListableTest test3;
+        TestClass test1;
+        TestClass test2;
+        TestClass test3;
+        TestInterface interface;
 
         size_t i = 0;
-        for (ObjectListIterator<ListableTest> it = ObjectList<ListableTest>::begin(); it != ObjectList<ListableTest>::end(); ++it)
+        for (ObjectListIterator<TestClass> it = ObjectList<TestClass>::begin(); it != ObjectList<TestClass>::end(); ++it)
         {
             ++i;
             if (i == 1u) EXPECT_EQ(&test1, *it);
@@ -76,12 +85,13 @@
 
     TEST_F(ObjectListIteratorTest, CanIterateReverseOverFullList)
     {
-        ListableTest test1;
-        ListableTest test2;
-        ListableTest test3;
+        TestClass test1;
+        TestClass test2;
+        TestClass test3;
+        TestInterface interface;
 
         size_t i = 0;
-        for (ObjectListIterator<ListableTest> it = ObjectList<ListableTest>::rbegin(); it != ObjectList<ListableTest>::rend(); --it)
+        for (ObjectListIterator<TestClass> it = ObjectList<TestClass>::rbegin(); it != ObjectList<TestClass>::rend(); --it)
         {
             ++i;
             if (i == 1u) EXPECT_EQ(&test3, *it);
@@ -93,15 +103,16 @@
 
     TEST_F(ObjectListIteratorTest, CanCallObjects)
     {
-        ListableTest test1;
-        ListableTest test2;
-        ListableTest test3;
+        TestClass test1;
+        TestClass test2;
+        TestClass test3;
+        TestInterface interface;
 
         EXPECT_CALL(test1, test());
         EXPECT_CALL(test2, test());
         EXPECT_CALL(test3, test());
 
-        for (ObjectListIterator<ListableTest> it = ObjectList<ListableTest>::begin(); it != ObjectList<ListableTest>::end(); ++it)
+        for (ObjectListIterator<TestClass> it = ObjectList<TestClass>::begin(); it != ObjectList<TestClass>::end(); ++it)
             it->test();
     }
 }

Added: code/branches/cpp11_v2/test/core/object/ObjectListTest.cc
===================================================================
--- code/branches/cpp11_v2/test/core/object/ObjectListTest.cc	                        (rev 0)
+++ code/branches/cpp11_v2/test/core/object/ObjectListTest.cc	2015-10-31 22:50:17 UTC (rev 10736)
@@ -0,0 +1,105 @@
+#include <gtest/gtest.h>
+#include <gmock/gmock.h>
+
+#include "core/object/ObjectListIterator.h"
+#include "core/object/Listable.h"
+#include "core/CoreIncludes.h"
+#include "core/module/ModuleInstance.h"
+
+namespace orxonox
+{
+    namespace
+    {
+        class ListableTest : public Listable
+        {
+            public:
+                ListableTest() { RegisterObject(ListableTest); }
+                MOCK_METHOD0(test, void());
+        };
+
+        RegisterClassNoArgs(ListableTest);
+
+        // Fixture
+        class ObjectListTest : public ::testing::Test
+        {
+            public:
+                virtual void SetUp()
+                {
+                    new IdentifierManager();
+                    ModuleInstance::getCurrentModuleInstance()->loadAllStaticallyInitializedInstances(StaticInitialization::IDENTIFIER);
+                    Context::setRootContext(new Context(NULL));
+                }
+
+                virtual void TearDown()
+                {
+                    Context::destroyRootContext();
+                    ModuleInstance::getCurrentModuleInstance()->unloadAllStaticallyInitializedInstances(StaticInitialization::IDENTIFIER);
+                    delete &IdentifierManager::getInstance();
+                }
+        };
+    }
+    
+    TEST_F(ObjectListTest, CanIterateOverEmptyList)
+    {
+        size_t i = 0;
+        for (ListableTest* object : ObjectList<ListableTest>())
+        {
+            ++i;
+            ((void*)object); // avoid warning about unused variable
+        }
+        EXPECT_EQ(0u, i);
+    }
+
+    TEST_F(ObjectListTest, CanIterateOverFullList)
+    {
+        ListableTest test1;
+        ListableTest test2;
+        ListableTest test3;
+
+        size_t i = 0;
+        for (ListableTest* object : ObjectList<ListableTest>())
+        {
+            ++i;
+            if (i == 1u) EXPECT_EQ(&test1, object);
+            if (i == 2u) EXPECT_EQ(&test2, object);
+            if (i == 3u) EXPECT_EQ(&test3, object);
+        }
+        EXPECT_EQ(3u, i);
+    }
+    
+    TEST_F(ObjectListTest, CanIterateOverFullList_Expanded)
+    {
+        ListableTest test1;
+        ListableTest test2;
+        ListableTest test3;
+
+        size_t i = 0;
+        ObjectList<ListableTest>&& __range = ObjectList<ListableTest>();
+        ObjectListIterator<ListableTest> __begin = __range.begin();
+        ObjectListIterator<ListableTest>__end = __range.end();
+        for (; __begin != __end; ++__begin)
+        {
+            ListableTest* object = *__begin;
+
+            ++i;
+            if (i == 1u) EXPECT_EQ(&test1, object);
+            if (i == 2u) EXPECT_EQ(&test2, object);
+            if (i == 3u) EXPECT_EQ(&test3, object);
+        }
+        EXPECT_EQ(3u, i);
+    }
+    
+    TEST_F(ObjectListTest, CanCallObjects)
+    {
+        ListableTest test1;
+        ListableTest test2;
+        ListableTest test3;
+
+        EXPECT_CALL(test1, test());
+        EXPECT_CALL(test2, test());
+        EXPECT_CALL(test3, test());
+
+        for (ListableTest* object : ObjectList<ListableTest>())
+            object->test();
+    }
+}




More information about the Orxonox-commit mailing list