[Orxonox-commit 4966] r9635 - in code/branches/core6: src/libraries/core src/libraries/core/object test/core/object
landauf at orxonox.net
landauf at orxonox.net
Sun Aug 11 14:38:03 CEST 2013
Author: landauf
Date: 2013-08-11 14:38:03 +0200 (Sun, 11 Aug 2013)
New Revision: 9635
Modified:
code/branches/core6/src/libraries/core/CoreIncludes.h
code/branches/core6/src/libraries/core/CorePrereqs.h
code/branches/core6/src/libraries/core/object/ClassFactory.h
code/branches/core6/test/core/object/ClassFactoryTest.cc
Log:
added Factory for classes that don't require a Context as constructor argument
Modified: code/branches/core6/src/libraries/core/CoreIncludes.h
===================================================================
--- code/branches/core6/src/libraries/core/CoreIncludes.h 2013-08-11 12:36:31 UTC (rev 9634)
+++ code/branches/core6/src/libraries/core/CoreIncludes.h 2013-08-11 12:38:03 UTC (rev 9635)
@@ -112,20 +112,27 @@
InternRegisterObject(ClassName, true)
/**
- @brief Creates the Factory.
+ @brief Creates and registers the Factory.
@param ClassName The name of the class
*/
#define CreateFactory(ClassName) \
- Factory* _##ClassName##Factory = new orxonox::ClassFactory<ClassName>(#ClassName, true)
+ RegisterFactory(ClassName, new orxonox::ClassFactoryWithContext<ClassName>(#ClassName, true))
/**
- @brief Creates the Factory for classes which should not be loaded through XML.
+ @brief Creates and registers the Factory for classes which should not be loaded through XML.
@param ClassName The name of the class
*/
#define CreateUnloadableFactory(ClassName) \
- Factory* _##ClassName##Factory = new orxonox::ClassFactory<ClassName>(#ClassName, false)
+ RegisterFactory(ClassName, new orxonox::ClassFactoryWithContext<ClassName>(#ClassName, false))
/**
+ @brief Registers a given Factory.
+ @param ClassName The name of the class
+*/
+#define RegisterFactory(ClassName, FactoryInstance) \
+ Factory* _##ClassName##Factory = FactoryInstance
+
+/**
@brief Returns the Identifier of the given class.
@param ClassName The name of the class
*/
Modified: code/branches/core6/src/libraries/core/CorePrereqs.h
===================================================================
--- code/branches/core6/src/libraries/core/CorePrereqs.h 2013-08-11 12:36:31 UTC (rev 9634)
+++ code/branches/core6/src/libraries/core/CorePrereqs.h 2013-08-11 12:38:03 UTC (rev 9635)
@@ -126,6 +126,8 @@
template <class T>
class ClassFactory;
template <class T>
+ class ClassFactoryWithContext;
+ template <class T>
class ClassIdentifier;
class ClassTreeMask;
class ClassTreeMaskIterator;
Modified: code/branches/core6/src/libraries/core/object/ClassFactory.h
===================================================================
--- code/branches/core6/src/libraries/core/object/ClassFactory.h 2013-08-11 12:36:31 UTC (rev 9634)
+++ code/branches/core6/src/libraries/core/object/ClassFactory.h 2013-08-11 12:38:03 UTC (rev 9635)
@@ -49,7 +49,7 @@
// ###########################
// ### Factory ###
// ###########################
- /// Base-class of ClassFactory.
+ /// Base-class of all factories.
class _CoreExport Factory
{
public:
@@ -60,7 +60,7 @@
// ###############################
// ### ClassFactory ###
// ###############################
- /// The ClassFactory is able to create new objects of a specific class.
+ /// The ClassFactory is able to create new objects of a specific class that require no constructor arguments.
template <class T>
class ClassFactory : public Factory
{
@@ -83,6 +83,36 @@
*/
inline Identifiable* fabricate(Context* context)
{
+ return static_cast<Identifiable*>(new T());
+ }
+ };
+
+ // ###############################
+ // ### ClassFactoryWithContext ###
+ // ###############################
+ /// The ClassFactoryWithContext is able to create new objects of a specific class that require a context as constructor argument
+ template <class T>
+ class ClassFactoryWithContext : public Factory
+ {
+ public:
+ /**
+ @brief Constructor: Adds the ClassFactory to the Identifier of the same type.
+ @param name The name of the class
+ @param bLoadable True if the class can be loaded through XML
+ */
+ ClassFactoryWithContext(const std::string& name, bool bLoadable = true)
+ {
+ orxout(verbose, context::misc::factory) << "Create entry for " << name << " in Factory." << endl;
+ ClassIdentifier<T>::getIdentifier(name)->setFactory(this);
+ ClassIdentifier<T>::getIdentifier()->setLoadable(bLoadable);
+ }
+
+ /**
+ @brief Creates and returns a new object of class T.
+ @return The new object
+ */
+ inline Identifiable* fabricate(Context* context)
+ {
return static_cast<Identifiable*>(new T(context));
}
};
Modified: code/branches/core6/test/core/object/ClassFactoryTest.cc
===================================================================
--- code/branches/core6/test/core/object/ClassFactoryTest.cc 2013-08-11 12:36:31 UTC (rev 9634)
+++ code/branches/core6/test/core/object/ClassFactoryTest.cc 2013-08-11 12:38:03 UTC (rev 9635)
@@ -6,7 +6,7 @@
{
TEST(ClassFactoryTest, CanFabricateObject)
{
- Factory* factory = new ClassFactory<BaseObject>("BaseObject");
+ Factory* factory = new ClassFactoryWithContext<BaseObject>("BaseObject");
Identifiable* object = factory->fabricate(NULL);
ASSERT_TRUE(object != NULL);
BaseObject* baseObject = dynamic_cast<BaseObject*>(object);
More information about the Orxonox-commit
mailing list