Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/network/src/util/MultiTypePrimitive.cc @ 1494

Last change on this file since 1494 was 1494, checked in by rgrieder, 16 years ago
  • set the svn:eol-style property to all files so, that where ever you check out, you'll get the right line endings (had to change every file with mixed endings to windows in order to set the property)
  • Property svn:eol-style set to native
File size: 12.5 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 *   Inspiration: MultiType by Benjamin Grauer
28 */
29
30#include "MultiTypePrimitive.h"
31#include "Convert.h"
32
33MultiTypePrimitive::MultiTypePrimitive(MultiType type)
34{
35    this->type_ = type;
36
37    if (type == MT_void)
38        this->value_.void_ = 0;
39    else if (type == MT_int)
40        this->value_.int_ = 0;
41    else if (type == MT_uint)
42        this->value_.uint_ = 0;
43    else if (type == MT_char)
44        this->value_.char_ = 0;
45    else if (type == MT_uchar)
46        this->value_.uchar_ = 0;
47    else if (type == MT_short)
48        this->value_.short_ = 0;
49    else if (type == MT_ushort)
50        this->value_.ushort_ = 0;
51    else if (type == MT_long)
52        this->value_.long_ = 0;
53    else if (type == MT_ulong)
54        this->value_.ulong_ = 0;
55    else if (type == MT_float)
56        this->value_.float_ = 0.0;
57    else if (type == MT_double)
58        this->value_.double_ = 0.0;
59    else if (type == MT_longdouble)
60        this->value_.longdouble_ = 0.0;
61    else if (type == MT_bool)
62        this->value_.bool_ = false;
63    else
64        this->value_.void_ = 0;
65}
66
67bool MultiTypePrimitive::operator==(const MultiTypePrimitive& mtp) const
68{
69    if (this->type_ == mtp.type_)
70    {
71        if (this->type_ == MT_void)
72            return (this->value_.void_ == mtp.value_.void_);
73        else if (this->type_ == MT_int)
74            return (this->value_.int_ == mtp.value_.int_);
75        else if (this->type_ == MT_uint)
76            return (this->value_.uint_ == mtp.value_.uint_);
77        else if (this->type_ == MT_char)
78            return (this->value_.char_ == mtp.value_.char_);
79        else if (this->type_ == MT_uchar)
80            return (this->value_.uchar_ == mtp.value_.uchar_);
81        else if (this->type_ == MT_short)
82            return (this->value_.short_ == mtp.value_.short_);
83        else if (this->type_ == MT_ushort)
84            return (this->value_.ushort_ == mtp.value_.ushort_);
85        else if (this->type_ == MT_long)
86            return (this->value_.long_ == mtp.value_.long_);
87        else if (this->type_ == MT_ulong)
88            return (this->value_.ulong_ == mtp.value_.ulong_);
89        else if (this->type_ == MT_float)
90            return (this->value_.float_ == mtp.value_.float_);
91        else if (this->type_ == MT_double)
92            return (this->value_.double_ == mtp.value_.double_);
93        else if (this->type_ == MT_longdouble)
94            return (this->value_.longdouble_ == mtp.value_.longdouble_);
95        else if (this->type_ == MT_bool)
96            return (this->value_.bool_ == mtp.value_.bool_);
97    }
98
99    return false;
100}
101
102bool MultiTypePrimitive::operator!=(const MultiTypePrimitive& mtp) const
103{
104    if (this->type_ == mtp.type_)
105    {
106        if (this->type_ == MT_void)
107            return (this->value_.void_ != mtp.value_.void_);
108        else if (this->type_ == MT_int)
109            return (this->value_.int_ != mtp.value_.int_);
110        else if (this->type_ == MT_uint)
111            return (this->value_.uint_ != mtp.value_.uint_);
112        else if (this->type_ == MT_char)
113            return (this->value_.char_ != mtp.value_.char_);
114        else if (this->type_ == MT_uchar)
115            return (this->value_.uchar_ != mtp.value_.uchar_);
116        else if (this->type_ == MT_short)
117            return (this->value_.short_ != mtp.value_.short_);
118        else if (this->type_ == MT_ushort)
119            return (this->value_.ushort_ != mtp.value_.ushort_);
120        else if (this->type_ == MT_long)
121            return (this->value_.long_ != mtp.value_.long_);
122        else if (this->type_ == MT_ulong)
123            return (this->value_.ulong_ != mtp.value_.ulong_);
124        else if (this->type_ == MT_float)
125            return (this->value_.float_ != mtp.value_.float_);
126        else if (this->type_ == MT_double)
127            return (this->value_.double_ != mtp.value_.double_);
128        else if (this->type_ == MT_longdouble)
129            return (this->value_.longdouble_ != mtp.value_.longdouble_);
130        else if (this->type_ == MT_bool)
131            return (this->value_.bool_ != mtp.value_.bool_);
132    }
133
134    return true;
135}
136
137MultiTypePrimitive::operator void*() const
138{ return (this->type_ == MT_void) ? this->value_.void_ : getConvertedValue<MultiTypePrimitive, void*>(*this, 0); }
139MultiTypePrimitive::operator int() const
140{ return (this->type_ == MT_int) ? this->value_.int_ : getConvertedValue<MultiTypePrimitive, int>(*this, 0); }
141MultiTypePrimitive::operator unsigned int() const
142{ return (this->type_ == MT_uint) ? this->value_.uint_ : getConvertedValue<MultiTypePrimitive, unsigned int>(*this, 0); }
143MultiTypePrimitive::operator char() const
144{ return (this->type_ == MT_char) ? this->value_.char_ : getConvertedValue<MultiTypePrimitive, char>(*this, 0); }
145MultiTypePrimitive::operator unsigned char() const
146{ return (this->type_ == MT_uchar) ? this->value_.uchar_ : getConvertedValue<MultiTypePrimitive, unsigned char>(*this, 0); }
147MultiTypePrimitive::operator short() const
148{ return (this->type_ == MT_short) ? this->value_.short_ : getConvertedValue<MultiTypePrimitive, short>(*this, 0); }
149MultiTypePrimitive::operator unsigned short() const
150{ return (this->type_ == MT_ushort) ? this->value_.ushort_ : getConvertedValue<MultiTypePrimitive, unsigned short>(*this, 0); }
151MultiTypePrimitive::operator long() const
152{ return (this->type_ == MT_long) ? this->value_.long_ : getConvertedValue<MultiTypePrimitive, long>(*this, 0); }
153MultiTypePrimitive::operator unsigned long() const
154{ return (this->type_ == MT_ulong) ? this->value_.ulong_ : getConvertedValue<MultiTypePrimitive, unsigned long>(*this, 0); }
155MultiTypePrimitive::operator float() const
156{ return (this->type_ == MT_float) ? this->value_.float_ : getConvertedValue<MultiTypePrimitive, float>(*this, 0); }
157MultiTypePrimitive::operator double() const
158{ return (this->type_ == MT_double) ? this->value_.double_ : getConvertedValue<MultiTypePrimitive, double>(*this, 0); }
159MultiTypePrimitive::operator long double() const
160{ return (this->type_ == MT_longdouble) ? this->value_.longdouble_ : getConvertedValue<MultiTypePrimitive, long double>(*this, 0); }
161MultiTypePrimitive::operator bool() const
162{ return (this->type_ == MT_bool) ? this->value_.bool_ : getConvertedValue<MultiTypePrimitive, bool>(*this, 0); }
163
164void MultiTypePrimitive::setValue(const MultiTypePrimitive& mtp)
165{
166    this->type_ = mtp.type_;
167    this->value_ = mtp.value_;
168}
169
170std::string MultiTypePrimitive::getTypename() const
171{
172    if (this->type_ == MT_void)
173        return "pointer";
174    else if (this->type_ == MT_int)
175        return "int";
176    else if (this->type_ == MT_uint)
177        return "unsigned int";
178    else if (this->type_ == MT_char)
179        return "char";
180    else if (this->type_ == MT_uchar)
181        return "unsigned char";
182    else if (this->type_ == MT_short)
183        return "short";
184    else if (this->type_ == MT_ushort)
185        return "unsigned short";
186    else if (this->type_ == MT_long)
187        return "long";
188    else if (this->type_ == MT_ulong)
189        return "unsigned long";
190    else if (this->type_ == MT_float)
191        return "float";
192    else if (this->type_ == MT_double)
193        return "double";
194    else if (this->type_ == MT_longdouble)
195        return "long double";
196    else if (this->type_ == MT_bool)
197        return "bool";
198    else
199        return "unknown";
200}
201
202std::string MultiTypePrimitive::toString() const
203{
204    std::string output;
205
206    if (this->type_ == MT_void)
207        ConvertValue(&output, this->value_.void_);
208    else if (this->type_ == MT_int)
209        ConvertValue(&output, this->value_.int_);
210    else if (this->type_ == MT_uint)
211        ConvertValue(&output, this->value_.uint_);
212    else if (this->type_ == MT_char)
213        ConvertValue(&output, this->value_.char_);
214    else if (this->type_ == MT_uchar)
215        ConvertValue(&output, this->value_.uchar_);
216    else if (this->type_ == MT_short)
217        ConvertValue(&output, this->value_.short_);
218    else if (this->type_ == MT_ushort)
219        ConvertValue(&output, this->value_.ushort_);
220    else if (this->type_ == MT_long)
221        ConvertValue(&output, this->value_.long_);
222    else if (this->type_ == MT_ulong)
223        ConvertValue(&output, this->value_.ulong_);
224    else if (this->type_ == MT_float)
225        ConvertValue(&output, this->value_.float_);
226    else if (this->type_ == MT_double)
227        ConvertValue(&output, this->value_.double_);
228    else if (this->type_ == MT_longdouble)
229        ConvertValue(&output, this->value_.longdouble_);
230    else if (this->type_ == MT_bool)
231        ConvertValue(&output, this->value_.bool_);
232
233    return output;
234}
235
236bool MultiTypePrimitive::fromString(const std::string value)
237{
238    if (this->type_ == MT_void)
239        return ConvertValue(&this->value_.void_, value, (void*)0);
240    else if (this->type_ == MT_int)
241        return ConvertValue(&this->value_.int_, value, (int)0);
242    else if (this->type_ == MT_uint)
243        return ConvertValue(&this->value_.uint_, value, (unsigned int)0);
244    else if (this->type_ == MT_char)
245        return ConvertValue(&this->value_.char_, value, (char)0);
246    else if (this->type_ == MT_uchar)
247        return ConvertValue(&this->value_.uchar_, value, (unsigned char)0);
248    else if (this->type_ == MT_short)
249        return ConvertValue(&this->value_.short_, value, (short)0);
250    else if (this->type_ == MT_ushort)
251        return ConvertValue(&this->value_.ushort_, value, (unsigned short)0);
252    else if (this->type_ == MT_long)
253        return ConvertValue(&this->value_.long_, value, (long)0);
254    else if (this->type_ == MT_ulong)
255        return ConvertValue(&this->value_.ulong_, value, (unsigned long)0);
256    else if (this->type_ == MT_float)
257        return ConvertValue(&this->value_.float_, value, (float)0.0);
258    else if (this->type_ == MT_double)
259        return ConvertValue(&this->value_.double_, value, (double)0.0);
260    else if (this->type_ == MT_longdouble)
261        return ConvertValue(&this->value_.longdouble_, value, (long double)0.0);
262    else if (this->type_ == MT_bool)
263        return ConvertValue(&this->value_.bool_, value, false);
264    else
265        return false;
266}
267
268bool MultiTypePrimitive::assimilate(const MultiTypePrimitive& mtp, const MultiTypePrimitive& defvalue)
269{
270    if (this->type_ == MT_void)
271        return ConvertValue(&this->value_.void_, mtp, defvalue.value_.void_);
272    else if (this->type_ == MT_int)
273        return ConvertValue(&this->value_.int_, mtp, defvalue.value_.int_);
274    else if (this->type_ == MT_uint)
275        return ConvertValue(&this->value_.uint_, mtp, defvalue.value_.uint_);
276    else if (this->type_ == MT_char)
277        return ConvertValue(&this->value_.char_, mtp, defvalue.value_.char_);
278    else if (this->type_ == MT_uchar)
279        return ConvertValue(&this->value_.uchar_, mtp, defvalue.value_.uchar_);
280    else if (this->type_ == MT_short)
281        return ConvertValue(&this->value_.short_, mtp, defvalue.value_.short_);
282    else if (this->type_ == MT_ushort)
283        return ConvertValue(&this->value_.ushort_, mtp, defvalue.value_.ushort_);
284    else if (this->type_ == MT_long)
285        return ConvertValue(&this->value_.long_, mtp, defvalue.value_.long_);
286    else if (this->type_ == MT_ulong)
287        return ConvertValue(&this->value_.ulong_, mtp, defvalue.value_.ulong_);
288    else if (this->type_ == MT_float)
289        return ConvertValue(&this->value_.float_, mtp, defvalue.value_.float_);
290    else if (this->type_ == MT_double)
291        return ConvertValue(&this->value_.double_, mtp, defvalue.value_.double_);
292    else if (this->type_ == MT_longdouble)
293        return ConvertValue(&this->value_.longdouble_, mtp, defvalue.value_.longdouble_);
294    else if (this->type_ == MT_bool)
295        return ConvertValue(&this->value_.bool_, mtp, defvalue.value_.bool_);
296    else
297        return false;
298
299}
300
301std::ostream& operator<<(std::ostream& out, const MultiTypePrimitive& mtp)
302{
303    out << mtp.toString();
304    return out;
305}
Note: See TracBrowser for help on using the repository browser.