[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