Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/weapon/src/orxonox/core/ConfigValueContainer.h @ 1142

Last change on this file since 1142 was 790, checked in by nicolasc, 17 years ago

merged FICN back into trunk
awaiting release.

File size: 11.6 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 <list>
46#include <string>
47
48#include "CorePrereqs.h"
49
50#include "util/Math.h"
51#include "Language.h"
52
53namespace orxonox
54{
55    //! The ConfigValuecontainer contains all needed informations about a configurable variable.
56    /**
57        The ConfigValueContainer class contains all needed informations about a configurable variable:
58         - the name of the variable
59         - the name of the class the variable belongs to
60         - the default value
61         - the user-specified value
62         - a pointer to the entry in the config-file
63
64        This is needed to assign the configured values to all newly created objects.
65
66        The container searches for the entry in the config file.
67        If there is an entry, it parses the specified value and assigns it to the variable of the right type.
68        If there is no entry, it adds the entry with the default-value to the section of the variables class.
69        If there is no section, the section and the entry are added to the end of the config-file.
70    */
71    class _CoreExport ConfigValueContainer
72    {
73        public:
74            enum VariableType
75            {
76                VT_Int,
77                VT_uInt,
78                VT_Char,
79                VT_uChar,
80                VT_Float,
81                VT_Double,
82                VT_LongDouble,
83                VT_Bool,
84                VT_ConstChar,
85                VT_String,
86                VT_Vector2,
87                VT_Vector3,
88                VT_ColourValue
89            };
90
91            ConfigValueContainer(const std::string& classname, const std::string& varname, int defvalue);
92            ConfigValueContainer(const std::string& classname, const std::string& varname, unsigned int defvalue);
93            ConfigValueContainer(const std::string& classname, const std::string& varname, char defvalue);
94            ConfigValueContainer(const std::string& classname, const std::string& varname, unsigned char defvalue);
95            ConfigValueContainer(const std::string& classname, const std::string& varname, float defvalue);
96            ConfigValueContainer(const std::string& classname, const std::string& varname, double defvalue);
97            ConfigValueContainer(const std::string& classname, const std::string& varname, long double defvalue);
98            ConfigValueContainer(const std::string& classname, const std::string& varname, bool defvalue);
99            ConfigValueContainer(const std::string& classname, const std::string& varname, const std::string& defvalue);
100            ConfigValueContainer(const std::string& classname, const std::string& varname, const char* defvalue);
101            ConfigValueContainer(const std::string& classname, const std::string& varname, Vector2 defvalue);
102            ConfigValueContainer(const std::string& classname, const std::string& varname, Vector3 defvalue);
103            ConfigValueContainer(const std::string& classname, const std::string& varname, ColourValue defvalue);
104
105            /** @returns the value. @param value This is only needed to determine the right type. */
106            inline ConfigValueContainer& getValue(int& value)                           { value = this->value_.value_int_; return *this; }
107            /** @returns the value. @param value This is only needed to determine the right type. */
108            inline ConfigValueContainer& getValue(unsigned int& value)                  { value = this->value_.value_uint_; return *this; }
109            /** @returns the value. @param value This is only needed to determine the right type. */
110            inline ConfigValueContainer& getValue(char& value)                          { value = this->value_.value_char_; return *this; }
111            /** @returns the value. @param value This is only needed to determine the right type. */
112            inline ConfigValueContainer& getValue(unsigned char& value)                 { value = this->value_.value_uchar_; return *this; }
113            /** @returns the value. @param value This is only needed to determine the right type. */
114            inline ConfigValueContainer& getValue(float& value)                         { value = this->value_.value_float_; return *this; }
115            /** @returns the value. @param value This is only needed to determine the right type. */
116            inline ConfigValueContainer& getValue(double& value)                        { value = this->value_.value_double_; return *this; }
117            /** @returns the value. @param value This is only needed to determine the right type. */
118            inline ConfigValueContainer& getValue(long double& value)                   { value = this->value_.value_long_double_; return *this; }
119            /** @returns the value. @param value This is only needed to determine the right type. */
120            inline ConfigValueContainer& getValue(bool& value)                          { value = this->value_.value_bool_; return *this; }
121            /** @returns the value. @param value This is only needed to determine the right type. */
122            inline ConfigValueContainer& getValue(std::string& value)                   { value = this->value_string_; return *this; }
123            /** @returns the value. @param value This is only needed to determine the right type. */
124            inline ConfigValueContainer& getValue(const char* value)                    { value = this->value_string_.c_str(); return *this; }
125            /** @returns the value. @param value This is only needed to determine the right type. */
126            inline ConfigValueContainer& getValue(Vector2& value)                       { value = this->value_vector2_; return *this; }
127            /** @returns the value. @param value This is only needed to determine the right type. */
128            inline ConfigValueContainer& getValue(Vector3& value)                       { value = this->value_vector3_; return *this; }
129            /** @returns the value. @param value This is only needed to determine the right type. */
130            inline ConfigValueContainer& getValue(ColourValue& value)                   { value = this->value_colourvalue_; return *this; }
131
132            void description(const std::string& description);
133
134            bool parseSting(const std::string& input);
135            void resetConfigFileEntry();
136            void resetConfigValue();
137
138            static std::string getStrippedLine(const std::string& line);
139            static bool isEmpty(const std::string& line);
140            static bool isComment(const std::string& line);
141
142        private:
143            bool parseSting(const std::string& input, int defvalue);
144            bool parseSting(const std::string& input, unsigned int defvalue);
145            bool parseSting(const std::string& input, char defvalue);
146            bool parseSting(const std::string& input, unsigned char defvalue);
147            bool parseSting(const std::string& input, float defvalue);
148            bool parseSting(const std::string& input, double defvalue);
149            bool parseSting(const std::string& input, long double defvalue);
150            bool parseSting(const std::string& input, bool defvalue);
151            bool parseSting(const std::string& input, const std::string& defvalue);
152            bool parseSting(const std::string& input, const char* defvalue);
153            bool parseSting(const std::string& input, const Vector2& defvalue);
154            bool parseSting(const std::string& input, const Vector3& defvalue);
155            bool parseSting(const std::string& input, const ColourValue& defvalue);
156
157            static std::list<std::string>& getConfigFileLines();
158            static bool finishedReadingConfigFile(bool finished = false);
159            void searchConfigFileLine();
160            std::string parseValueString(bool bStripped = true);
161
162            static void readConfigFile(const std::string& filename);
163            static void writeConfigFile(const std::string& filename);
164
165            std::string         classname_;                     //!< The name of the class the variable belongs to
166            std::string         varname_;                       //!< The name of the variable
167            std::string         defvalueString_;                //!< The string of the default-variable
168
169            union MultiType
170            {
171                int                 value_int_;                 //!< The value, if the variable is of the type int
172                unsigned int        value_uint_;                //!< The value, if the variable is of the type unsigned int
173                char                value_char_;                //!< The value, if the variable is of the type char
174                unsigned char       value_uchar_;               //!< The value, if the variable is of the type unsigned char
175                float               value_float_;               //!< The value, if the variable is of the type float
176                double              value_double_;              //!< The value, if the variable is of the type double
177                long double         value_long_double_;         //!< The value, if the variable is of the type long double
178                bool                value_bool_;                //!< The value, if the variable is of the type bool
179            } value_;                                           //!< The value of the variable
180
181            std::string         value_string_;                  //!< The value, if the variable is of the type string
182            Vector2             value_vector2_;                 //!< The value, if the variable is of the type Vector2
183            Vector3             value_vector3_;                 //!< The value, if the variable is of the type Vector3
184            ColourValue         value_colourvalue_;             //!< The value, if the variable is of the type ColourValue
185
186            std::list<std::string>::iterator configFileLine_;   //!< An iterator, pointing to the entry of the variable in the config-file
187
188            VariableType type_;                                 //!< The type of the variable
189            bool bAddedDescription_;                            //!< True if a description was added
190            LanguageEntryName description_;                     //!< The description
191    };
192}
193
194#endif /* _ConfigValueContainer_H__ */
Note: See TracBrowser for help on using the repository browser.