Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/gamestate/src/libraries/core/ConfigValueIncludes.h @ 7047

Last change on this file since 7047 was 6432, checked in by rgrieder, 15 years ago

Changed the way config values associated with general settings (ConfigFileType::Settings) are handled:

  • ConfigFileManager only handles config files listed in the ConfigFileType enum (normal enum again)
  • ConfigFileManager only takes care of ConfigFiles and returns a pointer to the right one, just two functions left. —> use like: ConfigFileManager::getInstance().getConfigFile(myType)→doSomething();
  • Moved all code (except for the argument completion functions) relating to ConfigFileType::Settings to a new class: SettingsConfigFile, which is a Singleton (it doesn't make sense to have multiple instances unless you start coding a lot more)
  • SettingsConfigFile handles config value containers according to their section and entry in the ini file, not according to class and variables names. (In most cases it will be class and variable names though)
  • SettingsConfigFile supports:
    • clear() (removes any file entries not associated to a config value container)
    • updateConfigValues() (does exactly that through the identifier)
    • config, tconfig and getConfig
    • commands listed above are exported to tolua, and tconfig, config and getConfig were given shortcuts in Lua (e.g. orxonox.config)
  • If you need to organise ConfigFiles yourself, just do it without the ConfigFileManager, like the KeyBinder does.
  • All getValue() functions have been split into getOrCreateValue() and getValue(), which is const
  • Removed obsolete config value management code in the Identifier (it still stores and destroys them and provides access to them)

All of that leads to one HUGE advantage:
"config OutputHandler softDebugLevelInGameConsole"
works now :D (any further implications are up to the reader…)
(it didn't work before because the actual config value container is in the InGameConsole singleton)

  • Property svn:eol-style set to native
File size: 7.3 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      Reto Grieder (functions)
26 *
27 */
28
29/**
30@file
31@brief
32    Definition of macros and functions for config-values.
33*/
34
35#ifndef _ConfigValueIncludes_H__
36#define _ConfigValueIncludes_H__
37
38#include "CorePrereqs.h"
39
40#include "Identifier.h"
41#include "ConfigValueContainer.h"
42
43namespace orxonox
44{
45    /** Sets a runtime configurable value.
46        If the container for the value doesn't yet exist, a new one is created.
47        Also, the @a variable argument will be modified and set to the new value (default or from ini file).
48    @param object
49        Class instance that the config value should belong to (usually just 'this')
50    @param variable
51        Pointer to the variable where the value should be written to
52    @param type
53        Type of the config file, usually ConfigFileType::Settings
54    @param sectionName
55        Name of the section in the ini file (e.g. [MySection])
56    @param entryName
57        Name of the entry in the ini file (e.g. [MySection] myValue)
58    @param defaultValue
59        Value to be used if it cannot be read from the ini file
60    */
61    template <class T, class D, class V>
62    inline ConfigValueContainer& setConfigValueGeneric(T* object, V* variable, ConfigFileType::Value type, const std::string& sectionName, const std::string& entryName, const D& defaultValue)
63    {
64        ConfigValueContainer* container = ClassIdentifier<T>::getIdentifier()->getConfigValueContainer(entryName);
65        if (!container)
66        {
67            container = new ConfigValueContainer(type, ClassIdentifier<T>::getIdentifier(), sectionName, entryName, defaultValue, *variable);
68            ClassIdentifier<T>::getIdentifier()->addConfigValueContainer(entryName, container);
69        }
70        return container->getValue(variable, object);
71    }
72}
73
74/** Sets a runtime configurable value (simplified macro version of setConfigValueGeneric)
75    If the container for the value doesn't yet exist, a new one is created.
76    Also, the @a varname argument will be modified and set to the new value (default or from ini file).
77@param varname
78    Variable name as C++ identifier. It will be used as entry name and as variable pointer
79@param defaultValue
80    Value to be used if it cannot be read from the ini file
81*/
82#define SetConfigValue(varname, defaultValue) \
83    orxonox::setConfigValueGeneric(this, &varname, ConfigFileType::Settings, this->getIdentifier()->getName(), #varname, defaultValue)
84
85/** Sets a runtime configurable value (simplified macro version of setConfigValueGeneric)
86    If the container for the value doesn't yet exist, a new one is created.
87    Also, the @a varname argument will be modified and set to the new value (default or from ini file).
88@param variable
89    Variable name as C++ identifier.
90@param entryName
91    Name of the entry in the ini file (e.g. [MySection] myValue)
92@param defaultValue
93    Value to be used if it cannot be read from the ini file
94*/
95#define SetConfigValueAlias(variable, entryName, defaultValue) \
96    orxonox::setConfigValueGeneric(this, &variable, ConfigFileType::Settings, this->getIdentifier()->getName(), entryName, defaultValue)
97
98
99namespace orxonox
100{
101    /** Resets a runtime configurable value to its default.
102        If the container for the value doesn't yet exist, a warning is displayed.
103        Also, the @a variable argument will be modified and set to the default value.
104    @param object
105        Class instance that the config value should belong to (usually just 'this')
106    @param variable
107        Pointer to the variable where the value should be written to
108    @param entryName
109        Name of the entry in the ini file (e.g. [MySection] myValue)
110    */
111    template <class T, class V>
112    inline void resetConfigValueGeneric(T* object, V* variable, const std::string& entryName)
113    {
114        ConfigValueContainer* container = ClassIdentifier<T>::getIdentifier()->getConfigValueContainer(entryName);
115        if (container)
116        {
117            container->reset();
118            container->getValue(variable, object);
119        }
120        else
121        {
122            COUT(2) << "Warning: Couldn't reset config-value '" << entryName << "' in class '"
123                    << ClassIdentifier<T>::getIdentifier()->getName() << "', corresponding container doesn't exist." << std::endl;
124        }
125    }
126}
127
128/** Resets a runtime configurable value to its default (simplified macro version of modifyConfigValueGeneric)
129    If the container for the value doesn't yet exist, a warning is displayed.
130    Also, the @a varname argument will be modified and set to the default value.
131@param varname
132    Variable name as C++ identifier. It will be used as entry name and as variable pointer
133*/
134#define ResetConfigValue(varname) \
135    orxonox::resetConfigValueGeneric(this, &varname, #varname)
136
137
138/** Modifies a runtime configurable value by using a modifier and some arguments.
139    If the container for the value doesn't yet exist, a warning is displayed.
140    Also, the @a variable argument will be modified and set to the current value.
141@param object
142    Class instance that the config value should belong to (usually just 'this')
143@param variable
144    Pointer to the variable where the value should be written to
145@param entryName
146    Name of the entry in the ini file (e.g. [MySection] myValue)
147@param modifier
148    On of these functions: set, tset, add, remove, reset, update
149@param ...
150    Arguments for the modifier function
151*/
152#define ModifyConfigValueGeneric(object, variable, entryName, modifier, ...) \
153    if (orxonox::ConfigValueContainer* container = ClassByObjectType(object)->getConfigValueContainer(entryName)) \
154    { \
155        container->modifier(__VA_ARGS__); \
156        container->getValue(variable, object); \
157    } \
158    else \
159    { \
160        COUT(2) << "Warning: Couln't modify config-value '" << entryName << "' in class '" \
161                << ClassByObjectType(object)->getName() << "', corresponding container doesn't exist." << std::endl; \
162    }
163
164/** Modifies a runtime configurable value by using a modifier and some arguments.
165    If the container for the value doesn't yet exist, a warning is displayed.
166    Also, the @a varname argument will be modified and set to the current value.
167@param varname
168    Variable name as C++ identifier. It will be used as entry name and as variable pointer
169@param modifier
170    On of these functions: set, tset, add, remove, reset, update
171@param ...
172    Arguments for the modifier function
173*/
174#define ModifyConfigValue(varname, modifier, ...) \
175    ModifyConfigValueGeneric(this, &varname, #varname, modifier, __VA_ARGS__)
176
177#endif /* _ConfigValueIncludes_H__ */
Note: See TracBrowser for help on using the repository browser.