Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core3/src/util/MultiType.h @ 1726

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

several changes in MultiType:

  • added a const char* constructor to fix a bug
  • fixed unexpected behavior when assigning another MultiType: setValue(MultiType) converts now the value of the other MultiType to the current type
  • added copy(MultiType) function to assign value AND type of the other MultiType
  • it's now possible to convert the type of a MultiType by either calling convert<T>() or convert(MT_Type)
  • convert(MultiType) converts the current value to the type of the other MultiType
  • setValue<type>(othertype value) will now convert value from othertype to type by using Convert.h instead of a typecast
  • Property svn:eol-style set to native
File size: 32.9 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#ifndef _MultiType_H__
30#define _MultiType_H__
31
32#include "UtilPrereqs.h"
33
34#include <boost/static_assert.hpp>
35
36#include "Math.h"
37
38// disable annoying warning about multiple assignment operators
39#if ORXONOX_COMPILER == ORXONOX_COMPILER_MSVC
40#pragma warning(push)
41#pragma warning(disable:4522)
42#endif
43
44enum MT_Type
45{
46    MT_null,
47    MT_char,
48    MT_uchar,
49    MT_short,
50    MT_ushort,
51    MT_int,
52    MT_uint,
53    MT_long,
54    MT_ulong,
55    MT_longlong,
56    MT_ulonglong,
57    MT_float,
58    MT_double,
59    MT_longdouble,
60    MT_bool,
61    MT_void,
62    MT_string,
63    MT_vector2,
64    MT_vector3,
65    MT_vector4,
66    MT_colourvalue,
67    MT_quaternion,
68    MT_radian,
69    MT_degree
70};
71
72class _UtilExport MultiType
73{
74    _UtilExport friend std::ostream& operator<<(std::ostream& outstream, const MultiType& mt);
75    template <typename T> friend struct MT_Value;
76
77    struct _UtilExport MT_ValueBase
78    {
79        MT_ValueBase(MT_Type type) : type_(type) {}
80        virtual ~MT_ValueBase() {}
81
82        virtual MT_ValueBase* clone() const = 0;
83
84        virtual void reset() = 0;
85        virtual void assimilate(const MultiType& other) = 0;
86        const MT_Type& getType() const { return this->type_; }
87
88        virtual void setValue(const char& value)                 = 0;
89        virtual void setValue(const unsigned char& value)        = 0;
90        virtual void setValue(const short& value)                = 0;
91        virtual void setValue(const unsigned short& value)       = 0;
92        virtual void setValue(const int& value)                  = 0;
93        virtual void setValue(const unsigned int& value)         = 0;
94        virtual void setValue(const long& value)                 = 0;
95        virtual void setValue(const unsigned long& value)        = 0;
96        virtual void setValue(const long long& value)            = 0;
97        virtual void setValue(const unsigned long long& value)   = 0;
98        virtual void setValue(const float& value)                = 0;
99        virtual void setValue(const double& value)               = 0;
100        virtual void setValue(const long double& value)          = 0;
101        virtual void setValue(const bool& value)                 = 0;
102        virtual void setValue(      void* const& value)          = 0;
103        virtual void setValue(const std::string& value)          = 0;
104        virtual void setValue(const orxonox::Vector2& value)     = 0;
105        virtual void setValue(const orxonox::Vector3& value)     = 0;
106        virtual void setValue(const orxonox::Vector4& value)     = 0;
107        virtual void setValue(const orxonox::ColourValue& value) = 0;
108        virtual void setValue(const orxonox::Quaternion& value)  = 0;
109        virtual void setValue(const orxonox::Radian& value)      = 0;
110        virtual void setValue(const orxonox::Degree& value)      = 0;
111
112        virtual operator char()                 const = 0;
113        virtual operator unsigned char()        const = 0;
114        virtual operator short()                const = 0;
115        virtual operator unsigned short()       const = 0;
116        virtual operator int()                  const = 0;
117        virtual operator unsigned int()         const = 0;
118        virtual operator long()                 const = 0;
119        virtual operator unsigned long()        const = 0;
120        virtual operator long long()            const = 0;
121        virtual operator unsigned long long()   const = 0;
122        virtual operator float()                const = 0;
123        virtual operator double()               const = 0;
124        virtual operator long double()          const = 0;
125        virtual operator bool()                 const = 0;
126        virtual operator void*()                const = 0;
127        virtual operator std::string()          const = 0;
128        virtual operator orxonox::Vector2()     const = 0;
129        virtual operator orxonox::Vector3()     const = 0;
130        virtual operator orxonox::Vector4()     const = 0;
131        virtual operator orxonox::ColourValue() const = 0;
132        virtual operator orxonox::Quaternion()  const = 0;
133        virtual operator orxonox::Radian()      const = 0;
134        virtual operator orxonox::Degree()      const = 0;
135
136        virtual void toString(std::ostream& outstream) const = 0;
137
138        MT_Type type_;
139    };
140
141    public:
142        inline MultiType()                                  : value_(0) {}
143        inline MultiType(const char& value)                 : value_(0) { this->assignValue(value); }
144        inline MultiType(const unsigned char& value)        : value_(0) { this->assignValue(value); }
145        inline MultiType(const short& value)                : value_(0) { this->assignValue(value); }
146        inline MultiType(const unsigned short& value)       : value_(0) { this->assignValue(value); }
147        inline MultiType(const int& value)                  : value_(0) { this->assignValue(value); }
148        inline MultiType(const unsigned int& value)         : value_(0) { this->assignValue(value); }
149        inline MultiType(const long& value)                 : value_(0) { this->assignValue(value); }
150        inline MultiType(const unsigned long& value)        : value_(0) { this->assignValue(value); }
151        inline MultiType(const long long& value)            : value_(0) { this->assignValue(value); }
152        inline MultiType(const unsigned long long& value)   : value_(0) { this->assignValue(value); }
153        inline MultiType(const float& value)                : value_(0) { this->assignValue(value); }
154        inline MultiType(const double& value)               : value_(0) { this->assignValue(value); }
155        inline MultiType(const long double& value)          : value_(0) { this->assignValue(value); }
156        inline MultiType(const bool& value)                 : value_(0) { this->assignValue(value); }
157        inline MultiType(      void* const& value)          : value_(0) { this->assignValue(value); }
158        inline MultiType(const std::string& value)          : value_(0) { this->assignValue(value); }
159        inline MultiType(const orxonox::Vector2& value)     : value_(0) { this->assignValue(value); }
160        inline MultiType(const orxonox::Vector3& value)     : value_(0) { this->assignValue(value); }
161        inline MultiType(const orxonox::Vector4& value)     : value_(0) { this->assignValue(value); }
162        inline MultiType(const orxonox::ColourValue& value) : value_(0) { this->assignValue(value); }
163        inline MultiType(const orxonox::Quaternion& value)  : value_(0) { this->assignValue(value); }
164        inline MultiType(const orxonox::Radian& value)      : value_(0) { this->assignValue(value); }
165        inline MultiType(const orxonox::Degree& value)      : value_(0) { this->assignValue(value); }
166        inline MultiType(const char* value)                 : value_(0) { this->setValue(std::string(value)); }
167        inline MultiType(const MultiType& other)            : value_(0) { this->setValue(other); }
168        inline MultiType(MT_Type type)                      : value_(0) { this->setType(type); }
169
170        inline ~MultiType() { if (this->value_) { delete this->value_; } }
171
172        template <typename V> inline MultiType& operator=(const V& value)         { this->setValue(value); return (*this); }
173        inline                       MultiType& operator=(const MultiType& other) { this->setValue(other); return (*this); }
174        inline                       MultiType& operator=(MT_Type type)           { this->setType(type);   return (*this); }
175
176        inline void                                   setValue(const char& value);
177        inline void                                   setValue(const unsigned char& value);
178        inline void                                   setValue(const short& value);
179        inline void                                   setValue(const unsigned short& value);
180        inline void                                   setValue(const int& value);
181        inline void                                   setValue(const unsigned int& value);
182        inline void                                   setValue(const long& value);
183        inline void                                   setValue(const unsigned long& value);
184        inline void                                   setValue(const long long& value);
185        inline void                                   setValue(const unsigned long long& value);
186        inline void                                   setValue(const float& value);
187        inline void                                   setValue(const double& value);
188        inline void                                   setValue(const long double& value);
189        inline void                                   setValue(const bool& value);
190        inline void                                   setValue(      void* const& value);
191        inline void                                   setValue(const std::string& value);
192        inline void                                   setValue(const orxonox::Vector2& value);
193        inline void                                   setValue(const orxonox::Vector3& value);
194        inline void                                   setValue(const orxonox::Vector4& value);
195        inline void                                   setValue(const orxonox::ColourValue& value);
196        inline void                                   setValue(const orxonox::Quaternion& value);
197        inline void                                   setValue(const orxonox::Radian& value);
198        inline void                                   setValue(const orxonox::Degree& value);
199        template <typename V> inline void             setValue(V* value)               { if (this->value_) { this->value_->setValue((void*)value); } else { this->assignValue((void*)value); } }
200        void                                          setValue(const MultiType& other) { if (this->value_) { this->value_->assimilate(other); } else { if (other.value_) { this->value_ = other.value_->clone(); } } }
201        template <typename T, typename V> inline void setValue(const V& value)         { this->setType<T>(); this->setValue(value); }
202        inline void                                   setValue(const char* value);
203
204        inline void                       copy(const MultiType& other)    { if (this->value_) { delete this->value_; } this->value_ = (other.value_) ? other.value_->clone() : 0; }
205
206        template <typename T> inline void convert()                       { this->setValue<T>((T)(*this));  }
207        inline void                       convert(const MultiType& other) { this->convert(other.getType()); }
208        void                              convert(MT_Type type);
209
210        inline void                       reset()                         { if (this->value_) { delete this->value_; this->value_ = 0; } }
211
212        template <typename T> inline void setType()                       { this->assignValue(T());             }
213        inline void                       setType(const MultiType& other) { this->setType(other.getType());     }
214        inline void                       setType(MT_Type type)           { this->reset(); this->convert(type); }
215
216        operator char()                  const;
217        operator unsigned char()         const;
218        operator short()                 const;
219        operator unsigned short()        const;
220        operator int()                   const;
221        operator unsigned int()          const;
222        operator long()                  const;
223        operator unsigned long()         const;
224        operator long long()             const;
225        operator unsigned long long()    const;
226        operator float()                 const;
227        operator double()                const;
228        operator long double()           const;
229        operator bool()                  const;
230        operator void*()                 const;
231        operator std::string()           const;
232        operator orxonox::Vector2()      const;
233        operator orxonox::Vector3()      const;
234        operator orxonox::Vector4()      const;
235        operator orxonox::ColourValue()  const;
236        operator orxonox::Quaternion()   const;
237        operator orxonox::Radian()       const;
238        operator orxonox::Degree()       const;
239        template <class T> operator T*() const { return ((T*)this->operator void*()); }
240
241        inline void getValue(char*                 value) const { if (this->value_) { (*value) = (*this->value_); } }
242        inline void getValue(unsigned char*        value) const { if (this->value_) { (*value) = (*this->value_); } }
243        inline void getValue(short*                value) const { if (this->value_) { (*value) = (*this->value_); } }
244        inline void getValue(unsigned short*       value) const { if (this->value_) { (*value) = (*this->value_); } }
245        inline void getValue(int*                  value) const { if (this->value_) { (*value) = (*this->value_); } }
246        inline void getValue(unsigned int*         value) const { if (this->value_) { (*value) = (*this->value_); } }
247        inline void getValue(long*                 value) const { if (this->value_) { (*value) = (*this->value_); } }
248        inline void getValue(unsigned long*        value) const { if (this->value_) { (*value) = (*this->value_); } }
249        inline void getValue(long long*            value) const { if (this->value_) { (*value) = (*this->value_); } }
250        inline void getValue(unsigned long long*   value) const { if (this->value_) { (*value) = (*this->value_); } }
251        inline void getValue(float*                value) const { if (this->value_) { (*value) = (*this->value_); } }
252        inline void getValue(double*               value) const { if (this->value_) { (*value) = (*this->value_); } }
253        inline void getValue(long double*          value) const { if (this->value_) { (*value) = (*this->value_); } }
254        inline void getValue(bool*                 value) const { if (this->value_) { (*value) = (*this->value_); } }
255        inline void getValue(void*                 value) const { if (this->value_) {   value  = (*this->value_); } }
256        inline void getValue(std::string*          value) const { if (this->value_) { (*value) = this->value_->operator std::string();          } }
257        inline void getValue(orxonox::Vector2*     value) const { if (this->value_) { (*value) = this->value_->operator orxonox::Vector2();     } }
258        inline void getValue(orxonox::Vector3*     value) const { if (this->value_) { (*value) = this->value_->operator orxonox::Vector3();     } }
259        inline void getValue(orxonox::Vector4*     value) const { if (this->value_) { (*value) = this->value_->operator orxonox::Vector4();     } }
260        inline void getValue(orxonox::ColourValue* value) const { if (this->value_) { (*value) = this->value_->operator orxonox::ColourValue(); } }
261        inline void getValue(orxonox::Quaternion*  value) const { if (this->value_) { (*value) = this->value_->operator orxonox::Quaternion();  } }
262        inline void getValue(orxonox::Radian*      value) const { if (this->value_) { (*value) = this->value_->operator orxonox::Radian();      } }
263        inline void getValue(orxonox::Degree*      value) const { if (this->value_) { (*value) = this->value_->operator orxonox::Degree();      } }
264
265        inline MT_Type                    getType()            const { return (this->value_) ? this->value_->type_ : MT_null; }
266        inline bool                       isType(MT_Type type) const { return (this->value_) ? (this->value_->type_ == type) : (type == MT_null); }
267        template <typename T> inline bool isType()             const { return false; }
268        std::string                       getTypename()        const;
269
270        inline std::string toString() const { return this->operator std::string(); }
271
272    private:
273        inline void assignValue(const char& value)                 { if (this->value_ && this->value_->type_ == MT_char)        { this->value_->setValue(value); } else { this->changeValueContainer<char>(value);                 } }
274        inline void assignValue(const unsigned char& value)        { if (this->value_ && this->value_->type_ == MT_uchar)       { this->value_->setValue(value); } else { this->changeValueContainer<unsigned char>(value);        } }
275        inline void assignValue(const short& value)                { if (this->value_ && this->value_->type_ == MT_short)       { this->value_->setValue(value); } else { this->changeValueContainer<short>(value);                } }
276        inline void assignValue(const unsigned short& value)       { if (this->value_ && this->value_->type_ == MT_ushort)      { this->value_->setValue(value); } else { this->changeValueContainer<unsigned short>(value);       } }
277        inline void assignValue(const int& value)                  { if (this->value_ && this->value_->type_ == MT_int)         { this->value_->setValue(value); } else { this->changeValueContainer<int>(value);                  } }
278        inline void assignValue(const unsigned int& value)         { if (this->value_ && this->value_->type_ == MT_uint)        { this->value_->setValue(value); } else { this->changeValueContainer<unsigned int>(value);         } }
279        inline void assignValue(const long& value)                 { if (this->value_ && this->value_->type_ == MT_long)        { this->value_->setValue(value); } else { this->changeValueContainer<long>(value);                 } }
280        inline void assignValue(const unsigned long& value)        { if (this->value_ && this->value_->type_ == MT_ulong)       { this->value_->setValue(value); } else { this->changeValueContainer<unsigned long>(value);        } }
281        inline void assignValue(const long long& value)            { if (this->value_ && this->value_->type_ == MT_longlong)    { this->value_->setValue(value); } else { this->changeValueContainer<long long>(value);            } }
282        inline void assignValue(const unsigned long long& value)   { if (this->value_ && this->value_->type_ == MT_ulonglong)   { this->value_->setValue(value); } else { this->changeValueContainer<unsigned long long>(value);   } }
283        inline void assignValue(const float& value)                { if (this->value_ && this->value_->type_ == MT_float)       { this->value_->setValue(value); } else { this->changeValueContainer<float>(value);                } }
284        inline void assignValue(const double& value)               { if (this->value_ && this->value_->type_ == MT_double)      { this->value_->setValue(value); } else { this->changeValueContainer<double>(value);               } }
285        inline void assignValue(const long double& value)          { if (this->value_ && this->value_->type_ == MT_longdouble)  { this->value_->setValue(value); } else { this->changeValueContainer<long double>(value);          } }
286        inline void assignValue(const bool& value)                 { if (this->value_ && this->value_->type_ == MT_bool)        { this->value_->setValue(value); } else { this->changeValueContainer<bool>(value);                 } }
287        inline void assignValue(      void* const& value)          { if (this->value_ && this->value_->type_ == MT_void)        { this->value_->setValue(value); } else { this->changeValueContainer<void*>(value);                } }
288        inline void assignValue(const std::string& value)          { if (this->value_ && this->value_->type_ == MT_string)      { this->value_->setValue(value); } else { this->changeValueContainer<std::string>(value);          } }
289        inline void assignValue(const orxonox::Vector2& value)     { if (this->value_ && this->value_->type_ == MT_vector2)     { this->value_->setValue(value); } else { this->changeValueContainer<orxonox::Vector2>(value);     } }
290        inline void assignValue(const orxonox::Vector3& value)     { if (this->value_ && this->value_->type_ == MT_vector3)     { this->value_->setValue(value); } else { this->changeValueContainer<orxonox::Vector3>(value);     } }
291        inline void assignValue(const orxonox::Vector4& value)     { if (this->value_ && this->value_->type_ == MT_vector4)     { this->value_->setValue(value); } else { this->changeValueContainer<orxonox::Vector4>(value);     } }
292        inline void assignValue(const orxonox::ColourValue& value) { if (this->value_ && this->value_->type_ == MT_colourvalue) { this->value_->setValue(value); } else { this->changeValueContainer<orxonox::ColourValue>(value); } }
293        inline void assignValue(const orxonox::Quaternion& value)  { if (this->value_ && this->value_->type_ == MT_quaternion)  { this->value_->setValue(value); } else { this->changeValueContainer<orxonox::Quaternion>(value);  } }
294        inline void assignValue(const orxonox::Radian& value)      { if (this->value_ && this->value_->type_ == MT_radian)      { this->value_->setValue(value); } else { this->changeValueContainer<orxonox::Radian>(value);      } }
295        inline void assignValue(const orxonox::Degree& value)      { if (this->value_ && this->value_->type_ == MT_degree)      { this->value_->setValue(value); } else { this->changeValueContainer<orxonox::Degree>(value);      } }
296
297        template <typename T> inline void changeValueContainer(const T& value) { if (this->value_) { delete this->value_; } this->createNewValueContainer<T>(value); }
298        template <typename T>        void createNewValueContainer(const T& value) { BOOST_STATIC_ASSERT(sizeof(T) == 0); }
299
300        MT_ValueBase* value_;
301};
302
303_UtilExport inline std::ostream& operator<<(std::ostream& outstream, const MultiType& mt) { if (mt.value_) { mt.value_->toString(outstream); } return outstream; }
304
305template <> inline bool MultiType::isType<char>()                 const { return (this->value_ && this->value_->type_ == MT_char);        }
306template <> inline bool MultiType::isType<unsigned char>()        const { return (this->value_ && this->value_->type_ == MT_uchar);       }
307template <> inline bool MultiType::isType<short>()                const { return (this->value_ && this->value_->type_ == MT_short);       }
308template <> inline bool MultiType::isType<unsigned short>()       const { return (this->value_ && this->value_->type_ == MT_ushort);      }
309template <> inline bool MultiType::isType<int>()                  const { return (this->value_ && this->value_->type_ == MT_int);         }
310template <> inline bool MultiType::isType<unsigned int>()         const { return (this->value_ && this->value_->type_ == MT_uint);        }
311template <> inline bool MultiType::isType<long>()                 const { return (this->value_ && this->value_->type_ == MT_long);        }
312template <> inline bool MultiType::isType<unsigned long>()        const { return (this->value_ && this->value_->type_ == MT_ulong);       }
313template <> inline bool MultiType::isType<long long>()            const { return (this->value_ && this->value_->type_ == MT_longlong);    }
314template <> inline bool MultiType::isType<unsigned long long>()   const { return (this->value_ && this->value_->type_ == MT_ulonglong);   }
315template <> inline bool MultiType::isType<float>()                const { return (this->value_ && this->value_->type_ == MT_float);       }
316template <> inline bool MultiType::isType<double>()               const { return (this->value_ && this->value_->type_ == MT_double);      }
317template <> inline bool MultiType::isType<long double>()          const { return (this->value_ && this->value_->type_ == MT_longdouble);  }
318template <> inline bool MultiType::isType<bool>()                 const { return (this->value_ && this->value_->type_ == MT_bool);        }
319template <> inline bool MultiType::isType<void*>()                const { return (this->value_ && this->value_->type_ == MT_void);        }
320template <> inline bool MultiType::isType<std::string>()          const { return (this->value_ && this->value_->type_ == MT_string);      }
321template <> inline bool MultiType::isType<orxonox::Vector2>()     const { return (this->value_ && this->value_->type_ == MT_vector2);     }
322template <> inline bool MultiType::isType<orxonox::Vector3>()     const { return (this->value_ && this->value_->type_ == MT_vector3);     }
323template <> inline bool MultiType::isType<orxonox::Vector4>()     const { return (this->value_ && this->value_->type_ == MT_vector4);     }
324template <> inline bool MultiType::isType<orxonox::ColourValue>() const { return (this->value_ && this->value_->type_ == MT_colourvalue); }
325template <> inline bool MultiType::isType<orxonox::Quaternion>()  const { return (this->value_ && this->value_->type_ == MT_quaternion);  }
326template <> inline bool MultiType::isType<orxonox::Radian>()      const { return (this->value_ && this->value_->type_ == MT_radian);      }
327template <> inline bool MultiType::isType<orxonox::Degree>()      const { return (this->value_ && this->value_->type_ == MT_degree);      }
328
329template <> inline void MultiType::convert<std::string>()          { this->setValue<std::string>         (this->operator std::string());          }
330template <> inline void MultiType::convert<orxonox::Vector2>()     { this->setValue<orxonox::Vector2>    (this->operator orxonox::Vector2());     }
331template <> inline void MultiType::convert<orxonox::Vector3>()     { this->setValue<orxonox::Vector3>    (this->operator orxonox::Vector3());     }
332template <> inline void MultiType::convert<orxonox::Vector4>()     { this->setValue<orxonox::Vector4>    (this->operator orxonox::Vector4());     }
333template <> inline void MultiType::convert<orxonox::ColourValue>() { this->setValue<orxonox::ColourValue>(this->operator orxonox::ColourValue()); }
334template <> inline void MultiType::convert<orxonox::Quaternion>()  { this->setValue<orxonox::Quaternion> (this->operator orxonox::Quaternion());  }
335template <> inline void MultiType::convert<orxonox::Radian>()      { this->setValue<orxonox::Radian>     (this->operator orxonox::Radian());      }
336template <> inline void MultiType::convert<orxonox::Degree>()      { this->setValue<orxonox::Degree>     (this->operator orxonox::Degree());      }
337
338template <> inline void MultiType::convert<const std::string&>()          { this->convert<std::string>();          }
339template <> inline void MultiType::convert<const orxonox::Vector2&>()     { this->convert<orxonox::Vector2>();     }
340template <> inline void MultiType::convert<const orxonox::Vector3&>()     { this->convert<orxonox::Vector3>();     }
341template <> inline void MultiType::convert<const orxonox::Vector4&>()     { this->convert<orxonox::Vector4>();     }
342template <> inline void MultiType::convert<const orxonox::ColourValue&>() { this->convert<orxonox::ColourValue>(); }
343template <> inline void MultiType::convert<const orxonox::Quaternion&>()  { this->convert<orxonox::Quaternion>();  }
344template <> inline void MultiType::convert<const orxonox::Radian&>()      { this->convert<orxonox::Radian>();      }
345template <> inline void MultiType::convert<const orxonox::Degree&>()      { this->convert<orxonox::Degree>();      }
346
347template <> void MultiType::createNewValueContainer(const char& value);
348template <> void MultiType::createNewValueContainer(const unsigned char& value);
349template <> void MultiType::createNewValueContainer(const short& value);
350template <> void MultiType::createNewValueContainer(const unsigned short& value);
351template <> void MultiType::createNewValueContainer(const int& value);
352template <> void MultiType::createNewValueContainer(const unsigned int& value);
353template <> void MultiType::createNewValueContainer(const long& value);
354template <> void MultiType::createNewValueContainer(const unsigned long& value);
355template <> void MultiType::createNewValueContainer(const long long& value);
356template <> void MultiType::createNewValueContainer(const unsigned long long& value);
357template <> void MultiType::createNewValueContainer(const float& value);
358template <> void MultiType::createNewValueContainer(const double& value);
359template <> void MultiType::createNewValueContainer(const bool& value);
360template <> void MultiType::createNewValueContainer(const long double& value);
361template <> void MultiType::createNewValueContainer(      void* const& value);
362template <> void MultiType::createNewValueContainer(const std::string& value);
363template <> void MultiType::createNewValueContainer(const orxonox::Vector2& value);
364template <> void MultiType::createNewValueContainer(const orxonox::Vector3& value);
365template <> void MultiType::createNewValueContainer(const orxonox::Vector4& value);
366template <> void MultiType::createNewValueContainer(const orxonox::ColourValue& value);
367template <> void MultiType::createNewValueContainer(const orxonox::Quaternion& value);
368template <> void MultiType::createNewValueContainer(const orxonox::Radian& value);
369template <> void MultiType::createNewValueContainer(const orxonox::Degree& value);
370
371inline void MultiType::setValue(const char& value)                  { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
372inline void MultiType::setValue(const unsigned char& value)         { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
373inline void MultiType::setValue(const short& value)                 { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
374inline void MultiType::setValue(const unsigned short& value)        { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
375inline void MultiType::setValue(const int& value)                   { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
376inline void MultiType::setValue(const unsigned int& value)          { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
377inline void MultiType::setValue(const long& value)                  { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
378inline void MultiType::setValue(const unsigned long& value)         { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
379inline void MultiType::setValue(const long long& value)             { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
380inline void MultiType::setValue(const unsigned long long& value)    { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
381inline void MultiType::setValue(const float& value)                 { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
382inline void MultiType::setValue(const double& value)                { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
383inline void MultiType::setValue(const long double& value)           { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
384inline void MultiType::setValue(const bool& value)                  { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
385inline void MultiType::setValue(      void* const& value)           { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
386inline void MultiType::setValue(const std::string& value)           { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
387inline void MultiType::setValue(const orxonox::Vector2& value)      { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
388inline void MultiType::setValue(const orxonox::Vector3& value)      { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
389inline void MultiType::setValue(const orxonox::Vector4& value)      { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
390inline void MultiType::setValue(const orxonox::ColourValue& value)  { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
391inline void MultiType::setValue(const orxonox::Quaternion& value)   { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
392inline void MultiType::setValue(const orxonox::Radian& value)       { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
393inline void MultiType::setValue(const orxonox::Degree& value)       { if (this->value_) { this->value_->setValue(value); } else { this->assignValue(value); } }
394
395inline void MultiType::setValue(const char* value)                  { if (this->value_) { this->value_->setValue(std::string(value)); } else { this->assignValue(std::string(value)); } }
396
397
398#if ORXONOX_COMPILER == ORXONOX_COMPILER_MSVC
399#pragma warning(pop)
400#endif
401
402#endif /* _MultiType_H__ */
Note: See TracBrowser for help on using the repository browser.