[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