Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/libraries/util/MultiTypeValue.h @ 8706

Last change on this file since 8706 was 8706, checked in by dafrick, 13 years ago

Merging presentation branch back into trunk.
There are many new features and also a lot of other changes and bugfixes, if you want to know, digg through the svn log.
Not everything is yet working as it should, but it should be fairly stable. If you habe any bug reports, just send me an email.

  • Property svn:eol-style set to native
File size: 21.6 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
31    @ingroup MultiType
32    @brief Declaration and Implementation of the MT_Value<T> class.
33
34    The MT_Value<T> class is used to hold a value of type T within a MultiType.
35*/
36
37#ifndef _MultiTypeValue_H__
38#define _MultiTypeValue_H__
39
40#include "UtilPrereqs.h"
41
42#include <cassert>
43#include "MathConvert.h"
44#include "MultiType.h"
45#include "Serialise.h"
46
47namespace orxonox
48{
49    /**
50        @brief The MT_Value<T> class is used to hold a value of type T within a MultiType.
51    */
52    template <typename T>
53    class MT_Value : public MultiType::MT_ValueBase
54    {
55    public:
56        /// Constructor: Assigns the value and the type identifier.
57        MT_Value(const T& value, MT_Type::Value type) : MT_ValueBase(type), value_(value) {}
58
59        /// Creates a copy of itself.
60        inline MT_ValueBase* clone() const { return new MT_Value<T>(this->value_, this->type_); }
61
62        /// Resets the current value to the default.
63        inline void reset() { this->value_ = zeroise<T>(); bHasDefaultValue_ = true; }
64
65        /**
66            @brief Assigns the value of the other MultiType, converted to T.
67            @param other The other MultiType
68        */
69        inline bool assimilate(const MultiType& other)
70        {
71            if (other.value_)
72            {
73                return !(bHasDefaultValue_ = !other.value_->getValue(&value_));
74            }
75            else
76            {
77                this->value_ = zeroise<T>();
78                return !(bHasDefaultValue_ = true);
79            }
80        }
81
82        inline bool getValue(char*                 value) const { return convertValue<T, char                >(value, value_, 0); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
83        inline bool getValue(unsigned char*        value) const { return convertValue<T, unsigned char       >(value, value_, 0); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
84        inline bool getValue(short*                value) const { return convertValue<T, short               >(value, value_, 0); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
85        inline bool getValue(unsigned short*       value) const { return convertValue<T, unsigned short      >(value, value_, 0); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
86        inline bool getValue(int*                  value) const { return convertValue<T, int                 >(value, value_, 0); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
87        inline bool getValue(unsigned int*         value) const { return convertValue<T, unsigned int        >(value, value_, 0); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
88        inline bool getValue(long*                 value) const { return convertValue<T, long                >(value, value_, 0); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
89        inline bool getValue(unsigned long*        value) const { return convertValue<T, unsigned long       >(value, value_, 0); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
90        inline bool getValue(long long*            value) const { return convertValue<T, long long           >(value, value_, 0); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
91        inline bool getValue(unsigned long long*   value) const { return convertValue<T, unsigned long long  >(value, value_, 0); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
92        inline bool getValue(float*                value) const { return convertValue<T, float               >(value, value_, 0); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
93        inline bool getValue(double*               value) const { return convertValue<T, double              >(value, value_, 0); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
94        inline bool getValue(long double*          value) const { return convertValue<T, long double         >(value, value_, 0); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
95        inline bool getValue(bool*                 value) const { return convertValue<T, bool                >(value, value_, 0); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
96        inline bool getValue(void**                value) const { return convertValue<T, void*               >(value, value_, 0); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
97        inline bool getValue(std::string*          value) const { return convertValue<T, std::string         >(value, value_, zeroise<std::string>         ()); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
98        inline bool getValue(orxonox::Vector2*     value) const { return convertValue<T, orxonox::Vector2    >(value, value_, zeroise<orxonox::Vector2>    ()); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
99        inline bool getValue(orxonox::Vector3*     value) const { return convertValue<T, orxonox::Vector3    >(value, value_, zeroise<orxonox::Vector3>    ()); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
100        inline bool getValue(orxonox::Vector4*     value) const { return convertValue<T, orxonox::Vector4    >(value, value_, zeroise<orxonox::Vector4>    ()); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
101        inline bool getValue(orxonox::ColourValue* value) const { return convertValue<T, orxonox::ColourValue>(value, value_, zeroise<orxonox::ColourValue>()); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
102        inline bool getValue(orxonox::Quaternion*  value) const { return convertValue<T, orxonox::Quaternion >(value, value_, zeroise<orxonox::Quaternion> ()); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
103        inline bool getValue(orxonox::Radian*      value) const { return convertValue<T, orxonox::Radian     >(value, value_, zeroise<orxonox::Radian>     ()); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
104        inline bool getValue(orxonox::Degree*      value) const { return convertValue<T, orxonox::Degree     >(value, value_, zeroise<orxonox::Degree>     ()); } ///< Assigns the value to the given pointer. The value gets converted if the types don't match.
105
106        inline bool setValue(const char& value)                 { return !(bHasDefaultValue_ = !convertValue<char                , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
107        inline bool setValue(const unsigned char& value)        { return !(bHasDefaultValue_ = !convertValue<unsigned char       , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
108        inline bool setValue(const short& value)                { return !(bHasDefaultValue_ = !convertValue<short               , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
109        inline bool setValue(const unsigned short& value)       { return !(bHasDefaultValue_ = !convertValue<unsigned short      , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
110        inline bool setValue(const int& value)                  { return !(bHasDefaultValue_ = !convertValue<int                 , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
111        inline bool setValue(const unsigned int& value)         { return !(bHasDefaultValue_ = !convertValue<unsigned int        , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
112        inline bool setValue(const long& value)                 { return !(bHasDefaultValue_ = !convertValue<long                , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
113        inline bool setValue(const unsigned long& value)        { return !(bHasDefaultValue_ = !convertValue<unsigned long       , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
114        inline bool setValue(const long long& value)            { return !(bHasDefaultValue_ = !convertValue<long long           , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
115        inline bool setValue(const unsigned long long& value)   { return !(bHasDefaultValue_ = !convertValue<unsigned long long  , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
116        inline bool setValue(const float& value)                { return !(bHasDefaultValue_ = !convertValue<float               , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
117        inline bool setValue(const double& value)               { return !(bHasDefaultValue_ = !convertValue<double              , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
118        inline bool setValue(const long double& value)          { return !(bHasDefaultValue_ = !convertValue<long double         , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
119        inline bool setValue(const bool& value)                 { return !(bHasDefaultValue_ = !convertValue<bool                , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
120        inline bool setValue(      void* const& value)          { return !(bHasDefaultValue_ = !convertValue<void*               , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
121        inline bool setValue(const std::string& value)          { return !(bHasDefaultValue_ = !convertValue<std::string         , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
122        inline bool setValue(const orxonox::Vector2& value)     { return !(bHasDefaultValue_ = !convertValue<orxonox::Vector2    , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
123        inline bool setValue(const orxonox::Vector3& value)     { return !(bHasDefaultValue_ = !convertValue<orxonox::Vector3    , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
124        inline bool setValue(const orxonox::Vector4& value)     { return !(bHasDefaultValue_ = !convertValue<orxonox::Vector4    , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
125        inline bool setValue(const orxonox::ColourValue& value) { return !(bHasDefaultValue_ = !convertValue<orxonox::ColourValue, T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
126        inline bool setValue(const orxonox::Quaternion& value)  { return !(bHasDefaultValue_ = !convertValue<orxonox::Quaternion , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
127        inline bool setValue(const orxonox::Radian& value)      { return !(bHasDefaultValue_ = !convertValue<orxonox::Radian     , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
128        inline bool setValue(const orxonox::Degree& value)      { return !(bHasDefaultValue_ = !convertValue<orxonox::Degree     , T>(&value_, value, zeroise<T>())); } ///< Assigns the value by converting it to T.
129
130        inline operator char()                 const { return getConvertedValue<T, char>                (this->value_, 0); }     ///< Returns the current value, converted to the requested type.
131        inline operator unsigned char()        const { return getConvertedValue<T, unsigned char>       (this->value_, 0); }     ///< Returns the current value, converted to the requested type.
132        inline operator short()                const { return getConvertedValue<T, short>               (this->value_, 0); }     ///< Returns the current value, converted to the requested type.
133        inline operator unsigned short()       const { return getConvertedValue<T, unsigned short>      (this->value_, 0); }     ///< Returns the current value, converted to the requested type.
134        inline operator int()                  const { return getConvertedValue<T, int>                 (this->value_, 0); }     ///< Returns the current value, converted to the requested type.
135        inline operator unsigned int()         const { return getConvertedValue<T, unsigned int>        (this->value_, 0); }     ///< Returns the current value, converted to the requested type.
136        inline operator long()                 const { return getConvertedValue<T, long>                (this->value_, 0); }     ///< Returns the current value, converted to the requested type.
137        inline operator unsigned long()        const { return getConvertedValue<T, unsigned long>       (this->value_, 0); }     ///< Returns the current value, converted to the requested type.
138        inline operator long long()            const { return getConvertedValue<T, long long>           (this->value_, 0); }     ///< Returns the current value, converted to the requested type.
139        inline operator unsigned long long()   const { return getConvertedValue<T, unsigned long long>  (this->value_, 0); }     ///< Returns the current value, converted to the requested type.
140        inline operator float()                const { return getConvertedValue<T, float>               (this->value_, 0); }     ///< Returns the current value, converted to the requested type.
141        inline operator double()               const { return getConvertedValue<T, double>              (this->value_, 0); }     ///< Returns the current value, converted to the requested type.
142        inline operator long double()          const { return getConvertedValue<T, long double>         (this->value_, 0); }     ///< Returns the current value, converted to the requested type.
143        inline operator bool()                 const { return getConvertedValue<T, bool>                (this->value_, 0); }     ///< Returns the current value, converted to the requested type.
144        inline operator void*()                const { return getConvertedValue<T, void*>               (this->value_, 0); }     ///< Returns the current value, converted to the requested type.
145        inline operator std::string()          const { return getConvertedValue<T, std::string>         (this->value_, NilValue<std::string         >()); } ///< Returns the current value, converted to the requested type.
146        inline operator orxonox::Vector2()     const { return getConvertedValue<T, orxonox::Vector2>    (this->value_, NilValue<orxonox::Vector2    >()); } ///< Returns the current value, converted to the requested type.
147        inline operator orxonox::Vector3()     const { return getConvertedValue<T, orxonox::Vector3>    (this->value_, NilValue<orxonox::Vector3    >()); } ///< Returns the current value, converted to the requested type.
148        inline operator orxonox::Vector4()     const { return getConvertedValue<T, orxonox::Vector4>    (this->value_, NilValue<orxonox::Vector4    >()); } ///< Returns the current value, converted to the requested type.
149        inline operator orxonox::ColourValue() const { return getConvertedValue<T, orxonox::ColourValue>(this->value_, NilValue<orxonox::ColourValue>()); } ///< Returns the current value, converted to the requested type.
150        inline operator orxonox::Quaternion()  const { return getConvertedValue<T, orxonox::Quaternion> (this->value_, NilValue<orxonox::Quaternion >()); } ///< Returns the current value, converted to the requested type.
151        inline operator orxonox::Radian()      const { return getConvertedValue<T, orxonox::Radian>     (this->value_, NilValue<orxonox::Radian     >()); } ///< Returns the current value, converted to the requested type.
152        inline operator orxonox::Degree()      const { return getConvertedValue<T, orxonox::Degree>     (this->value_, NilValue<orxonox::Degree     >()); } ///< Returns the current value, converted to the requested type.
153
154        /// Puts the current value on the stream
155        inline void toString(std::ostream& outstream) const { outstream << this->value_; }
156
157        /// loads data from the bytestream (mem) into the MT and increases the bytestream pointer by the size of the data
158        inline void importData( uint8_t*& mem )         { loadAndIncrease( /*(const T&)*/this->value_, mem ); }
159        /// saves data from the MT into the bytestream (mem) and increases the bytestream pointer by the size of the data
160        inline void exportData( uint8_t*& mem ) const   { saveAndIncrease( /*(const T&)*/this->value_, mem ); }
161        /// returns the size of the data that would be saved by exportData
162        inline uint8_t getSize() const { return returnSize( this->value_ ); }
163
164        T value_; ///< The stored value
165    };
166
167    // Import / Export specialisation
168    // ColourValue
169    template <> inline void MT_Value<ColourValue>::importData( uint8_t*& mem )
170    {
171        loadAndIncrease( this->value_.r, mem );
172        loadAndIncrease( this->value_.g, mem );
173        loadAndIncrease( this->value_.b, mem );
174        loadAndIncrease( this->value_.a, mem );
175    }
176    template <> inline void MT_Value<ColourValue>::exportData( uint8_t*& mem ) const
177    {
178        saveAndIncrease( this->value_.r, mem );
179        saveAndIncrease( this->value_.g, mem );
180        saveAndIncrease( this->value_.b, mem );
181        saveAndIncrease( this->value_.a, mem );
182    }
183    template <> inline uint8_t MT_Value<ColourValue>::getSize() const
184    {
185        return 4*returnSize(this->value_.r);
186    }
187    // Ogre::Quaternion
188    template <> inline void MT_Value<Ogre::Quaternion>::importData( uint8_t*& mem )
189    {
190        loadAndIncrease( this->value_.x, mem );
191        loadAndIncrease( this->value_.y, mem );
192        loadAndIncrease( this->value_.z, mem );
193        loadAndIncrease( this->value_.w, mem );
194    }
195    template <> inline void MT_Value<Ogre::Quaternion>::exportData( uint8_t*& mem ) const
196    {
197        saveAndIncrease( this->value_.x, mem );
198        saveAndIncrease( this->value_.y, mem );
199        saveAndIncrease( this->value_.z, mem );
200        saveAndIncrease( this->value_.w, mem );
201    }
202    template <> inline uint8_t MT_Value<Ogre::Quaternion>::getSize() const
203    {
204        return 4*returnSize(this->value_.x);
205    }
206    // Ogre::Vector2
207    template <> inline void MT_Value<Ogre::Vector2>::importData( uint8_t*& mem )
208    {
209        loadAndIncrease( this->value_.x, mem );
210        loadAndIncrease( this->value_.y, mem );
211    }
212    template <> inline void MT_Value<Ogre::Vector2>::exportData( uint8_t*& mem ) const
213    {
214        saveAndIncrease( this->value_.x, mem );
215        saveAndIncrease( this->value_.y, mem );
216    }
217    template <> inline uint8_t MT_Value<Ogre::Vector2>::getSize() const
218    {
219        return 2*returnSize(this->value_.x);
220    }
221    // Ogre::Vector3
222    template <> inline void MT_Value<Ogre::Vector3>::importData( uint8_t*& mem )
223    {
224        loadAndIncrease( this->value_.x, mem );
225        loadAndIncrease( this->value_.y, mem );
226        loadAndIncrease( this->value_.z, mem );
227    }
228    template <> inline void MT_Value<Ogre::Vector3>::exportData( uint8_t*& mem ) const
229    {
230        saveAndIncrease( this->value_.x, mem );
231        saveAndIncrease( this->value_.y, mem );
232        saveAndIncrease( this->value_.z, mem );
233    }
234    template <> inline uint8_t MT_Value<Ogre::Vector3>::getSize() const
235    {
236        return 3*returnSize(this->value_.x);
237    }
238    // Ogre::Vector4
239    template <> inline void MT_Value<Ogre::Vector4>::importData( uint8_t*& mem )
240    {
241        loadAndIncrease( this->value_.x, mem );
242        loadAndIncrease( this->value_.y, mem );
243        loadAndIncrease( this->value_.z, mem );
244        loadAndIncrease( this->value_.w, mem );
245    }
246    template <> inline void MT_Value<Ogre::Vector4>::exportData( uint8_t*& mem ) const
247    {
248        saveAndIncrease( this->value_.x, mem );
249        saveAndIncrease( this->value_.y, mem );
250        saveAndIncrease( this->value_.z, mem );
251        saveAndIncrease( this->value_.w, mem );
252    }
253    template <> inline uint8_t MT_Value<Ogre::Vector4>::getSize() const
254    {
255        return 4*returnSize(this->value_.x);
256    }
257    template <> inline void MT_Value<void*>::importData( uint8_t*& /*mem*/ )
258    {
259        assert(0);
260    }
261    template <> inline void MT_Value<void*>::exportData( uint8_t*& /*mem*/ ) const
262    {
263        assert(0);
264    }
265    template <> inline uint8_t MT_Value<void*>::getSize() const
266    {
267        assert(0); return 0;
268    }
269}
270
271#endif /* _MultiTypeValue_H__ */
Note: See TracBrowser for help on using the repository browser.