Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/FICN/src/orxonox/core/ConfigValueContainer.h @ 705

Last change on this file since 705 was 705, checked in by landauf, 16 years ago

added function to add descriptions to config values

File size: 11.7 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *
4 *
5 *   License notice:
6 *
7 *   This program is free software; you can redistribute it and/or
8 *   modify it under the terms of the GNU General Public License
9 *   as published by the Free Software Foundation; either version 2
10 *   of the License, or (at your option) any later version.
11 *
12 *   This program is distributed in the hope that it will be useful,
13 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
14 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 *   GNU General Public License for more details.
16 *
17 *   You should have received a copy of the GNU General Public License
18 *   along with this program; if not, write to the Free Software
19 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20 *
21 *   Author:
22 *      Fabian 'x3n' Landau
23 *   Co-authors:
24 *      ...
25 *
26 */
27
28/*!
29    @file ConfigValueContainer.h
30    @brief Definition of the ConfigValueContainer class.
31
32    The ConfigValueContainer class contains all needed informations about a configurable variable:
33     - the name of the variable
34     - the name of the class the variable belongs to
35     - the default value
36     - the user-specified value
37     - a pointer to the entry in the config-file
38
39    This is needed to assign the configured values to all newly created objects.
40*/
41
42#ifndef _ConfigValueContainer_H__
43#define _ConfigValueContainer_H__
44
45#include <string>
46#include <list>
47
48#include "CorePrereqs.h"
49
50#include "OgreVector2.h"
51#include "OgreVector3.h"
52#include "OgreColourValue.h"
53#include "Language.h"
54
55namespace orxonox
56{
57    //! The ConfigValuecontainer contains all needed informations about a configurable variable.
58    /**
59        The ConfigValueContainer class contains all needed informations about a configurable variable:
60         - the name of the variable
61         - the name of the class the variable belongs to
62         - the default value
63         - the user-specified value
64         - a pointer to the entry in the config-file
65
66        This is needed to assign the configured values to all newly created objects.
67
68        The container searches for the entry in the config file.
69        If there is an entry, it parses the specified value and assigns it to the variable of the right type.
70        If there is no entry, it adds the entry with the default-value to the section of the variables class.
71        If there is no section, the section and the entry are added to the end of the config-file.
72    */
73    class _CoreExport ConfigValueContainer
74    {
75        public:
76            enum VariableType
77            {
78                Int,
79                uInt,
80                Char,
81                uChar,
82                Float,
83                Double,
84                LongDouble,
85                Bool,
86                ConstChar,
87                String,
88                Vector2,
89                Vector3,
90                ColourValue
91            };
92
93            ConfigValueContainer(const std::string& classname, const std::string& varname, int defvalue);
94            ConfigValueContainer(const std::string& classname, const std::string& varname, unsigned int defvalue);
95            ConfigValueContainer(const std::string& classname, const std::string& varname, char defvalue);
96            ConfigValueContainer(const std::string& classname, const std::string& varname, unsigned char defvalue);
97            ConfigValueContainer(const std::string& classname, const std::string& varname, float defvalue);
98            ConfigValueContainer(const std::string& classname, const std::string& varname, double defvalue);
99            ConfigValueContainer(const std::string& classname, const std::string& varname, long double defvalue);
100            ConfigValueContainer(const std::string& classname, const std::string& varname, bool defvalue);
101            ConfigValueContainer(const std::string& classname, const std::string& varname, const std::string& defvalue);
102            ConfigValueContainer(const std::string& classname, const std::string& varname, const char* defvalue);
103            ConfigValueContainer(const std::string& classname, const std::string& varname, Ogre::Vector2 defvalue);
104            ConfigValueContainer(const std::string& classname, const std::string& varname, Ogre::Vector3 defvalue);
105            ConfigValueContainer(const std::string& classname, const std::string& varname, Ogre::ColourValue defvalue);
106
107            /** @returns the value. @param value This is only needed to determine the right type. */
108            inline ConfigValueContainer& getValue(int& value)                           { value = this->value_.value_int_; return *this; }
109            /** @returns the value. @param value This is only needed to determine the right type. */
110            inline ConfigValueContainer& getValue(unsigned int& value)                  { value = this->value_.value_uint_; return *this; }
111            /** @returns the value. @param value This is only needed to determine the right type. */
112            inline ConfigValueContainer& getValue(char& value)                          { value = this->value_.value_char_; return *this; }
113            /** @returns the value. @param value This is only needed to determine the right type. */
114            inline ConfigValueContainer& getValue(unsigned char& value)                 { value = this->value_.value_uchar_; return *this; }
115            /** @returns the value. @param value This is only needed to determine the right type. */
116            inline ConfigValueContainer& getValue(float& value)                         { value = this->value_.value_float_; return *this; }
117            /** @returns the value. @param value This is only needed to determine the right type. */
118            inline ConfigValueContainer& getValue(double& value)                        { value = this->value_.value_double_; return *this; }
119            /** @returns the value. @param value This is only needed to determine the right type. */
120            inline ConfigValueContainer& getValue(long double& value)                   { value = this->value_.value_long_double_; return *this; }
121            /** @returns the value. @param value This is only needed to determine the right type. */
122            inline ConfigValueContainer& getValue(bool& value)                          { value = this->value_.value_bool_; return *this; }
123            /** @returns the value. @param value This is only needed to determine the right type. */
124            inline ConfigValueContainer& getValue(std::string& value)                   { value = this->value_string_; return *this; }
125            /** @returns the value. @param value This is only needed to determine the right type. */
126            inline ConfigValueContainer& getValue(const char* value)                    { value = this->value_string_.c_str(); return *this; }
127            /** @returns the value. @param value This is only needed to determine the right type. */
128            inline ConfigValueContainer& getValue(Ogre::Vector2& value)                 { value = this->value_vector2_; return *this; }
129            /** @returns the value. @param value This is only needed to determine the right type. */
130            inline ConfigValueContainer& getValue(Ogre::Vector3& value)                 { value = this->value_vector3_; return *this; }
131            /** @returns the value. @param value This is only needed to determine the right type. */
132            inline ConfigValueContainer& getValue(Ogre::ColourValue& value)             { value = this->value_colourvalue_; return *this; }
133
134            void description(const std::string& description);
135
136            bool parseSting(const std::string& input);
137            void resetConfigFileEntry();
138            void resetConfigValue();
139
140            static std::string getStrippedLine(const std::string& line);
141            static bool isEmpty(const std::string& line);
142            static bool isComment(const std::string& line);
143
144        private:
145            bool parseSting(const std::string& input, int defvalue);
146            bool parseSting(const std::string& input, unsigned int defvalue);
147            bool parseSting(const std::string& input, char defvalue);
148            bool parseSting(const std::string& input, unsigned char defvalue);
149            bool parseSting(const std::string& input, float defvalue);
150            bool parseSting(const std::string& input, double defvalue);
151            bool parseSting(const std::string& input, long double defvalue);
152            bool parseSting(const std::string& input, bool defvalue);
153            bool parseSting(const std::string& input, const std::string& defvalue);
154            bool parseSting(const std::string& input, const char* defvalue);
155            bool parseSting(const std::string& input, const Ogre::Vector2& defvalue);
156            bool parseSting(const std::string& input, const Ogre::Vector3& defvalue);
157            bool parseSting(const std::string& input, const Ogre::ColourValue& defvalue);
158
159            static std::list<std::string>& getConfigFileLines();
160            static bool finishedReadingConfigFile(bool finished = false);
161            void searchConfigFileLine();
162            std::string parseValueString(bool bStripped = true);
163
164            static void readConfigFile(const std::string& filename);
165            static void writeConfigFile(const std::string& filename);
166
167            std::string         classname_;                     //!< The name of the class the variable belongs to
168            std::string         varname_;                       //!< The name of the variable
169            std::string         defvalueString_;                //!< The string of the default-variable
170
171            union MultiType
172            {
173                int                 value_int_;                 //!< The value, if the variable is of the type int
174                unsigned int        value_uint_;                //!< The value, if the variable is of the type unsigned int
175                char                value_char_;                //!< The value, if the variable is of the type char
176                unsigned char       value_uchar_;               //!< The value, if the variable is of the type unsigned char
177                float               value_float_;               //!< The value, if the variable is of the type float
178                double              value_double_;              //!< The value, if the variable is of the type double
179                long double         value_long_double_;         //!< The value, if the variable is of the type long double
180                bool                value_bool_;                //!< The value, if the variable is of the type bool
181            } value_;                                           //!< The value of the variable
182
183            std::string         value_string_;                  //!< The value, if the variable is of the type string
184            Ogre::Vector2       value_vector2_;                 //!< The value, if the variable is of the type Vector2
185            Ogre::Vector3       value_vector3_;                 //!< The value, if the variable is of the type Vector3
186            Ogre::ColourValue   value_colourvalue_;             //!< The value, if the variable is of the type ColourValue
187
188            std::list<std::string>::iterator configFileLine_;   //!< An iterator, pointing to the entry of the variable in the config-file
189
190            VariableType type_;                                 //!< The type of the variable
191            bool bAddedDescription_;                            //!< True if a description was added
192            LanguageEntryName description_;                     //!< The description
193    };
194}
195
196#endif /* _ConfigValueContainer_H__ */
Note: See TracBrowser for help on using the repository browser.