Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core3/src/core/ConfigValueContainer.h @ 1596

Last change on this file since 1596 was 1596, checked in by landauf, 16 years ago
  • added feature to add a callback function to configvalues. they get called if the value changes. an examples is in Core.cc.
  • changed the SetConfigValue macro and the Identifier::updateConfigValues() function to work properly with inherited classes in both possible cases: 1) they overwrite the config-value or 2) they don't. an example is ParticleProjectile that defines it's own speed_ configvalue.
  • Property svn:eol-style set to native
File size: 8.7 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 *      ...
26 *
27 */
28
29/**
30    @file ConfigValueContainer.h
31    @brief Definition of the ConfigValueContainer class.
32
33    The ConfigValueContainer class contains all needed informations about a configurable variable:
34     - the name of the variable
35     - the name of the class the variable belongs to
36     - the default value
37     - the user-specified value
38     - a pointer to the entry in the config-file
39
40    This is needed to assign the configured values to all newly created objects.
41*/
42
43#ifndef _ConfigValueContainer_H__
44#define _ConfigValueContainer_H__
45
46#include "CorePrereqs.h"
47
48#include <string>
49#include <vector>
50
51#include "util/Math.h"
52#include "util/MultiTypeMath.h"
53#include "ConfigFileManager.h"
54
55namespace orxonox
56{
57    class ConfigValueCallbackBase
58    {
59        public:
60            virtual void call(void* object) = 0;
61            inline virtual ~ConfigValueCallbackBase() {}
62    };
63
64    template <class T>
65    class ConfigValueCallback: public ConfigValueCallbackBase
66    {
67        public:
68            inline ConfigValueCallback(void (T::*function) (void)) : function_(function) {}
69            inline virtual ~ConfigValueCallback() {}
70            inline virtual void call(void* object)
71                { (((T*)object)->*this->function_)(); }
72
73        private:
74            void (T::*function_) (void);
75    };
76
77
78    //! The ConfigValuecontainer contains all needed informations about a configurable variable.
79    /**
80        The ConfigValueContainer class contains all needed informations about a configurable variable:
81         - the name of the variable
82         - the name of the class the variable belongs to
83         - the default value
84         - the user-specified value
85         - a pointer to the entry in the config-file
86
87        This is needed to assign the configured values to all newly created objects.
88
89        The container searches for the entry in the config file.
90        If there is an entry, it parses the specified value and assigns it to the variable of the right type.
91        If there is no entry, it adds the entry with the default-value to the section of the variables class.
92        If there is no section, the section and the entry are added to the end of the config-file.
93    */
94    class _CoreExport ConfigValueContainer
95    {
96        public:
97            ConfigValueContainer(ConfigFileType type, Identifier* identifier, const std::string& varname, const MultiTypeMath& defvalue);
98            ConfigValueContainer(ConfigFileType type, Identifier* identifier, const std::string& varname, const std::vector<MultiTypeMath>& defvalue);
99            ~ConfigValueContainer();
100
101            /** @brief Returns the configured value. @param value A pointer to the variable to store the value. @return The ConfigValueContainer */
102            template <typename T, class C>
103            ConfigValueContainer& getValue(T* value, C* object)
104            {
105                if (this->callback_ && object)
106                {
107                    T temp = *value;
108                    this->value_.getValue(value);
109                    if ((*value) != temp)
110                        this->callback_->call(object);
111                }
112                else
113                {
114                    this->value_.getValue(value);
115                }
116                return *this;
117            }
118
119            /** @brief Returns the configured vector. @param value A pointer to the vector to store the values. @return The ConfigValueContainer */
120            template <typename T, class C>
121            ConfigValueContainer& getValue(std::vector<T>* value, C* object)
122            {
123                if (this->callback_ && object)
124                {
125                    std::vector<T> temp = *value;
126
127                    value->clear();
128                    for (unsigned int i = 0; i < this->valueVector_.size(); ++i)
129                        value->push_back(this->valueVector_[i]);
130
131                    if (value->size() != temp.size())
132                    {
133                        this->callback_->call(object);
134                    }
135                    else
136                    {
137                        for (unsigned int i = 0; i < value->size(); ++i)
138                        {
139                            if ((*value)[i] != temp[i])
140                            {
141                                this->callback_->call(object);
142                                break;
143                            }
144                        }
145                    }
146                }
147                else
148                {
149                    value->clear();
150                    for (unsigned int i = 0; i < this->valueVector_.size(); ++i)
151                        value->push_back(this->valueVector_[i]);
152                }
153                return *this;
154            }
155
156            template <typename T>
157            inline void setVectorType(const std::vector<T>& value)
158            {
159                this->value_ = T();
160                this->update();
161            }
162
163            inline const std::string& getName() const
164                { return this->varname_; }
165            inline bool isVector() const
166                { return this->bIsVector_; }
167            inline unsigned int getVectorSize() const
168                { return this->valueVector_.size(); }
169
170            ConfigValueContainer& description(const std::string& description);
171            const std::string& getDescription() const;
172
173            template <class T>
174            inline ConfigValueContainer& callback(void (T::*function) (void))
175            {
176                if (!this->callback_)
177                    this->callback_ = new ConfigValueCallback<T>(function);
178                return (*this);
179            }
180
181            bool set(const MultiTypeMath& input);
182            bool tset(const MultiTypeMath& input);
183
184            bool set(unsigned int index, const MultiTypeMath& input);
185            bool tset(unsigned int index, const MultiTypeMath& input);
186            bool add(const MultiTypeMath& input);
187            bool remove(unsigned int index);
188
189            bool reset();
190            void update();
191
192            /** @brief Converts the config-value to a string. @return The string */
193            inline std::string toString() const
194                { return this->value_.toString(); }
195            /** @brief Returns the typename of the assigned config-value. @return The typename */
196            inline std::string getTypename() const
197                { return this->value_.getTypename(); }
198
199        private:
200            bool callFunctionWithIndex(bool (ConfigValueContainer::* function) (unsigned int, const MultiTypeMath&), const std::string& input);
201
202            bool                       bIsVector_;                  //!< True if the container contains a std::vector
203
204            ConfigFileType             type_;                       //!< The type of the corresponding config-file
205            Identifier*                identifier_;                 //!< The identifier of the class
206            std::string                sectionname_;                //!< The name of the class the variable belongs to
207            std::string                varname_;                    //!< The name of the variable
208            std::string                defvalueString_;             //!< The string of the default-value
209            std::vector<std::string>   defvalueStringVector_;       //!< A vector, containg the strings of the default-values in case we're storing a vector
210
211            MultiTypeMath              value_;                      //!< The value
212            std::vector<MultiTypeMath> valueVector_;                //!< A vector, containg the values in case we're storing a vector
213
214            bool                       bAddedDescription_;          //!< True if a description was added
215            LanguageEntryLabel         description_;                //!< The description
216            ConfigValueCallbackBase*   callback_;                   //!< A callback function to call after getValue if the value changed
217    };
218}
219
220#endif /* _ConfigValueContainer_H__ */
Note: See TracBrowser for help on using the repository browser.