[Orxonox-commit 1705] r6423 - code/trunk/src/libraries/core

rgrieder at orxonox.net rgrieder at orxonox.net
Sun Dec 27 00:09:09 CET 2009


Author: rgrieder
Date: 2009-12-27 00:09:08 +0100 (Sun, 27 Dec 2009)
New Revision: 6423

Modified:
   code/trunk/src/libraries/core/ConfigValueIncludes.h
   code/trunk/src/libraries/core/CoreIncludes.h
Log:
Fixed bug that caused derived classes to list the base class's config values as well.
Introduced a new "ClassByObjecType" function that accepts a 'this' pointer and returns the correct identifier (not this->getIdentifier()!).

Modified: code/trunk/src/libraries/core/ConfigValueIncludes.h
===================================================================
--- code/trunk/src/libraries/core/ConfigValueIncludes.h	2009-12-26 10:18:13 UTC (rev 6422)
+++ code/trunk/src/libraries/core/ConfigValueIncludes.h	2009-12-26 23:09:08 UTC (rev 6423)
@@ -62,11 +62,11 @@
     template <class T, class D, class V>
     inline ConfigValueContainer& setConfigValueGeneric(T* object, V* variable, ConfigFileType type, const std::string& sectionName, const std::string& entryName, const D& defaultValue)
     {
-        ConfigValueContainer* container = object->getIdentifier()->getConfigValueContainer(entryName);
+        ConfigValueContainer* container = ClassIdentifier<T>::getIdentifier()->getConfigValueContainer(entryName);
         if (!container)
         {
-            container = new ConfigValueContainer(type, object->getIdentifier(), sectionName, entryName, defaultValue, *variable);
-            object->getIdentifier()->addConfigValueContainer(entryName, container);
+            container = new ConfigValueContainer(type, ClassIdentifier<T>::getIdentifier(), sectionName, entryName, defaultValue, *variable);
+            ClassIdentifier<T>::getIdentifier()->addConfigValueContainer(entryName, container);
         }
         return container->getValue(variable, object);
     }
@@ -112,7 +112,7 @@
     template <class T, class V>
     inline void resetConfigValueGeneric(T* object, V* variable, const std::string& entryName)
     {
-        ConfigValueContainer* container = object->getIdentifier()->getConfigValueContainer(entryName);
+        ConfigValueContainer* container = ClassIdentifier<T>::getIdentifier()->getConfigValueContainer(entryName);
         if (container)
         {
             container->reset();
@@ -121,7 +121,7 @@
         else
         {
             COUT(2) << "Warning: Couldn't reset config-value '" << entryName << "' in class '"
-                    << object->getIdentifier()->getName() << "', corresponding container doesn't exist." << std::endl;
+                    << ClassIdentifier<T>::getIdentifier()->getName() << "', corresponding container doesn't exist." << std::endl;
         }
     }
 }
@@ -151,7 +151,7 @@
     Arguments for the modifier function
 */
 #define ModifyConfigValueGeneric(object, variable, entryName, modifier, ...) \
-    if (orxonox::ConfigValueContainer* container = object->getIdentifier()->getConfigValueContainer(entryName)) \
+    if (orxonox::ConfigValueContainer* container = ClassByObjectType(object)->getConfigValueContainer(entryName)) \
     { \
         container->modifier(__VA_ARGS__); \
         container->getValue(variable, object); \
@@ -159,7 +159,7 @@
     else \
     { \
         COUT(2) << "Warning: Couln't modify config-value '" << entryName << "' in class '" \
-                << object->getIdentifier()->getName() << "', corresponding container doesn't exist." << std::endl; \
+                << ClassByObjectType(object)->getName() << "', corresponding container doesn't exist." << std::endl; \
     }
 
 /** Modifies a runtime configurable value by using a modifier and some arguments.

Modified: code/trunk/src/libraries/core/CoreIncludes.h
===================================================================
--- code/trunk/src/libraries/core/CoreIncludes.h	2009-12-26 10:18:13 UTC (rev 6422)
+++ code/trunk/src/libraries/core/CoreIncludes.h	2009-12-26 23:09:08 UTC (rev 6423)
@@ -124,6 +124,18 @@
     {
         return Identifier::getIdentifierByID(id);
     }
+
+    /**
+        @brief Returns the Identifier with a given 'this' pointer.
+        @note This of course only works with OrxonoxClasses.
+              The only use is in conjunction with macros that don't know the class type.
+        @param Pointer to an OrxonoxClass
+    */
+    template <class T>
+    inline Identifier* ClassByObjectType(const T* object)
+    {
+        return ClassIdentifier<T>::getIdentifier();
+    }
 }
 
 #endif /* _CoreIncludes_H__ */




More information about the Orxonox-commit mailing list